package com.kuxhausen.huemore.alarm; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.support.v4.content.WakefulBroadcastReceiver; import android.text.format.DateUtils; import android.widget.Toast; import com.kuxhausen.huemore.R; import com.kuxhausen.huemore.net.ConnectivityService; import com.kuxhausen.huemore.persistence.Definitions.InternalArguments; import com.kuxhausen.huemore.persistence.Definitions.PreferenceKeys; public class AlarmReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(InternalArguments.ALARM_INTENT_ACTION)) { int globalId = AlarmLogic.getGlobalId(context); int intentId = intent.getIntExtra(PreferenceKeys.ALARM_GLOBAL_ID, -1); if (globalId == intentId) { long alarmId = intent.getLongExtra(InternalArguments.ALARM_ID, -1); AlarmData alarm = AlarmLogic.getAlarm(context, alarmId); if (alarm != null) { AlarmLogic.updateAlarm(context, alarm); //schedule next alarm if repeating if (alarm.isEnabled()) { registerAlarm(context, alarm, false); } //now start playing this alarm Intent transmitter = new Intent(context, ConnectivityService.class); transmitter.putExtra(InternalArguments.MAX_BRIGHTNESS, alarm.getPercentBrightness()); transmitter.putExtra(InternalArguments.MOOD_NAME, alarm.getMoodName()); transmitter.putExtra(InternalArguments.GROUP_NAME, alarm.getGroupName()); startWakefulService(context, transmitter); } } } } private static PendingIntent generatePendingIntent(Context context, AlarmData data) { Intent intent = new Intent(context, AlarmReceiver.class); intent.setAction(InternalArguments.ALARM_INTENT_ACTION); intent.setData(Uri.parse("content://" + data.getId())); intent.putExtra(InternalArguments.ALARM_ID, data.getId()); intent.putExtra(PreferenceKeys.ALARM_GLOBAL_ID, AlarmLogic.getGlobalId(context)); return PendingIntent .getBroadcast(context, (int) data.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT); } public static void registerAlarm(Context context, AlarmData data, boolean showToast) { AlarmLogic.logAlarm("RegisterAlarm", data); PendingIntent pending = generatePendingIntent(context, data); AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { AlarmManager.AlarmClockInfo info = new AlarmManager.AlarmClockInfo(data.getAlarmTime().getTimeInMillis(), pending); alarmMgr.setAlarmClock(info, pending); } else { alarmMgr.setExact(AlarmManager.RTC_WAKEUP, data.getAlarmTime().getTimeInMillis(), pending); } if (showToast) { Toast.makeText(context, context.getString(R.string.next_scheduled_intro) + " " + DateUtils .getRelativeTimeSpanString( data.getAlarmTime().getTimeInMillis()), Toast.LENGTH_SHORT).show(); } } public static void unregisterAlarm(Context context, AlarmData data) { AlarmLogic.logAlarm("UnregisterAlarm", data); PendingIntent pending = generatePendingIntent(context, data); AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmMgr.cancel(pending); } }