package com.ianhanniballake.contractiontimer.ui;
import android.content.AsyncQueryHandler;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.ianhanniballake.contractiontimer.BuildConfig;
import com.ianhanniballake.contractiontimer.R;
import com.ianhanniballake.contractiontimer.appwidget.AppWidgetUpdateHandler;
import com.ianhanniballake.contractiontimer.notification.NotificationUpdateService;
import com.ianhanniballake.contractiontimer.provider.ContractionContract;
/**
* Fragment which controls starting and stopping the contraction timer
*/
public class ContractionControlsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
private final static String TAG = ContractionControlsFragment.class.getSimpleName();
/**
* Cursor Adapter which holds the latest contraction
*/
CursorAdapter adapter;
/**
* Handler for asynchronous inserts/updates of contractions
*/
AsyncQueryHandler contractionQueryHandler;
private boolean contractionOngoing = false;
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
adapter = new CursorAdapter(getActivity(), 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;
}
};
getLoaderManager().initLoader(0, null, this);
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Context context = getActivity();
contractionQueryHandler = new AsyncQueryHandler(context.getContentResolver()) {
@Override
protected void onInsertComplete(final int token, final Object cookie, final Uri uri) {
AppWidgetUpdateHandler.createInstance().updateAllWidgets(context);
NotificationUpdateService.updateNotification(context);
}
@Override
protected void onUpdateComplete(final int token, final Object cookie, final int result) {
AppWidgetUpdateHandler.createInstance().updateAllWidgets(context);
NotificationUpdateService.updateNotification(context);
}
};
}
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
final String[] projection = {BaseColumns._ID, ContractionContract.Contractions.COLUMN_NAME_START_TIME,
ContractionContract.Contractions.COLUMN_NAME_END_TIME};
return new CursorLoader(getActivity(), getActivity().getIntent().getData(), projection, null, null, null);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
final FloatingActionButton view = (FloatingActionButton)
inflater.inflate(R.layout.fragment_contraction_controls, container, false);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
// Disable the button to ensure we give the database a chance to
// complete the insert/update
view.setEnabled(false);
FirebaseAnalytics analytics = FirebaseAnalytics.getInstance(getContext());
if (!contractionOngoing) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Starting contraction");
analytics.logEvent("control_start", null);
// Start a new contraction
contractionQueryHandler.startInsert(0, null, ContractionContract.Contractions.CONTENT_URI,
new ContentValues());
} else {
if (BuildConfig.DEBUG)
Log.d(TAG, "Stopping contraction");
analytics.logEvent("control_stop", null);
final ContentValues newEndTime = new ContentValues();
newEndTime.put(ContractionContract.Contractions.COLUMN_NAME_END_TIME, System.currentTimeMillis());
final long latestContractionId = adapter.getItemId(0);
final Uri updateUri = ContentUris.withAppendedId(
ContractionContract.Contractions.CONTENT_ID_URI_BASE, latestContractionId);
// Add the new end time to the last contraction
contractionQueryHandler.startUpdate(0, 0, updateUri, newEndTime, null, null);
}
}
});
return view;
}
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
adapter.swapCursor(null);
}
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
adapter.swapCursor(data);
final FloatingActionButton view = (FloatingActionButton) getView();
if (view == null)
return;
view.setEnabled(true);
contractionOngoing = data != null && data.moveToFirst()
&& data.isNull(data.getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_END_TIME));
if (contractionOngoing) {
view.setImageResource(R.drawable.ic_notif_action_stop);
} else {
view.setImageResource(R.drawable.ic_notif_action_start);
}
}
}