mirror of
https://github.com/MatomoCamp/matomocamp-companion-android.git
synced 2024-09-19 16:13:46 +02:00
Highlight date-time in bookmarks list for conflicting schedules
Fixes #4
This commit is contained in:
parent
61f407a6d2
commit
b6a3f7e1af
5 changed files with 95 additions and 4 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,8 +20,8 @@ import be.digitalia.fosdem.utils.DateUtils;
|
||||||
|
|
||||||
public class EventsAdapter extends CursorAdapter {
|
public class EventsAdapter extends CursorAdapter {
|
||||||
|
|
||||||
private final LayoutInflater inflater;
|
protected final LayoutInflater inflater;
|
||||||
private final DateFormat timeDateFormat;
|
protected final DateFormat timeDateFormat;
|
||||||
private final boolean showDay;
|
private final boolean showDay;
|
||||||
|
|
||||||
public EventsAdapter(Context context) {
|
public EventsAdapter(Context context) {
|
||||||
|
@ -81,7 +81,7 @@ public class EventsAdapter extends CursorAdapter {
|
||||||
holder.details.setText(details);
|
holder.details.setText(details);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ViewHolder {
|
protected static class ViewHolder {
|
||||||
TextView title;
|
TextView title;
|
||||||
TextView persons;
|
TextView persons;
|
||||||
TextView trackName;
|
TextView trackName;
|
||||||
|
|
|
@ -713,6 +713,10 @@ public class DatabaseManager {
|
||||||
return cursor.isNull(1) ? -1L : cursor.getLong(1);
|
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) {
|
public static boolean toBookmarkStatus(Cursor cursor) {
|
||||||
return !cursor.isNull(14);
|
return !cursor.isNull(14);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import android.widget.ListView;
|
||||||
|
|
||||||
import be.digitalia.fosdem.R;
|
import be.digitalia.fosdem.R;
|
||||||
import be.digitalia.fosdem.activities.EventDetailsActivity;
|
import be.digitalia.fosdem.activities.EventDetailsActivity;
|
||||||
|
import be.digitalia.fosdem.adapters.BookmarksAdapter;
|
||||||
import be.digitalia.fosdem.adapters.EventsAdapter;
|
import be.digitalia.fosdem.adapters.EventsAdapter;
|
||||||
import be.digitalia.fosdem.db.DatabaseManager;
|
import be.digitalia.fosdem.db.DatabaseManager;
|
||||||
import be.digitalia.fosdem.loaders.SimpleCursorLoader;
|
import be.digitalia.fosdem.loaders.SimpleCursorLoader;
|
||||||
|
@ -42,7 +43,7 @@ public class BookmarksListFragment extends SmoothListFragment implements LoaderC
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
adapter = new EventsAdapter(getActivity());
|
adapter = new BookmarksAdapter(getActivity());
|
||||||
setListAdapter(adapter);
|
setListAdapter(adapter);
|
||||||
|
|
||||||
upcomingOnly = getActivity().getPreferences(Context.MODE_PRIVATE).getBoolean(PREF_UPCOMING_ONLY, false);
|
upcomingOnly = getActivity().getPreferences(Context.MODE_PRIVATE).getBoolean(PREF_UPCOMING_ONLY, false);
|
||||||
|
|
|
@ -10,5 +10,6 @@
|
||||||
<color name="translucent_grey">#0c000000</color>
|
<color name="translucent_grey">#0c000000</color>
|
||||||
<color name="schedule_time_background">#29000000</color>
|
<color name="schedule_time_background">#29000000</color>
|
||||||
<color name="schedule_time_running_background">#d6000000</color>
|
<color name="schedule_time_running_background">#d6000000</color>
|
||||||
|
<color name="error_material">#dd2c00</color>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in a new issue