From 2e5e4177424cb645f8c7e9d25e713f32d0213a8b Mon Sep 17 00:00:00 2001 From: Christophe Beyls Date: Sat, 18 Jan 2014 20:51:21 +0100 Subject: [PATCH] Handle events with no speakers (Issue reported by B. Leseul) --- res/layout/fragment_event_details.xml | 2 +- .../fosdem/adapters/EventsAdapter.java | 9 +++- .../digitalia/fosdem/db/DatabaseManager.java | 36 ++++++++-------- .../fragments/EventDetailsFragment.java | 43 ++++++++++++------- .../fragments/TrackScheduleListFragment.java | 8 +++- src/be/digitalia/fosdem/model/Event.java | 9 ++-- .../fosdem/services/AlarmIntentService.java | 14 ++++-- 7 files changed, 79 insertions(+), 42 deletions(-) diff --git a/res/layout/fragment_event_details.xml b/res/layout/fragment_event_details.xml index b374b57..744de91 100644 --- a/res/layout/fragment_event_details.xml +++ b/res/layout/fragment_event_details.xml @@ -27,7 +27,6 @@ android:id="@+id/persons" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:textIsSelectable="true" android:textSize="14sp" @@ -37,6 +36,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" + android:layout_marginTop="10dp" android:background="@color/fosdem_purple" android:orientation="vertical" android:padding="6dp" > diff --git a/src/be/digitalia/fosdem/adapters/EventsAdapter.java b/src/be/digitalia/fosdem/adapters/EventsAdapter.java index bfeba59..6f86f57 100644 --- a/src/be/digitalia/fosdem/adapters/EventsAdapter.java +++ b/src/be/digitalia/fosdem/adapters/EventsAdapter.java @@ -8,6 +8,7 @@ import android.database.Cursor; import android.support.v4.widget.CursorAdapter; import android.text.Spannable; import android.text.SpannableString; +import android.text.TextUtils; import android.text.style.AbsoluteSizeSpan; import android.view.LayoutInflater; import android.view.View; @@ -63,7 +64,13 @@ public class EventsAdapter extends CursorAdapter { holder.event = event; String eventTitle = event.getTitle(); - SpannableString spannableString = new SpannableString(String.format("%1$s\n%2$s", eventTitle, event.getPersonsSummary())); + SpannableString spannableString; + String personsSummary = event.getPersonsSummary(); + if (TextUtils.isEmpty(personsSummary)) { + spannableString = new SpannableString(eventTitle); + } else { + spannableString = new SpannableString(String.format("%1$s\n%2$s", eventTitle, event.getPersonsSummary())); + } spannableString.setSpan(holder.titleSizeSpan, 0, eventTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); holder.title.setText(spannableString); diff --git a/src/be/digitalia/fosdem/db/DatabaseManager.java b/src/be/digitalia/fosdem/db/DatabaseManager.java index 624cfa9..aa76e65 100644 --- a/src/be/digitalia/fosdem/db/DatabaseManager.java +++ b/src/be/digitalia/fosdem/db/DatabaseManager.java @@ -398,10 +398,10 @@ public class DatabaseManager { + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE e.id = ?" + " GROUP BY e.id", selectionArgs); @@ -441,10 +441,10 @@ public class DatabaseManager { + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE e.day_index = ? AND t.name = ? AND t.type = ?" + " GROUP BY e.id" + " ORDER BY e.start_time ASC", selectionArgs); @@ -508,16 +508,15 @@ public class DatabaseManager { + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE " + whereCondition.toString() - + " GROUP BY e.id" - + " ORDER BY e.start_time " + ascendingString, selectionArgs.toArray(new String[selectionArgs.size()])); + + " GROUP BY e.id" + " ORDER BY e.start_time " + ascendingString, selectionArgs.toArray(new String[selectionArgs.size()])); cursor.setNotificationUri(context.getContentResolver(), URI_SCHEDULE); return cursor; } @@ -546,15 +545,18 @@ public class DatabaseManager { + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME - + " ep2 ON e.id = ep2.event_id" + " WHERE ep2.person_id = ?" + " GROUP BY e.id" + " ORDER BY e.start_time ASC", selectionArgs); + + " ep2 ON e.id = ep2.event_id" + + " WHERE ep2.person_id = ?" + + " GROUP BY e.id" + + " ORDER BY e.start_time ASC", selectionArgs); cursor.setNotificationUri(context.getContentResolver(), URI_SCHEDULE); return cursor; } @@ -596,10 +598,10 @@ public class DatabaseManager { + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + whereCondition + " GROUP BY e.id" + " ORDER BY e.start_time ASC", selectionArgs); cursor.setNotificationUri(context.getContentResolver(), URI_BOOKMARKS); @@ -632,10 +634,10 @@ public class DatabaseManager { + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" - + " JOIN " + + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE e.id IN ( " @@ -677,10 +679,10 @@ public class DatabaseManager { // Query is similar to getSearchResults but returns different columns, does not join the Day table and limits the result set to 5 entries. Cursor cursor = helper.getReadableDatabase().rawQuery( "SELECT e.id AS " + BaseColumns._ID + ", et.title AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 - + ", GROUP_CONCAT(p.name, ', ') || ' - ' || t.name AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ", e.id AS " + + ", IFNULL(GROUP_CONCAT(p.name, ', '), '') || ' - ' || t.name AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ", e.id AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA + " FROM " + DatabaseHelper.EVENTS_TABLE_NAME + " e" + " JOIN " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " et ON e.id = et.rowid" + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME - + " t ON e.track_id = t.id" + " JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" + " JOIN " + + " t ON e.track_id = t.id" + " LEFT JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" + " LEFT JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE e.id IN ( " + "SELECT rowid" + " FROM " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " WHERE " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " MATCH ?" + " UNION " + "SELECT e.id" + " FROM " + DatabaseHelper.EVENTS_TABLE_NAME + " e" + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME diff --git a/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java b/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java index 3ae7665..68b3a7c 100644 --- a/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java +++ b/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java @@ -127,8 +127,14 @@ public class EventDetailsFragment extends Fragment { // Set the persons summary text first; replace it with the clickable text when the loader completes holder.personsTextView = (TextView) view.findViewById(R.id.persons); - holder.personsTextView.setText(event.getPersonsSummary()); - holder.personsTextView.setMovementMethod(linkMovementMethod); + String personsSummary = event.getPersonsSummary(); + if (TextUtils.isEmpty(personsSummary)) { + holder.personsTextView.setVisibility(View.GONE); + } else { + holder.personsTextView.setText(personsSummary); + holder.personsTextView.setMovementMethod(linkMovementMethod); + holder.personsTextView.setVisibility(View.VISIBLE); + } ((TextView) view.findViewById(R.id.track)).setText(event.getTrack().getName()); Date startTime = event.getStartTime(); @@ -241,9 +247,11 @@ public class EventDetailsFragment extends Fragment { } // Strip HTML description = StringUtils.trimEnd(Html.fromHtml(description)).toString(); - // Add speaker info - description = String.format("%1$s: %2$s\n\n%3$s", getResources().getQuantityString(R.plurals.speakers, personsCount), event.getPersonsSummary(), - description); + // Add speaker info if available + if (personsCount > 0) { + description = String.format("%1$s: %2$s\n\n%3$s", getResources().getQuantityString(R.plurals.speakers, personsCount), event.getPersonsSummary(), + description); + } intent.putExtra(CalendarContract.Events.DESCRIPTION, description); intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, event.getStartTime().getTime()); intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, event.getEndTime().getTime()); @@ -302,19 +310,22 @@ public class EventDetailsFragment extends Fragment { // 1. Persons if (data.persons != null) { personsCount = data.persons.size(); - // Build a list of clickable persons - SpannableStringBuilder sb = new SpannableStringBuilder(); - int length = 0; - for (Person person : data.persons) { - if (length != 0) { - sb.append(", "); + if (personsCount > 0) { + // Build a list of clickable persons + SpannableStringBuilder sb = new SpannableStringBuilder(); + int length = 0; + for (Person person : data.persons) { + if (length != 0) { + sb.append(", "); + } + String name = person.getName(); + sb.append(name); + length = sb.length(); + sb.setSpan(new PersonClickableSpan(person), length - name.length(), length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } - String name = person.getName(); - sb.append(name); - length = sb.length(); - sb.setSpan(new PersonClickableSpan(person), length - name.length(), length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + holder.personsTextView.setText(sb); + holder.personsTextView.setVisibility(View.VISIBLE); } - holder.personsTextView.setText(sb); } // 2. Links diff --git a/src/be/digitalia/fosdem/fragments/TrackScheduleListFragment.java b/src/be/digitalia/fosdem/fragments/TrackScheduleListFragment.java index 537ebb4..d7490e6 100644 --- a/src/be/digitalia/fosdem/fragments/TrackScheduleListFragment.java +++ b/src/be/digitalia/fosdem/fragments/TrackScheduleListFragment.java @@ -13,6 +13,7 @@ import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.text.Spannable; import android.text.SpannableString; +import android.text.TextUtils; import android.text.style.AbsoluteSizeSpan; import android.text.style.StyleSpan; import android.view.LayoutInflater; @@ -189,9 +190,14 @@ public class TrackScheduleListFragment extends ListFragment implements LoaderCal holder.event = event; holder.time.setText(TIME_DATE_FORMAT.format(event.getStartTime())); + SpannableString spannableString; String eventTitle = event.getTitle(); String personsSummary = event.getPersonsSummary(); - SpannableString spannableString = new SpannableString(String.format("%1$s\n%2$s\n%3$s", eventTitle, personsSummary, event.getRoomName())); + if (TextUtils.isEmpty(personsSummary)) { + spannableString = new SpannableString(String.format("%1$s\n%2$s", eventTitle, event.getRoomName())); + } else { + spannableString = new SpannableString(String.format("%1$s\n%2$s\n%3$s", eventTitle, personsSummary, event.getRoomName())); + } spannableString.setSpan(holder.titleSizeSpan, 0, eventTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(holder.boldStyleSpan, 0, eventTitle.length() + personsSummary.length() + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); diff --git a/src/be/digitalia/fosdem/model/Event.java b/src/be/digitalia/fosdem/model/Event.java index a275f8b..13e691c 100644 --- a/src/be/digitalia/fosdem/model/Event.java +++ b/src/be/digitalia/fosdem/model/Event.java @@ -73,7 +73,7 @@ public class Event implements Parcelable { } public String getRoomName() { - return roomName; + return (roomName == null) ? "" : roomName; } public void setRoomName(String roomName) { @@ -133,10 +133,13 @@ public class Event implements Parcelable { } public String getPersonsSummary() { - if ((personsSummary == null) && (persons != null)) { + if (personsSummary != null) { + return personsSummary; + } + if (persons != null) { return TextUtils.join(", ", persons); } - return personsSummary; + return ""; } public void setPersonsSummary(String personsSummary) { diff --git a/src/be/digitalia/fosdem/services/AlarmIntentService.java b/src/be/digitalia/fosdem/services/AlarmIntentService.java index 266a666..ab6f168 100644 --- a/src/be/digitalia/fosdem/services/AlarmIntentService.java +++ b/src/be/digitalia/fosdem/services/AlarmIntentService.java @@ -15,6 +15,7 @@ import android.net.Uri; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; +import android.text.TextUtils; import be.digitalia.fosdem.R; import be.digitalia.fosdem.activities.EventDetailsActivity; import be.digitalia.fosdem.activities.MainActivity; @@ -139,10 +140,17 @@ public class AlarmIntentService extends IntentService { defaultFlags |= Notification.DEFAULT_LIGHTS; } + String personsSummary = event.getPersonsSummary(); + String contentText; + if (TextUtils.isEmpty(personsSummary)) { + contentText = event.getTrack().getName(); + } else { + contentText = String.format("%1$s - %2$s", event.getTrack().getName(), personsSummary); + } + Notification notification = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher).setWhen(event.getStartTime().getTime()) - .setContentTitle(event.getTitle()).setContentText(String.format("%1$s - %2$s", event.getTrack().getName(), event.getPersonsSummary())) - .setContentInfo(event.getRoomName()).setContentIntent(eventPendingIntent).setAutoCancel(true).setDefaults(defaultFlags) - .setPriority(NotificationCompat.PRIORITY_DEFAULT).build(); + .setContentTitle(event.getTitle()).setContentText(contentText).setContentInfo(event.getRoomName()).setContentIntent(eventPendingIntent) + .setAutoCancel(true).setDefaults(defaultFlags).setPriority(NotificationCompat.PRIORITY_DEFAULT).build(); notificationManager.notify(eventId, notification); }