package jp.co.cyberagent.stf.monitor;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import jp.co.cyberagent.stf.io.MessageWritable;
import jp.co.cyberagent.stf.proto.Wire;
public class ConnectivityMonitor extends AbstractMonitor {
private static final String TAG = "STFConnectivityMonitor";
private ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
public ConnectivityMonitor(Context context, MessageWritable writer) {
super(context, writer);
}
@Override
public void run() {
Log.i(TAG, "Monitor starting");
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
peek();
}
};
context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
try {
synchronized (this) {
while (!isInterrupted()) {
wait();
}
}
}
catch (InterruptedException e) {
// Okay
}
catch (Exception e) {
e.printStackTrace();
}
finally {
Log.i(TAG, "Monitor stopping");
context.unregisterReceiver(receiver);
}
}
@Override
public void peek(MessageWritable writer) {
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
Log.i(TAG, String.format("Network %s/%s is %s; %s; %s",
info.getTypeName(),
info.getSubtypeName(),
info.isConnected() ? "connected" : "not connected",
info.isFailover() ? "failover" : "not failover",
info.isRoaming() ? "roaming" : "not roaming"
));
writer.write(Wire.Envelope.newBuilder()
.setType(Wire.MessageType.EVENT_CONNECTIVITY)
.setMessage(Wire.ConnectivityEvent.newBuilder()
.setConnected(info.isConnected())
.setType(info.getTypeName())
.setSubtype(info.getSubtypeName())
.setFailover(info.isFailover())
.setRoaming(info.isRoaming())
.build()
.toByteString())
.build());
}
else {
Log.i(TAG, "No active network");
writer.write(Wire.Envelope.newBuilder()
.setType(Wire.MessageType.EVENT_CONNECTIVITY)
.setMessage(Wire.ConnectivityEvent.newBuilder()
.setConnected(false)
.build()
.toByteString())
.build());
}
}
}