package be.digitalia.fosdem.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.app.NavUtils; import android.support.v4.app.TaskStackBuilder; import android.support.v4.content.Loader; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.widget.Toast; import be.digitalia.fosdem.R; import be.digitalia.fosdem.db.DatabaseManager; import be.digitalia.fosdem.fragments.EventDetailsFragment; import be.digitalia.fosdem.loaders.LocalCacheLoader; import be.digitalia.fosdem.model.Event; import be.digitalia.fosdem.utils.NfcUtils; import be.digitalia.fosdem.utils.NfcUtils.CreateNfcAppDataCallback; import be.digitalia.fosdem.utils.ThemeUtils; /** * Displays a single event passed either as a complete Parcelable object in extras or as an id in data. * * @author Christophe Beyls */ public class EventDetailsActivity extends AppCompatActivity implements LoaderCallbacks<Event>, CreateNfcAppDataCallback { public static final String EXTRA_EVENT = "event"; private static final int EVENT_LOADER_ID = 1; private Event event; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content); ActionBar bar = getSupportActionBar(); bar.setDisplayHomeAsUpEnabled(true); bar.setDisplayShowTitleEnabled(false); Event event = getIntent().getParcelableExtra(EXTRA_EVENT); if (event != null) { // The event has been passed as parameter, it can be displayed immediately initEvent(event); if (savedInstanceState == null) { Fragment f = EventDetailsFragment.newInstance(event); getSupportFragmentManager().beginTransaction().add(R.id.content, f).commit(); } } else { // Load the event from the DB using its id getSupportLoaderManager().initLoader(EVENT_LOADER_ID, null, this); } } /** * Initialize event-related configuration after the event has been loaded. */ private void initEvent(@NonNull Event event) { this.event = event; // Enable up navigation only after getting the event details getSupportActionBar().setDisplayHomeAsUpEnabled(true); ThemeUtils.setActionBarTrackColor(this, event.getTrack().getType()); // Enable Android Beam NfcUtils.setAppDataPushMessageCallbackIfAvailable(this, this); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // Navigate up to the track associated with this event Intent upIntent = new Intent(this, TrackScheduleActivity.class); upIntent.putExtra(TrackScheduleActivity.EXTRA_DAY, event.getDay()); upIntent.putExtra(TrackScheduleActivity.EXTRA_TRACK, event.getTrack()); upIntent.putExtra(TrackScheduleActivity.EXTRA_FROM_EVENT_ID, event.getId()); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); finish(); } else { // Replicate the compatibility implementation of NavUtils.navigateUpTo() // to ensure the parent Activity is always launched // even if not present on the back stack. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(upIntent); finish(); } return true; } return false; } @Override public byte[] createNfcAppData() { return String.valueOf(event.getId()).getBytes(); } private static class EventLoader extends LocalCacheLoader<Event> { private final long eventId; public EventLoader(Context context, long eventId) { super(context); this.eventId = eventId; } @Override public Event loadInBackground() { return DatabaseManager.getInstance().getEvent(eventId); } } @Override public Loader<Event> onCreateLoader(int id, Bundle args) { Intent intent = getIntent(); String eventIdString; if (NfcUtils.hasAppData(intent)) { // NFC intent eventIdString = new String(NfcUtils.extractAppData(intent)); } else { // Normal in-app intent eventIdString = intent.getDataString(); } return new EventLoader(this, Long.parseLong(eventIdString)); } @Override public void onLoadFinished(Loader<Event> loader, Event data) { if (data == null) { // Event not found, quit Toast.makeText(this, getString(R.string.event_not_found_error), Toast.LENGTH_LONG).show(); finish(); return; } initEvent(data); FragmentManager fm = getSupportFragmentManager(); if (fm.findFragmentById(R.id.content) == null) { Fragment f = EventDetailsFragment.newInstance(data); fm.beginTransaction().add(R.id.content, f).commitAllowingStateLoss(); } } @Override public void onLoaderReset(Loader<Event> loader) { } }