package com.quickblox.sample.groupchatwebrtc.util;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import com.quickblox.chat.QBChatService;
import com.quickblox.chat.QBPingManager;
import com.quickblox.core.QBEntityCallback;
import com.quickblox.core.exception.QBResponseException;
import org.jivesoftware.smackx.ping.PingFailedListener;
import java.util.concurrent.TimeUnit;
public class ChatPingAlarmManager {
//Change interval for your behaviour
private static final long PING_INTERVAL = TimeUnit.SECONDS.toMillis(60);
private static final String TAG = ChatPingAlarmManager.class.getSimpleName();
private static final String PING_ALARM_ACTION = "com.quickblox.chat.ping.ACTION";
private static final BroadcastReceiver ALARM_BROADCAST_RECEIVER = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "Ping Alarm broadcast received");
if (enabled) {
Log.d(TAG, "Calling pingServer for connection ");
final QBPingManager pingManager = QBChatService.getInstance().getPingManager();
if (pingManager != null) {
pingManager.pingServer(new QBEntityCallback<Void>() {
@Override
public void onSuccess(Void result, Bundle params) {
}
@Override
public void onError(QBResponseException responseException) {
if (pingFailedListener != null) {
pingFailedListener.pingFailed();
}
}
});
}
} else {
Log.d(TAG, "NOT calling pingServerIfNecessary (disabled) on connection ");
}
}
};
private static Context sContext;
private static PendingIntent sPendingIntent;
private static AlarmManager sAlarmManager;
private static boolean enabled = true;
private static ChatPingAlarmManager instance;
private static PingFailedListener pingFailedListener;
public static void setEnabled(boolean enabled) {
ChatPingAlarmManager.enabled = enabled;
}
private ChatPingAlarmManager() {
}
public void addPingListener(PingFailedListener pingFailedListener) {
this.pingFailedListener = pingFailedListener;
}
public static synchronized ChatPingAlarmManager getInstanceFor() {
if (instance == null) {
instance = new ChatPingAlarmManager();
}
return instance;
}
/**
* Register a pending intent with the AlarmManager to be broadcasted every
* half hour and register the alarm broadcast receiver to receive this
* intent. The receiver will check all known questions if a ping is
* Necessary when invoked by the alarm intent.
*
* @param context
*/
public static void onCreate(Context context) {
sContext = context;
context.registerReceiver(ALARM_BROADCAST_RECEIVER, new IntentFilter(PING_ALARM_ACTION));
sAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
sPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(PING_ALARM_ACTION), 0);
sAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + PING_INTERVAL,
PING_INTERVAL, sPendingIntent);
}
/**
* Unregister the alarm broadcast receiver and cancel the alarm.
*/
public static void onDestroy() {
if (sContext != null) {
sContext.unregisterReceiver(ALARM_BROADCAST_RECEIVER);
}
if (sAlarmManager != null) {
sAlarmManager.cancel(sPendingIntent);
}
pingFailedListener = null;
instance = null;
}
}