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