package jp.co.cyberagent.stf.monitor; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.provider.Settings; import android.util.Log; import jp.co.cyberagent.stf.io.MessageWritable; import jp.co.cyberagent.stf.proto.Wire; public class AirplaneModeMonitor extends AbstractMonitor { private static final String TAG = "STFAirplaneModeMonitor"; public AirplaneModeMonitor(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) { report(writer, intent.getBooleanExtra("state", false)); } }; context.registerReceiver(receiver, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); 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) { if (Build.VERSION.SDK_INT >= 17) { report(writer, Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 1); } else { report(writer, Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1); } } private void report(MessageWritable writer, boolean enabled) { Log.i(TAG, String.format("Airplane mode is %s", enabled ? "on" : "off")); writer.write(Wire.Envelope.newBuilder() .setType(Wire.MessageType.EVENT_AIRPLANE_MODE) .setMessage(Wire.AirplaneModeEvent.newBuilder() .setEnabled(enabled) .build() .toByteString()) .build()); } }