- Simplify alarm setting, cancellation, and resetting code
- Lintian cleanups
This commit is contained in:
		| @@ -16,8 +16,8 @@ | |||||||
|     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> |     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> | ||||||
|     <!-- permission required to vibrate --> |     <!-- permission required to vibrate --> | ||||||
|     <uses-permission android:name="android.permission.VIBRATE" /> |     <uses-permission android:name="android.permission.VIBRATE" /> | ||||||
|     <!-- permission required to wake the device --> |     <!-- permission required for AlarmService to keep the CPU awake --> | ||||||
|     <!-- uses-permission android:name="android.permission.WAKE_LOCK"/ --> |     <uses-permission android:name="android.permission.WAKE_LOCK" /> | ||||||
|  |  | ||||||
|     <application |     <application | ||||||
|         android:allowBackup="true" |         android:allowBackup="true" | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import android.content.SharedPreferences; | |||||||
| import android.os.Build; | import android.os.Build; | ||||||
| import android.os.Handler; | import android.os.Handler; | ||||||
| import android.os.IBinder; | import android.os.IBinder; | ||||||
|  | import android.os.PowerManager; | ||||||
| import android.preference.PreferenceManager; | import android.preference.PreferenceManager; | ||||||
| import android.telephony.TelephonyManager; | import android.telephony.TelephonyManager; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| @@ -18,6 +19,7 @@ import java.util.Calendar; | |||||||
| public class AlarmService extends Service { | 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 SNOOZE_TIME = 1000*60*5; // Snooze for 5 minutes if need be | ||||||
|     private static final int ALERT_LIFE  = 1000*60*1; // 2 minutes |     private static final int ALERT_LIFE  = 1000*60*1; // 2 minutes | ||||||
|  |     private static PowerManager.WakeLock wl; | ||||||
|     private static AlarmManager alarmManager; |     private static AlarmManager alarmManager; | ||||||
|     private static Intent alarmServiceIntent, alertActivityIntent, notifyIntent; |     private static Intent alarmServiceIntent, alertActivityIntent, notifyIntent; | ||||||
|     private static Boolean alarmStarted = false; |     private static Boolean alarmStarted = false; | ||||||
| @@ -31,6 +33,11 @@ public class AlarmService extends Service { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onCreate() { |     public void onCreate() { | ||||||
|  |         // Ensure that CPU runs while the service is running, so we don't miss an alert or snooze | ||||||
|  |         PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); | ||||||
|  |         wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AlarmService"); | ||||||
|  |         //wl.acquire(); | ||||||
|  |  | ||||||
|         alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); |         alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); | ||||||
|     } |     } | ||||||
|     @Override |     @Override | ||||||
| @@ -40,6 +47,9 @@ public class AlarmService extends Service { | |||||||
|             stopAlert(getApplicationContext()); |             stopAlert(getApplicationContext()); | ||||||
|             alarmStarted = false; |             alarmStarted = false; | ||||||
|         } |         } | ||||||
|  |         if (wl.isHeld()) { | ||||||
|  |             wl.release(); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -100,6 +110,7 @@ public class AlarmService extends Service { | |||||||
|             if (cal.before(Calendar.getInstance())) { |             if (cal.before(Calendar.getInstance())) { | ||||||
|                 cal.add(Calendar.DAY_OF_MONTH, 1); |                 cal.add(Calendar.DAY_OF_MONTH, 1); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(this, MainActivity.ALARM_REQUEST, intent, 0); |             PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(this, MainActivity.ALARM_REQUEST, intent, 0); | ||||||
|             alarmManager.cancel(alarmPendingIntent); |             alarmManager.cancel(alarmPendingIntent); | ||||||
|             if (Build.VERSION.SDK_INT >= 19) { |             if (Build.VERSION.SDK_INT >= 19) { | ||||||
|   | |||||||
| @@ -1,12 +1,9 @@ | |||||||
| package za.org.treehouse.hypoalarm; | package za.org.treehouse.hypoalarm; | ||||||
|  |  | ||||||
| import android.app.AlarmManager; |  | ||||||
| import android.app.PendingIntent; |  | ||||||
| import android.content.BroadcastReceiver; | import android.content.BroadcastReceiver; | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.content.SharedPreferences; | import android.content.SharedPreferences; | ||||||
| import android.os.Build; |  | ||||||
| import android.preference.PreferenceManager; | import android.preference.PreferenceManager; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
|  |  | ||||||
| @@ -17,21 +14,10 @@ public class BootReceiver extends BroadcastReceiver { | |||||||
|     public void onReceive(Context context, Intent intent) { |     public void onReceive(Context context, Intent intent) { | ||||||
|         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); |         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); | ||||||
|         if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { |         if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { | ||||||
|             // Reset for tomorrow; as of API 19, setRepeating() is inexact, so we use setExact() |  | ||||||
|             String alarmTimeStr = sharedPref.getString(context.getString(R.string.AlarmTimePref), null); |             String alarmTimeStr = sharedPref.getString(context.getString(R.string.AlarmTimePref), null); | ||||||
|             Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true); |             Calendar cal = MainActivity.TimeStringToCalendar(alarmTimeStr); | ||||||
|             if (alarmTimeStr != null && alarmActive) { |             Log.d("BootReceiver", "Booting: Setting alarm for " + MainActivity.debugDate(cal)); | ||||||
|                 // If it's later than alarmTimeStr, Calendar automatically advances the day. |             MainActivity.resetAlarm(context, cal); | ||||||
|                 Calendar cal = MainActivity.TimeStringToCalendar(alarmTimeStr); |  | ||||||
|                 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); |  | ||||||
|                 PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); |  | ||||||
|                 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("BootReceiver", "Setting alarm for "+MainActivity.debugDate(cal)); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -60,13 +60,11 @@ import java.util.regex.Pattern; | |||||||
| public class MainActivity extends ActionBarActivity { | public class MainActivity extends ActionBarActivity { | ||||||
|     public static final int ALARM_REQUEST = 1; |     public static final int ALARM_REQUEST = 1; | ||||||
|     public static final int GRACE_REQUEST = 2; |     public static final int GRACE_REQUEST = 2; | ||||||
|     public static final int PRENOTIFY_REQUEST = 3; |     public static final int PRE_NOTIFY_REQUEST = 3; | ||||||
|     public static final int CANCEL_GRACE_REQUEST = 4; |     public static final int CANCEL_GRACE_REQUEST = 4; | ||||||
|     public static final int CANCEL_ALARM_REQUEST = 5; |     public static final int CANCEL_ALARM_REQUEST = 5; | ||||||
|     public static final int PHONE_NUMBER_REQUEST = 6; |     public static final int PHONE_NUMBER_REQUEST = 6; | ||||||
|     public static final int RINGTONE_REQUEST = 7; |     public static final int RINGTONE_REQUEST = 7; | ||||||
|     private static Button alarmTimeButton; |  | ||||||
|     private static EditText messageButton; |  | ||||||
|  |  | ||||||
|     public static final Boolean HYPOALARM_DEBUG = false; |     public static final Boolean HYPOALARM_DEBUG = false; | ||||||
|  |  | ||||||
| @@ -91,63 +89,18 @@ public class MainActivity extends ActionBarActivity { | |||||||
|         @Override |         @Override | ||||||
|         public View onCreateView(LayoutInflater inflater, ViewGroup container, |         public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||||||
|                                  Bundle savedInstanceState) { |                                  Bundle savedInstanceState) { | ||||||
|             View rootView = inflater.inflate(R.layout.fragment_main, container, false); |             return inflater.inflate(R.layout.fragment_main, container, false); | ||||||
|             return rootView; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void onStart() { |         public void onStart() { | ||||||
|             super.onStart(); |  | ||||||
|  |  | ||||||
|             final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); |             final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); | ||||||
|  |  | ||||||
|             // Allow alarm to activate |             super.onStart(); | ||||||
|             Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); |  | ||||||
|             CompoundButton alarmActiveSwitch = (CompoundButton) getActivity().findViewById(R.id.alarm_active_switch); |  | ||||||
|             alarmActiveSwitch.setChecked(alarmActive); |  | ||||||
|             alarmActiveSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { |  | ||||||
|                 @Override |  | ||||||
|                 public void onCheckedChanged(CompoundButton compoundButton, boolean b) { |  | ||||||
|                     AlarmManager alarmManager; |  | ||||||
|                     PendingIntent alarmPendingIntent, gracePendingIntent, preNotifyPendingIntent; |  | ||||||
|                     SharedPreferences.Editor editor = sharedPref.edit(); |  | ||||||
|  |  | ||||||
|                     editor.putBoolean(getString(R.string.AlarmActivePref), b); |  | ||||||
|                     editor.commit(); |  | ||||||
|  |  | ||||||
|                     if (!b) { |  | ||||||
|                         // Cancel any current alarm |  | ||||||
|                         alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); |  | ||||||
|                         Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class); |  | ||||||
|                         alarmPendingIntent = PendingIntent.getBroadcast(getActivity(), ALARM_REQUEST, alarmIntent, 0); |  | ||||||
|                         alarmManager.cancel(alarmPendingIntent); |  | ||||||
|                         // Cancel any pre-alarm notification |  | ||||||
|                         Intent preNotifyIntent = new Intent(getActivity(), AlarmReceiver.class); |  | ||||||
|                         preNotifyPendingIntent = PendingIntent.getBroadcast(getActivity(), PRENOTIFY_REQUEST, alarmIntent, 0); |  | ||||||
|                         alarmManager.cancel(preNotifyPendingIntent); |  | ||||||
|                         // Cancel any grace period |  | ||||||
|                         Intent graceIntent = new Intent(getActivity(), GraceReceiver.class); |  | ||||||
|                         gracePendingIntent = PendingIntent.getBroadcast(getActivity(), GRACE_REQUEST, graceIntent, 0); |  | ||||||
|                         alarmManager.cancel(gracePendingIntent); |  | ||||||
|                         // Stop any notifications |  | ||||||
|                         getActivity().stopService(new Intent(getActivity(), AlarmNotify.class)); |  | ||||||
|                         getActivity().stopService(new Intent(getActivity(), PreAlarmNotify.class)); |  | ||||||
|  |  | ||||||
|                         Log.d("MainActivity", "Alarms cancelled"); |  | ||||||
|                         Toast.makeText(getActivity().getApplicationContext(), getString(R.string.alarmCancelled), Toast.LENGTH_SHORT).show(); |  | ||||||
|                     } else { |  | ||||||
|                         // Activate the alarm |  | ||||||
|                         DialogFragment alarmFragment = new TimePickerFragment(); |  | ||||||
|                         alarmFragment.show(getActivity().getSupportFragmentManager(), "alarmTimePicker"); |  | ||||||
|                         alarmFragment.dismiss(); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             }); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|             // Set alarm time |             // Set alarm time | ||||||
|             String defaultTimeStr = "09:00"; |             final String defaultTimeStr = "09:00"; | ||||||
|             String alarmTimeStr = verifyTimeString(sharedPref.getString(getString(R.string.AlarmTimePref), defaultTimeStr)); |             String alarmTimeStr = verifyTimeString(sharedPref.getString(getString(R.string.AlarmTimePref), defaultTimeStr)); | ||||||
|             alarmTimeButton = (Button) getActivity().findViewById(R.id.alarm_time); |             final Button alarmTimeButton = (Button) getActivity().findViewById(R.id.alarm_time); | ||||||
|  |  | ||||||
|             // When debugging, set the alarm for one minute's time |             // When debugging, set the alarm for one minute's time | ||||||
|             if (HYPOALARM_DEBUG) { |             if (HYPOALARM_DEBUG) { | ||||||
| @@ -165,15 +118,37 @@ public class MainActivity extends ActionBarActivity { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             // Activate the time when starting the app. |             // Allow alarm to activate | ||||||
|             DialogFragment alarmFragment = new TimePickerFragment(); |             Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); | ||||||
|             alarmFragment.show(getActivity().getSupportFragmentManager(), "alarmTimePicker"); |             final CompoundButton alarmActiveSwitch = (CompoundButton) getActivity().findViewById(R.id.alarm_active_switch); | ||||||
|             alarmFragment.dismiss(); |             alarmActiveSwitch.setChecked(alarmActive); | ||||||
|  |             alarmActiveSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||||
|  |                 @Override | ||||||
|  |                 public void onCheckedChanged(CompoundButton compoundButton, boolean active) { | ||||||
|  |                     SharedPreferences.Editor editor = sharedPref.edit(); | ||||||
|  |                     editor.putBoolean(getString(R.string.AlarmActivePref), active); | ||||||
|  |                     editor.commit(); | ||||||
|  |  | ||||||
|  |                     if (!active) { | ||||||
|  |                         cancelAllAlarms(getActivity()); | ||||||
|  |                         Toast.makeText(getActivity(), getString(R.string.alarmCancelled), Toast.LENGTH_SHORT).show(); | ||||||
|  |                     } else { | ||||||
|  |                         String alarmTimeStr = verifyTimeString(sharedPref.getString(getString(R.string.AlarmTimePref), defaultTimeStr)); | ||||||
|  |                         Calendar cal = TimeStringToCalendar(alarmTimeStr); | ||||||
|  |                         resetAlarm(getActivity(), cal); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             // Activate the time (after setting alarmActive) when starting the app. | ||||||
|  |             Calendar cal = TimeStringToCalendar(alarmTimeStr); | ||||||
|  |             resetAlarm(getActivity(), cal); | ||||||
|  |  | ||||||
|             // Set grace period |             // Set grace period | ||||||
|             int defaultGrace = 60; |             final int defaultGrace = 60; | ||||||
|             int gracePeriod = sharedPref.getInt(getString(R.string.GracePeriodPref), defaultGrace); |             int gracePeriod = sharedPref.getInt(getString(R.string.GracePeriodPref), defaultGrace); | ||||||
|             Spinner gracePeriodSpinner = (Spinner) getActivity().findViewById(R.id.grace_period); |             final Spinner gracePeriodSpinner = (Spinner) getActivity().findViewById(R.id.grace_period); | ||||||
|  |  | ||||||
|             gracePeriodSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { |             gracePeriodSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | ||||||
|                 final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); |                 final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); | ||||||
|  |  | ||||||
| @@ -191,7 +166,7 @@ public class MainActivity extends ActionBarActivity { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|             // Set value of drop-down list to value of gracePeriodStr |             // Set value of drop-down list to value of gracePeriodStr | ||||||
|             ArrayAdapter gracePeriodSpinnerAdapter = (ArrayAdapter) gracePeriodSpinner.getAdapter(); |             ArrayAdapter<String> gracePeriodSpinnerAdapter = (ArrayAdapter<String>) gracePeriodSpinner.getAdapter(); | ||||||
|             int spinnerPosition = gracePeriodSpinnerAdapter.getPosition(MinutesToGracePeriodStr(gracePeriod)); |             int spinnerPosition = gracePeriodSpinnerAdapter.getPosition(MinutesToGracePeriodStr(gracePeriod)); | ||||||
|             gracePeriodSpinner.setSelection(spinnerPosition); |             gracePeriodSpinner.setSelection(spinnerPosition); | ||||||
|  |  | ||||||
| @@ -218,7 +193,7 @@ public class MainActivity extends ActionBarActivity { | |||||||
|  |  | ||||||
|             // Set phone number |             // Set phone number | ||||||
|             String phoneNumberStr = sharedPref.getString(getString(R.string.PhoneNumberPref), null); |             String phoneNumberStr = sharedPref.getString(getString(R.string.PhoneNumberPref), null); | ||||||
|             EditText phoneNumberButton = (EditText) getActivity().findViewById(R.id.phone_number); |             final EditText phoneNumberButton = (EditText) getActivity().findViewById(R.id.phone_number); | ||||||
|             phoneNumberButton.setText(phoneNumberStr); |             phoneNumberButton.setText(phoneNumberStr); | ||||||
|             phoneNumberButton.setOnClickListener(new View.OnClickListener() { |             phoneNumberButton.setOnClickListener(new View.OnClickListener() { | ||||||
|                 @Override |                 @Override | ||||||
| @@ -230,7 +205,7 @@ public class MainActivity extends ActionBarActivity { | |||||||
|  |  | ||||||
|             // Set message |             // Set message | ||||||
|             String messageStr = sharedPref.getString(getString(R.string.MessagePref), getString(R.string.defaultMessage)); |             String messageStr = sharedPref.getString(getString(R.string.MessagePref), getString(R.string.defaultMessage)); | ||||||
|             messageButton = (EditText) getActivity().findViewById(R.id.message); |             final EditText messageButton = (EditText) getActivity().findViewById(R.id.message); | ||||||
|             messageButton.setText(messageStr); |             messageButton.setText(messageStr); | ||||||
|             messageButton.setOnClickListener(new View.OnClickListener() { |             messageButton.setOnClickListener(new View.OnClickListener() { | ||||||
|                 @Override |                 @Override | ||||||
| @@ -285,7 +260,7 @@ public class MainActivity extends ActionBarActivity { | |||||||
|  |  | ||||||
|             // If we're answering a ringtone dialogue, update the correct button |             // If we're answering a ringtone dialogue, update the correct button | ||||||
|             if (requestCode == RINGTONE_REQUEST && resultCode == RESULT_OK) { |             if (requestCode == RINGTONE_REQUEST && resultCode == RESULT_OK) { | ||||||
|                 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); |                 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); | ||||||
|                 SharedPreferences.Editor editor = sharedPref.edit(); |                 SharedPreferences.Editor editor = sharedPref.edit(); | ||||||
|                 Button ringtoneButton = (Button) getActivity().findViewById(R.id.ringtone); |                 Button ringtoneButton = (Button) getActivity().findViewById(R.id.ringtone); | ||||||
|  |  | ||||||
| @@ -302,16 +277,92 @@ public class MainActivity extends ActionBarActivity { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static void cancelAllAlarms(Context context) { | ||||||
|  |         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); | ||||||
|  |  | ||||||
|  |         // Cancel any current alarm | ||||||
|  |         Intent alarmIntent = new Intent(context, AlarmReceiver.class); | ||||||
|  |         PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(context, ALARM_REQUEST, alarmIntent, 0); | ||||||
|  |         alarmManager.cancel(alarmPendingIntent); | ||||||
|  |  | ||||||
|  |         // Cancel any pre-alarm notification | ||||||
|  |         Intent preNotifyIntent = new Intent(context, PreAlarmReceiver.class); | ||||||
|  |         PendingIntent preNotifyPendingIntent = PendingIntent.getBroadcast(context, PRE_NOTIFY_REQUEST, preNotifyIntent, 0); | ||||||
|  |         alarmManager.cancel(preNotifyPendingIntent); | ||||||
|  |  | ||||||
|  |         // Cancel any grace period | ||||||
|  |         Intent graceIntent = new Intent(context, GraceReceiver.class); | ||||||
|  |         PendingIntent gracePendingIntent = PendingIntent.getBroadcast(context, GRACE_REQUEST, graceIntent, 0); | ||||||
|  |         alarmManager.cancel(gracePendingIntent); | ||||||
|  |  | ||||||
|  |         // Stop any notifications | ||||||
|  |         context.stopService(new Intent(context, AlarmNotify.class)); | ||||||
|  |         context.stopService(new Intent(context, PreAlarmNotify.class)); | ||||||
|  |  | ||||||
|  |         Log.d("MainActivity", "Alarms cancelled"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void resetAlarm(Context context, Calendar cal) { | ||||||
|  |         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); | ||||||
|  |         PendingIntent alarmPendingIntent, preNotifyPendingIntent; | ||||||
|  |         SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); | ||||||
|  |         Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true); | ||||||
|  |  | ||||||
|  |         cancelAllAlarms(context); | ||||||
|  |  | ||||||
|  |         // Advance cal to tomorrow if setting a time earlier than now | ||||||
|  |         if (cal.before(Calendar.getInstance())) { | ||||||
|  |             cal.add(Calendar.DAY_OF_MONTH, 1); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (alarmActive) { | ||||||
|  |             // Initialise alarm, which displays a dialog and system alert, and | ||||||
|  |             // calls AlarmManager with grace_period as the delay | ||||||
|  |             // which in turn, sends SMS if dialog is not exited. | ||||||
|  |             // Advance to tomorrow if setting a time earlier than now | ||||||
|  |             Intent alarmIntent = new Intent(context, AlarmReceiver.class); | ||||||
|  |             alarmPendingIntent = PendingIntent.getBroadcast(context, ALARM_REQUEST, alarmIntent, 0); | ||||||
|  |             // Set or reset alarm | ||||||
|  |             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("MainActivity", "Setting alarm for " + MainActivity.debugDate(cal)); | ||||||
|  |  | ||||||
|  |             // Set an alarm for the pre-alarm notification, half an hour before the alarm | ||||||
|  |             Calendar preNotifyCal = (Calendar) cal.clone(); | ||||||
|  |             preNotifyCal.add(Calendar.MINUTE, -30); | ||||||
|  |             Intent preNotifyIntent = new Intent(context, PreAlarmReceiver.class); | ||||||
|  |             preNotifyPendingIntent = PendingIntent.getBroadcast(context, PRE_NOTIFY_REQUEST, preNotifyIntent, 0); | ||||||
|  |             // Set or reset alarm | ||||||
|  |             if (Build.VERSION.SDK_INT >= 19) { | ||||||
|  |                 alarmManager.setExact(AlarmManager.RTC_WAKEUP, preNotifyCal.getTimeInMillis(), preNotifyPendingIntent); | ||||||
|  |             } else { | ||||||
|  |                 alarmManager.set(AlarmManager.RTC_WAKEUP, preNotifyCal.getTimeInMillis(), preNotifyPendingIntent); | ||||||
|  |             } | ||||||
|  |             Log.d("MainActivity", "Setting pre-alarm for " + MainActivity.debugDate(preNotifyCal)); | ||||||
|  |  | ||||||
|  |             // Set boot receiver, so alarm restarts on boot | ||||||
|  |             ComponentName bootReceiver = new ComponentName(context, BootReceiver.class); | ||||||
|  |             PackageManager pm = context.getPackageManager(); | ||||||
|  |             pm.setComponentEnabledSetting(bootReceiver, | ||||||
|  |                     PackageManager.COMPONENT_ENABLED_STATE_ENABLED, | ||||||
|  |                     PackageManager.DONT_KILL_APP); | ||||||
|  |             Log.d("MainActivity", "Setting BootReceiver"); | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Alarm time picker |     // Alarm time picker | ||||||
|     public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { |     public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { | ||||||
|         SharedPreferences sharedPref; |         SharedPreferences sharedPref; | ||||||
|         private AlarmManager alarmManager; |  | ||||||
|         private PendingIntent alarmPendingIntent, preNotifyPendingIntent; |  | ||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
|         public Dialog onCreateDialog(Bundle savedInstanceState) { |         public Dialog onCreateDialog(Bundle savedInstanceState) { | ||||||
|             sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); |             sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); | ||||||
|             // Use the current set time as the default value for the picker |             // Use the current set time as the default value for the picker | ||||||
|  |             Button alarmTimeButton = (Button) getActivity().findViewById(R.id.alarm_time); | ||||||
|             String alarmTimeStr = alarmTimeButton.getText().toString(); |             String alarmTimeStr = alarmTimeButton.getText().toString(); | ||||||
|             // For selecting a time, the date doesn't matter, just the hour and minute |             // For selecting a time, the date doesn't matter, just the hour and minute | ||||||
|             Calendar cal = TimeStringToCalendar(alarmTimeStr); |             Calendar cal = TimeStringToCalendar(alarmTimeStr); | ||||||
| @@ -324,17 +375,11 @@ public class MainActivity extends ActionBarActivity { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void onTimeSet(TimePicker view, int hourOfDay, int minute) { |         public void onTimeSet(TimePicker view, int hourOfDay, int minute) { | ||||||
|             Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); |  | ||||||
|  |  | ||||||
|             // Set time preference |             // Set time preference | ||||||
|             Calendar cal = Calendar.getInstance(); |             Calendar cal = Calendar.getInstance(); | ||||||
|             cal.set(Calendar.HOUR_OF_DAY, hourOfDay); |             cal.set(Calendar.HOUR_OF_DAY, hourOfDay); | ||||||
|             cal.set(Calendar.MINUTE, minute); |             cal.set(Calendar.MINUTE, minute); | ||||||
|             cal.set(Calendar.SECOND, 0); |             cal.set(Calendar.SECOND, 0); | ||||||
|             // Advance to tomorrow if setting a time earlier than now |  | ||||||
|             if (cal.before(Calendar.getInstance())) { |  | ||||||
|                 cal.add(Calendar.DAY_OF_MONTH, 1); |  | ||||||
|             } |  | ||||||
|             String alarmStr = CalendarToTimeString(cal); |             String alarmStr = CalendarToTimeString(cal); | ||||||
|  |  | ||||||
|             SharedPreferences.Editor editor = sharedPref.edit(); |             SharedPreferences.Editor editor = sharedPref.edit(); | ||||||
| @@ -344,73 +389,37 @@ public class MainActivity extends ActionBarActivity { | |||||||
|             Button alarm_time = (Button) getActivity().findViewById(R.id.alarm_time); |             Button alarm_time = (Button) getActivity().findViewById(R.id.alarm_time); | ||||||
|             alarm_time.setText(alarmStr); |             alarm_time.setText(alarmStr); | ||||||
|  |  | ||||||
|             if (alarmActive) { |             // Set actual alarm | ||||||
|                 // Initialise alarm, which displays a dialog and system alert, and |             resetAlarm(getActivity(), cal); | ||||||
|                 // calls AlarmManager with grace_period as the delay |  | ||||||
|                 // which in turn, sends SMS if dialog is not exited. |  | ||||||
|                 alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); |  | ||||||
|                 Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class); |  | ||||||
|                 alarmPendingIntent = PendingIntent.getBroadcast(getActivity(), ALARM_REQUEST, alarmIntent, 0); |  | ||||||
|                 // Cancel any existing alarms |  | ||||||
|                 alarmManager.cancel(alarmPendingIntent); |  | ||||||
|                 // Set or reset alarm |  | ||||||
|                 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("MainActivity", "Setting alarm for " + MainActivity.debugDate(cal)); |  | ||||||
|  |  | ||||||
|                 // Set an alarm for the pre-alarm notification, half an hour before the alarm |             // Display toast | ||||||
|                 Calendar preNotifyCal = cal; |             CharSequence text = getString(R.string.alarmSetToast) + " " + CalendarToTimeString(cal); | ||||||
|                 preNotifyCal.add(Calendar.MINUTE, -30); |             Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show(); | ||||||
|                 Intent preNotifyIntent = new Intent(getActivity(), PreAlarmReceiver.class); |  | ||||||
|                 preNotifyPendingIntent = PendingIntent.getBroadcast(getActivity(), PRENOTIFY_REQUEST, preNotifyIntent, 0); |  | ||||||
|                 // Cancel any existing alarms |  | ||||||
|                 alarmManager.cancel(preNotifyPendingIntent); |  | ||||||
|                 // Set or reset alarm |  | ||||||
|                 if (Build.VERSION.SDK_INT >= 19) { |  | ||||||
|                     alarmManager.setExact(AlarmManager.RTC_WAKEUP, preNotifyCal.getTimeInMillis(), preNotifyPendingIntent); |  | ||||||
|                 } else { |  | ||||||
|                     alarmManager.set(AlarmManager.RTC_WAKEUP, preNotifyCal.getTimeInMillis(), preNotifyPendingIntent); |  | ||||||
|                 } |  | ||||||
|                 Log.d("MainActivity", "Setting pre-alarm for " + MainActivity.debugDate(preNotifyCal)); |  | ||||||
|  |  | ||||||
|                 // Set boot receiver, so alarm restarts on boot |  | ||||||
|                 ComponentName receiver = new ComponentName(getActivity(), BootReceiver.class); |  | ||||||
|                 PackageManager pm = getActivity().getPackageManager(); |  | ||||||
|                 pm.setComponentEnabledSetting(receiver, |  | ||||||
|                         PackageManager.COMPONENT_ENABLED_STATE_ENABLED, |  | ||||||
|                         PackageManager.DONT_KILL_APP); |  | ||||||
|  |  | ||||||
|                 // Display toast |  | ||||||
|                 CharSequence text = getString(R.string.alarmSetToast) + " " + alarmStr; |  | ||||||
|                 Toast.makeText(getActivity().getApplicationContext(), text, Toast.LENGTH_SHORT).show(); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static class PhonePickerFragment extends DialogFragment { |     public static class PhonePickerFragment extends DialogFragment { | ||||||
|         EditText phoneButton; |         SharedPreferences sharedPref; | ||||||
|         EditText phoneInput; |         EditText phoneInput; | ||||||
|         Button contactsButton; |  | ||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
|         public Dialog onCreateDialog(Bundle savedInstanceState) { |         public Dialog onCreateDialog(Bundle savedInstanceState) { | ||||||
|             final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); |             sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); | ||||||
|  |  | ||||||
|             AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); |             AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); | ||||||
|             alert.setMessage(R.string.setPhoneNumber); |             alert.setMessage(R.string.setPhoneNumber); | ||||||
|  |  | ||||||
|             LayoutInflater inflater = getActivity().getLayoutInflater(); |             LayoutInflater inflater = getActivity().getLayoutInflater(); | ||||||
|  |             // Pass null instead of the parent ViewGroup, as the parent View is a | ||||||
|  |             // ScrollView, which can only have one direct child | ||||||
|             View dialogView = inflater.inflate(R.layout.phone_dialog, null); |             View dialogView = inflater.inflate(R.layout.phone_dialog, null); | ||||||
|             alert.setView(dialogView); |             alert.setView(dialogView); | ||||||
|  |  | ||||||
|             phoneButton = (EditText) getActivity().findViewById(R.id.phone_number); |             final EditText phoneButton = (EditText) getActivity().findViewById(R.id.phone_number); | ||||||
|             phoneInput = (EditText) dialogView.findViewById(R.id.dialog_phone_number); |             phoneInput = (EditText) dialogView.findViewById(R.id.dialog_phone_number); | ||||||
|             phoneInput.setText(phoneButton.getText().toString()); |             phoneInput.setText(phoneButton.getText().toString()); | ||||||
|             phoneInput.setSelection(phoneInput.getText().length()); |             phoneInput.setSelection(phoneInput.getText().length()); | ||||||
|             contactsButton = (Button) dialogView.findViewById(R.id.dialog_contacts_button); |             final Button contactsButton = (Button) dialogView.findViewById(R.id.dialog_contacts_button); | ||||||
|  |  | ||||||
|             alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { |             alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { | ||||||
|                 public void onClick(DialogInterface dialog, int whichButton) { |                 public void onClick(DialogInterface dialog, int whichButton) { | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 8.2 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 4.2 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 12 KiB | 
| @@ -62,7 +62,7 @@ | |||||||
|                 android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|                 android:id="@+id/alarm_time" |                 android:id="@+id/alarm_time" | ||||||
|                 android:gravity="center_vertical" |                 android:gravity="center_vertical" | ||||||
|                 style="?android:attr/borderlessButtonStyle" |                 style="@style/borderless_button" | ||||||
|                 android:layout_column="1" /> |                 android:layout_column="1" /> | ||||||
|         </TableRow> |         </TableRow> | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								HypoAlarm/src/main/res/values-small/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								HypoAlarm/src/main/res/values-small/styles.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  |     <style name="borderless_button"></style> | ||||||
|  | </resources> | ||||||
| @@ -3,4 +3,6 @@ | |||||||
|     <style name="AppTheme" parent="Theme.AppCompat"> |     <style name="AppTheme" parent="Theme.AppCompat"> | ||||||
|         <!-- Customize your theme here. --> |         <!-- Customize your theme here. --> | ||||||
|     </style> |     </style> | ||||||
|  |  | ||||||
|  |     <style name="borderless_button">?android:attr/borderlessButtonStyle</style> | ||||||
| </resources> | </resources> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user