package com.kuxhausen.huemore.alarm; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.preference.PreferenceManager; import com.kuxhausen.huemore.BuildConfig; import com.kuxhausen.huemore.persistence.Definitions; import com.kuxhausen.huemore.persistence.Definitions.AlarmColumns; import com.kuxhausen.huemore.utils.DeferredLog; import java.util.Calendar; public class AlarmLogic { /** * if enabled and alarm time has passed, replaced with next upcoming alarm time. If not repeating, * mark disabled. Saves changes to database */ public static void updateAlarm(Context context, AlarmData data) { logAlarm("UpdateAlarm", data); if (data.isEnabled()) { Calendar mustBeAfter = Calendar.getInstance(); mustBeAfter.add(Calendar.MINUTE, 1); Calendar cal = data.getAlarmTime(); if (!cal.after(mustBeAfter)) { if (data.getRepeatDays().isNoDaysSet()) { data.setEnabled(false); } else { data.setAlarmTime( computeNextAlarmTime(data.getHourOfDay(), data.getMinute(), data.getRepeatDays(), Calendar.getInstance())); } saveChangesToDB(context, data); } } } public static Calendar computeNextAlarmTime(int hourOfDay, int minute, DaysOfWeek repeats, Calendar currentTime) { Calendar mustBeAfter = Calendar.getInstance(); mustBeAfter.setTimeInMillis(currentTime.getTimeInMillis()); mustBeAfter.add(Calendar.MINUTE, 1); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(currentTime.getTimeInMillis()); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.getTime(); //force internal recompute while (!calendar.after(mustBeAfter)) { calendar.add(Calendar.DAY_OF_WEEK, 1); //if alarm is only valid on certain days, keep incrementing till one of those days reached if (!repeats.isNoDaysSet()) { while (!repeats.isDaySet(calendar.get(Calendar.DAY_OF_WEEK))) { calendar.add(Calendar.DAY_OF_WEEK, 1); } } } return calendar; } public static AlarmData getAlarm(Context context, long id) { AlarmData result = null; String rowSelect = Definitions.AlarmColumns.TABLE_NAME + "." + Definitions.AlarmColumns._ID + "=?"; String[] rowArg = {"" + id}; Cursor cursor = context.getContentResolver().query(AlarmColumns.ALARMS_URI, AlarmData.QUERY_COLUMNS, rowSelect, rowArg, null); if (cursor.moveToFirst()) { result = new AlarmData(cursor); } cursor.close(); return result; } public static void insertAlarmToDB(Context context, AlarmData data) { logAlarm("DBinsert", data); long baseId = Long.parseLong( context.getContentResolver() .insert(Definitions.AlarmColumns.ALARMS_URI, data.getValues()) .getLastPathSegment()); data.setId(baseId); } public static void saveChangesToDB(Context context, AlarmData data) { logAlarm("DBupdate", data); String rowSelect = Definitions.AlarmColumns._ID + "=?"; String[] rowArg = {"" + data.getId()}; context.getContentResolver() .update(Definitions.AlarmColumns.ALARMS_URI, data.getValues(), rowSelect, rowArg); } public static void deleteAlarmFromDB(Context context, AlarmData data) { logAlarm("DBdelete", data); String rowSelect = Definitions.AlarmColumns._ID + "=?"; String[] rowArg = {"" + data.getId()}; context.getContentResolver().delete(Definitions.AlarmColumns.ALARMS_URI, rowSelect, rowArg); } public static void updateGloablIntentId(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int newGlobalId = prefs.getInt(Definitions.PreferenceKeys.ALARM_GLOBAL_ID, -1) + 1; prefs.edit().putInt(Definitions.PreferenceKeys.ALARM_GLOBAL_ID, newGlobalId).commit(); } public static int getGlobalId(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return prefs.getInt(Definitions.PreferenceKeys.ALARM_GLOBAL_ID, -1); } public static void toggleAlarm(Context context, AlarmData data) { logAlarm("Toggled", data); if (!data.isEnabled()) { data.setEnabled(true); data.setAlarmTime( computeNextAlarmTime(data.getHourOfDay(), data.getMinute(), data.getRepeatDays(), Calendar.getInstance())); saveChangesToDB(context, data); AlarmReceiver.registerAlarm(context, data, true); } else { AlarmReceiver.unregisterAlarm(context, data); data.setEnabled(false); saveChangesToDB(context, data); } } public static void logAlarm(String eventMessage, AlarmData alarmData) { if(DeferredLog.isLoggable()) { StringBuilder sb = new StringBuilder(eventMessage); sb.append(','); Calendar time = alarmData.getAlarmTime(); sb.append(time.get(Calendar.YEAR)); sb.append(','); sb.append(time.get(Calendar.MONTH)); sb.append(','); sb.append(time.get(Calendar.DAY_OF_MONTH)); sb.append(','); sb.append(time.get(Calendar.HOUR_OF_DAY)); sb.append(','); sb.append(time.get(Calendar.MINUTE)); sb.append(','); sb.append(alarmData.getMoodName()); sb.append(','); sb.append(alarmData.getGroupName()); DeferredLog.i("AlarmDebug", sb.toString()); } } }