package com.notificationFramework.stimulus; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import com.notificationFramework.sedentary.frontEnd.R; import java.util.Calendar; /** * Created by Peter De Jonckheere on 09/03/2018. * <p> * The concrete implementation of the Stimulus interface which handles requests for goal * notifications to be sent. * </p> * * @see android.content.BroadcastReceiver */ public class GoalStimulus extends BroadcastReceiver implements Stimulus { /** * Upon receiving a broadcast from a strategy this method is triggered and starts the related * service which sends the notification after checking relevant personalised settings. * * @param context the context of the broadcast * @param intent the intent with which the broadcast was sent */ @Override public void onReceive(Context context, Intent intent) { SharedPreferences shared = context.getSharedPreferences(context.getString(R.string.preference_file_key), Context.MODE_PRIVATE); if ((checkTime(shared, context)) && (shared.getBoolean(context.getString(R.string.notf_switch), true))) { Intent i = new Intent(context.getApplicationContext(), com.notificationFramework.notification.GoalNotification.class); context.getApplicationContext().startService(i); } } /** * Checks the current time against the do not disturb time by first checking if the time spans 2 * days, then checking between the first time and midnight, then midnight and the second time, * followed finally by the simple check between the two times if the time does not span 2 days. * It is done in this way to avoid compications with date changes as each time is obtained using * the current calendar as a template so if done correctly dates should not need to be changed. * * @param shared the SharedPreferences instance set up in the onReceive() method * @param context the application context which this method has been called from * @return false if the time is within the do not disturb period and so a notification should * not be sent, true if a notification should be sent */ private boolean checkTime(SharedPreferences shared, Context context) { Calendar start = Calendar.getInstance(); start.set(Calendar.HOUR_OF_DAY, shared.getInt(context.getString(R.string.dnd_shour), 23)); start.set(Calendar.MINUTE, shared.getInt(context.getString(R.string.dnd_smin), 0)); Calendar midnightCal = Calendar.getInstance(); midnightCal.set(Calendar.HOUR_OF_DAY, 23); midnightCal.set(Calendar.MINUTE, 59); midnightCal.set(Calendar.SECOND, 59); Calendar end = Calendar.getInstance(); end.set(Calendar.HOUR_OF_DAY, shared.getInt(context.getString(R.string.dnd_ehour), 9)); end.set(Calendar.MINUTE, shared.getInt(context.getString(R.string.dnd_emin), 0)); Calendar curCal = Calendar.getInstance(); if (shared.getInt(context.getString(R.string.dnd_shour), 23) > shared.getInt(context.getString(R.string.dnd_ehour), 9)) { if (curCal.getTime().after(start.getTime()) && curCal.getTime().before(midnightCal.getTime())) { return false; } else { midnightCal.set(Calendar.HOUR_OF_DAY, 0); midnightCal.set(Calendar.MINUTE, 0); midnightCal.set(Calendar.SECOND, 1); if (curCal.getTime().after(midnightCal.getTime()) && curCal.getTime().before(end.getTime())) { return false; } else { return true; } } } else if (curCal.getTime().after(start.getTime()) && curCal.getTime().before(end.getTime())) { return false; } else { return true; } } }