package be.digitalia.fosdem.activities; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.NavUtils; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; 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; import be.digitalia.fosdem.fragments.RoomImageDialogFragment; import be.digitalia.fosdem.fragments.TrackScheduleListFragment; import be.digitalia.fosdem.model.Day; import be.digitalia.fosdem.model.Event; import be.digitalia.fosdem.model.Track; import be.digitalia.fosdem.utils.NfcUtils; import be.digitalia.fosdem.utils.NfcUtils.CreateNfcAppDataCallback; import be.digitalia.fosdem.utils.ThemeUtils; /** * Track Schedule container, works in both single pane and dual pane modes. * * @author Christophe Beyls */ public class TrackScheduleActivity extends AppCompatActivity implements TrackScheduleListFragment.Callbacks, EventDetailsFragment.FloatingActionButtonProvider, CreateNfcAppDataCallback { public static final String EXTRA_DAY = "day"; public static final String EXTRA_TRACK = "track"; // Optional extra used as a hint for up navigation from an event public static final String EXTRA_FROM_EVENT_ID = "from_event_id"; private Day day; private Track track; 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); ActionBar bar = getSupportActionBar(); bar.setDisplayHomeAsUpEnabled(true); bar.setTitle(track.toString()); bar.setSubtitle(day.toString()); setTitle(String.format("%1$s, %2$s", track.toString(), day.toString())); ThemeUtils.setActionBarTrackColor(this, track.getType()); isTabletLandscape = getResources().getBoolean(R.bool.tablet_landscape); TrackScheduleListFragment trackScheduleListFragment; FragmentManager fm = getSupportFragmentManager(); if (savedInstanceState == null) { long fromEventId = extras.getLong(EXTRA_FROM_EVENT_ID, -1L); if (fromEventId != -1L) { trackScheduleListFragment = TrackScheduleListFragment.newInstance(day, track, fromEventId); } else { trackScheduleListFragment = TrackScheduleListFragment.newInstance(day, track); } fm.beginTransaction().add(R.id.schedule, trackScheduleListFragment).commit(); } else { trackScheduleListFragment = (TrackScheduleListFragment) fm.findFragmentById(R.id.schedule); // Cleanup after switching from dual pane to single pane mode if (!isTabletLandscape) { FragmentTransaction ft = null; Fragment eventDetailsFragment = fm.findFragmentById(R.id.event); if (eventDetailsFragment != null) { ft = fm.beginTransaction(); ft.remove(eventDetailsFragment); } Fragment roomImageDialogFragment = fm.findFragmentByTag(RoomImageDialogFragment.TAG); if (roomImageDialogFragment != null) { if (ft == null) { ft = fm.beginTransaction(); } ft.remove(roomImageDialogFragment); } if (ft != null) { ft.commit(); } } } trackScheduleListFragment.setSelectionEnabled(isTabletLandscape); if (isTabletLandscape) { // Enable Android Beam NfcUtils.setAppDataPushMessageCallbackIfAvailable(this, this); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return false; } // TrackScheduleListFragment.Callbacks @Override public void onEventSelected(int position, Event event) { if (isTabletLandscape) { // Tablet mode: Show event details in the right pane fragment lastSelectedEvent = event; FragmentManager fm = getSupportFragmentManager(); EventDetailsFragment currentFragment = (EventDetailsFragment) fm.findFragmentById(R.id.event); if (event != null) { // Only replace the fragment if the event is different if ((currentFragment == null) || !currentFragment.getEvent().equals(event)) { Fragment f = EventDetailsFragment.newInstance(event); // Allow state loss since the event fragment will be synchronized with the list selection after activity re-creation fm.beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).replace(R.id.event, f).commitAllowingStateLoss(); } } else { // Nothing is selected because the list is empty if (currentFragment != null) { fm.beginTransaction().remove(currentFragment).commitAllowingStateLoss(); } } } else { // Classic mode: Show event details in a new activity Intent intent = new Intent(this, TrackScheduleEventActivity.class); intent.putExtra(TrackScheduleEventActivity.EXTRA_DAY, day); intent.putExtra(TrackScheduleEventActivity.EXTRA_TRACK, track); intent.putExtra(TrackScheduleEventActivity.EXTRA_POSITION, position); 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(); } }