Remove mStartTime and mPauseTime instance variables and read those values from SharedPreferences. Fix bug where SeekBar became visible on rotation with a lap progress ratio of zero. Fix bug where mini FABs became invisible on rotation with the stopwatch started.

This commit is contained in:
Phillip Hsu 2016-09-16 00:27:29 -07:00
parent c6c0ba69a3
commit 698892419b

View File

@ -43,10 +43,6 @@ public class StopwatchFragment extends RecyclerViewFragment<
static final String KEY_PAUSE_TIME = "pause_time";
static final String KEY_CHRONOMETER_RUNNING = "chronometer_running";
// TODO: See if we can remove these? Since we save prefs in the notif. service.
private long mStartTime;
private long mPauseTime;
private ObjectAnimator mProgressAnimator;
private SharedPreferences mPrefs;
private WeakReference<FloatingActionButton> mActivityFab;
@ -67,8 +63,6 @@ public class StopwatchFragment extends RecyclerViewFragment<
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
mStartTime = mPrefs.getLong(KEY_START_TIME, 0);
mPauseTime = mPrefs.getLong(KEY_PAUSE_TIME, 0);
// TODO: Will these be kept alive after onDestroyView()? If not, we should move these to
// onCreateView() or any other callback that is guaranteed to be called.
mStartDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.ic_start_24dp);
@ -84,13 +78,15 @@ public class StopwatchFragment extends RecyclerViewFragment<
View view = super.onCreateView(inflater, container, savedInstanceState);
mChronometer.setShowCentiseconds(true, true);
if (mStartTime > 0) {
long base = mStartTime;
if (mPauseTime > 0) {
base += SystemClock.elapsedRealtime() - mPauseTime;
// We're not done pausing yet, so don't reset mPauseTime.
long startTime = getLongFromPref(KEY_START_TIME);
long pauseTime = getLongFromPref(KEY_PAUSE_TIME);
// If we have a nonzero startTime from a previous session, restore it as
// the chronometer's base. Otherwise, leave the default base.
if (startTime > 0) {
if (pauseTime > 0) {
startTime += SystemClock.elapsedRealtime() - pauseTime;
}
mChronometer.setBase(base);
mChronometer.setBase(startTime);
}
if (isStopwatchRunning()) {
mChronometer.start();
@ -103,7 +99,7 @@ public class StopwatchFragment extends RecyclerViewFragment<
// would have hidden the mini FABs, if not for us already setting its
// visibility to invisible in XML. We haven't initialized the WeakReference to
// our Activity's FAB yet, so this call does nothing with the FAB.
setMiniFabsVisible(isStopwatchRunning());
setMiniFabsVisible(startTime > 0);
mPrefs.registerOnSharedPreferenceChangeListener(mPrefChangeListener);
return view;
}
@ -152,8 +148,7 @@ public class StopwatchFragment extends RecyclerViewFragment<
super.onDestroyView();
// Every view that was in our tree is dereferenced for us.
// The reason we can control the animator here is because members
// are not dereferenced here, as evidenced by mStartTime and mPauseTime
// retaining their values.
// are not dereferenced here.
if (mProgressAnimator != null) {
mProgressAnimator.removeAllListeners();
}
@ -208,9 +203,16 @@ public class StopwatchFragment extends RecyclerViewFragment<
} else {
// I verified the bar was visible already without this, so we probably don't need this,
// but it's just a safety measure..
// ACTUALLY NOT A SAFETY MEASURE!
// ACTUALLY NOT A SAFETY MEASURE! TODO: Why was this not acceptable?
// mSeekBar.setVisibility(View.VISIBLE);
ProgressBarUtils.setProgress(mSeekBar, getCurrentLapProgressRatio(currentLap, previousLap));
double ratio = getCurrentLapProgressRatio(currentLap, previousLap);
if (ratio > 0d) {
// TODO: To be consistent with the else case, we could set the visibility
// to VISIBLE if we cared.
ProgressBarUtils.setProgress(mSeekBar, ratio);
} else {
mSeekBar.setVisibility(View.INVISIBLE);
}
}
} else {
mSeekBar.setVisibility(View.INVISIBLE);
@ -223,7 +225,7 @@ public class StopwatchFragment extends RecyclerViewFragment<
syncFabIconWithStopwatchState(!running/*invert the current state*/);
final Intent serviceIntent = new Intent(getActivity(), StopwatchNotificationService.class);
if (mStartTime == 0) {
if (getLongFromPref(KEY_START_TIME) == 0) {
setMiniFabsVisible(true);
// Handle the default action, i.e. post the notification for the first time.
getActivity().startService(serviceIntent);
@ -234,7 +236,7 @@ public class StopwatchFragment extends RecyclerViewFragment<
@Override
public void onPageSelected() {
setMiniFabsVisible(mStartTime > 0);
setMiniFabsVisible(getLongFromPref(KEY_START_TIME) > 0);
syncFabIconWithStopwatchState(isStopwatchRunning());
}
@ -332,6 +334,7 @@ public class StopwatchFragment extends RecyclerViewFragment<
private long remainingTimeBetweenLaps(Lap currentLap, Lap previousLap) {
if (currentLap == null || previousLap == null)
return 0;
// TODO: Should we check if the subtraction results in negative number, and return 0?
return previousLap.elapsed() - currentLap.elapsed();
}
@ -343,6 +346,10 @@ public class StopwatchFragment extends RecyclerViewFragment<
return mChronometer.isRunning() || mPrefs.getBoolean(KEY_CHRONOMETER_RUNNING, false);
}
private long getLongFromPref(String key) {
return mPrefs.getLong(key, 0);
}
private final OnSharedPreferenceChangeListener mPrefChangeListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {