Implement ability to stop stopwatch in both app and notification
This commit is contained in:
parent
8438060ac8
commit
ad7335c6d6
@ -283,26 +283,6 @@ public class StopwatchFragment extends RecyclerViewFragment<
|
|||||||
|
|
||||||
@OnClick(R.id.stop)
|
@OnClick(R.id.stop)
|
||||||
void stop() {
|
void stop() {
|
||||||
mChronometer.stop();
|
|
||||||
mChronometer.setBase(SystemClock.elapsedRealtime());
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// TOneverDO: Precede these with mProgressAnimator.end(), otherwise our
|
|
||||||
// Animator.onAnimationEnd() callback won't hide SeekBar in time.
|
|
||||||
mStartTime = 0;
|
|
||||||
mPauseTime = 0;
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
mCurrentLap = null;
|
|
||||||
mPreviousLap = null;
|
|
||||||
// No issues controlling the animator here, because onLoadFinished() can't
|
|
||||||
// call through to startNewProgressBarAnimator(), because by that point
|
|
||||||
// the chronometer won't be running.
|
|
||||||
if (mProgressAnimator != null) {
|
|
||||||
mProgressAnimator.end();
|
|
||||||
}
|
|
||||||
mProgressAnimator = null;
|
|
||||||
setMiniFabsVisible(false);
|
|
||||||
syncFabIconWithStopwatchState(false);
|
|
||||||
|
|
||||||
// Remove the notification. This will also write to prefs and clear the laps table.
|
// Remove the notification. This will also write to prefs and clear the laps table.
|
||||||
//
|
//
|
||||||
// The service will make changes to shared prefs, which will fire our
|
// The service will make changes to shared prefs, which will fire our
|
||||||
@ -364,6 +344,28 @@ public class StopwatchFragment extends RecyclerViewFragment<
|
|||||||
syncFabIconWithStopwatchState(true);
|
syncFabIconWithStopwatchState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void resetStopwatch() {
|
||||||
|
mChronometer.stop();
|
||||||
|
mChronometer.setBase(SystemClock.elapsedRealtime());
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// TOneverDO: Precede these with mProgressAnimator.end(), otherwise our
|
||||||
|
// Animator.onAnimationEnd() callback won't hide SeekBar in time.
|
||||||
|
mStartTime = 0;
|
||||||
|
mPauseTime = 0;
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
mCurrentLap = null;
|
||||||
|
mPreviousLap = null;
|
||||||
|
// No issues controlling the animator here, because onLoadFinished() can't
|
||||||
|
// call through to startNewProgressBarAnimator(), because by that point
|
||||||
|
// the chronometer won't be running.
|
||||||
|
if (mProgressAnimator != null) {
|
||||||
|
mProgressAnimator.end();
|
||||||
|
}
|
||||||
|
mProgressAnimator = null;
|
||||||
|
setMiniFabsVisible(false);
|
||||||
|
syncFabIconWithStopwatchState(false);
|
||||||
|
}
|
||||||
|
|
||||||
private void setMiniFabsVisible(boolean visible) {
|
private void setMiniFabsVisible(boolean visible) {
|
||||||
int vis = visible ? View.VISIBLE : View.INVISIBLE;
|
int vis = visible ? View.VISIBLE : View.INVISIBLE;
|
||||||
mNewLapButton.setVisibility(vis);
|
mNewLapButton.setVisibility(vis);
|
||||||
@ -456,13 +458,6 @@ public class StopwatchFragment extends RecyclerViewFragment<
|
|||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
Log.d(TAG, "Pref " + key + " changed");
|
Log.d(TAG, "Pref " + key + " changed");
|
||||||
// int instead of boolean because -1 indicates "uninitialized" better than false
|
|
||||||
// TODO: I think we should read the KEY_CHRONOMETER_RUNNING flag instead, espeicially
|
|
||||||
// when we refactor the stop() method to be called here. The only reason clicking
|
|
||||||
// on the stop fab is doing what we expect is because we control everything there.
|
|
||||||
// int setRunningFlag = -1;
|
|
||||||
// boolean running = sharedPreferences.getBoolean(key, false);
|
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case KEY_CHRONOMETER_RUNNING:
|
case KEY_CHRONOMETER_RUNNING:
|
||||||
// The value of running tells us what state the stopwatch *should be set to*.
|
// The value of running tells us what state the stopwatch *should be set to*.
|
||||||
@ -471,6 +466,20 @@ public class StopwatchFragment extends RecyclerViewFragment<
|
|||||||
runStopwatch();
|
runStopwatch();
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "Pausing stopwatch");
|
Log.d(TAG, "Pausing stopwatch");
|
||||||
|
// TODO: If your claim that there is no defined order with which this
|
||||||
|
// callback fires is true, then you need to be wary of the following
|
||||||
|
// scenario:
|
||||||
|
// The value of KEY_START_TIME is changed to zero, and happens before the
|
||||||
|
// change to the value of KEY_CHRONOMETER_RUNNING. Therefore, resetStopwatch()
|
||||||
|
// is called, and within that call, mCurrentLap is set to null. When the
|
||||||
|
// value of KEY_CHRONOMETER_RUNNING changes to false sometime later in the future,
|
||||||
|
// pauseStopwatch() is called, and within that call, mCurrentLap.pause() is
|
||||||
|
// called--this will result in a NPE.
|
||||||
|
//
|
||||||
|
// However, it appears the change to the value of KEY_CHRONOMETER_RUNNING
|
||||||
|
// always happens first. So pauseStopwatch() is called first, and then
|
||||||
|
// resetStopwatch() follows shortly after. This is acceptable and produces
|
||||||
|
// the desired result.
|
||||||
pauseStopwatch();
|
pauseStopwatch();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -480,7 +489,8 @@ public class StopwatchFragment extends RecyclerViewFragment<
|
|||||||
// the change to that value may not have occurred before this point;
|
// the change to that value may not have occurred before this point;
|
||||||
// we cannot rely on there being a defined order with which this callback fires.
|
// we cannot rely on there being a defined order with which this callback fires.
|
||||||
if (sharedPreferences.getLong(key, 0) == 0) {
|
if (sharedPreferences.getLong(key, 0) == 0) {
|
||||||
stop();
|
Log.d(TAG, "Resetting stopwatch");
|
||||||
|
resetStopwatch();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_PAUSE_TIME:
|
case KEY_PAUSE_TIME:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user