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