Create BatterySaverReceiver
This cl elicits BatterySaverReceiver that listen to the change about
battery state and battery saver state.
BatterySaverController and BatterySaverSettings will use this receiver
to update the UI.
Bug: 32410757
Test: RunSettingsRoboTests
Change-Id: Ia92c6776985b89fe6a8d5b8d80898e502942b9b5
Merged-In: Ia92c6776985b89fe6a8d5b8d80898e502942b9b5
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index 5d64f1c..bb7e678 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.PreferenceController;
@@ -39,15 +34,12 @@
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
-import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING;
-
public class BatterySaverController extends PreferenceController implements
- Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop {
+ Preference.OnPreferenceChangeListener, 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;
@@ -56,7 +48,8 @@
lifecycle.addObserver(this);
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mBatteryStateChangeReceiver = new BatteryStateChangeReceiver();
+ mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
+ mBatteryStateChangeReceiver.setBatterySaverListener(this);
}
@Override
@@ -137,40 +130,14 @@
}
};
- private final class BatteryStateChangeReceiver extends BroadcastReceiver {
- private boolean mRegistered;
+ @Override
+ public void onPowerSaveModeChanged() {
+ mBatterySaverPref.setChecked(mPowerManager.isPowerSaveMode());
+ updateSummary();
+ }
- @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 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 0000000..2254438
--- /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 6b7ddf9..88dab49 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.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 @@
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 @@
mTriggerPref.init(this);
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ mReceiver = new BatterySaverReceiver(mContext);
+ mReceiver.setBatterySaverListener(this);
}
@Override
@@ -187,37 +185,14 @@
}
};
- private final class Receiver extends BroadcastReceiver {
+ @Override
+ public void onPowerSaveModeChanged() {
+ mHandler.post(mUpdateSwitch);
+ }
- 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 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 84204e6..c75a6a6 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 @@
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 @@
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 0000000..259bcd2
--- /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 0000000..1e173a2
--- /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();
+ }
+}