diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java index 97e95d2e401..85fb9f5efbf 100644 --- a/src/com/android/settings/fuelgauge/BatterySaverController.java +++ b/src/com/android/settings/fuelgauge/BatterySaverController.java @@ -15,19 +15,14 @@ */ package com.android.settings.fuelgauge; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.database.ContentObserver; -import android.os.BatteryManager; import android.os.Handler; import android.os.PowerManager; import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; -import android.util.Log; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; @@ -44,12 +39,9 @@ import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING; public class BatterySaverController extends AbstractPreferenceController implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, - LifecycleObserver, OnStart, OnStop { + LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener { private static final String KEY_BATTERY_SAVER = "battery_saver_summary"; - private static final String TAG = "BatterySaverController"; - private static final boolean DEBUG = false; - - private final BatteryStateChangeReceiver mBatteryStateChangeReceiver; + private final BatterySaverReceiver mBatteryStateChangeReceiver; private final PowerManager mPowerManager; private MasterSwitchPreference mBatterySaverPref; @@ -58,7 +50,8 @@ public class BatterySaverController extends AbstractPreferenceController lifecycle.addObserver(this); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - mBatteryStateChangeReceiver = new BatteryStateChangeReceiver(); + mBatteryStateChangeReceiver = new BatterySaverReceiver(context); + mBatteryStateChangeReceiver.setBatterySaverListener(this); } @Override @@ -139,40 +132,14 @@ public class BatterySaverController extends AbstractPreferenceController } }; - private final class BatteryStateChangeReceiver extends BroadcastReceiver { - private boolean mRegistered; - - @Override - public void onReceive(Context context, Intent intent) { - if (DEBUG) { - Log.d(TAG, "Received " + intent.getAction()); - } - final String action = intent.getAction(); - if (action.equals(ACTION_POWER_SAVE_MODE_CHANGING)) { - mBatterySaverPref.setChecked(mPowerManager.isPowerSaveMode()); - updateSummary(); - } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { - final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - // disable BSM switch if phone is plugged in or at 100% while plugged in - final boolean enabled = !(status == BatteryManager.BATTERY_STATUS_CHARGING - || status == BatteryManager.BATTERY_STATUS_FULL); - - mBatterySaverPref.setSwitchEnabled(enabled); - } - } - - public void setListening(boolean listening) { - if (listening && !mRegistered) { - final IntentFilter ifilter = new IntentFilter(); - ifilter.addAction(Intent.ACTION_BATTERY_CHANGED); - ifilter.addAction(ACTION_POWER_SAVE_MODE_CHANGING); - mContext.registerReceiver(this, ifilter); - mRegistered = true; - } else if (!listening && mRegistered) { - mContext.unregisterReceiver(this); - mRegistered = false; - } - } + @Override + public void onPowerSaveModeChanged() { + mBatterySaverPref.setChecked(mPowerManager.isPowerSaveMode()); + updateSummary(); + } + @Override + public void onBatteryChanged(boolean pluggedIn) { + mBatterySaverPref.setSwitchEnabled(!pluggedIn); } } diff --git a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java new file mode 100644 index 00000000000..22544389cf4 --- /dev/null +++ b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.fuelgauge; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.BatteryManager; +import android.os.PowerManager; +import android.util.Log; + +public class BatterySaverReceiver extends BroadcastReceiver { + private static final String TAG = "BatterySaverReceiver"; + private static final boolean DEBUG = false; + private boolean mRegistered; + private Context mContext; + private BatterySaverListener mBatterySaverListener; + + public BatterySaverReceiver(Context context) { + mContext = context; + } + + @Override + public void onReceive(Context context, Intent intent) { + if (DEBUG) Log.d(TAG, "Received " + intent.getAction()); + String action = intent.getAction(); + if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) { + if (mBatterySaverListener != null) { + mBatterySaverListener.onPowerSaveModeChanged(); + } + } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { + // disable BSM switch if phone is plugged in + if (mBatterySaverListener != null) { + final boolean pluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; + mBatterySaverListener.onBatteryChanged(pluggedIn); + } + } + } + + public void setListening(boolean listening) { + if (listening && !mRegistered) { + final IntentFilter ifilter = new IntentFilter(); + ifilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING); + ifilter.addAction(Intent.ACTION_BATTERY_CHANGED); + mContext.registerReceiver(this, ifilter); + mRegistered = true; + } else if (!listening && mRegistered) { + mContext.unregisterReceiver(this); + mRegistered = false; + } + } + + public void setBatterySaverListener(BatterySaverListener lsn) { + mBatterySaverListener = lsn; + } + + interface BatterySaverListener { + void onPowerSaveModeChanged(); + void onBatteryChanged(boolean pluggedIn); + } +} diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java index 6b7ddf95696..88dab494355 100644 --- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java +++ b/src/com/android/settings/fuelgauge/BatterySaverSettings.java @@ -16,20 +16,17 @@ package com.android.settings.fuelgauge; -import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.res.Resources; import android.database.ContentObserver; import android.net.Uri; import android.os.AsyncTask; -import android.os.BatteryManager; import android.os.Bundle; import android.os.Handler; import android.os.PowerManager; import android.provider.Settings.Global; +import android.support.annotation.VisibleForTesting; import android.util.Log; import android.widget.Switch; @@ -43,10 +40,8 @@ import com.android.settings.dashboard.conditional.ConditionManager; import com.android.settings.notification.SettingPref; import com.android.settings.widget.SwitchBar; -import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING; - public class BatterySaverSettings extends SettingsPreferenceFragment - implements SwitchBar.OnSwitchChangeListener { + implements SwitchBar.OnSwitchChangeListener, BatterySaverReceiver.BatterySaverListener { private static final String TAG = "BatterySaverSettings"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically"; @@ -54,15 +49,16 @@ public class BatterySaverSettings extends SettingsPreferenceFragment private final Handler mHandler = new Handler(); private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler); - private final Receiver mReceiver = new Receiver(); + @VisibleForTesting + SwitchBar mSwitchBar; private Context mContext; private boolean mCreated; private SettingPref mTriggerPref; - private SwitchBar mSwitchBar; private Switch mSwitch; private boolean mValidListener; private PowerManager mPowerManager; + private BatterySaverReceiver mReceiver; @Override public int getMetricsCategory() { @@ -101,6 +97,8 @@ public class BatterySaverSettings extends SettingsPreferenceFragment mTriggerPref.init(this); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + mReceiver = new BatterySaverReceiver(mContext); + mReceiver.setBatterySaverListener(this); } @Override @@ -187,37 +185,14 @@ public class BatterySaverSettings extends SettingsPreferenceFragment } }; - private final class Receiver extends BroadcastReceiver { - - private boolean mRegistered; - - @Override - public void onReceive(Context context, Intent intent) { - if (DEBUG) Log.d(TAG, "Received " + intent.getAction()); - String action = intent.getAction(); - if (action.equals(ACTION_POWER_SAVE_MODE_CHANGING)) { - mHandler.post(mUpdateSwitch); - } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { - final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - // disable BSM switch if phone is plugged in or at 100% while plugged in - mSwitchBar.setEnabled( - !(status == BatteryManager.BATTERY_STATUS_CHARGING - || status == BatteryManager.BATTERY_STATUS_FULL)); - } - } - public void setListening(boolean listening) { - if (listening && !mRegistered) { - final IntentFilter ifilter = new IntentFilter(); - ifilter.addAction(ACTION_POWER_SAVE_MODE_CHANGING); - ifilter.addAction(Intent.ACTION_BATTERY_CHANGED); - mContext.registerReceiver(this, ifilter); - mRegistered = true; - } else if (!listening && mRegistered) { - mContext.unregisterReceiver(this); - mRegistered = false; - } - } + @Override + public void onPowerSaveModeChanged() { + mHandler.post(mUpdateSwitch); + } + @Override + public void onBatteryChanged(boolean pluggedIn) { + mSwitchBar.setEnabled(!pluggedIn); } private final class SettingsObserver extends ContentObserver { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java index 84204e645be..c75a6a6377e 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java @@ -17,10 +17,12 @@ package com.android.settings.fuelgauge; import android.content.Context; import android.os.PowerManager; + import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.widget.MasterSwitchPreference; import com.android.settingslib.core.lifecycle.Lifecycle; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -77,6 +79,20 @@ public class BatterySaverControllerTest { testUpdateStateInner(false); } + @Test + public void testOnBatteryChanged_pluggedIn_setDisable() { + mBatterySaverController.onBatteryChanged(true /* pluggedIn */); + + verify(mBatterySaverPref).setSwitchEnabled(false); + } + + @Test + public void testOnBatteryChanged_notPluggedIn_setEnable() { + mBatterySaverController.onBatteryChanged(false /* pluggedIn */); + + verify(mBatterySaverPref).setSwitchEnabled(true); + } + private void testOnPreferenceChangeInner(final boolean saverOn) { when(mPowerManager.setPowerSaveMode(saverOn)).thenReturn(true); when(mPowerManager.isPowerSaveMode()).thenReturn(!saverOn); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java new file mode 100644 index 00000000000..259bcd29656 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.fuelgauge; + +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.Intent; +import android.os.BatteryManager; +import android.os.PowerManager; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class BatterySaverReceiverTest { + @Mock + private BatterySaverReceiver.BatterySaverListener mBatterySaverListener; + @Mock + private Context mContext; + private BatterySaverReceiver mBatterySaverReceiver; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mBatterySaverReceiver = new BatterySaverReceiver(mContext); + mBatterySaverReceiver.setBatterySaverListener(mBatterySaverListener); + } + + @Test + public void testOnReceive_devicePluggedIn_pluggedInTrue() { + Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); + intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_AC); + + mBatterySaverReceiver.onReceive(mContext, intent); + + verify(mBatterySaverListener).onBatteryChanged(true); + } + + @Test + public void testOnReceive_deviceNotPluggedIn_pluggedInFalse() { + Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); + intent.putExtra(BatteryManager.EXTRA_PLUGGED, 0); + + mBatterySaverReceiver.onReceive(mContext, intent); + + verify(mBatterySaverListener).onBatteryChanged(false); + } + + @Test + public void testOnReceive_powerSaveModeChanged_invokeCallback() { + Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING); + + mBatterySaverReceiver.onReceive(mContext, intent); + + verify(mBatterySaverListener).onPowerSaveModeChanged(); + } + +} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverSettingsTest.java new file mode 100644 index 00000000000..1e173a2ba52 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverSettingsTest.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.fuelgauge; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.widget.SwitchBar; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class BatterySaverSettingsTest { + private Context mContext; + private BatterySaverSettings mBatterySaverSettings; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = RuntimeEnvironment.application; + mBatterySaverSettings = new BatterySaverSettings(); + mBatterySaverSettings.mSwitchBar = new SwitchBar(mContext); + } + + @Test + public void testOnBatteryChanged_pluggedIn_setDisable() { + mBatterySaverSettings.onBatteryChanged(true /* pluggedIn */); + + assertThat(mBatterySaverSettings.mSwitchBar.isEnabled()).isFalse(); + } + + @Test + public void testOnBatteryChanged_notPluggedIn_setEnable() { + mBatterySaverSettings.onBatteryChanged(false /* pluggedIn */); + + assertThat(mBatterySaverSettings.mSwitchBar.isEnabled()).isTrue(); + } +}