package be.digitalia.fosdem.activities; import android.database.Cursor; import android.os.Bundle; import android.provider.BaseColumns; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.ContextCompat; import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import com.viewpagerindicator.UnderlinePageIndicator; import be.digitalia.fosdem.R; import be.digitalia.fosdem.db.DatabaseManager; import be.digitalia.fosdem.fragments.EventDetailsFragment; import be.digitalia.fosdem.loaders.TrackScheduleLoader; import be.digitalia.fosdem.model.Day; 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; import be.digitalia.fosdem.widgets.ContentLoadingProgressBar; /** * Event view of the track schedule; allows to slide between events of the same track using a ViewPager. * * @author Christophe Beyls */ public class TrackScheduleEventActivity extends AppCompatActivity implements LoaderCallbacks<Cursor>, CreateNfcAppDataCallback { public static final String EXTRA_DAY = "day"; public static final String EXTRA_TRACK = "track"; public static final String EXTRA_POSITION = "position"; private static final int EVENTS_LOADER_ID = 1; private Day day; private Track track; private int initialPosition = -1; private ContentLoadingProgressBar progress; private ViewPager pager; private UnderlinePageIndicator pageIndicator; private TrackScheduleEventAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.track_schedule_event); Bundle extras = getIntent().getExtras(); day = extras.getParcelable(EXTRA_DAY); track = extras.getParcelable(EXTRA_TRACK); progress = (ContentLoadingProgressBar) findViewById(R.id.progress); pager = (ViewPager) findViewById(R.id.pager); adapter = new TrackScheduleEventAdapter(getSupportFragmentManager()); pageIndicator = (UnderlinePageIndicator) findViewById(R.id.indicator); pageIndicator.setSelectedColor(ContextCompat.getColor(this, track.getType().getColorResId())); if (savedInstanceState == null) { initialPosition = extras.getInt(EXTRA_POSITION, -1); pager.setAdapter(adapter); pageIndicator.setViewPager(pager); } ActionBar bar = getSupportActionBar(); bar.setDisplayHomeAsUpEnabled(true); bar.setTitle(track.toString()); bar.setSubtitle(day.toString()); ThemeUtils.setActionBarTrackColor(this, track.getType()); // Enable Android Beam NfcUtils.setAppDataPushMessageCallbackIfAvailable(this, this); setCustomProgressVisibility(true); getSupportLoaderManager().initLoader(EVENTS_LOADER_ID, null, this); } private void setCustomProgressVisibility(boolean isVisible) { if (isVisible) { progress.show(); } else { progress.hide(); } } @Override public byte[] createNfcAppData() { if (adapter.getCount() == 0) { return null; } long eventId = adapter.getItemId(pager.getCurrentItem()); if (eventId == -1L) { return null; } return String.valueOf(eventId).getBytes(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return false; } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new TrackScheduleLoader(this, day, track); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { setCustomProgressVisibility(false); if (data != null) { adapter.setCursor(data); // Delay setting the adapter when the instance state is restored // to ensure the current position is restored properly if (pager.getAdapter() == null) { pager.setAdapter(adapter); pageIndicator.setViewPager(pager); } if (initialPosition != -1) { pager.setCurrentItem(initialPosition, false); initialPosition = -1; } } } @Override public void onLoaderReset(Loader<Cursor> loader) { adapter.setCursor(null); } public static class TrackScheduleEventAdapter extends FragmentStatePagerAdapter { private Cursor cursor; public TrackScheduleEventAdapter(FragmentManager fm) { super(fm); } public Cursor getCursor() { return cursor; } public void setCursor(Cursor cursor) { this.cursor = cursor; notifyDataSetChanged(); } @Override public int getCount() { return (cursor == null) ? 0 : cursor.getCount(); } @Override public Fragment getItem(int position) { cursor.moveToPosition(position); return EventDetailsFragment.newInstance(DatabaseManager.toEvent(cursor)); } public long getItemId(int position) { if (!cursor.moveToPosition(position)) { return -1L; } return cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); } } }