package jp.co.cyberagent.stf.monitor;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.util.Log;
import jp.co.cyberagent.stf.io.MessageWritable;
import jp.co.cyberagent.stf.proto.Wire;
public class PhoneStateMonitor extends AbstractMonitor {
private static final String TAG = "STFPhoneStateMonitor";
private ServiceState state = null;
public PhoneStateMonitor(Context context, MessageWritable writer) {
super(context, writer);
}
@Override
public void run() {
Log.i(TAG, "Monitor starting");
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener listener = new PhoneStateListener() {
@Override
public void onServiceStateChanged(ServiceState newState) {
state = newState;
report(writer, state);
}
};
tm.listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE);
try {
synchronized (this) {
while (!isInterrupted()) {
wait();
}
}
}
catch (InterruptedException e) {
// Okay
}
catch (Exception e) {
e.printStackTrace();
}
finally {
Log.i(TAG, "Monitor stopping");
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
}
}
@Override
public void peek(MessageWritable writer) {
if (state != null) {
report(writer, state);
}
}
private void report(MessageWritable writer, ServiceState state) {
Log.i(TAG, String.format("Phone state is %s; %s; %s",
stateLabel(state.getState()),
state.getIsManualSelection() ? "manual" : "automatic",
state.getOperatorAlphaLong() == null ? "no operator" : "operator " + state.getOperatorAlphaLong()
));
Wire.PhoneStateEvent.Builder message = Wire.PhoneStateEvent.newBuilder()
.setState(stateLabel(state.getState()))
.setManual(state.getIsManualSelection());
if (state.getOperatorAlphaLong() != null) {
message.setOperator(state.getOperatorAlphaLong());
}
writer.write(Wire.Envelope.newBuilder()
.setType(Wire.MessageType.EVENT_PHONE_STATE)
.setMessage(message.build().toByteString())
.build());
}
private String stateLabel(int state) {
switch (state) {
case ServiceState.STATE_EMERGENCY_ONLY:
return "emergency_only";
case ServiceState.STATE_IN_SERVICE:
return "in_service";
case ServiceState.STATE_OUT_OF_SERVICE:
return "out_of_service";
case ServiceState.STATE_POWER_OFF:
return "power_off";
default:
return "unknown_" + state;
}
}
}