diff --git a/app/src/main/java/be/digitalia/fosdem/activities/TrackScheduleActivity.java b/app/src/main/java/be/digitalia/fosdem/activities/TrackScheduleActivity.java index cef0207..6dc48d2 100644 --- a/app/src/main/java/be/digitalia/fosdem/activities/TrackScheduleActivity.java +++ b/app/src/main/java/be/digitalia/fosdem/activities/TrackScheduleActivity.java @@ -10,6 +10,7 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import android.widget.ImageView; import be.digitalia.fosdem.R; import be.digitalia.fosdem.fragments.EventDetailsFragment; @@ -26,7 +27,10 @@ import be.digitalia.fosdem.utils.NfcUtils.CreateNfcAppDataCallback; * * @author Christophe Beyls */ -public class TrackScheduleActivity extends ActionBarActivity implements TrackScheduleListFragment.Callbacks, CreateNfcAppDataCallback { +public class TrackScheduleActivity extends ActionBarActivity + implements TrackScheduleListFragment.Callbacks, + EventDetailsFragment.FloatingActionButtonProvider, + CreateNfcAppDataCallback { public static final String EXTRA_DAY = "day"; public static final String EXTRA_TRACK = "track"; @@ -38,12 +42,16 @@ public class TrackScheduleActivity extends ActionBarActivity implements TrackSch private boolean isTabletLandscape; private Event lastSelectedEvent; + private ImageView floatingActionButton; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.track_schedule); setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + floatingActionButton = (ImageView) findViewById(R.id.fab); + Bundle extras = getIntent().getExtras(); day = extras.getParcelable(EXTRA_DAY); track = extras.getParcelable(EXTRA_TRACK); @@ -101,14 +109,6 @@ public class TrackScheduleActivity extends ActionBarActivity implements TrackSch } } - @Override - public byte[] createNfcAppData() { - if (lastSelectedEvent == null) { - return null; - } - return String.valueOf(lastSelectedEvent.getId()).getBytes(); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -119,6 +119,8 @@ public class TrackScheduleActivity extends ActionBarActivity implements TrackSch return false; } + // TrackScheduleListFragment.Callbacks + @Override public void onEventSelected(int position, Event event) { if (isTabletLandscape) { @@ -149,4 +151,21 @@ public class TrackScheduleActivity extends ActionBarActivity implements TrackSch startActivity(intent); } } + + // EventDetailsFragment.FloatingActionButtonProvider + + @Override + public ImageView getActionButton() { + return floatingActionButton; + } + + // CreateNfcAppDataCallback + + @Override + public byte[] createNfcAppData() { + if (lastSelectedEvent == null) { + return null; + } + return String.valueOf(lastSelectedEvent.getId()).getBytes(); + } } diff --git a/app/src/main/java/be/digitalia/fosdem/fragments/EventDetailsFragment.java b/app/src/main/java/be/digitalia/fosdem/fragments/EventDetailsFragment.java index c4049c1..f7d4967 100644 --- a/app/src/main/java/be/digitalia/fosdem/fragments/EventDetailsFragment.java +++ b/app/src/main/java/be/digitalia/fosdem/fragments/EventDetailsFragment.java @@ -1,6 +1,7 @@ package be.digitalia.fosdem.fragments; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -27,6 +28,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import java.text.DateFormat; @@ -47,6 +49,14 @@ import be.digitalia.fosdem.utils.StringUtils; public class EventDetailsFragment extends Fragment { + /** + * Interface implemented by container activities + */ + public interface FloatingActionButtonProvider { + // May return null + ImageView getActionButton(); + } + private static class EventDetails { List persons; List links; @@ -71,6 +81,7 @@ public class EventDetailsFragment extends Fragment { private ViewHolder holder; private MenuItem bookmarkMenuItem; + private ImageView actionButton; public static EventDetailsFragment newInstance(Event event) { EventDetailsFragment f = new EventDetailsFragment(); @@ -84,7 +95,6 @@ public class EventDetailsFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); event = getArguments().getParcelable(ARG_EVENT); - setHasOptionsMenu(true); } public Event getEvent() { @@ -165,47 +175,100 @@ public class EventDetailsFragment extends Fragment { return view; } - @Override - public void onDestroyView() { - super.onDestroyView(); - holder = null; - } - @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + Activity activity = getActivity(); + if (activity instanceof FloatingActionButtonProvider) { + actionButton = ((FloatingActionButtonProvider) activity).getActionButton(); + if (actionButton != null) { + actionButton.setOnClickListener(actionButtonClickListener); + } + } + + // Ensure the actionButton is initialized before creating the options menu + setHasOptionsMenu(true); + LoaderManager loaderManager = getLoaderManager(); loaderManager.initLoader(BOOKMARK_STATUS_LOADER_ID, null, bookmarkStatusLoaderCallbacks); loaderManager.initLoader(EVENT_DETAILS_LOADER_ID, null, eventDetailsLoaderCallbacks); } + private final View.OnClickListener actionButtonClickListener = new View.OnClickListener() { + + @Override + public void onClick(View view) { + if (isBookmarked != null) { + new UpdateBookmarkAsyncTask(event).execute(isBookmarked); + } + } + }; + + @Override + public void onDestroyView() { + super.onDestroyView(); + holder = null; + if (actionButton != null) { + // Clear the reference to this fragment + actionButton.setOnClickListener(null); + actionButton = null; + } + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.event, menu); menu.findItem(R.id.share).setIntent(getShareChooserIntent()); bookmarkMenuItem = menu.findItem(R.id.bookmark); + if (actionButton != null) { + bookmarkMenuItem.setEnabled(false).setVisible(false); + } updateOptionsMenu(); } private Intent getShareChooserIntent() { - return ShareCompat.IntentBuilder.from(getActivity()).setSubject(String.format("%1$s (FOSDEM)", event.getTitle())).setType("text/plain") - .setText(String.format("%1$s %2$s #FOSDEM", event.getTitle(), event.getUrl())).setChooserTitle(R.string.share).createChooserIntent(); + return ShareCompat.IntentBuilder.from(getActivity()) + .setSubject(String.format("%1$s (FOSDEM)", event.getTitle())) + .setType("text/plain") + .setText(String.format("%1$s %2$s #FOSDEM", event.getTitle(), event.getUrl())) + .setChooserTitle(R.string.share) + .createChooserIntent(); } private void updateOptionsMenu() { - if (bookmarkMenuItem != null) { + if (actionButton != null) { + // Action Button is used as bookmark button + if (isBookmarked == null) { - bookmarkMenuItem.setEnabled(false); + actionButton.setEnabled(false); } else { - bookmarkMenuItem.setEnabled(true); + actionButton.setEnabled(true); if (isBookmarked) { - bookmarkMenuItem.setTitle(R.string.remove_bookmark); - bookmarkMenuItem.setIcon(R.drawable.ic_bookmark_white_24dp); + actionButton.setContentDescription(getString(R.string.remove_bookmark)); + actionButton.setImageResource(R.drawable.ic_bookmark_white_24dp); } else { - bookmarkMenuItem.setTitle(R.string.add_bookmark); - bookmarkMenuItem.setIcon(R.drawable.ic_bookmark_outline_white_24dp); + actionButton.setContentDescription(getString(R.string.add_bookmark)); + actionButton.setImageResource(R.drawable.ic_bookmark_outline_white_24dp); + } + } + } else { + // Standard menu item is used as bookmark button + + if (bookmarkMenuItem != null) { + if (isBookmarked == null) { + bookmarkMenuItem.setEnabled(false); + } else { + bookmarkMenuItem.setEnabled(true); + + if (isBookmarked) { + bookmarkMenuItem.setTitle(R.string.remove_bookmark); + bookmarkMenuItem.setIcon(R.drawable.ic_bookmark_white_24dp); + } else { + bookmarkMenuItem.setTitle(R.string.add_bookmark); + bookmarkMenuItem.setIcon(R.drawable.ic_bookmark_outline_white_24dp); + } } } } diff --git a/app/src/main/java/be/digitalia/fosdem/services/AlarmIntentService.java b/app/src/main/java/be/digitalia/fosdem/services/AlarmIntentService.java index 3ecf0a8..f1ca7fa 100644 --- a/app/src/main/java/be/digitalia/fosdem/services/AlarmIntentService.java +++ b/app/src/main/java/be/digitalia/fosdem/services/AlarmIntentService.java @@ -174,7 +174,7 @@ public class AlarmIntentService extends IntentService { bigText = spannableBigText; } - int notificationColor = getResources().getColor(R.color.fosdem_purple); + int notificationColor = getResources().getColor(R.color.color_primary); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_fosdem) diff --git a/app/src/main/res/anim-v21/fab_elevation.xml b/app/src/main/res/anim-v21/fab_elevation.xml new file mode 100644 index 0000000..8fcb5e1 --- /dev/null +++ b/app/src/main/res/anim-v21/fab_elevation.xml @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/fab_background.xml b/app/src/main/res/drawable-v21/fab_background.xml new file mode 100644 index 0000000..fea05b8 --- /dev/null +++ b/app/src/main/res/drawable-v21/fab_background.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fab_background.xml b/app/src/main/res/drawable/fab_background.xml new file mode 100644 index 0000000..da19fd0 --- /dev/null +++ b/app/src/main/res/drawable/fab_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fab_background_highlighted.xml b/app/src/main/res/drawable/fab_background_highlighted.xml new file mode 100644 index 0000000..6b14b61 --- /dev/null +++ b/app/src/main/res/drawable/fab_background_highlighted.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp-land/track_schedule.xml b/app/src/main/res/layout-sw600dp-land/track_schedule.xml index 3c8adf1..1a166dc 100644 --- a/app/src/main/res/layout-sw600dp-land/track_schedule.xml +++ b/app/src/main/res/layout-sw600dp-land/track_schedule.xml @@ -29,6 +29,14 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="@dimen/schedule_column_width" - android:layout_marginRight="48dp" + android:layout_marginRight="120dp" android:layout_marginTop="64dp"/> + + \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 812ec99..5de7d25 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -8,9 +8,9 @@ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bea46f9..c7cfab5 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,9 +1,9 @@ - #a91991 - #76005e - #3479c4 + #a91991 + #76005e + #3479c4 #663479c4 #323232 #fffafafa diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e718ce1..1a1c40e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -11,5 +11,8 @@ 16dp 8dp 360dp + 56dp + 2dp + 4dp \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d13828b..a29c921 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,9 +4,9 @@ + +