package org.mozilla.mozstumbler.client.subactivities; import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.RadioGroup; import android.widget.Spinner; import android.widget.SpinnerAdapter; import android.widget.TextView; import org.mozilla.mozstumbler.R; import org.mozilla.mozstumbler.client.ClientPrefs; import org.mozilla.mozstumbler.client.MainApp; import org.mozilla.mozstumbler.service.AppGlobals; import org.mozilla.mozstumbler.service.stumblerthread.motiondetection.MotionSensor; import org.mozilla.mozstumbler.service.stumblerthread.motiondetection.SignificantMotionSensor; public class PowerSavingScreen extends ActionBarActivity { TestSignificantMotionDialog mTesterDialog = new TestSignificantMotionDialog(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_power_saving_screen); setupMotionDetectionCheckbox(); setupLowBatterySpinner(); setupSensorRadio(); if (AppGlobals.hasSignificantMotionSensor) { mTesterDialog.setupTestMotionButton(); } else { findViewById(R.id.testSignificantMotionSensor).setVisibility(View.INVISIBLE); } } private void setupSensorRadio() { RadioGroup radioGroupSensorType = (RadioGroup) findViewById(R.id.radioGroupSensorType); if (ClientPrefs.getInstance(this).isMotionSensorTypeSignificant()) { radioGroupSensorType.check(R.id.radioSignificant); } radioGroupSensorType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { boolean isAccelerometer = (checkedId == R.id.radioAccelerometer); ClientPrefs.getInstance(PowerSavingScreen.this).setMotionSensorTypeSignificant(!isAccelerometer); resetScanningToReflectChanges(); } }); String msg; if (AppGlobals.hasSignificantMotionSensor) { msg = getResources().getString(R.string.sensor_type_significant_motion); } else { msg = getResources().getString(R.string.sensor_type_legacy); } TextView infoMessage = (TextView) findViewById(R.id.message_sensor_type); infoMessage.setText(msg); } private void motionDetectionOptionsEnable(boolean on) { findViewById(R.id.titleUseSensor).setEnabled(on); findViewById(R.id.radioAccelerometer).setEnabled(on); findViewById(R.id.radioSignificant).setEnabled(on && AppGlobals.hasSignificantMotionSensor); } private void setupMotionDetectionCheckbox() { boolean isOn = ClientPrefs.getInstance(this).isMotionSensorEnabled(); CheckBox motionDetectionCheckbox = (CheckBox) findViewById(R.id.checkbox_motion_detection); motionDetectionCheckbox.setChecked(isOn); motionDetectionOptionsEnable(isOn); motionDetectionCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { ClientPrefs.getInstance(PowerSavingScreen.this).setMotionSensorEnabled(isChecked); resetScanningToReflectChanges(); motionDetectionOptionsEnable(isChecked); } }); } private void resetScanningToReflectChanges() { final MainApp app = ((MainApp) getApplication()); if (app.isScanningOrPaused()) { app.stopScanning(); app.startScanning(); } } private void setupLowBatterySpinner() { Spinner batteryLevelSpinner = (Spinner) findViewById(R.id.spinnerBatteryPercent); final SpinnerAdapter spinnerAdapter = batteryLevelSpinner.getAdapter(); assert (spinnerAdapter instanceof ArrayAdapter); @SuppressWarnings("unchecked") final ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerAdapter; final int percent = ClientPrefs.getInstance(this).getMinBatteryPercent(); final int spinnerPosition = adapter.getPosition(percent + "%"); batteryLevelSpinner.setSelection(spinnerPosition); batteryLevelSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View arg1, int position, long id) { String item = parent.getItemAtPosition(position).toString().replace("%", ""); int percent = Integer.valueOf(item); ClientPrefs.getInstance(PowerSavingScreen.this).setMinBatteryPercent(percent); } public void onNothingSelected(AdapterView<?> arg0) { } }); } class TestSignificantMotionDialog { private AlertDialog mDialogMotionTesting; private SignificantMotionSensor mSigSensor; BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (mDialogMotionTesting != null) { mDialogMotionTesting.dismiss(); mDialogMotionTesting = null; Context c = PowerSavingScreen.this; AlertDialog.Builder builder = new AlertDialog.Builder(c) .setTitle(c.getString(R.string.test_significant_sensor_dialog_title)) .setMessage(getString(R.string.test_significant_sensor_confirmed_working)) .setNegativeButton(c.getString(android.R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); }}); builder.create().show(); } } }; private void setupTestMotionButton() { Button button = (Button) findViewById(R.id.testSignificantMotionSensor); button.setOnClickListener(new View.OnClickListener() { @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public void onClick(View v) { Context c = PowerSavingScreen.this; AlertDialog.Builder builder = new AlertDialog.Builder(c) .setTitle(c.getString(R.string.test_significant_sensor_dialog_title)) .setMessage(c.getString(R.string.test_significant_sensor_dialog_message)) .setOnDismissListener(new DialogInterface.OnDismissListener() { public void onDismiss(DialogInterface dialog) { mSigSensor.stop(); mDialogMotionTesting = null; } }) .setNegativeButton(c.getString(android.R.string.cancel), new Dialog.OnClickListener() { public void onClick(DialogInterface di, int which) { di.dismiss(); } }); mDialogMotionTesting = builder.create(); mDialogMotionTesting.show(); } }); LocalBroadcastManager.getInstance(PowerSavingScreen.this).registerReceiver(mReceiver, new IntentFilter(MotionSensor.ACTION_USER_MOTION_DETECTED)); mSigSensor = SignificantMotionSensor.getSensor(PowerSavingScreen.this); mSigSensor.start(); } } }