|
|
|
@@ -42,79 +42,176 @@ import java.util.Iterator;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
public class ReminderPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
|
|
|
|
|
public class ReminderPreferences extends PreferenceFragment
|
|
|
|
|
implements SharedPreferences.OnSharedPreferenceChangeListener
|
|
|
|
|
{
|
|
|
|
|
private static final String PREFERENCE_KEY_REMINDER_ENABLE = "reminderEnable";
|
|
|
|
|
private static final String PREFERENCE_KEY_REMINDER_WEEKDAYS = "reminderWeekdays";
|
|
|
|
|
private static final String PREFERENCE_KEY_REMINDER_TIME = "reminderTime";
|
|
|
|
|
private static final String PREFERENCE_KEY_REMINDER_NOTIFY_TEXT = "reminderNotifyText";
|
|
|
|
|
|
|
|
|
|
private static ArrayList<PendingIntent> pendingAlarms = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
private CheckBoxPreference reminderEnable;
|
|
|
|
|
private MultiSelectListPreference reminderWeekdays;
|
|
|
|
|
private TimePreferenceDialog reminderTime;
|
|
|
|
|
private EditTextPreference reminderNotifyText;
|
|
|
|
|
|
|
|
|
|
private static ArrayList<PendingIntent> pendingAlarms = new ArrayList<>();
|
|
|
|
|
public static void scheduleAlarms(Context context)
|
|
|
|
|
{
|
|
|
|
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
|
|
|
|
|
|
|
|
|
Set<String> reminderWeekdays = prefs.getStringSet(PREFERENCE_KEY_REMINDER_WEEKDAYS, new HashSet<String>());
|
|
|
|
|
Long reminderTimeInMillis = prefs.getLong(PREFERENCE_KEY_REMINDER_TIME, System.currentTimeMillis());
|
|
|
|
|
|
|
|
|
|
Iterator<String> iterWeekdays = reminderWeekdays.iterator();
|
|
|
|
|
|
|
|
|
|
disableAllAlarms(context);
|
|
|
|
|
|
|
|
|
|
while (iterWeekdays.hasNext())
|
|
|
|
|
{
|
|
|
|
|
String strWeekdays = iterWeekdays.next();
|
|
|
|
|
switch (strWeekdays)
|
|
|
|
|
{
|
|
|
|
|
case "Monday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.MONDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case "Tuesday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.TUESDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case "Wednesday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.WEDNESDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case "Thursday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.THURSDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case "Friday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.FRIDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case "Saturday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.SATURDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case "Sunday":
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.SUNDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static PendingIntent enableAlarm(Context context, int dayOfWeek, long timeInMillis)
|
|
|
|
|
{
|
|
|
|
|
Calendar alarmCal = Calendar.getInstance();
|
|
|
|
|
alarmCal.setTimeInMillis(timeInMillis);
|
|
|
|
|
alarmCal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
|
|
|
|
|
|
|
|
|
|
// Check we aren't setting it in the past which would trigger it to fire instantly
|
|
|
|
|
if (alarmCal.getTimeInMillis() < System.currentTimeMillis())
|
|
|
|
|
{
|
|
|
|
|
alarmCal.add(Calendar.DAY_OF_YEAR, 7);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Log.d("ReminderPreferences", "Set alarm to " + calendar.getTime());
|
|
|
|
|
|
|
|
|
|
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
|
|
|
|
|
|
|
|
|
Intent alarmIntent = new Intent(context, ReminderBootReceiver.class);
|
|
|
|
|
alarmIntent.putExtra("alarmIntent", true);
|
|
|
|
|
|
|
|
|
|
PendingIntent alarmPendingIntent =
|
|
|
|
|
PendingIntent.getBroadcast(context, dayOfWeek, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
|
|
|
|
|
|
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, alarmCal.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7,
|
|
|
|
|
alarmPendingIntent);
|
|
|
|
|
|
|
|
|
|
return alarmPendingIntent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void disableAllAlarms(Context context)
|
|
|
|
|
{
|
|
|
|
|
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < pendingAlarms.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
alarmMgr.cancel(pendingAlarms.get(i));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pendingAlarms.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onCreate(Bundle savedInstanceState) {
|
|
|
|
|
public void onCreate(Bundle savedInstanceState)
|
|
|
|
|
{
|
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
|
|
|
|
|
|
addPreferencesFromResource(R.xml.reminder_preferences);
|
|
|
|
|
|
|
|
|
|
reminderEnable = (CheckBoxPreference)findPreference("reminderEnable");
|
|
|
|
|
reminderWeekdays = (MultiSelectListPreference)findPreference("reminderWeekdays");
|
|
|
|
|
reminderTime = (TimePreferenceDialog)findPreference("reminderTime");
|
|
|
|
|
reminderNotifyText = (EditTextPreference)findPreference("reminderNotifyText");
|
|
|
|
|
reminderEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_REMINDER_ENABLE);
|
|
|
|
|
reminderWeekdays = (MultiSelectListPreference) findPreference(PREFERENCE_KEY_REMINDER_WEEKDAYS);
|
|
|
|
|
reminderTime = (TimePreferenceDialog) findPreference(PREFERENCE_KEY_REMINDER_TIME);
|
|
|
|
|
reminderNotifyText = (EditTextPreference) findPreference(PREFERENCE_KEY_REMINDER_NOTIFY_TEXT);
|
|
|
|
|
|
|
|
|
|
updateAlarmPreferences();
|
|
|
|
|
initSummary(getPreferenceScreen());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initSummary(Preference p) {
|
|
|
|
|
if (p instanceof PreferenceGroup) {
|
|
|
|
|
private void initSummary(Preference p)
|
|
|
|
|
{
|
|
|
|
|
if (p instanceof PreferenceGroup)
|
|
|
|
|
{
|
|
|
|
|
PreferenceGroup pGrp = (PreferenceGroup) p;
|
|
|
|
|
for (int i = 0; i < pGrp.getPreferenceCount(); i++) {
|
|
|
|
|
for (int i = 0; i < pGrp.getPreferenceCount(); i++)
|
|
|
|
|
{
|
|
|
|
|
initSummary(pGrp.getPreference(i));
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
updatePrefSummary(p);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onResume() {
|
|
|
|
|
public void onResume()
|
|
|
|
|
{
|
|
|
|
|
super.onResume();
|
|
|
|
|
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPause() {
|
|
|
|
|
public void onPause()
|
|
|
|
|
{
|
|
|
|
|
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
|
|
|
|
|
super.onPause();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
|
|
|
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
|
|
|
|
|
{
|
|
|
|
|
updatePrefSummary(findPreference(key));
|
|
|
|
|
updateAlarmPreferences();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void updateAlarmPreferences() {
|
|
|
|
|
public void updateAlarmPreferences()
|
|
|
|
|
{
|
|
|
|
|
ComponentName receiver = new ComponentName(getActivity().getApplicationContext(), ReminderBootReceiver.class);
|
|
|
|
|
PackageManager pm = getActivity().getApplicationContext().getPackageManager();
|
|
|
|
|
|
|
|
|
|
if (reminderEnable.isChecked()) {
|
|
|
|
|
if (reminderEnable.isChecked())
|
|
|
|
|
{
|
|
|
|
|
scheduleAlarms(getActivity());
|
|
|
|
|
|
|
|
|
|
pm.setComponentEnabledSetting(receiver,
|
|
|
|
|
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
|
|
|
|
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
|
|
|
|
PackageManager.DONT_KILL_APP);
|
|
|
|
|
|
|
|
|
|
reminderWeekdays.setEnabled(true);
|
|
|
|
|
reminderTime.setEnabled(true);
|
|
|
|
|
reminderNotifyText.setEnabled(true);
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
disableAllAlarms(getActivity());
|
|
|
|
|
|
|
|
|
|
pm.setComponentEnabledSetting(receiver,
|
|
|
|
|
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
|
|
|
|
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
|
|
|
|
PackageManager.DONT_KILL_APP);
|
|
|
|
|
|
|
|
|
|
reminderWeekdays.setEnabled(false);
|
|
|
|
@@ -123,23 +220,29 @@ public class ReminderPreferences extends PreferenceFragment implements SharedPr
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updatePrefSummary(Preference p) {
|
|
|
|
|
if (p instanceof ListPreference) {
|
|
|
|
|
private void updatePrefSummary(Preference p)
|
|
|
|
|
{
|
|
|
|
|
if (p instanceof ListPreference)
|
|
|
|
|
{
|
|
|
|
|
ListPreference listPref = (ListPreference) p;
|
|
|
|
|
p.setSummary(listPref.getEntry());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (p instanceof EditTextPreference) {
|
|
|
|
|
if (p instanceof EditTextPreference)
|
|
|
|
|
{
|
|
|
|
|
EditTextPreference editTextPref = (EditTextPreference) p;
|
|
|
|
|
if (p.getTitle().toString().contains("assword"))
|
|
|
|
|
{
|
|
|
|
|
p.setSummary("******");
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
p.setSummary(editTextPref.getText());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (p instanceof MultiSelectListPreference) {
|
|
|
|
|
if (p instanceof MultiSelectListPreference)
|
|
|
|
|
{
|
|
|
|
|
MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p;
|
|
|
|
|
|
|
|
|
|
CharSequence[] entries = editMultiListPref.getEntries();
|
|
|
|
@@ -148,86 +251,12 @@ public class ReminderPreferences extends PreferenceFragment implements SharedPr
|
|
|
|
|
Set<String> currentEntryValues = editMultiListPref.getValues();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < entries.length; i++)
|
|
|
|
|
if (currentEntryValues.contains(entryValues[i]))
|
|
|
|
|
currentEntries.add(entries[i].toString());
|
|
|
|
|
{
|
|
|
|
|
if (currentEntryValues.contains(entryValues[i].toString())) currentEntries.add(entries[i].toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p.setSummary(currentEntries.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void scheduleAlarms(Context context) {
|
|
|
|
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
|
|
|
|
|
|
|
|
|
Set<String> reminderWeekdays = prefs.getStringSet("reminderWeekdays", new HashSet<String>());
|
|
|
|
|
Long reminderTimeInMillis = prefs.getLong("reminderTime", System.currentTimeMillis());
|
|
|
|
|
|
|
|
|
|
Iterator iterWeekdays = reminderWeekdays.iterator();
|
|
|
|
|
|
|
|
|
|
disableAllAlarms(context);
|
|
|
|
|
|
|
|
|
|
while (iterWeekdays.hasNext()) {
|
|
|
|
|
String strWeekdays = iterWeekdays.next().toString();
|
|
|
|
|
|
|
|
|
|
switch (Integer.parseInt(strWeekdays)){
|
|
|
|
|
case 0:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.MONDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.TUESDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.WEDNESDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.THURSDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.FRIDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.SATURDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
pendingAlarms.add(enableAlarm(context, Calendar.SUNDAY, reminderTimeInMillis));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static PendingIntent enableAlarm(Context context, int dayOfWeek, long timeInMillis) {
|
|
|
|
|
Calendar alarmCal = Calendar.getInstance();
|
|
|
|
|
alarmCal.setTimeInMillis(timeInMillis);
|
|
|
|
|
alarmCal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
|
|
|
|
|
|
|
|
|
|
// Check we aren't setting it in the past which would trigger it to fire instantly
|
|
|
|
|
if(alarmCal.getTimeInMillis() < System.currentTimeMillis()) {
|
|
|
|
|
alarmCal.add(Calendar.DAY_OF_YEAR, 7);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Log.d("ReminderPreferences", "Set alarm to " + calendar.getTime());
|
|
|
|
|
|
|
|
|
|
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
|
|
|
|
|
|
|
|
|
Intent alarmIntent = new Intent(context, ReminderBootReceiver.class);
|
|
|
|
|
alarmIntent.putExtra("alarmIntent", true);
|
|
|
|
|
|
|
|
|
|
PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(context, dayOfWeek, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
|
|
|
|
|
|
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, alarmCal.getTimeInMillis(),
|
|
|
|
|
AlarmManager.INTERVAL_DAY * 7, alarmPendingIntent);
|
|
|
|
|
|
|
|
|
|
return alarmPendingIntent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void disableAllAlarms(Context context) {
|
|
|
|
|
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
|
|
|
|
|
|
|
|
|
for (int i=0; i<pendingAlarms.size(); i++) {
|
|
|
|
|
alarmMgr.cancel(pendingAlarms.get(i));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pendingAlarms.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|