package com.alimuzaffar.ramadanalarm.scheduler; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.location.LocationManager; import android.os.Build; import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; import com.alimuzaffar.ramadanalarm.Constants; import com.alimuzaffar.ramadanalarm.R; import com.alimuzaffar.ramadanalarm.RingAlarmActivity; import com.alimuzaffar.ramadanalarm.util.AppSettings; import com.alimuzaffar.ramadanalarm.util.PrayTime; import java.util.ArrayList; import java.util.Calendar; import java.util.LinkedHashMap; import java.util.List; import java.util.TimeZone; /** * When the alarm fires, this WakefulBroadcastReceiver receives the broadcast Intent * and then starts the IntentService {@code SampleSchedulingService} to do some work. */ public class RamadanAlarmReceiver extends WakefulBroadcastReceiver implements Constants { // The app's AlarmManager, which provides access to the system alarm services. private AlarmManager alarmMgr; // The pending intent that is triggered when the alarm fires. private PendingIntent sAlarmIntent; private PendingIntent iAlarmIntent; @Override public void onReceive(Context context, Intent intent) { // BEGIN_INCLUDE(alarm_onreceive) /* * If your receiver intent includes extras that need to be passed along to the * service, use setComponent() to indicate that the service should handle the * receiver's intent. For example: * * ComponentName comp = new ComponentName(context.getPackageName(), * MyService.class.getName()); * * // This intent passed in this call will include the wake lock extra as well as * // the receiver intent contents. * startWakefulService(context, (intent.setComponent(comp))); * * In this example, we simply create a new intent to deliver to the service. * This intent holds an extra identifying the wake lock. */ String prayerName = intent.getStringExtra(EXTRA_PRAYER_NAME); long prayerTime = intent.getLongExtra(EXTRA_PRAYER_TIME, -1); boolean timePassed = (prayerTime != -1 && Math.abs(System.currentTimeMillis() - prayerTime) > FIVE_MINUTES); AppSettings settings = AppSettings.getInstance(context); if (settings.isAlarmSetFor(0)) { if (!timePassed) { // START THE ALARM ACTIVITY Intent newIntent = new Intent(context, RingAlarmActivity.class); Log.d("RamadanAlarmReceiver", "Alarm Receiver Got " + prayerName); newIntent.putExtra(EXTRA_PRAYER_NAME, prayerName); newIntent.putExtra(EXTRA_PRE_ALARM_FLAG, true); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(newIntent); } //SET THE NEXT ALARM setAlarm(context); } } // BEGIN_INCLUDE(set_alarm) /** * Sets a repeating alarm that runs once a day at approximately 8:30 a.m. When the * alarm fires, the app broadcasts an Intent to this WakefulBroadcastReceiver. * * @param context */ public void setAlarm(Context context) { alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); AppSettings settings = AppSettings.getInstance(context); Calendar now = Calendar.getInstance(TimeZone.getDefault()); now.setTimeInMillis(System.currentTimeMillis()); // Set the alarm's trigger time to 8:30 a.m. double lat = settings.getLatFor(0); double lng = settings.getLngFor(0); LinkedHashMap<String, String> prayerTimes = PrayTime.getPrayerTimes(context, 0, lat, lng, PrayTime.TIME_24); if (!settings.getBoolean(AppSettings.Key.IS_RAMADAN)) { return; } int suhoorOffset = settings.getInt(AppSettings.Key.SUHOOR_OFFSET); int iftarOffset = settings.getInt(AppSettings.Key.IFTAR_OFFSET); Calendar preSuhoorTime = Calendar.getInstance(TimeZone.getDefault()); preSuhoorTime.setTimeInMillis(System.currentTimeMillis()); Calendar preIftarTime = Calendar.getInstance(TimeZone.getDefault()); preIftarTime.setTimeInMillis(System.currentTimeMillis()); if (suhoorOffset > 0) { long time = suhoorOffset * 15 * 60 * 1000; preSuhoorTime = getCalendarFromPrayerTime(preSuhoorTime, prayerTimes.get("Fajr")); preSuhoorTime.setTimeInMillis(preSuhoorTime.getTimeInMillis() - time); } if (iftarOffset > 0) { long time = iftarOffset * 15 * 60 * 1000; preIftarTime = getCalendarFromPrayerTime(preIftarTime, prayerTimes.get("Maghrib")); preIftarTime.setTimeInMillis(preIftarTime.getTimeInMillis() - time); } if (preSuhoorTime.before(now)) { preSuhoorTime.add(Calendar.DAY_OF_YEAR, 1); } if (suhoorOffset > 0) { Intent sIntent = new Intent(context, RamadanAlarmReceiver.class); sIntent.putExtra(EXTRA_PRAYER_NAME, context.getString(R.string.suhoor_is_close)); sIntent.putExtra(EXTRA_PRAYER_TIME, preSuhoorTime.getTimeInMillis()); sAlarmIntent = PendingIntent.getBroadcast(context, PRE_SUHOOR_ALARM_ID, sIntent, PendingIntent.FLAG_CANCEL_CURRENT); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) { //lollipop_mr1 is 22, this is only 23 and above alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, preSuhoorTime.getTimeInMillis(), sAlarmIntent); } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { //JB_MR2 is 18, this is only 19 and above. alarmMgr.setExact(AlarmManager.RTC_WAKEUP, preSuhoorTime.getTimeInMillis(), sAlarmIntent); } else { //available since api1 alarmMgr.set(AlarmManager.RTC_WAKEUP, preSuhoorTime.getTimeInMillis(), sAlarmIntent); } } if (preIftarTime.before(now)) { preIftarTime.add(Calendar.DAY_OF_YEAR, 1); } if (iftarOffset > 0) { Intent iIntent = new Intent(context, RamadanAlarmReceiver.class); iIntent.putExtra(EXTRA_PRAYER_NAME, context.getString(R.string.iftar_is_close)); iIntent.putExtra(EXTRA_PRAYER_TIME, preIftarTime.getTimeInMillis()); iAlarmIntent = PendingIntent.getBroadcast(context, PRE_IFTAR_ALARM_ID, iIntent, PendingIntent.FLAG_CANCEL_CURRENT); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) { //lollipop_mr1 is 22, this is only 23 and above alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, preIftarTime.getTimeInMillis(), iAlarmIntent); } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { //JB_MR2 is 18, this is only 19 and above. alarmMgr.setExact(AlarmManager.RTC_WAKEUP, preIftarTime.getTimeInMillis(), iAlarmIntent); } else { //available since api1 alarmMgr.set(AlarmManager.RTC_WAKEUP, preIftarTime.getTimeInMillis(), iAlarmIntent); } } } // END_INCLUDE(set_alarm) /** * Cancels the alarm. * * @param context */ // BEGIN_INCLUDE(cancel_alarm) public void cancelAlarm(Context context) { // If the alarm has been set, cancel it. if (alarmMgr == null) { alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); } if (alarmMgr != null) { if (sAlarmIntent == null) { Intent sIntent = new Intent(context, RamadanAlarmReceiver.class); sAlarmIntent = PendingIntent.getBroadcast(context, PRE_SUHOOR_ALARM_ID, sIntent, PendingIntent.FLAG_CANCEL_CURRENT); Intent iIntent = new Intent(context, RamadanAlarmReceiver.class); iAlarmIntent = PendingIntent.getBroadcast(context, PRE_IFTAR_ALARM_ID, iIntent, PendingIntent.FLAG_CANCEL_CURRENT); } alarmMgr.cancel(sAlarmIntent); alarmMgr.cancel(iAlarmIntent); } } // END_INCLUDE(cancel_alarm) private Calendar getCalendarFromPrayerTime(Calendar cal, String prayerTime) { String[] time = prayerTime.split(":"); cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(time[0])); cal.set(Calendar.MINUTE, Integer.valueOf(time[1])); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal; } }