package com.ianhanniballake.contractiontimer.ui;
import android.content.ContentUris;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.crash.FirebaseCrash;
import com.ianhanniballake.contractiontimer.BuildConfig;
import com.ianhanniballake.contractiontimer.R;
import com.ianhanniballake.contractiontimer.provider.ContractionContract;
import com.ianhanniballake.contractiontimer.provider.ContractionContract.Contractions;
/**
* Stand alone activity used to view the details of an individual contraction
*/
public class ViewActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>,
ViewPager.OnPageChangeListener {
private final static String TAG = ViewActivity.class.getSimpleName();
/**
* Adapter for all contractions
*/
CursorAdapter adapter = null;
/**
* Currently shown page
*/
int currentPosition = -1;
/**
* Pager Adapter to manage view contraction pages
*/
private ViewFragmentPagerAdapter pagerAdapter;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (findViewById(R.id.pager) == null) {
// A null pager means we no longer need this activity
finish();
return;
}
adapter = new CursorAdapter(this, null, 0) {
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
// Nothing to do
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
return null;
}
};
final ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.addOnPageChangeListener(this);
pagerAdapter = new ViewFragmentPagerAdapter(getSupportFragmentManager());
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
return new CursorLoader(this, ContractionContract.Contractions.CONTENT_URI, null, null, null,
Contractions.COLUMN_NAME_START_TIME);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.activity_view, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
adapter.swapCursor(null);
pagerAdapter.notifyDataSetChanged();
}
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
adapter.swapCursor(data);
pagerAdapter.notifyDataSetChanged();
// A null content uri means we should cancel out as we are in an indeterminate state
final Uri contentUri = getIntent() == null ? null : getIntent().getData();
if (contentUri == null) {
finish();
return;
}
final long contractionId;
try {
contractionId = ContentUris.parseId(contentUri);
} catch (final NumberFormatException e) {
if (BuildConfig.DEBUG)
Log.e(TAG, "NumberFormatException in onLoadFinished", e);
else {
FirebaseCrash.report(e);
}
finish();
return;
}
final int count = adapter.getCount();
for (int position = 0; position < count; position++) {
final long id = adapter.getItemId(position);
if (id == contractionId) {
currentPosition = position;
break;
}
}
if (currentPosition == -1)
finish();
final ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
pager.setCurrentItem(currentPosition, false);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (BuildConfig.DEBUG)
Log.d(TAG, "View selected home");
}
return super.onOptionsItemSelected(item);
}
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
// Nothing to do
}
@Override
public void onPageScrollStateChanged(final int state) {
// Nothing to do
}
@Override
public void onPageSelected(final int position) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Swapped to " + position);
currentPosition = position;
final long newContractionId = adapter.getItemId(position);
getIntent().setData(
ContentUris.withAppendedId(ContractionContract.Contractions.CONTENT_ID_URI_BASE, newContractionId));
}
@Override
protected void onResume() {
super.onResume();
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
final boolean isLockPortrait = preferences.getBoolean(Preferences.LOCK_PORTRAIT_PREFERENCE_KEY, getResources()
.getBoolean(R.bool.pref_lock_portrait_default));
if (BuildConfig.DEBUG)
Log.d(TAG, "Lock Portrait: " + isLockPortrait);
if (isLockPortrait)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
else
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
@Override
protected void onStart() {
super.onStart();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0);
ViewCompat.setElevation(findViewById(R.id.pager_title_strip),
getResources().getDimension(R.dimen.action_bar_elevation));
if (getIntent().hasExtra(MainActivity.LAUNCHED_FROM_WIDGET_EXTRA)) {
final String widgetIdentifier = getIntent().getStringExtra(MainActivity.LAUNCHED_FROM_WIDGET_EXTRA);
if (BuildConfig.DEBUG)
Log.d(TAG, "Launched from " + widgetIdentifier);
FirebaseAnalytics.getInstance(this).logEvent(widgetIdentifier + "_view_launch", null);
getIntent().removeExtra(MainActivity.LAUNCHED_FROM_WIDGET_EXTRA);
}
}
/**
* Creates ViewFragments as necessary
*/
private class ViewFragmentPagerAdapter extends FragmentStatePagerAdapter {
/**
* Creates a new ViewFragmentPagerAdapter
*
* @param fm FragmentManager used to manage fragments
*/
public ViewFragmentPagerAdapter(final FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return adapter == null ? 0 : adapter.getCount();
}
@Override
public Fragment getItem(final int position) {
return ViewFragment.createInstance(adapter.getItemId(position));
}
@Override
public CharSequence getPageTitle(final int position) {
if (position + 1 == currentPosition)
return getText(R.string.detail_previous_page);
else if (position - 1 == currentPosition)
return getText(R.string.detail_next_page);
else
return null;
}
}
}