From 6eb1ebe188349b5ef76ae4380294aefee9a82794 Mon Sep 17 00:00:00 2001 From: tim Date: Tue, 15 Apr 2014 00:24:49 +0200 Subject: [PATCH] - Simplify alarm setting, cancellation, and resetting code - Lintian cleanups --- HypoAlarm/src/main/AndroidManifest.xml | 4 +- .../org/treehouse/hypoalarm/AlarmService.java | 11 + .../org/treehouse/hypoalarm/BootReceiver.java | 20 +- .../org/treehouse/hypoalarm/MainActivity.java | 243 +++++++++--------- .../res/drawable-hdpi/ic_handle_pressed.png | Bin 8378 -> 0 bytes .../res/drawable-mdpi/ic_handle_pressed.png | Bin 4299 -> 0 bytes .../res/drawable-xhdpi/ic_handle_pressed.png | Bin 12182 -> 0 bytes .../src/main/res/layout/fragment_main.xml | 2 +- .../src/main/res/values-small/styles.xml | 4 + HypoAlarm/src/main/res/values/styles.xml | 2 + 10 files changed, 149 insertions(+), 137 deletions(-) delete mode 100644 HypoAlarm/src/main/res/drawable-hdpi/ic_handle_pressed.png delete mode 100644 HypoAlarm/src/main/res/drawable-mdpi/ic_handle_pressed.png delete mode 100644 HypoAlarm/src/main/res/drawable-xhdpi/ic_handle_pressed.png create mode 100644 HypoAlarm/src/main/res/values-small/styles.xml diff --git a/HypoAlarm/src/main/AndroidManifest.xml b/HypoAlarm/src/main/AndroidManifest.xml index f28cadd..2621bb4 100644 --- a/HypoAlarm/src/main/AndroidManifest.xml +++ b/HypoAlarm/src/main/AndroidManifest.xml @@ -16,8 +16,8 @@ - - + + = 19) { diff --git a/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/BootReceiver.java b/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/BootReceiver.java index 37cbfb8..eeddc1b 100644 --- a/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/BootReceiver.java +++ b/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/BootReceiver.java @@ -1,12 +1,9 @@ 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.preference.PreferenceManager; import android.util.Log; @@ -17,21 +14,10 @@ public class BootReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 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); - Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true); - if (alarmTimeStr != null && alarmActive) { - // If it's later than alarmTimeStr, Calendar automatically advances the day. - 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)); - } + Calendar cal = MainActivity.TimeStringToCalendar(alarmTimeStr); + Log.d("BootReceiver", "Booting: Setting alarm for " + MainActivity.debugDate(cal)); + MainActivity.resetAlarm(context, cal); } } } diff --git a/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/MainActivity.java b/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/MainActivity.java index 931ceb4..f0589a3 100644 --- a/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/MainActivity.java +++ b/HypoAlarm/src/main/java/za/org/treehouse/hypoalarm/MainActivity.java @@ -60,13 +60,11 @@ import java.util.regex.Pattern; public class MainActivity extends ActionBarActivity { public static final int ALARM_REQUEST = 1; 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_ALARM_REQUEST = 5; public static final int PHONE_NUMBER_REQUEST = 6; public static final int RINGTONE_REQUEST = 7; - private static Button alarmTimeButton; - private static EditText messageButton; public static final Boolean HYPOALARM_DEBUG = false; @@ -91,63 +89,18 @@ public class MainActivity extends ActionBarActivity { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_main, container, false); - return rootView; + return inflater.inflate(R.layout.fragment_main, container, false); } public void onStart() { - super.onStart(); - final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); - // Allow alarm to activate - 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(); - } - } - }); - + super.onStart(); // Set alarm time - String defaultTimeStr = "09:00"; + final String defaultTimeStr = "09:00"; 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 if (HYPOALARM_DEBUG) { @@ -165,15 +118,37 @@ public class MainActivity extends ActionBarActivity { } }); - // Activate the time when starting the app. - DialogFragment alarmFragment = new TimePickerFragment(); - alarmFragment.show(getActivity().getSupportFragmentManager(), "alarmTimePicker"); - alarmFragment.dismiss(); + // Allow alarm to activate + Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); + final 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 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 - int defaultGrace = 60; + final int defaultGrace = 60; 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() { 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 - ArrayAdapter gracePeriodSpinnerAdapter = (ArrayAdapter) gracePeriodSpinner.getAdapter(); + ArrayAdapter gracePeriodSpinnerAdapter = (ArrayAdapter) gracePeriodSpinner.getAdapter(); int spinnerPosition = gracePeriodSpinnerAdapter.getPosition(MinutesToGracePeriodStr(gracePeriod)); gracePeriodSpinner.setSelection(spinnerPosition); @@ -218,7 +193,7 @@ public class MainActivity extends ActionBarActivity { // Set phone number 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.setOnClickListener(new View.OnClickListener() { @Override @@ -230,7 +205,7 @@ public class MainActivity extends ActionBarActivity { // Set message 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.setOnClickListener(new View.OnClickListener() { @Override @@ -285,7 +260,7 @@ public class MainActivity extends ActionBarActivity { // If we're answering a ringtone dialogue, update the correct button if (requestCode == RINGTONE_REQUEST && resultCode == RESULT_OK) { - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); SharedPreferences.Editor editor = sharedPref.edit(); 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 public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { SharedPreferences sharedPref; - private AlarmManager alarmManager; - private PendingIntent alarmPendingIntent, preNotifyPendingIntent; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); // 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(); // For selecting a time, the date doesn't matter, just the hour and minute Calendar cal = TimeStringToCalendar(alarmTimeStr); @@ -324,17 +375,11 @@ public class MainActivity extends ActionBarActivity { } public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - Boolean alarmActive = sharedPref.getBoolean(getString(R.string.AlarmActivePref), true); - // Set time preference Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, hourOfDay); cal.set(Calendar.MINUTE, minute); 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); SharedPreferences.Editor editor = sharedPref.edit(); @@ -344,73 +389,37 @@ public class MainActivity extends ActionBarActivity { Button alarm_time = (Button) getActivity().findViewById(R.id.alarm_time); alarm_time.setText(alarmStr); - 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. - 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 actual alarm + resetAlarm(getActivity(), cal); - // Set an alarm for the pre-alarm notification, half an hour before the alarm - Calendar preNotifyCal = cal; - preNotifyCal.add(Calendar.MINUTE, -30); - 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(); - } + // Display toast + CharSequence text = getString(R.string.alarmSetToast) + " " + CalendarToTimeString(cal); + Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show(); } } public static class PhonePickerFragment extends DialogFragment { - EditText phoneButton; + SharedPreferences sharedPref; EditText phoneInput; - Button contactsButton; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); + sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.setMessage(R.string.setPhoneNumber); 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); 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.setText(phoneButton.getText().toString()); 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() { public void onClick(DialogInterface dialog, int whichButton) { diff --git a/HypoAlarm/src/main/res/drawable-hdpi/ic_handle_pressed.png b/HypoAlarm/src/main/res/drawable-hdpi/ic_handle_pressed.png deleted file mode 100644 index 58a5f16dfb42cd79e6157936f80da7abad806f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8378 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 diff --git a/HypoAlarm/src/main/res/drawable-mdpi/ic_handle_pressed.png b/HypoAlarm/src/main/res/drawable-mdpi/ic_handle_pressed.png deleted file mode 100644 index 0187a02afc2132d93d337142c022348cf659209a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4299 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 diff --git a/HypoAlarm/src/main/res/drawable-xhdpi/ic_handle_pressed.png b/HypoAlarm/src/main/res/drawable-xhdpi/ic_handle_pressed.png deleted file mode 100644 index 2d28009f22352d2ebf94d933670c068eeb38623d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12182 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 diff --git a/HypoAlarm/src/main/res/values-small/styles.xml b/HypoAlarm/src/main/res/values-small/styles.xml new file mode 100644 index 0000000..d4e61d9 --- /dev/null +++ b/HypoAlarm/src/main/res/values-small/styles.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/HypoAlarm/src/main/res/values/styles.xml b/HypoAlarm/src/main/res/values/styles.xml index 898d102..822720e 100644 --- a/HypoAlarm/src/main/res/values/styles.xml +++ b/HypoAlarm/src/main/res/values/styles.xml @@ -3,4 +3,6 @@ + +