diff --git a/app/src/main/java/be/digitalia/fosdem/adapters/BookmarksAdapter.java b/app/src/main/java/be/digitalia/fosdem/adapters/BookmarksAdapter.java new file mode 100644 index 0000000..423f712 --- /dev/null +++ b/app/src/main/java/be/digitalia/fosdem/adapters/BookmarksAdapter.java @@ -0,0 +1,85 @@ +package be.digitalia.fosdem.adapters; + +import android.content.Context; +import android.database.Cursor; +import android.graphics.Typeface; +import android.support.annotation.ColorInt; +import android.support.v4.content.ContextCompat; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; +import android.view.View; + +import java.util.Date; + +import be.digitalia.fosdem.R; +import be.digitalia.fosdem.db.DatabaseManager; +import be.digitalia.fosdem.model.Event; + +public class BookmarksAdapter extends EventsAdapter { + + @ColorInt + private final int errorColor; + + public BookmarksAdapter(Context context) { + super(context); + errorColor = ContextCompat.getColor(context, R.color.error_material); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + ViewHolder holder = (ViewHolder) view.getTag(); + Event event = DatabaseManager.toEvent(cursor, holder.event); + holder.event = event; + + holder.title.setText(event.getTitle()); + String personsSummary = event.getPersonsSummary(); + holder.persons.setText(personsSummary); + holder.persons.setVisibility(TextUtils.isEmpty(personsSummary) ? View.GONE : View.VISIBLE); + holder.trackName.setText(event.getTrack().getName()); + + Date startTime = event.getStartTime(); + Date endTime = event.getEndTime(); + String startTimeString = (startTime != null) ? timeDateFormat.format(startTime) : "?"; + String endTimeString = (endTime != null) ? timeDateFormat.format(endTime) : "?"; + String details = String.format("%1$s, %2$s ― %3$s | %4$s", event.getDay().getShortName(), startTimeString, endTimeString, event.getRoomName()); + + // Highlight the date and time with error color in case of conflicting schedules + if (isOverlapping(cursor, startTime, endTime)) { + SpannableString detailsSpannable = new SpannableString(details); + int endPosition = details.indexOf(" | "); + detailsSpannable.setSpan(new ForegroundColorSpan(errorColor), 0, endPosition, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + detailsSpannable.setSpan(new StyleSpan(Typeface.BOLD), 0, endPosition, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + holder.details.setText(detailsSpannable); + } else { + holder.details.setText(details); + } + } + + /** + * Checks if the current event is overlapping with the previous or next one. + */ + public static boolean isOverlapping(Cursor cursor, Date startTime, Date endTime) { + final int position = cursor.getPosition(); + + if ((startTime != null) && (position > 0) && cursor.moveToPosition(position - 1)) { + long previousEndTime = DatabaseManager.toEventEndTimeMillis(cursor); + if ((previousEndTime != -1L) && (previousEndTime > startTime.getTime())) { + // The event overlaps with the previous one + return true; + } + } + + if ((endTime != null) && (position < (cursor.getCount() - 1)) && cursor.moveToPosition(position + 1)) { + long nextStartTime = DatabaseManager.toEventStartTimeMillis(cursor); + if ((nextStartTime != -1L) && (nextStartTime < endTime.getTime())) { + // The event overlaps with the next one + return true; + } + } + + return false; + } +} diff --git a/app/src/main/java/be/digitalia/fosdem/adapters/EventsAdapter.java b/app/src/main/java/be/digitalia/fosdem/adapters/EventsAdapter.java index e82ba7c..c7dd23d 100644 --- a/app/src/main/java/be/digitalia/fosdem/adapters/EventsAdapter.java +++ b/app/src/main/java/be/digitalia/fosdem/adapters/EventsAdapter.java @@ -20,8 +20,8 @@ import be.digitalia.fosdem.utils.DateUtils; public class EventsAdapter extends CursorAdapter { - private final LayoutInflater inflater; - private final DateFormat timeDateFormat; + protected final LayoutInflater inflater; + protected final DateFormat timeDateFormat; private final boolean showDay; public EventsAdapter(Context context) { @@ -81,7 +81,7 @@ public class EventsAdapter extends CursorAdapter { holder.details.setText(details); } - private static class ViewHolder { + protected static class ViewHolder { TextView title; TextView persons; TextView trackName; diff --git a/app/src/main/java/be/digitalia/fosdem/db/DatabaseManager.java b/app/src/main/java/be/digitalia/fosdem/db/DatabaseManager.java index 4924339..2b3f3c1 100644 --- a/app/src/main/java/be/digitalia/fosdem/db/DatabaseManager.java +++ b/app/src/main/java/be/digitalia/fosdem/db/DatabaseManager.java @@ -713,6 +713,10 @@ public class DatabaseManager { return cursor.isNull(1) ? -1L : cursor.getLong(1); } + public static long toEventEndTimeMillis(Cursor cursor) { + return cursor.isNull(2) ? -1L : cursor.getLong(2); + } + public static boolean toBookmarkStatus(Cursor cursor) { return !cursor.isNull(14); } diff --git a/app/src/main/java/be/digitalia/fosdem/fragments/BookmarksListFragment.java b/app/src/main/java/be/digitalia/fosdem/fragments/BookmarksListFragment.java index d5db4a9..526d0b8 100644 --- a/app/src/main/java/be/digitalia/fosdem/fragments/BookmarksListFragment.java +++ b/app/src/main/java/be/digitalia/fosdem/fragments/BookmarksListFragment.java @@ -16,6 +16,7 @@ import android.widget.ListView; import be.digitalia.fosdem.R; import be.digitalia.fosdem.activities.EventDetailsActivity; +import be.digitalia.fosdem.adapters.BookmarksAdapter; import be.digitalia.fosdem.adapters.EventsAdapter; import be.digitalia.fosdem.db.DatabaseManager; import be.digitalia.fosdem.loaders.SimpleCursorLoader; @@ -42,7 +43,7 @@ public class BookmarksListFragment extends SmoothListFragment implements LoaderC public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - adapter = new EventsAdapter(getActivity()); + adapter = new BookmarksAdapter(getActivity()); setListAdapter(adapter); upcomingOnly = getActivity().getPreferences(Context.MODE_PRIVATE).getBoolean(PREF_UPCOMING_ONLY, false); diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2738f36..85ad9d0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,5 +10,6 @@ #0c000000 #29000000 #d6000000 + #dd2c00 \ No newline at end of file