1113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
2113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinpackage com.android.deskclock.stopwatch;
3113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
4113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.app.Notification;
5113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.app.Notification.Builder;
6113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.app.NotificationManager;
7113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.app.PendingIntent;
8113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.app.Service;
9113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.content.Context;
10113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.content.Intent;
11113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.content.SharedPreferences;
12113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.os.Build;
13113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.os.IBinder;
14113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.preference.PreferenceManager;
15113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.view.View;
16113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport android.widget.RemoteViews;
17113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
18113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport com.android.deskclock.CircleTimerView;
19113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport com.android.deskclock.DeskClock;
20113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport com.android.deskclock.Log;
21113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport com.android.deskclock.R;
22113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinimport com.android.deskclock.Utils;
23113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
24113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein/**
25113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein * TODO: Insert description here. (generated by sblitz)
26113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein */
27113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzsteinpublic class StopwatchService extends Service {
28113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    // Member fields
29113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private int mNumLaps;
30113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private long mElapsedTime;
31113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private long mStartTime;
32113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private boolean mLoadApp;
33113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private NotificationManager mNotificationManager;
34113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
35113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    // Constants for intent information
369e33fe399ce41766dc0a2d6e8f3e2fef0d30f6c1Robyn Coultas    // Make this a large number to avoid the alarm ID's which seem to be 1, 2, ...
379e33fe399ce41766dc0a2d6e8f3e2fef0d30f6c1Robyn Coultas    // Must also be different than TimerReceiver.IN_USE_NOTIFICATION_ID
389e33fe399ce41766dc0a2d6e8f3e2fef0d30f6c1Robyn Coultas    private static final int NOTIFICATION_ID = Integer.MAX_VALUE - 1;
39113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
40113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    @Override
41113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    public IBinder onBind(Intent intent) {
42113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        return null;
43113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
44113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
45113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    @Override
46113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    public void onCreate() {
47113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mNumLaps = 0;
48113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mElapsedTime = 0;
49113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mStartTime = 0;
50113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mLoadApp = false;
51113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
52113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
53113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
54113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    @Override
55113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    public int onStartCommand(Intent intent, int flags, int startId) {
56113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (intent == null) {
57113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            return Service.START_NOT_STICKY;
58113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
59113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
60113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (mStartTime == 0 || mElapsedTime == 0 || mNumLaps == 0) {
61113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            // May not have the most recent values.
62113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            readFromSharedPrefs();
63113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
64113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
65113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        String actionType = intent.getAction();
66113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        long actionTime = intent.getLongExtra(Stopwatches.MESSAGE_TIME, Utils.getTimeNow());
67113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        boolean showNotif = intent.getBooleanExtra(Stopwatches.SHOW_NOTIF, true);
68113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        boolean updateCircle = showNotif; // Don't save updates to the cirle if we're in the app.
69113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (actionType.equals(Stopwatches.START_STOPWATCH)) {
70113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mStartTime = actionTime;
71113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            writeSharedPrefsStarted(mStartTime, updateCircle);
72113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (showNotif) {
73113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                setNotification(mStartTime - mElapsedTime, true, mNumLaps);
74113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else {
75113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                saveNotification(mStartTime - mElapsedTime, true, mNumLaps);
76113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
77113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else if (actionType.equals(Stopwatches.LAP_STOPWATCH)) {
78113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mNumLaps++;
79113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long lapTimeElapsed = actionTime - mStartTime + mElapsedTime;
80113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            writeSharedPrefsLap(lapTimeElapsed, updateCircle);
81113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (showNotif) {
82113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                setNotification(mStartTime - mElapsedTime, true, mNumLaps);
83113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else {
84113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                saveNotification(mStartTime - mElapsedTime, true, mNumLaps);
85113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
86113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else if (actionType.equals(Stopwatches.STOP_STOPWATCH)) {
87113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mElapsedTime = mElapsedTime + (actionTime - mStartTime);
88113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            writeSharedPrefsStopped(mElapsedTime, updateCircle);
89113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (showNotif) {
90113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                setNotification(actionTime - mElapsedTime, false, mNumLaps);
91113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else {
92113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                saveNotification(mElapsedTime, false, mNumLaps);
93113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
94113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else if (actionType.equals(Stopwatches.RESET_STOPWATCH)) {
95a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            mLoadApp = false;
96a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            writeSharedPrefsReset(updateCircle);
97a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            clearSavedNotification();
98a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            stopSelf();
99a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein        } else if (actionType.equals(Stopwatches.RESET_AND_LAUNCH_STOPWATCH)) {
100a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            mLoadApp = true;
101113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            writeSharedPrefsReset(updateCircle);
102113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            clearSavedNotification();
103113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            closeNotificationShade();
104113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            stopSelf();
105113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else if (actionType.equals(Stopwatches.SHARE_STOPWATCH)) {
106113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            closeNotificationShade();
107113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
108113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            shareIntent.setType("text/plain");
109113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            shareIntent.putExtra(
110113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    Intent.EXTRA_SUBJECT, Stopwatches.getShareTitle(getApplicationContext()));
111113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            shareIntent.putExtra(Intent.EXTRA_TEXT, Stopwatches.buildShareResults(
112113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    getApplicationContext(), mElapsedTime, readLapsFromPrefs()));
113113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent chooserIntent = Intent.createChooser(shareIntent, null);
114113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
115113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            getApplication().startActivity(chooserIntent);
116113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else if (actionType.equals(Stopwatches.SHOW_NOTIF)) {
11745df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas            // SHOW_NOTIF sent from the DeskClock.onPause
11845df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas            // If a notification is not displayed, this service's work is over
11945df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas            if (!showSavedNotification()) {
12045df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas                stopSelf();
12145df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas            }
122113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else if (actionType.equals(Stopwatches.KILL_NOTIF)) {
123113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mNotificationManager.cancel(NOTIFICATION_ID);
124113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
125113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
126113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        // We want this service to continue running until it is explicitly
127113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        // stopped, so return sticky.
128113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        return START_STICKY;
129113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
130113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
131113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    @Override
132113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    public void onDestroy() {
133113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mNotificationManager.cancel(NOTIFICATION_ID);
134113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        clearSavedNotification();
135113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mNumLaps = 0;
136113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mElapsedTime = 0;
137113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mStartTime = 0;
138113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (mLoadApp) {
139113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent activityIntent = new Intent(getApplicationContext(), DeskClock.class);
140113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
141113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            activityIntent.putExtra(
142113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.STOPWATCH_TAB_INDEX);
143113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            startActivity(activityIntent);
144113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mLoadApp = false;
145113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
146113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
147113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
148113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void setNotification(long clockBaseTime, boolean clockRunning, int numLaps) {
149113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        Context context = getApplicationContext();
150113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        // Intent to load the app for a non-button click.
151113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        Intent intent = new Intent(context, DeskClock.class);
152113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
153113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        intent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.STOPWATCH_TAB_INDEX);
154113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
155113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
156113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
157113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        // Set up remoteviews for the notification.
158113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        RemoteViews remoteViewsCollapsed = new RemoteViews(getPackageName(),
159113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                R.layout.stopwatch_notif_collapsed);
160113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        remoteViewsCollapsed.setOnClickPendingIntent(R.id.swn_collapsed_hitspace, pendingIntent);
161113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        remoteViewsCollapsed.setChronometer(
162113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                R.id.swn_collapsed_chronometer, clockBaseTime, null, clockRunning);
163a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein        remoteViewsCollapsed.setImageViewResource(R.id.notification_icon, R.drawable.stat_notify_stopwatch);
164113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        RemoteViews remoteViewsExpanded = new RemoteViews(getPackageName(),
165113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                R.layout.stopwatch_notif_expanded);
166113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_expanded_hitspace, pendingIntent);
167113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        remoteViewsExpanded.setChronometer(
168113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                R.id.swn_expanded_chronometer, clockBaseTime, null, clockRunning);
169a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein        remoteViewsExpanded.setImageViewResource(R.id.notification_icon, R.drawable.stat_notify_stopwatch);
170113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
171113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (clockRunning) {
172113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            // Left button: lap
173113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setTextViewText(
174113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    R.id.swn_left_button, getResources().getText(R.string.sw_lap_button));
175113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent leftButtonIntent = new Intent(context, StopwatchService.class);
176113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            leftButtonIntent.setAction(Stopwatches.LAP_STOPWATCH);
177113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_left_button,
178113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    PendingIntent.getService(context, 0, leftButtonIntent, 0));
1797d308c68d6426048fd851b33b963abe49128c717Sam Blitzstein            remoteViewsExpanded.setTextViewCompoundDrawables(R.id.swn_left_button, R.drawable.ic_notify_lap, 0, 0, 0);
180113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
181113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            // Right button: stop clock
182113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setTextViewText(
183113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    R.id.swn_right_button, getResources().getText(R.string.sw_stop_button));
184113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent rightButtonIntent = new Intent(context, StopwatchService.class);
185113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            rightButtonIntent.setAction(Stopwatches.STOP_STOPWATCH);
186113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_right_button,
187113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    PendingIntent.getService(context, 0, rightButtonIntent, 0));
1887d308c68d6426048fd851b33b963abe49128c717Sam Blitzstein            remoteViewsExpanded.setTextViewCompoundDrawables(R.id.swn_right_button, R.drawable.ic_notify_stop, 0, 0, 0);
189a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein
190a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            // Show the laps if applicable.
191a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            if (numLaps > 0) {
192a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                String lapText = String.format(
193a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                        context.getString(R.string.sw_notification_lap_number), numLaps);
194a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                remoteViewsCollapsed.setTextViewText(R.id.swn_collapsed_laps, lapText);
195a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                remoteViewsCollapsed.setViewVisibility(R.id.swn_collapsed_laps, View.VISIBLE);
196a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                remoteViewsExpanded.setTextViewText(R.id.swn_expanded_laps, lapText);
197a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                remoteViewsExpanded.setViewVisibility(R.id.swn_expanded_laps, View.VISIBLE);
198a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            } else {
199a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                remoteViewsCollapsed.setViewVisibility(R.id.swn_collapsed_laps, View.GONE);
200a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                remoteViewsExpanded.setViewVisibility(R.id.swn_expanded_laps, View.GONE);
201a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            }
202113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else {
203113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            // Left button: reset clock
204113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setTextViewText(
205113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    R.id.swn_left_button, getResources().getText(R.string.sw_reset_button));
206113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent leftButtonIntent = new Intent(context, StopwatchService.class);
207a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            leftButtonIntent.setAction(Stopwatches.RESET_AND_LAUNCH_STOPWATCH);
208113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_left_button,
209113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    PendingIntent.getService(context, 0, leftButtonIntent, 0));
2107d308c68d6426048fd851b33b963abe49128c717Sam Blitzstein            remoteViewsExpanded.setTextViewCompoundDrawables(R.id.swn_left_button, R.drawable.ic_notify_reset, 0, 0, 0);
211113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
212113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            // Right button: start clock
213113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setTextViewText(
214113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    R.id.swn_right_button, getResources().getText(R.string.sw_start_button));
215113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Intent rightButtonIntent = new Intent(context, StopwatchService.class);
216113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            rightButtonIntent.setAction(Stopwatches.START_STOPWATCH);
217113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_right_button,
218113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    PendingIntent.getService(context, 0, rightButtonIntent, 0));
2197d308c68d6426048fd851b33b963abe49128c717Sam Blitzstein            remoteViewsExpanded.setTextViewCompoundDrawables(R.id.swn_right_button, R.drawable.ic_notify_start, 0, 0, 0);
220113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
221a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            // Show stopped string.
222a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            remoteViewsCollapsed.setTextViewText(R.id.swn_collapsed_laps, getString(R.string.swn_stopped));
223a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            remoteViewsCollapsed.setViewVisibility(R.id.swn_collapsed_laps, View.VISIBLE);
224a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            remoteViewsExpanded.setTextViewText(R.id.swn_expanded_laps, getString(R.string.swn_stopped));
225a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein            remoteViewsExpanded.setViewVisibility(R.id.swn_expanded_laps, View.VISIBLE);
226113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
227113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
228a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein        Intent dismissIntent = new Intent(context, StopwatchService.class);
229a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein        dismissIntent.setAction(Stopwatches.RESET_STOPWATCH);
230a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein
231113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        Notification notification = new Notification.Builder(context)
232a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                .setAutoCancel(!clockRunning)
233a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                .setContent(remoteViewsCollapsed)
234a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                .setOngoing(clockRunning)
235a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                .setDeleteIntent(PendingIntent.getService(context, 0, dismissIntent, 0))
236a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                .setSmallIcon(R.drawable.ic_tab_stopwatch_activated)
237a1e56f0e0cd571a4a39019eb0c18c6cfdf9e71e0Sam Blitzstein                .setPriority(Notification.PRIORITY_MAX).build();
238113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        notification.bigContentView = remoteViewsExpanded;
239113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mNotificationManager.notify(NOTIFICATION_ID, notification);
240113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
241113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
242113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    /** Save the notification to be shown when the app is closed. **/
243113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void saveNotification(long clockTime, boolean clockRunning, int numLaps) {
244113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
245113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                getApplicationContext());
246113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences.Editor editor = prefs.edit();
247113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (clockRunning) {
248113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.NOTIF_CLOCK_BASE, clockTime);
249113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.NOTIF_CLOCK_ELAPSED, -1);
250113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, true);
251113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        } else {
252113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.NOTIF_CLOCK_ELAPSED, clockTime);
253113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.NOTIF_CLOCK_BASE, -1);
254113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false);
255113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
256113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.putBoolean(Stopwatches.PREF_UPDATE_CIRCLE, false);
257113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.apply();
258113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
259113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
260113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    /** Show the most recently saved notification. **/
26145df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas    private boolean showSavedNotification() {
262113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
263113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                getApplicationContext());
264113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        long clockBaseTime = prefs.getLong(Stopwatches.NOTIF_CLOCK_BASE, -1);
265113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        long clockElapsedTime = prefs.getLong(Stopwatches.NOTIF_CLOCK_ELAPSED, -1);
266113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        boolean clockRunning = prefs.getBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false);
267113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, -1);
268113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (clockBaseTime == -1) {
269113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (clockElapsedTime == -1) {
27045df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas                return false;
271113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else {
272113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                // We don't have a clock base time, so the clock is stopped.
273113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                // Use the elapsed time to figure out what time to show.
274113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                mElapsedTime = clockElapsedTime;
275113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                clockBaseTime = Utils.getTimeNow() - clockElapsedTime;
276113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
277113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
278113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        setNotification(clockBaseTime, clockRunning, numLaps);
27945df16665f6a945e08455ff8ed6be5dac598d6e1Robyn Coultas        return true;
280113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
281113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
282113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void clearSavedNotification() {
283113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
284113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                getApplicationContext());
285113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences.Editor editor = prefs.edit();
286113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.remove(Stopwatches.NOTIF_CLOCK_BASE);
287113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.remove(Stopwatches.NOTIF_CLOCK_RUNNING);
288113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.remove(Stopwatches.NOTIF_CLOCK_ELAPSED);
289113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.apply();
290113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
291113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
292113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void closeNotificationShade() {
293113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        Intent intent = new Intent();
294113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        intent.setAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
295113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        sendBroadcast(intent);
296113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
297113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
298113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void readFromSharedPrefs() {
299113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
300113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                getApplicationContext());
301113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mStartTime = prefs.getLong(Stopwatches.PREF_START_TIME, 0);
302113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mElapsedTime = prefs.getLong(Stopwatches.PREF_ACCUM_TIME, 0);
303113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        mNumLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, Stopwatches.STOPWATCH_RESET);
304113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
305113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
306113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private long[] readLapsFromPrefs() {
307113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
308113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                getApplicationContext());
309113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, Stopwatches.STOPWATCH_RESET);
310113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        long[] laps = new long[numLaps];
311113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        long prevLapElapsedTime = 0;
312113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        for (int lap_i = 0; lap_i < numLaps; lap_i++) {
313113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            String key = Stopwatches.PREF_LAP_TIME + Integer.toString(lap_i + 1);
314113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long lap = prefs.getLong(key, 0);
315113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (lap == prevLapElapsedTime && lap_i == numLaps - 1) {
316113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                lap = mElapsedTime;
317113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
318113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            laps[numLaps - lap_i - 1] = lap - prevLapElapsedTime;
319113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            prevLapElapsedTime = lap;
320113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
321113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        return laps;
322113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
323113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
324113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void writeToSharedPrefs(Long startTime, Long lapTimeElapsed, Long elapsedTime,
325113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            Integer state, boolean updateCircle) {
326113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
327113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                getApplicationContext());
328113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        SharedPreferences.Editor editor = prefs.edit();
329113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (startTime != null) {
330113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.PREF_START_TIME, startTime);
331113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mStartTime = startTime;
332113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
333113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (lapTimeElapsed != null) {
334113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, 0);
335113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (numLaps == 0) {
336113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                mNumLaps++;
337113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                numLaps++;
338113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
339113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.PREF_LAP_TIME + Integer.toString(numLaps), lapTimeElapsed);
340113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            numLaps++;
341113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.PREF_LAP_TIME + Integer.toString(numLaps), lapTimeElapsed);
342113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putInt(Stopwatches.PREF_LAP_NUM, numLaps);
343113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
344113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (elapsedTime != null) {
345113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.PREF_ACCUM_TIME, elapsedTime);
346113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            mElapsedTime = elapsedTime;
347113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
348113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (state != null) {
349113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (state == Stopwatches.STOPWATCH_RESET) {
350113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_RESET);
351113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else if (state == Stopwatches.STOPWATCH_RUNNING) {
352113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_RUNNING);
353113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else if (state == Stopwatches.STOPWATCH_STOPPED) {
354113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_STOPPED);
355113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
356113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
357113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.putBoolean(Stopwatches.PREF_UPDATE_CIRCLE, updateCircle);
358113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        editor.apply();
359113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
360113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
361113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void writeSharedPrefsStarted(long startTime, boolean updateCircle) {
362113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        writeToSharedPrefs(startTime, null, null, Stopwatches.STOPWATCH_RUNNING, updateCircle);
363113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (updateCircle) {
364113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long time = Utils.getTimeNow();
365113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
366113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    getApplicationContext());
367113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long intervalStartTime = prefs.getLong(
368113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, -1);
369113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (intervalStartTime != -1) {
370113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                intervalStartTime = time;
371113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                SharedPreferences.Editor editor = prefs.edit();
372113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START,
373113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                        intervalStartTime);
374113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putBoolean(Stopwatches.KEY + CircleTimerView.PREF_CTV_PAUSED, false);
375113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.apply();
376113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
377113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
378113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
379113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
380113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void writeSharedPrefsLap(long lapTimeElapsed, boolean updateCircle) {
381113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        writeToSharedPrefs(null, lapTimeElapsed, null, null, updateCircle);
382113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (updateCircle) {
383113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long time = Utils.getTimeNow();
384113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
385113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    getApplicationContext());
386113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            SharedPreferences.Editor editor = prefs.edit();
387113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long laps[] = readLapsFromPrefs();
388113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            int numLaps = laps.length;
389113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long lapTime = laps[1];
390113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (numLaps == 2) { // Have only hit lap once.
391113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL, lapTime);
392113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else {
393113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_MARKER_TIME, lapTime);
394113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
395113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_ACCUM_TIME, 0);
396113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            if (numLaps < Stopwatches.MAX_LAPS) {
397113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, time);
398113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putBoolean(Stopwatches.KEY + CircleTimerView.PREF_CTV_PAUSED, false);
399113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            } else {
400113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, -1);
401113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            }
402113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.apply();
403113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
404113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
405113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
406113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void writeSharedPrefsStopped(long elapsedTime, boolean updateCircle) {
407113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        writeToSharedPrefs(null, null, elapsedTime, Stopwatches.STOPWATCH_STOPPED, updateCircle);
408113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        if (updateCircle) {
409113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long time = Utils.getTimeNow();
410113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
411113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    getApplicationContext());
412113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long accumulatedTime = prefs.getLong(
413113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    Stopwatches.KEY + CircleTimerView.PREF_CTV_ACCUM_TIME, 0);
414113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            long intervalStartTime = prefs.getLong(
415113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, -1);
416113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            accumulatedTime += time - intervalStartTime;
417113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            SharedPreferences.Editor editor = prefs.edit();
418113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_ACCUM_TIME, accumulatedTime);
419113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putBoolean(Stopwatches.KEY + CircleTimerView.PREF_CTV_PAUSED, true);
420113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.putLong(
421113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein                    Stopwatches.KEY + CircleTimerView.PREF_CTV_CURRENT_INTERVAL, accumulatedTime);
422113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein            editor.apply();
423113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        }
424113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
425113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein
426113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    private void writeSharedPrefsReset(boolean updateCircle) {
427113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein        writeToSharedPrefs(null, null, null, Stopwatches.STOPWATCH_RESET, updateCircle);
428113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein    }
429113e1daddd8cb0e890084aa4b6ea3194d8ad4826Sam Blitzstein}
430