- Simplify alarm setting, cancellation, and resetting code
- Lintian cleanups
This commit is contained in:
parent
db6c41fe72
commit
6eb1ebe188
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user