package com.betomaluje.android.miband.example;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.text.format.Time;
import android.util.Log;
import com.betomaluje.miband.ActionCallback;
import com.betomaluje.miband.MiBand;
import java.util.Calendar;
/**
* Created by betomaluje on 7/4/15.
*/
public class WaterScheduler {
private static final String TAG = WaterScheduler.class.getSimpleName();
private static Context context;
private static PendingIntent pendingIntent;
private static AlarmManager alarmManager;
private static WaterScheduler instance;
private boolean alreadyScheduled = false;
//every 45 minutes
private long nextUpdate = (1000 * 60 * 45);
public interface ScheduleCallback {
void OnScheduleNext();
void OnScheduleTomorrow();
}
public static WaterScheduler getInstance(Context context) {
if (instance == null) {
instance = new WaterScheduler(context);
} else {
WaterScheduler.context = context;
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
return instance;
}
public WaterScheduler(Context context) {
WaterScheduler.context = context;
Intent alarmIntent = new Intent(context, WaterReceiver.class);
pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
public void notify(final ScheduleCallback scheduleCallback) {
if (isAlarmForToday()) {
final MiBand miBand = MiBand.getInstance(context);
Log.i(TAG, "miBand connected: " + miBand.isConnected());
if (!miBand.isConnected()) {
miBand.connect(new ActionCallback() {
@Override
public void onSuccess(Object data) {
if (scheduleCallback != null)
scheduleCallback.OnScheduleNext();
}
@Override
public void onFail(int errorCode, String msg) {
Log.i(TAG, "onFail: " + msg);
}
});
} else {
if (scheduleCallback != null)
scheduleCallback.OnScheduleNext();
}
} else {
Log.i(TAG, "notify after time! Scheduling new alarm!");
scheduleForTomorrow(scheduleCallback);
}
}
public void schedule(final ScheduleCallback scheduleCallback) {
alarmManager.cancel(pendingIntent);
if (isAlarmForToday()) {
//we schedule the alarm for the next X minutes, repeating every X minutes
if (alarmManager == null) {
Log.i(TAG, "AlarmManager null :(");
return;
}
//we cancel any previous alarm
alarmManager.cancel(pendingIntent);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextUpdate, nextUpdate, pendingIntent);
if (scheduleCallback != null)
scheduleCallback.OnScheduleNext();
} else {
Log.i(TAG, "schedule after time! Scheduling new alarm!");
scheduleForTomorrow(scheduleCallback);
}
}
private void scheduleForTomorrow(final ScheduleCallback scheduleCallback) {
if (alarmManager == null) {
Log.i(TAG, "AlarmManager null :(");
return;
}
if (!alreadyScheduled) {
alreadyScheduled = true;
//we cancel any previous alarm
alarmManager.cancel(pendingIntent);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
//exactly at 8 am for tomorrow
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), nextUpdate, pendingIntent);
if (scheduleCallback != null)
scheduleCallback.OnScheduleTomorrow();
}
}
private boolean isAlarmForToday() {
long currentTimeMillis = System.currentTimeMillis();
long nextUpdateTimeMillis = currentTimeMillis + nextUpdate;
Time nextUpdateTime = new Time();
nextUpdateTime.set(nextUpdateTimeMillis);
Log.v(TAG, "water time: " + nextUpdateTime.hour);
//only between 8 am and 18 pm
return nextUpdateTime.hour > 7 && nextUpdateTime.hour < 18;
}
}