- Convert alarm activity from being in the receiver to a service of its own.
This commit is contained in:
		| @@ -36,6 +36,8 @@ | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|  | ||||
|         <service | ||||
|             android:name="za.org.treehouse.hypoalarm.AlarmService" /> | ||||
|         <service | ||||
|             android:name="za.org.treehouse.hypoalarm.AlarmNotify" | ||||
|             android:label="@string/alarm_notification" /> | ||||
| @@ -46,6 +48,7 @@ | ||||
|         <meta-data | ||||
|             android:name="com.google.android.gms.version" | ||||
|             android:value="@integer/google_play_services_version" /> | ||||
|  | ||||
|     </application> | ||||
|  | ||||
|     <!-- permission required to read contacts --> | ||||
|   | ||||
| @@ -60,7 +60,7 @@ public class AlarmAlertActivity extends Activity { | ||||
|             @Override | ||||
|             public void onProgressChanged(SeekArc seekArc, int progress, boolean fromUser) { | ||||
|                 if (progress > 98 && !seekFinished && fromUser) { | ||||
|                     AlarmReceiver.dismissAlarm(alertActivity); | ||||
|                     AlarmService.dismissAlarm(alertActivity); | ||||
|                     seekFinished = true; | ||||
|                 } | ||||
|             } | ||||
| @@ -87,7 +87,7 @@ public class AlarmAlertActivity extends Activity { | ||||
|             @Override | ||||
|             public void onTrigger(View v, int target) { | ||||
|                 // if (target == "") | ||||
|                 AlarmReceiver.dismissAlarm(alertActivity); | ||||
|                 AlarmService.dismissAlarm(alertActivity); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
| @@ -107,12 +107,12 @@ public class AlarmAlertActivity extends Activity { | ||||
|      */ | ||||
|     @Override | ||||
|     public void onBackPressed() { | ||||
|         AlarmReceiver.setAlarmStatus(AlarmReceiver.ALARM_IGNORED); | ||||
|         AlarmReceiver.snoozeAlarm(this); | ||||
|         AlarmService.setAlarmStatus(AlarmService.ALARM_IGNORED); | ||||
|         AlarmService.snoozeAlarm(this); | ||||
|     } | ||||
|  | ||||
|     public void onUserLeaveHint() { | ||||
|         AlarmReceiver.setAlarmStatus(AlarmReceiver.ALARM_IGNORED); | ||||
|         AlarmReceiver.snoozeAlarm(this); | ||||
|         AlarmService.setAlarmStatus(AlarmService.ALARM_IGNORED); | ||||
|         AlarmService.snoozeAlarm(this); | ||||
|     } | ||||
| } | ||||
| @@ -5,7 +5,6 @@ import android.content.SharedPreferences; | ||||
| import android.content.res.AssetFileDescriptor; | ||||
| import android.media.AudioManager; | ||||
| import android.media.MediaPlayer; | ||||
| import android.media.Ringtone; | ||||
| import android.media.RingtoneManager; | ||||
| import android.net.Uri; | ||||
| import android.os.Vibrator; | ||||
| @@ -17,6 +16,7 @@ import android.util.Log; | ||||
| import java.io.IOException; | ||||
|  | ||||
| public class AlarmKlaxon { | ||||
|     public  static Boolean klaxonActive = false; | ||||
|     private static final long[] vPattern = {500, 500}; | ||||
|     // Volume modification for alarms while a phone call is active, from com.android.deskclock.alarms | ||||
|     private static final float IN_CALL_VOLUME = 0.125f; | ||||
| @@ -29,6 +29,11 @@ public class AlarmKlaxon { | ||||
|     public static void start(final Context context) { | ||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); | ||||
|  | ||||
|         if (klaxonActive) { | ||||
|             stop(context); | ||||
|         } | ||||
|         klaxonActive = true; | ||||
|  | ||||
|         vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); | ||||
|         vibrator.cancel(); | ||||
|         vibrator.vibrate(vPattern, 0); | ||||
| @@ -87,9 +92,12 @@ public class AlarmKlaxon { | ||||
|     } | ||||
|  | ||||
|     public static void stop(final Context context) { | ||||
|         vibrator.cancel(); | ||||
|         stopAudio(context); | ||||
|         telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); | ||||
|         if (klaxonActive) { | ||||
|             vibrator.cancel(); | ||||
|             stopAudio(context); | ||||
|             telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); | ||||
|             klaxonActive = false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static void startAudio(final Context context) throws IOException { | ||||
|   | ||||
| @@ -85,7 +85,7 @@ public class AlarmNotify extends Service { | ||||
|                     notificationRunning = true; | ||||
|                     int max = 1000; | ||||
|                     // Count in milliseconds for greater progress resolution | ||||
|                     int milliSecondsLeft = (int) ((AlarmReceiver.graceEndTime - System.currentTimeMillis())); | ||||
|                     int milliSecondsLeft = (int) ((AlarmService.graceEndTime - System.currentTimeMillis())); | ||||
|                     int gracePeriodMilliSeconds = gracePeriod * 60 * 1000; | ||||
|                     int progress = ((gracePeriodMilliSeconds - milliSecondsLeft) * max) / gracePeriodMilliSeconds; | ||||
|  | ||||
|   | ||||
| @@ -1,177 +1,16 @@ | ||||
| package za.org.treehouse.hypoalarm; | ||||
|  | ||||
| import android.app.AlarmManager; | ||||
| import android.app.PendingIntent; | ||||
| import android.content.BroadcastReceiver; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.SharedPreferences; | ||||
| import android.os.Build; | ||||
| import android.os.Handler; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.telephony.PhoneStateListener; | ||||
| import android.telephony.TelephonyManager; | ||||
| import android.util.Log; | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.Calendar; | ||||
|  | ||||
| public class AlarmReceiver extends BroadcastReceiver { | ||||
|     private static final int SNOOZE_TIME = 1000*60*5; // Snooze for 5 minutes if need be | ||||
|     private static final int ALERT_LIFE  = 1000*60*2; // 2 minutes | ||||
|     private static SharedPreferences sharedPref; | ||||
|     private static AlarmManager alarmManager; | ||||
|     private static PendingIntent alarmPendingIntent, gracePendingIntent; | ||||
|     private static Intent alertActivityIntent, notifyIntent; | ||||
|     private static TelephonyManager telephonyManager; | ||||
|     public  static volatile String alarmStatus; // Register ALARM_DISMISSED and its brethren here | ||||
|     public  static final String ALARM_RUNNING   = "ALARM_RUNNING"; | ||||
|     public  static final String ALARM_DISMISSED = "ALARM_DISMISSED"; | ||||
|     public  static final String ALARM_IGNORED   = "ALARM_IGNORED"; | ||||
|     public  static final String ALARM_SNOOZED   = "ALARM_SNOOZED"; | ||||
|     public  static final String ALARM_SNOOZE_RUNNING = "ALARM_SNOOZE_RUNNING"; | ||||
|     public  static long graceEndTime; | ||||
|     private static Intent alarmIntent; | ||||
|  | ||||
|     @Override | ||||
|     public void onReceive(final Context context, final Intent intent) { | ||||
|         sharedPref = PreferenceManager.getDefaultSharedPreferences(context); | ||||
|         alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); | ||||
|         final Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true); | ||||
|         final int gracePeriod = sharedPref.getInt(context.getString(R.string.GracePeriodPref), 60); | ||||
|         final String alarmTimeStr = sharedPref.getString(context.getString(R.string.AlarmTimePref), null); | ||||
|  | ||||
|         if (alarmActive) { | ||||
|             // if nothing else happens, assume the alert was ignored. | ||||
|             alarmStatus = ALARM_RUNNING; | ||||
|  | ||||
|             // Cancel the pre-alarm notification, if it exists | ||||
|             context.stopService(new Intent(context, PreAlarmNotify.class)); | ||||
|  | ||||
|             // If dialing, active in a phone call, or on hold, don't bother with the alarm, just reset it for tomorrow | ||||
|             telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); | ||||
|             if (telephonyManager.getCallState() != TelephonyManager.CALL_STATE_OFFHOOK) { | ||||
|  | ||||
|                 // Set a grace period alarm to send SMS | ||||
|                 Calendar graceCal = Calendar.getInstance(); | ||||
|                 graceCal.set(Calendar.SECOND, 0); | ||||
|                 graceCal.add(Calendar.MINUTE, gracePeriod); | ||||
|                 Intent graceIntent = new Intent(context, GraceReceiver.class); | ||||
|                 gracePendingIntent = PendingIntent.getBroadcast(context, MainActivity.GRACE_REQUEST, graceIntent, 0); | ||||
|                 alarmManager.cancel(gracePendingIntent); | ||||
|                 if (Build.VERSION.SDK_INT >= 19) { | ||||
|                     alarmManager.setExact(AlarmManager.RTC_WAKEUP, graceCal.getTimeInMillis(), gracePendingIntent); | ||||
|                 } else { | ||||
|                     alarmManager.set(AlarmManager.RTC_WAKEUP, graceCal.getTimeInMillis(), gracePendingIntent); | ||||
|                 } | ||||
|                 Log.d("AlarmReceiver", "Setting grace alarm for " + MainActivity.debugDate(graceCal)); | ||||
|  | ||||
|                 // Calculate when the grace period (converted from minutes to milliseconds) ends | ||||
|                 graceEndTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000); | ||||
|  | ||||
|                 // Set up intents for later use | ||||
|                 notifyIntent = new Intent(context, AlarmNotify.class); | ||||
|                 alertActivityIntent = new Intent(context, AlarmAlertActivity.class); | ||||
|                 alertActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | | ||||
|                         Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); | ||||
|  | ||||
|                 // Allow user to acknowledge alarm and cancel grace alarm | ||||
|                 startAlert(context); | ||||
|             } | ||||
|  | ||||
|             // Reset for tomorrow; as of API 19, setRepeating() is inexact, so we use setExact() | ||||
|             Calendar cal = MainActivity.TimeStringToCalendar(alarmTimeStr); | ||||
|             // Advance the calendar to tomorrow | ||||
|             cal.add(Calendar.DAY_OF_MONTH, 1); | ||||
|             alarmPendingIntent = PendingIntent.getBroadcast(context, MainActivity.ALARM_REQUEST, intent, 0); | ||||
|             alarmManager.cancel(alarmPendingIntent); | ||||
|             if (Build.VERSION.SDK_INT >= 19) { | ||||
|                 alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmPendingIntent); | ||||
|             } else { | ||||
|                 alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmPendingIntent); | ||||
|             } | ||||
|             Log.d("AlarmReceiver", "Resetting alarm for " + MainActivity.debugDate(cal)); | ||||
|         } | ||||
|         alarmIntent = new Intent(context, AlarmService.class); | ||||
|         context.startService(alarmIntent); | ||||
|     } | ||||
|  | ||||
|     public static void startAlert(final Context context) { | ||||
|         Log.d("AlarmReceiver", "Starting alarm; status is " + alarmStatus); | ||||
|         // Turn off any notifications first | ||||
|         context.stopService(notifyIntent); | ||||
|  | ||||
|         context.startActivity(alertActivityIntent); | ||||
|         AlarmKlaxon.start(context); | ||||
|  | ||||
|         // Turn off the alert activity after a period, and switch to a notification | ||||
|         new Handler().postDelayed(new Runnable() { | ||||
|             public void run() { | ||||
|                 // Close the dialogue and switch to notification | ||||
|                 // if the Activity has not been closed by the user | ||||
|                 // (that is, snoozeAlert and dismissAlert have not been called) | ||||
|                 if (alarmStatus.contentEquals(ALARM_DISMISSED) || | ||||
|                     alarmStatus.contentEquals(ALARM_SNOOZED)) { | ||||
|                     return; | ||||
|                 } | ||||
|                 // Stop if we're running the snooze alert, or the snooze time is less than 10 seconds | ||||
|                 if (alarmStatus.contentEquals(ALARM_SNOOZE_RUNNING) || SNOOZE_TIME < 10000) { | ||||
|                     stopAlert(context); | ||||
|                 } else { | ||||
|                     alarmStatus = ALARM_IGNORED; // This is true, although we are about to switch to ALARM_SNOOZED | ||||
|                     snoozeAlarm(context); | ||||
|                 } | ||||
|             } | ||||
|         }, ALERT_LIFE); | ||||
|     } | ||||
|  | ||||
|     public static void stopAlert(final Context context) { | ||||
|         Log.d("AlarmReceiver", "Stopping alarm; status is " + alarmStatus); | ||||
|         AlarmKlaxon.stop(context); | ||||
|         AlarmAlertActivity.alertActivity.finish(); | ||||
|         // Display a notification if the alarm hasn't been dismissed | ||||
|         if (!alarmStatus.contentEquals(ALARM_DISMISSED)) { | ||||
|             context.startService(notifyIntent); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void dismissAlarm(final Context context) { | ||||
|         Log.d("AlarmReceiver", "Dismissing alarm"); | ||||
|         alarmStatus = ALARM_DISMISSED; | ||||
|         // Close the alert and all notifications | ||||
|         stopAlert(context); | ||||
|  | ||||
|         // Cancel the graceAlarm | ||||
|         Intent graceIntent = new Intent(context, GraceReceiver.class); | ||||
|         PendingIntent gracePendingIntent = PendingIntent.getBroadcast(context, MainActivity.GRACE_REQUEST, graceIntent, 0); | ||||
|         alarmManager.cancel(gracePendingIntent); | ||||
|     } | ||||
|  | ||||
|     public static void snoozeAlarm(final Context context) { | ||||
|         Log.d("AlarmReceiver", "Snoozing alarm"); | ||||
|         stopAlert(context); | ||||
|         // Close the alert, stop the klaxon, and start the notification, | ||||
|         // but only if there's time left before the gracePeriod triggers, | ||||
|         // and we haven't snoozed before | ||||
|         if (((System.currentTimeMillis() + SNOOZE_TIME) < graceEndTime) && | ||||
|             (!alarmStatus.contentEquals(ALARM_SNOOZED)) && | ||||
|             (!alarmStatus.contentEquals(ALARM_DISMISSED))) { | ||||
|             new Handler().postDelayed(new Runnable() { | ||||
|                 public void run() { | ||||
|                     Log.d("AlarmReceiver", "Resuming after snooze; status is " + alarmStatus); | ||||
|                     // Don't run if the alarm was dismissed before the timer ran out | ||||
|                     // (because a notification was acknowledged) | ||||
|                     if (!alarmStatus.contentEquals(ALARM_DISMISSED)) { | ||||
|                         alarmStatus = ALARM_SNOOZE_RUNNING; | ||||
|                         startAlert(context); | ||||
|                     } | ||||
|                 } | ||||
|             }, SNOOZE_TIME); | ||||
|             // Change alarm status from ignored to snoozed | ||||
|             alarmStatus = ALARM_SNOOZED; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setAlarmStatus (String status) { | ||||
|         Log.d("AlarmReceiver", "Setting alarm status to " + status); | ||||
|         alarmStatus = status; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,198 @@ | ||||
| package za.org.treehouse.hypoalarm; | ||||
|  | ||||
| import android.app.AlarmManager; | ||||
| import android.app.PendingIntent; | ||||
| import android.app.Service; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.SharedPreferences; | ||||
| import android.os.Build; | ||||
| import android.os.Handler; | ||||
| import android.os.IBinder; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.telephony.TelephonyManager; | ||||
| import android.util.Log; | ||||
|  | ||||
| import java.util.Calendar; | ||||
|  | ||||
| public class AlarmService extends Service { | ||||
|     private static final int SNOOZE_TIME = 1000*60*5; // Snooze for 5 minutes if need be | ||||
|     private static final int ALERT_LIFE  = 1000*60*2; // 2 minutes | ||||
|     private static AlarmManager alarmManager; | ||||
|     private static Intent alertActivityIntent, notifyIntent; | ||||
|     public  static Boolean alarmStarted = false; | ||||
|     public  static volatile String alarmStatus; // Register ALARM_DISMISSED and its brethren here | ||||
|     public  static final String ALARM_RUNNING   = "ALARM_RUNNING"; | ||||
|     public  static final String ALARM_DISMISSED = "ALARM_DISMISSED"; | ||||
|     public  static final String ALARM_IGNORED   = "ALARM_IGNORED"; | ||||
|     public  static final String ALARM_SNOOZED   = "ALARM_SNOOZED"; | ||||
|     public  static final String ALARM_SNOOZE_RUNNING = "ALARM_SNOOZE_RUNNING"; | ||||
|     public  static long graceEndTime; | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate() { | ||||
|         alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); | ||||
|     } | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         if (alarmStarted) { | ||||
|             stopAlert(getApplicationContext()); | ||||
|             alarmStarted = false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int onStartCommand(Intent intent, int flags, int startId) { | ||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); | ||||
|         final Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); | ||||
|         final int gracePeriod = sharedPref.getInt(getString(R.string.GracePeriodPref), 60); | ||||
|         final String alarmTimeStr = sharedPref.getString(getString(R.string.AlarmTimePref), null); | ||||
|  | ||||
|         if (alarmActive) { | ||||
|  | ||||
|             if (alarmStarted) { | ||||
|                 stopAlert(getApplicationContext()); | ||||
|             } | ||||
|             alarmStarted = true; | ||||
|  | ||||
|             // if nothing else happens, assume the alert was ignored. | ||||
|             alarmStatus = ALARM_RUNNING; | ||||
|  | ||||
|             // Cancel the pre-alarm notification, if it exists | ||||
|             stopService(new Intent(this, PreAlarmNotify.class)); | ||||
|  | ||||
|             // If dialing, active in a phone call, or on hold, don't bother with the alarm, just reset it for tomorrow | ||||
|             TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); | ||||
|             if (telephonyManager.getCallState() != TelephonyManager.CALL_STATE_OFFHOOK) { | ||||
|  | ||||
|                 // Set a grace period alarm to send SMS | ||||
|                 Calendar graceCal = Calendar.getInstance(); | ||||
|                 graceCal.set(Calendar.SECOND, 0); | ||||
|                 graceCal.add(Calendar.MINUTE, gracePeriod); | ||||
|                 Intent graceIntent = new Intent(this, GraceReceiver.class); | ||||
|                 PendingIntent gracePendingIntent = PendingIntent.getBroadcast(this, MainActivity.GRACE_REQUEST, graceIntent, 0); | ||||
|                 alarmManager.cancel(gracePendingIntent); | ||||
|                 if (Build.VERSION.SDK_INT >= 19) { | ||||
|                     alarmManager.setExact(AlarmManager.RTC_WAKEUP, graceCal.getTimeInMillis(), gracePendingIntent); | ||||
|                 } else { | ||||
|                     alarmManager.set(AlarmManager.RTC_WAKEUP, graceCal.getTimeInMillis(), gracePendingIntent); | ||||
|                 } | ||||
|                 Log.d("AlarmService", "Setting grace alarm for " + MainActivity.debugDate(graceCal)); | ||||
|  | ||||
|                 // Calculate when the grace period (converted from minutes to milliseconds) ends | ||||
|                 graceEndTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000); | ||||
|  | ||||
|                 // Set up intents for later use | ||||
|                 notifyIntent = new Intent(this, AlarmNotify.class); | ||||
|                 alertActivityIntent = new Intent(this, AlarmAlertActivity.class); | ||||
|                 alertActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | | ||||
|                         Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); | ||||
|  | ||||
|                 // Allow user to acknowledge alarm and cancel grace alarm | ||||
|                 startAlert(this); | ||||
|             } | ||||
|  | ||||
|             // Reset for tomorrow; as of API 19, setRepeating() is inexact, so we use setExact() | ||||
|             Calendar cal = MainActivity.TimeStringToCalendar(alarmTimeStr); | ||||
|             // Advance the calendar to tomorrow | ||||
|             cal.add(Calendar.DAY_OF_MONTH, 1); | ||||
|             PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(this, MainActivity.ALARM_REQUEST, intent, 0); | ||||
|             alarmManager.cancel(alarmPendingIntent); | ||||
|             if (Build.VERSION.SDK_INT >= 19) { | ||||
|                 alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmPendingIntent); | ||||
|             } else { | ||||
|                 alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmPendingIntent); | ||||
|             } | ||||
|             Log.d("AlarmService", "Resetting alarm for " + MainActivity.debugDate(cal)); | ||||
|         } | ||||
|         return super.onStartCommand(intent, flags, startId); | ||||
|     } | ||||
|  | ||||
|     public static void startAlert(final Context context) { | ||||
|         Log.d("AlarmService", "Starting alarm; status is " + alarmStatus); | ||||
|         // Turn off any notifications first | ||||
|         context.stopService(notifyIntent); | ||||
|  | ||||
|         context.startActivity(alertActivityIntent); | ||||
|         AlarmKlaxon.start(context); | ||||
|  | ||||
|         // Turn off the alert activity after a period, and switch to a notification | ||||
|         new Handler().postDelayed(new Runnable() { | ||||
|             public void run() { | ||||
|                 // Close the dialogue and switch to notification | ||||
|                 // if the Activity has not been closed by the user | ||||
|                 // (that is, snoozeAlert and dismissAlert have not been called) | ||||
|                 if (alarmStatus.contentEquals(ALARM_DISMISSED) || | ||||
|                         alarmStatus.contentEquals(ALARM_SNOOZED)) { | ||||
|                     return; | ||||
|                 } | ||||
|                 // Stop if we're running the snooze alert, or the snooze time is less than 10 seconds | ||||
|                 if (alarmStatus.contentEquals(ALARM_SNOOZE_RUNNING) || SNOOZE_TIME < 10000) { | ||||
|                     stopAlert(context); | ||||
|                 } else { | ||||
|                     alarmStatus = ALARM_IGNORED; // This is true, although we are about to switch to ALARM_SNOOZED | ||||
|                     snoozeAlarm(context); | ||||
|                 } | ||||
|             } | ||||
|         }, ALERT_LIFE); | ||||
|     } | ||||
|  | ||||
|     public static void stopAlert(final Context context) { | ||||
|         Log.d("AlarmService", "Stopping alarm; status is " + alarmStatus); | ||||
|         if (alarmStarted) { | ||||
|             AlarmKlaxon.stop(context); | ||||
|             AlarmAlertActivity.alertActivity.finish(); | ||||
|             // Display a notification if the alarm hasn't been dismissed | ||||
|             if (!alarmStatus.contentEquals(ALARM_DISMISSED)) { | ||||
|                 context.startService(notifyIntent); | ||||
|             } | ||||
|             alarmStarted = false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void dismissAlarm(final Context context) { | ||||
|         Log.d("AlarmService", "Dismissing alarm"); | ||||
|         alarmStatus = ALARM_DISMISSED; | ||||
|         // Close the alert and all notifications | ||||
|         stopAlert(context); | ||||
|  | ||||
|         // Cancel the graceAlarm | ||||
|         Intent graceIntent = new Intent(context, GraceReceiver.class); | ||||
|         PendingIntent gracePendingIntent = PendingIntent.getBroadcast(context, MainActivity.GRACE_REQUEST, graceIntent, 0); | ||||
|         alarmManager.cancel(gracePendingIntent); | ||||
|     } | ||||
|  | ||||
|     public static void snoozeAlarm(final Context context) { | ||||
|         Log.d("AlarmService", "Snoozing alarm"); | ||||
|         stopAlert(context); | ||||
|         // Close the alert, stop the klaxon, and start the notification, | ||||
|         // but only if there's time left before the gracePeriod triggers, | ||||
|         // and we haven't snoozed before | ||||
|         if (((System.currentTimeMillis() + SNOOZE_TIME) < graceEndTime) && | ||||
|                 (!alarmStatus.contentEquals(ALARM_SNOOZED)) && | ||||
|                 (!alarmStatus.contentEquals(ALARM_DISMISSED))) { | ||||
|             new Handler().postDelayed(new Runnable() { | ||||
|                 public void run() { | ||||
|                     Log.d("AlarmService", "Resuming after snooze; status is " + alarmStatus); | ||||
|                     // Don't run if the alarm was dismissed before the timer ran out | ||||
|                     // (because a notification was acknowledged) | ||||
|                     if (!alarmStatus.contentEquals(ALARM_DISMISSED)) { | ||||
|                         alarmStatus = ALARM_SNOOZE_RUNNING; | ||||
|                         startAlert(context); | ||||
|                     } | ||||
|                 } | ||||
|             }, SNOOZE_TIME); | ||||
|             // Change alarm status from ignored to snoozed | ||||
|             alarmStatus = ALARM_SNOOZED; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setAlarmStatus (String status) { | ||||
|         Log.d("AlarmService", "Setting alarm status to " + status); | ||||
|         alarmStatus = status; | ||||
|     } | ||||
|     @Override | ||||
|     public IBinder onBind(Intent intent) { | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| @@ -19,7 +19,7 @@ public class CancelGraceReceiver extends BroadcastReceiver { | ||||
|         Log.d("CancelGraceReceiver", "Cancelled grace alarm"); | ||||
|  | ||||
|         // Ensure that any snoozes that are pending never happen. | ||||
|         AlarmReceiver.setAlarmStatus(AlarmReceiver.ALARM_DISMISSED); | ||||
|         AlarmService.setAlarmStatus(AlarmService.ALARM_DISMISSED); | ||||
|  | ||||
|         // Display toast | ||||
|         Toast.makeText(context, context.getString(R.string.alarmCancelToast), Toast.LENGTH_LONG).show(); | ||||
|   | ||||
| @@ -66,10 +66,7 @@ public class MainActivity extends ActionBarActivity { | ||||
|     public static int CANCEL_ALARM_REQUEST = 5; | ||||
|     public static int PHONE_NUMBER_REQUEST = 6; | ||||
|     public static int RINGTONE_REQUEST = 7; | ||||
|     private static Switch alarmActiveSwitch; | ||||
|     private static Button alarmTimeButton; | ||||
|     private static Spinner gracePeriodSpinner; | ||||
|     private static EditText phoneNumberButton; | ||||
|     private static EditText messageButton; | ||||
|  | ||||
|     public static Boolean HYPOALARM_DEBUG = true; | ||||
| @@ -107,7 +104,7 @@ public class MainActivity extends ActionBarActivity { | ||||
|  | ||||
|             // Allow alarm to activate | ||||
|             Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); | ||||
|             alarmActiveSwitch = (Switch) getActivity().findViewById(R.id.alarm_active_switch); | ||||
|             Switch alarmActiveSwitch = (Switch) getActivity().findViewById(R.id.alarm_active_switch); | ||||
|             alarmActiveSwitch.setChecked(alarmActive); | ||||
|             alarmActiveSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
|                 @Override | ||||
| @@ -177,7 +174,7 @@ public class MainActivity extends ActionBarActivity { | ||||
|             // Set grace period | ||||
|             int defaultGrace = 60; | ||||
|             int gracePeriod = sharedPref.getInt(getString(R.string.GracePeriodPref), defaultGrace); | ||||
|             gracePeriodSpinner = (Spinner) getActivity().findViewById(R.id.grace_period); | ||||
|             Spinner gracePeriodSpinner = (Spinner) getActivity().findViewById(R.id.grace_period); | ||||
|             gracePeriodSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | ||||
|                 final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); | ||||
|  | ||||
| @@ -203,10 +200,11 @@ public class MainActivity extends ActionBarActivity { | ||||
|             int spinnerPosition = gracePeriodSpinnerAdapter.getPosition(MinutesToGracePeriodStr(gracePeriod)); | ||||
|             gracePeriodSpinner.setSelection(spinnerPosition); | ||||
|  | ||||
|  | ||||
|             // Allow user to select ringtone | ||||
|             final Button ringtoneButton = (Button) getActivity().findViewById(R.id.ringtone); | ||||
|             String ringtoneStr = sharedPref.getString(getString(R.string.RingtonePref), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM).toString()); | ||||
|             Uri ringtoneUri = Uri.parse(ringtoneStr); | ||||
|             final Uri ringtoneUri = Uri.parse(ringtoneStr); | ||||
|             Ringtone currentRingtone = RingtoneManager.getRingtone(getActivity().getApplicationContext(), ringtoneUri); | ||||
|             ringtoneButton.setText(currentRingtone.getTitle(getActivity().getApplicationContext())); | ||||
|             ringtoneButton.setOnClickListener(new View.OnClickListener() { | ||||
| @@ -215,9 +213,8 @@ public class MainActivity extends ActionBarActivity { | ||||
|                     Intent ringtoneIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); | ||||
|                     ringtoneIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone:"); | ||||
|                     ringtoneIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); | ||||
|                     //ringtoneIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); | ||||
|                     ringtoneIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM); | ||||
|                     //ringtoneIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentRingtone); | ||||
|                     ringtoneIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri); | ||||
|  | ||||
|                     startActivityForResult(ringtoneIntent, RINGTONE_REQUEST); | ||||
|                 } | ||||
| @@ -226,7 +223,7 @@ public class MainActivity extends ActionBarActivity { | ||||
|  | ||||
|             // Set phone number | ||||
|             String phoneNumberStr = sharedPref.getString(getString(R.string.PhoneNumberPref), null); | ||||
|             phoneNumberButton = (EditText) getActivity().findViewById(R.id.phone_number); | ||||
|             EditText phoneNumberButton = (EditText) getActivity().findViewById(R.id.phone_number); | ||||
|             phoneNumberButton.setText(phoneNumberStr); | ||||
|             phoneNumberButton.setOnClickListener(new View.OnClickListener() { | ||||
|                 @Override | ||||
| @@ -295,7 +292,6 @@ public class MainActivity extends ActionBarActivity { | ||||
|         @Override | ||||
|         public void onActivityResult(int requestCode, int resultCode, Intent data) { | ||||
|             super.onActivityResult(requestCode, resultCode, data); | ||||
|             Log.d("MainActivity", "Request code: " + requestCode); | ||||
|  | ||||
|             // If we're answering a ringtone dialogue, update the correct button | ||||
|             if (requestCode == RINGTONE_REQUEST && resultCode == RESULT_OK) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user