package com.ianhanniballake.contractiontimer.ui; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.os.Bundle; import android.preference.PreferenceManager; 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.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.ianhanniballake.contractiontimer.R; import com.ianhanniballake.contractiontimer.provider.ContractionContract; /** * Fragment which displays the average duration and frequency */ public class ContractionAverageFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(final int id, final Bundle args) { final String[] projection = {ContractionContract.Contractions.COLUMN_NAME_START_TIME, ContractionContract.Contractions.COLUMN_NAME_END_TIME}; final String selection = ContractionContract.Contractions.COLUMN_NAME_START_TIME + ">?"; final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); final long averagesTimeFrame = Long.parseLong(preferences.getString( Preferences.AVERAGE_TIME_FRAME_PREFERENCE_KEY, getString(R.string.pref_average_time_frame_default))); final long timeCutoff = System.currentTimeMillis() - averagesTimeFrame; final String[] selectionArgs = {Long.toString(timeCutoff)}; return new CursorLoader(getActivity(), getActivity().getIntent().getData(), projection, selection, selectionArgs, null); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_contraction_average, container, false); } @Override public void onLoaderReset(final Loader<Cursor> loader) { final View view = getView(); if (view == null) return; final View averageLayout = view.findViewById(R.id.average_layout); final TextView averageDurationView = (TextView) view.findViewById(R.id.average_duration); final TextView averageFrequencyView = (TextView) view.findViewById(R.id.average_frequency); averageLayout.setVisibility(View.GONE); averageDurationView.setText(""); averageFrequencyView.setText(""); } @Override public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) { final View view = getView(); if (view == null) return; final View averageLayout = view.findViewById(R.id.average_layout); final TextView averageDurationView = (TextView) view.findViewById(R.id.average_duration); final TextView averageFrequencyView = (TextView) view.findViewById(R.id.average_frequency); if (data == null || !data.moveToFirst()) { averageLayout.setVisibility(View.GONE); averageDurationView.setText(""); averageFrequencyView.setText(""); return; } double averageDuration = 0; double averageFrequency = 0; int numDurations = 0; int numFrequencies = 0; while (!data.isAfterLast()) { final int startTimeColumnIndex = data .getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_START_TIME); final long startTime = data.getLong(startTimeColumnIndex); final int endTimeColumnIndex = data.getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_END_TIME); if (!data.isNull(endTimeColumnIndex)) { final long endTime = data.getLong(endTimeColumnIndex); final long curDuration = endTime - startTime; averageDuration = (curDuration + numDurations * averageDuration) / (numDurations + 1); numDurations++; } if (data.moveToNext()) { final int prevContractionStartTimeColumnIndex = data .getColumnIndex(ContractionContract.Contractions.COLUMN_NAME_START_TIME); final long prevContractionStartTime = data.getLong(prevContractionStartTimeColumnIndex); final long curFrequency = startTime - prevContractionStartTime; averageFrequency = (curFrequency + numFrequencies * averageFrequency) / (numFrequencies + 1); numFrequencies++; } } averageLayout.setVisibility(View.VISIBLE); final long averageDurationInSeconds = (long) (averageDuration / 1000); averageDurationView.setText(DateUtils.formatElapsedTime(averageDurationInSeconds)); final long averageFrequencyInSeconds = (long) (averageFrequency / 1000); averageFrequencyView.setText(DateUtils.formatElapsedTime(averageFrequencyInSeconds)); } @Override public void onResume() { super.onResume(); final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); final boolean averageTimeFrameChanged = preferences.getBoolean( Preferences.AVERAGE_TIME_FRAME_CHANGED_FRAGMENT_PREFERENCE_KEY, false); if (averageTimeFrameChanged) { final Editor editor = preferences.edit(); editor.remove(Preferences.AVERAGE_TIME_FRAME_CHANGED_FRAGMENT_PREFERENCE_KEY); editor.commit(); getLoaderManager().restartLoader(0, null, this); } } }