package at.tugraz.examreminder.service;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.preference.PreferenceManager;
import android.util.Log;
import at.tugraz.examreminder.R;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import java.util.Calendar;
public class DailyListener implements WakefulIntentService.AlarmListener {
public static PendingIntent currentPendingIntent;
public static void scheduleMe(Context context) {
WakefulIntentService.scheduleAlarms(new DailyListener(), context, true);
}
@Override
public void scheduleAlarms(AlarmManager alarmManager, PendingIntent pendingIntent, Context context) {
PreferenceManager.setDefaultValues(context, R.xml.preferences, false);
int update_interval = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(context).getString("pref_update_frequency", "-1"));
if(update_interval <= 0)
return;
String update_time = PreferenceManager.getDefaultSharedPreferences(context).getString("pref_update_time", "12:00");
String[] update_time_parts = update_time.split(":");
int update_hour = Integer.parseInt(update_time_parts[0]);
int update_minute = Integer.parseInt(update_time_parts[1]);
Calendar calendar = Calendar.getInstance();
// if it's already after the target time, schedule first run for the next day
if(calendar.get(Calendar.HOUR_OF_DAY) >= update_hour && calendar.get(Calendar.MINUTE) >= update_minute) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
calendar.set(Calendar.HOUR_OF_DAY, update_hour);
calendar.set(Calendar.MINUTE, update_minute);
calendar.set(Calendar.SECOND, 0);
setNewPendingIntentAndCancelOld(context, pendingIntent);
alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY * update_interval, pendingIntent);
Log.i("DailyListener", "New schedule: " + calendar.getTime().toString());
}
@Override
public void sendWakefulWork(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
boolean isConnectedOrConnecting;
int type;
if(netInfo == null) {
type = -1;
isConnectedOrConnecting = false;
} else {
type = netInfo.getType();
isConnectedOrConnecting = netInfo == null ? false : netInfo.isConnectedOrConnecting();
}
sendWakefulWork(context, isConnectedOrConnecting, type);
}
public void sendWakefulWork(Context context, boolean isConnectedOrConnecting, int connectionType) {
// only when connected or while connecting...
if (isConnectedOrConnecting) {
boolean updateOnlyOnWifi = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("pref_update_wifi_only", false);
// if we have mobile or wifi connectivity...
if (((connectionType == ConnectivityManager.TYPE_MOBILE) && updateOnlyOnWifi == false)
|| (connectionType == ConnectivityManager.TYPE_WIFI)) {
Log.d("DailyListener", "We have internet, start update check directly now!");
Intent backgroundIntent = new Intent(context, UpdateService.class);
WakefulIntentService.sendWakefulWork(context, backgroundIntent);
} else {
Log.d("DailyListener", "We have no internet, enable ConnectivityReceiver!");
// enable receiver to schedule update when internet is available!
ConnectivityReceiver.enableReceiver(context);
}
} else {
Log.d("DailyListener", "We have no internet, enable ConnectivityReceiver!");
// enable receiver to schedule update when internet is available!
ConnectivityReceiver.enableReceiver(context);
}
}
@Override
public long getMaxAge() {
return (AlarmManager.INTERVAL_DAY + 60 * 1000);
}
public synchronized static void setNewPendingIntentAndCancelOld(Context context, PendingIntent pendingIntent) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if(currentPendingIntent != null) {
alarmManager.cancel(currentPendingIntent);
}
WakefulIntentService.cancelAlarms(context);
currentPendingIntent = pendingIntent;
}
}