package org.nightscout.lasso.mqtt;
import android.annotation.TargetApi;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.util.Log;
import com.nightscout.core.mqtt.Constants;
import com.nightscout.core.mqtt.MqttTimer;
import com.nightscout.core.mqtt.MqttTimerObserver;
import java.util.ArrayList;
import java.util.List;
//import com.google.common.collect.Lists;
public class AndroidMqttTimer implements MqttTimer {
private static final String TAG = AndroidMqttTimer.class.getSimpleName();
Intent alarmIntent;
PendingIntent pendingAlarmIntent;
private List<MqttTimerObserver> observers = new ArrayList<>();
private MqttTimerReceiver timerReceiver;
private AlarmManager alarmMgr;
private boolean active = false;
private Context context;
private int Id;
public AndroidMqttTimer(Context context, int Id) {
this.context = context;
this.Id = Id;
this.timerReceiver = new MqttTimerReceiver(observers);
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public void setTimer(long delayMs) {
cancel();
alarmIntent = new Intent(Constants.RECONNECT_INTENT_FILTER);
alarmIntent.putExtra("device", Id);
pendingAlarmIntent = PendingIntent.getBroadcast(context, 61 + Id, alarmIntent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delayMs, pendingAlarmIntent);
} else {
alarmMgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delayMs, pendingAlarmIntent);
}
}
@Override
public void cancel() {
alarmMgr.cancel(pendingAlarmIntent);
}
@Override
public void activate() {
if (!active) {
context.registerReceiver(timerReceiver, new IntentFilter(Constants.RECONNECT_INTENT_FILTER));
active = true;
} else {
Log.w(TAG, "Timer already activiated");
}
}
@Override
public void deactivate() {
cancel();
if (active) {
Log.d(TAG, "Deactivating timer");
context.unregisterReceiver(timerReceiver);
active = false;
} else {
Log.w(TAG, "Timer already deactiviated");
}
}
@Override
public boolean isActive() {
return active;
}
@Override
public void registerObserver(MqttTimerObserver observer) {
if (!observers.contains(observer)) {
observers.add(observer);
} else {
Log.w(TAG, "Observer already registered");
}
}
@Override
public void unregisterObserver(MqttTimerObserver observer) {
if (observers.contains(observer)) {
observers.remove(observer);
} else {
Log.w(TAG, "Observer not registered");
}
}
}