import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.os.PowerManager;
import android.support.annotation.VisibleForTesting;
import com.android.settings.Utils;
/**
* Use this broadcastReceiver to listen to the battery change, and it will invoke
- * {@link OnBatteryChangedListener} if any of the following happens:
+ * {@link OnBatteryChangedListener} if any of the followings has been changed:
*
- * 1. Battery level has been changed
- * 2. Battery status has been changed
+ * 1. Battery level(e.g. 100%->99%)
+ * 2. Battery status(e.g. plugged->unplugged)
+ * 3. Battery saver(e.g. off->on)
*/
public class BatteryBroadcastReceiver extends BroadcastReceiver {
}
public void register() {
- final Intent intent = mContext.registerReceiver(this,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ final IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
+ intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
+
+ final Intent intent = mContext.registerReceiver(this, intentFilter);
updateBatteryStatus(intent, true /* forceUpdate */);
}
}
private void updateBatteryStatus(Intent intent, boolean forceUpdate) {
- if (intent != null && mBatteryListener != null && Intent.ACTION_BATTERY_CHANGED.equals(
- intent.getAction())) {
- String batteryLevel = Utils.getBatteryPercentage(intent);
- String batteryStatus = Utils.getBatteryStatus(
- mContext.getResources(), intent);
- if (forceUpdate || !batteryLevel.equals(mBatteryLevel) || !batteryStatus.equals(
- mBatteryStatus)) {
- mBatteryLevel = batteryLevel;
- mBatteryStatus = batteryStatus;
+ if (intent != null && mBatteryListener != null) {
+ if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
+ final String batteryLevel = Utils.getBatteryPercentage(intent);
+ final String batteryStatus = Utils.getBatteryStatus(
+ mContext.getResources(), intent);
+ if (forceUpdate || !batteryLevel.equals(mBatteryLevel) || !batteryStatus.equals(
+ mBatteryStatus)) {
+ mBatteryLevel = batteryLevel;
+ mBatteryStatus = batteryStatus;
+ mBatteryListener.onBatteryChanged();
+ }
+ } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(intent.getAction())) {
mBatteryListener.onBatteryChanged();
}
}
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
+import android.os.PowerManager;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
}
@Test
+ public void testOnReceive_powerSaveModeChanged_listenerInvoked() {
+ mBatteryBroadcastReceiver.onReceive(mContext,
+ new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
+
+ verify(mBatteryListener).onBatteryChanged();
+ }
+
+ @Test
public void testOnReceive_batteryDataNotChanged_listenerNotInvoked() {
final String batteryLevel = Utils.getBatteryPercentage(mChargingIntent);
final String batteryStatus = Utils.getBatteryStatus(mContext.getResources(),