From cf1190c7cb7c577dfdb6a20a9fb74990dc29fa43 Mon Sep 17 00:00:00 2001 From: Wesley Wang Date: Wed, 19 Apr 2023 20:00:31 +0800 Subject: [PATCH 1/4] Update battery health state intent (2/3) - Update the extra from overheated to longlife Bug: 278192441 Test: make SettingsRoboTests Change-Id: I5a906e64effbd9aaf84446c0670249afefdf7da8 --- .../fuelgauge/BatteryBroadcastReceiver.java | 31 ++++++++++++------- .../settings/fuelgauge/BatteryInfo.java | 10 +++--- .../settings/fuelgauge/BatteryUtils.java | 9 +++--- .../detectors/BatteryDefenderDetector.java | 15 +++++---- .../BatteryBroadcastReceiverTest.java | 20 ++++++++++-- ...BatteryHeaderPreferenceControllerTest.java | 4 +-- .../settings/fuelgauge/BatteryInfoTest.java | 19 ++++++------ .../settings/fuelgauge/BatteryUtilsTest.java | 16 +++++----- .../BatteryDefenderDetectorTest.java | 16 +++++----- .../detectors/DockDefenderDetectorTest.java | 8 ++--- 10 files changed, 85 insertions(+), 63 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java index 81a15ca7275..79ecd4076ae 100644 --- a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java +++ b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java @@ -34,24 +34,20 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * Use this broadcastReceiver to listen to the battery change, and it will invoke - * {@link OnBatteryChangedListener} if any of the following has been changed: - * - * 1. Battery level(e.g. 100%->99%) - * 2. Battery status(e.g. plugged->unplugged) - * 3. Battery saver(e.g. off->on) - * 4. Battery health(e.g. good->overheat) + * Use this broadcastReceiver to listen to the battery change and it will invoke + * {@link OnBatteryChangedListener} */ public class BatteryBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "BatteryBroadcastRcvr"; /** - * Callback when the following has been changed: + * Callback if any of the monitored fields has been changed: * * Battery level(e.g. 100%->99%) * Battery status(e.g. plugged->unplugged) * Battery saver(e.g. off->on) * Battery health(e.g. good->overheat) + * Battery charging status(e.g. default->long life) */ public interface OnBatteryChangedListener { void onBatteryChanged(@BatteryUpdateType int type); @@ -63,6 +59,7 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver { BatteryUpdateType.BATTERY_SAVER, BatteryUpdateType.BATTERY_STATUS, BatteryUpdateType.BATTERY_HEALTH, + BatteryUpdateType.CHARGING_STATUS, BatteryUpdateType.BATTERY_NOT_PRESENT}) public @interface BatteryUpdateType { int MANUAL = 0; @@ -70,7 +67,8 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver { int BATTERY_SAVER = 2; int BATTERY_STATUS = 3; int BATTERY_HEALTH = 4; - int BATTERY_NOT_PRESENT = 5; + int CHARGING_STATUS = 5; + int BATTERY_NOT_PRESENT = 6; } @VisibleForTesting @@ -78,6 +76,8 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver { @VisibleForTesting String mBatteryStatus; @VisibleForTesting + int mChargingStatus; + @VisibleForTesting int mBatteryHealth; private OnBatteryChangedListener mBatteryListener; private Context mContext; @@ -121,21 +121,27 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver { final String batteryLevel = Utils.getBatteryPercentage(intent); final String batteryStatus = Utils.getBatteryStatus(mContext, intent, /* compactStatus= */ false); + final int chargingStatus = intent.getIntExtra( + BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT); final int batteryHealth = intent.getIntExtra( BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN); Log.d( TAG, - "Battery changed: level=" + "Battery changed: level: " + batteryLevel - + ", status=" + + "| status: " + batteryStatus - + ", health=" + + "| chargingStatus: " + + chargingStatus + + "| health: " + batteryHealth); if (!Utils.isBatteryPresent(intent)) { Log.w(TAG, "Problem reading the battery meter."); mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_NOT_PRESENT); } else if (forceUpdate) { mBatteryListener.onBatteryChanged(BatteryUpdateType.MANUAL); + } else if (chargingStatus != mChargingStatus) { + mBatteryListener.onBatteryChanged(BatteryUpdateType.CHARGING_STATUS); } else if (batteryHealth != mBatteryHealth) { mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH); } else if(!batteryLevel.equals(mBatteryLevel)) { @@ -145,6 +151,7 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver { } mBatteryLevel = batteryLevel; mBatteryStatus = batteryStatus; + mChargingStatus = chargingStatus; mBatteryHealth = batteryHealth; } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) { mBatteryListener.onBatteryChanged(BatteryUpdateType.BATTERY_SAVER); diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index d164e931a21..e7eb947848f 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -51,7 +51,7 @@ public class BatteryInfo { public int batteryStatus; public int pluggedStatus; public boolean discharging = true; - public boolean isOverheated; + public boolean isBatteryDefender; public long remainingTimeUs = 0; public long averageTimeToDischarge = EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN; public String batteryPercentString; @@ -257,9 +257,9 @@ public class BatteryInfo { info.pluggedStatus = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); info.mCharging = info.pluggedStatus != 0; info.averageTimeToDischarge = estimate.getAverageDischargeTime(); - info.isOverheated = batteryBroadcast.getIntExtra( - BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN) - == BatteryManager.BATTERY_HEALTH_OVERHEAT; + info.isBatteryDefender = batteryBroadcast.getIntExtra( + BatteryManager.EXTRA_CHARGING_STATUS, BatteryManager.CHARGING_POLICY_DEFAULT) + == BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE; info.statusLabel = Utils.getBatteryStatus(context, batteryBroadcast, isCompactStatus); info.batteryStatus = batteryBroadcast.getIntExtra( @@ -283,7 +283,7 @@ public class BatteryInfo { info.discharging = false; info.suggestionLabel = null; int dockDefenderMode = BatteryUtils.getCurrentDockDefenderMode(context, info); - if ((info.isOverheated && status != BatteryManager.BATTERY_STATUS_FULL + if ((info.isBatteryDefender && status != BatteryManager.BATTERY_STATUS_FULL && dockDefenderMode == BatteryUtils.DockDefenderMode.DISABLED) || dockDefenderMode == BatteryUtils.DockDefenderMode.ACTIVE) { // Battery defender active, battery charging paused diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 72d84ef6663..12760b18b0a 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -18,7 +18,6 @@ package com.android.settings.fuelgauge; import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.PackageInfo; @@ -322,10 +321,10 @@ public class BatteryUtils { } /** - * Return {@code true} if battery is overheated and charging. + * Return {@code true} if battery defender is on and charging. */ public static boolean isBatteryDefenderOn(BatteryInfo batteryInfo) { - return batteryInfo.isOverheated && !batteryInfo.discharging; + return batteryInfo.isBatteryDefender && !batteryInfo.discharging; } /** @@ -627,11 +626,11 @@ public class BatteryUtils { if (Settings.Global.getInt(context.getContentResolver(), SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 0) == 1) { return DockDefenderMode.TEMPORARILY_BYPASSED; - } else if (batteryInfo.isOverheated && FeatureFactory.getFactory(context) + } else if (batteryInfo.isBatteryDefender && FeatureFactory.getFactory(context) .getPowerUsageFeatureProvider(context) .isExtraDefend()) { return DockDefenderMode.ACTIVE; - } else if (!batteryInfo.isOverheated) { + } else if (!batteryInfo.isBatteryDefender) { return DockDefenderMode.FUTURE_BYPASS; } } diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java index 2dc057ea7a3..8b7d4c18856 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java @@ -37,13 +37,12 @@ public class BatteryDefenderDetector implements BatteryTipDetector { @Override public BatteryTip detect() { - final boolean isBasicBatteryDefend = mBatteryInfo.isOverheated - && !FeatureFactory.getFactory(mContext) - .getPowerUsageFeatureProvider(mContext) - .isExtraDefend(); - final int state = isBasicBatteryDefend - ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE; - final boolean isPluggedIn = mBatteryInfo.pluggedStatus != 0; - return new BatteryDefenderTip(state, isPluggedIn); + final boolean isBasicBatteryDefend = mBatteryInfo.isBatteryDefender + && !FeatureFactory.getFactory(mContext).getPowerUsageFeatureProvider(mContext) + .isExtraDefend(); + final int state = isBasicBatteryDefend + ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE; + final boolean isPluggedIn = mBatteryInfo.pluggedStatus != 0; + return new BatteryDefenderTip(state, isPluggedIn); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java index a829c40e9a6..62f812d299a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java @@ -69,6 +69,7 @@ public class BatteryBroadcastReceiverTest { mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL; mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS; mBatteryBroadcastReceiver.mBatteryHealth = BatteryManager.BATTERY_HEALTH_UNKNOWN; + mBatteryBroadcastReceiver.mChargingStatus = BatteryManager.CHARGING_POLICY_DEFAULT; mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener); mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED); @@ -91,8 +92,8 @@ public class BatteryBroadcastReceiverTest { @Test public void onReceive_batteryHealthChanged_dataUpdated() { - mChargingIntent - .putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT); + mChargingIntent.putExtra( + BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT); mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent); assertThat(mBatteryBroadcastReceiver.mBatteryHealth) @@ -100,6 +101,17 @@ public class BatteryBroadcastReceiverTest { verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_HEALTH); } + @Test + public void onReceive_chargingStatusChanged_dataUpdated() { + mChargingIntent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, + BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE); + mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent); + + assertThat(mBatteryBroadcastReceiver.mChargingStatus) + .isEqualTo(BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE); + verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.CHARGING_STATUS); + } + @Test public void onReceive_batteryNotPresent_shouldShowHelpMessage() { mChargingIntent.putExtra(BatteryManager.EXTRA_PRESENT, false); @@ -131,6 +143,8 @@ public class BatteryBroadcastReceiverTest { assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus); assertThat(mBatteryBroadcastReceiver.mBatteryHealth) .isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN); + assertThat(mBatteryBroadcastReceiver.mChargingStatus) + .isEqualTo(BatteryManager.CHARGING_POLICY_DEFAULT); verify(mBatteryListener, never()).onBatteryChanged(anyInt()); } @@ -163,6 +177,8 @@ public class BatteryBroadcastReceiverTest { Utils.getBatteryStatus(mContext, mChargingIntent, /* compactStatus= */ false)); assertThat(mBatteryBroadcastReceiver.mBatteryHealth) .isEqualTo(BatteryManager.BATTERY_HEALTH_UNKNOWN); + assertThat(mBatteryBroadcastReceiver.mChargingStatus) + .isEqualTo(BatteryManager.CHARGING_POLICY_DEFAULT); // 2 times because register will force update the battery verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index f94e5bf7b66..2779e0ac0c7 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -290,8 +290,8 @@ public class BatteryHeaderPreferenceControllerTest { } @Test - public void updatePreference_isOverheat_showEmptyText() { - mBatteryInfo.isOverheated = true; + public void updatePreference_isBatteryDefender_showEmptyText() { + mBatteryInfo.isBatteryDefender = true; mController.updateHeaderPreference(mBatteryInfo); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index eb4b598823f..09eb4d0809d 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -254,18 +254,18 @@ public class BatteryInfoTest { } @Test - public void testGetBatteryInfo_chargingWithOverheated_updateChargeLabel() { + public void testGetBatteryInfo_chargingWithDefender_updateChargeLabel() { doReturn(TEST_CHARGE_TIME_REMAINING) .when(mBatteryUsageStats) .getChargeTimeRemainingMs(); - mChargingBatteryBroadcast - .putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT); + mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, + BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE); BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast, mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000, false /* shortString */); - assertThat(info.isOverheated).isTrue(); + assertThat(info.isBatteryDefender).isTrue(); assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_PAUSED); } @@ -278,7 +278,8 @@ public class BatteryInfoTest { 50 /* level */, 100 /* scale */, BatteryManager.BATTERY_STATUS_CHARGING) - .putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_OVERHEAT); + .putExtra(BatteryManager.EXTRA_CHARGING_STATUS, + BatteryManager.CHARGING_POLICY_ADAPTIVE_LONGLIFE); BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, intent, mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000, @@ -290,8 +291,8 @@ public class BatteryInfoTest { @Test public void testGetBatteryInfo_dockDefenderTemporarilyBypassed_updateChargeLabel() { doReturn(REMAINING_TIME).when(mBatteryUsageStats).getChargeTimeRemainingMs(); - mChargingBatteryBroadcast - .putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_GOOD); + mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, + BatteryManager.CHARGING_POLICY_DEFAULT); Settings.Global.putInt(mContext.getContentResolver(), BatteryUtils.SETTINGS_GLOBAL_DOCK_DEFENDER_BYPASS, 1); @@ -309,8 +310,8 @@ public class BatteryInfoTest { @Test public void testGetBatteryInfo_dockDefenderFutureBypass_updateChargeLabel() { doReturn(false).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend(); - mChargingBatteryBroadcast - .putExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_GOOD); + mChargingBatteryBroadcast.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, + BatteryManager.CHARGING_POLICY_DEFAULT); BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, BatteryTestUtils.getCustomBatteryIntent(BatteryManager.BATTERY_PLUGGED_DOCK, diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java index b5f81499ea5..2fe0cec63d8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java @@ -487,32 +487,32 @@ public class BatteryUtilsTest { } @Test - public void testIsBatteryDefenderOn_isOverheatedAndIsCharging_returnTrue() { - mBatteryInfo.isOverheated = true; + public void testIsBatteryDefenderOn_isDefenderAndIsCharging_returnTrue() { + mBatteryInfo.isBatteryDefender = true; mBatteryInfo.discharging = false; assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isTrue(); } @Test - public void testIsBatteryDefenderOn_isOverheatedAndDischarging_returnFalse() { - mBatteryInfo.isOverheated = true; + public void testIsBatteryDefenderOn_isDefenderAndDischarging_returnFalse() { + mBatteryInfo.isBatteryDefender = true; mBatteryInfo.discharging = true; assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse(); } @Test - public void testIsBatteryDefenderOn_notOverheatedAndDischarging_returnFalse() { - mBatteryInfo.isOverheated = false; + public void testIsBatteryDefenderOn_notDefenderAndDischarging_returnFalse() { + mBatteryInfo.isBatteryDefender = false; mBatteryInfo.discharging = true; assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse(); } @Test - public void testIsBatteryDefenderOn_notOverheatedAndIsCharging_returnFalse() { - mBatteryInfo.isOverheated = false; + public void testIsBatteryDefenderOn_notDefenderAndIsCharging_returnFalse() { + mBatteryInfo.isBatteryDefender = false; mBatteryInfo.discharging = false; assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java index f81a4be8d63..64d5d0460ef 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java @@ -60,32 +60,32 @@ public class BatteryDefenderDetectorTest { } @Test - public void testDetect_notOverheatedNotExtraDefend_tipInvisible() { - mBatteryInfo.isOverheated = false; + public void testDetect_notDefenderNotExtraDefend_tipInvisible() { + mBatteryInfo.isBatteryDefender = false; when(mFakeFeatureFactory.powerUsageFeatureProvider.isExtraDefend()).thenReturn(false); assertThat(mBatteryDefenderDetector.detect().isVisible()).isFalse(); } @Test - public void testDetect_notOverheatedIsExtraDefend_tipInvisible() { - mBatteryInfo.isOverheated = false; + public void testDetect_notDefenderIsExtraDefend_tipInvisible() { + mBatteryInfo.isBatteryDefender = false; when(mFakeFeatureFactory.powerUsageFeatureProvider.isExtraDefend()).thenReturn(true); assertThat(mBatteryDefenderDetector.detect().isVisible()).isFalse(); } @Test - public void testDetect_isOverheatedIsExtraDefend_tipInvisible() { - mBatteryInfo.isOverheated = false; + public void testDetect_isDefenderIsExtraDefend_tipInvisible() { + mBatteryInfo.isBatteryDefender = false; when(mFakeFeatureFactory.powerUsageFeatureProvider.isExtraDefend()).thenReturn(true); assertThat(mBatteryDefenderDetector.detect().isVisible()).isFalse(); } @Test - public void testDetect_isOverheatedNotExtraDefend_tipNew() { - mBatteryInfo.isOverheated = true; + public void testDetect_isDefenderNotExtraDefend_tipNew() { + mBatteryInfo.isBatteryDefender = true; when(mFakeFeatureFactory.powerUsageFeatureProvider.isExtraDefend()).thenReturn(false); assertThat(mBatteryDefenderDetector.detect().getState()) diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java index 9652a00ca18..bd2c5d1173b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/DockDefenderDetectorTest.java @@ -83,7 +83,7 @@ public class DockDefenderDetectorTest { @Test public void testDetect_dockDefenderActive() { - mBatteryInfo.isOverheated = true; + mBatteryInfo.isBatteryDefender = true; doReturn(true).when(mFakeFeatureFactory.powerUsageFeatureProvider).isExtraDefend(); BatteryTip batteryTip = mDockDefenderDetector.detect(); @@ -95,7 +95,7 @@ public class DockDefenderDetectorTest { @Test public void testDetect_dockDefenderFutureBypass() { - mBatteryInfo.isOverheated = false; + mBatteryInfo.isBatteryDefender = false; doReturn(false).when(mFakeFeatureFactory.powerUsageFeatureProvider).isExtraDefend(); BatteryTip batteryTip = mDockDefenderDetector.detect(); @@ -107,7 +107,7 @@ public class DockDefenderDetectorTest { @Test public void testDetect_overheatedTrue_dockDefenderDisabled() { - mBatteryInfo.isOverheated = true; + mBatteryInfo.isBatteryDefender = true; doReturn(false).when(mFakeFeatureFactory.powerUsageFeatureProvider).isExtraDefend(); BatteryTip batteryTip = mDockDefenderDetector.detect(); @@ -131,7 +131,7 @@ public class DockDefenderDetectorTest { @Test public void testDetect_overheatedTrueAndDockDefenderNotTriggered_dockDefenderDisabled() { doReturn(false).when(mFakeFeatureFactory.powerUsageFeatureProvider).isExtraDefend(); - mBatteryInfo.isOverheated = true; + mBatteryInfo.isBatteryDefender = true; BatteryTip batteryTip = mDockDefenderDetector.detect(); From 5b42447d299f9c61229b5039bd5c1974e03dc3c9 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Fri, 12 May 2023 16:35:15 +0100 Subject: [PATCH 2/4] work challenge: allow backgroud biometric auth We observed a race condition that when work challenge is launched from notification, the biometric prompt quickly dismisses itself because it detects the launcher is now the foreground app. This change attempts to workaround the issue by enabling the setAllowBackgroundAuthentication optin in BiometricPrompt so it no longer dismisses itself even if the foreground app is different. Bug: 279766640 Test: manual Change-Id: I453b7d603c6eb65f329afb38d8a190e21a7e4c01 --- src/com/android/settings/password/BiometricFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java index d364c71b331..4ad04a1a903 100644 --- a/src/com/android/settings/password/BiometricFragment.java +++ b/src/com/android/settings/password/BiometricFragment.java @@ -141,6 +141,7 @@ public class BiometricFragment extends InstrumentedFragment { .setDisallowBiometricsIfPolicyExists( promptInfo.isDisallowBiometricsIfPolicyExists()) .setReceiveSystemEvents(true) + .setAllowBackgroundAuthentication(true) .build(); } From 0cd24adec55d756404e16cf8e73a26b98e4f9fa7 Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 15 May 2023 11:01:16 +0800 Subject: [PATCH 3/4] Add allowlist mechanism for battery optimization mode Add a mechanism to add package name into the allowlist to avoid users change the battery optimization modes for specific apps in the list https://screenshot.googleplex.com/8hrHCcTh5bNYXqp Bug: 281566984 Test: make test RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.fuelgauge.* Change-Id: I8efa6a55646d761f5bee3667a59b38ab68c74bc1 --- protos/fuelgauge_log.proto | 1 + res/values/config.xml | 4 + .../fuelgauge/BatteryBackupHelper.java | 45 ++++--- .../fuelgauge/BatteryOptimizeUtils.java | 8 ++ .../BatterySettingsMigrateChecker.java | 41 ++++++- .../BatterySettingsMigrateCheckerTest.java | 113 +++++++++++++++++- 6 files changed, 193 insertions(+), 19 deletions(-) diff --git a/protos/fuelgauge_log.proto b/protos/fuelgauge_log.proto index 8512cb82506..150c2e2ce6a 100644 --- a/protos/fuelgauge_log.proto +++ b/protos/fuelgauge_log.proto @@ -20,6 +20,7 @@ message BatteryOptimizeHistoricalLogEntry { RESET = 3; RESTORE = 4; BACKUP = 5; + FORCE_RESET = 6; } optional string package_name = 1; diff --git a/res/values/config.xml b/res/values/config.xml index 52d7183ebff..334d4e574c5 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -526,6 +526,10 @@ content://com.android.settings.slices/intent/media_output_indicator + + + + diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java index 79df57ab08d..1bb3b4de001 100644 --- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java +++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java @@ -91,11 +91,12 @@ public final class BatteryBackupHelper implements BackupHelper { @Override public void restoreEntity(BackupDataInputStream data) { - BatterySettingsMigrateChecker.verifyConfiguration(mContext); + BatterySettingsMigrateChecker.verifySaverConfiguration(mContext); if (!isOwner() || data == null || data.size() == 0) { Log.w(TAG, "ignore restoreEntity() for non-owner or empty data"); return; } + if (KEY_OPTIMIZATION_LIST.equals(data.getKey())) { final int dataSize = data.size(); final byte[] dataBytes = new byte[dataSize]; @@ -105,7 +106,10 @@ public final class BatteryBackupHelper implements BackupHelper { Log.e(TAG, "failed to load BackupDataInputStream", e); return; } - restoreOptimizationMode(dataBytes); + final int restoreCount = restoreOptimizationMode(dataBytes); + if (restoreCount > 0) { + BatterySettingsMigrateChecker.verifyOptimizationModes(mContext); + } } } @@ -175,17 +179,17 @@ public final class BatteryBackupHelper implements BackupHelper { } @VisibleForTesting - void restoreOptimizationMode(byte[] dataBytes) { + int restoreOptimizationMode(byte[] dataBytes) { final long timestamp = System.currentTimeMillis(); final String dataContent = new String(dataBytes, StandardCharsets.UTF_8); if (dataContent == null || dataContent.isEmpty()) { Log.w(TAG, "no data found in the restoreOptimizationMode()"); - return; + return 0; } final String[] appConfigurations = dataContent.split(BatteryBackupHelper.DELIMITER); if (appConfigurations == null || appConfigurations.length == 0) { Log.w(TAG, "no data found from the split() processing"); - return; + return 0; } int restoreCount = 0; for (int index = 0; index < appConfigurations.length; index++) { @@ -217,6 +221,7 @@ public final class BatteryBackupHelper implements BackupHelper { } Log.d(TAG, String.format("restoreOptimizationMode() count=%d in %d/ms", restoreCount, (System.currentTimeMillis() - timestamp))); + return restoreCount; } /** Dump the app optimization mode backup history data. */ @@ -225,6 +230,23 @@ public final class BatteryBackupHelper implements BackupHelper { getSharedPreferences(context), writer); } + static boolean isOwner() { + return UserHandle.myUserId() == UserHandle.USER_SYSTEM; + } + + static BatteryOptimizeUtils newBatteryOptimizeUtils( + Context context, String packageName, BatteryOptimizeUtils testOptimizeUtils) { + final int uid = BatteryUtils.getInstance(context).getPackageUid(packageName); + if (uid == BatteryUtils.UID_NULL) { + return null; + } + final BatteryOptimizeUtils batteryOptimizeUtils = + testOptimizeUtils != null + ? testOptimizeUtils /*testing only*/ + : new BatteryOptimizeUtils(context, uid, packageName); + return batteryOptimizeUtils; + } + @VisibleForTesting static SharedPreferences getSharedPreferences(Context context) { return context.getSharedPreferences( @@ -233,14 +255,11 @@ public final class BatteryBackupHelper implements BackupHelper { private void restoreOptimizationMode( String packageName, @BatteryOptimizeUtils.OptimizationMode int mode) { - final int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName); - if (uid == BatteryUtils.UID_NULL) { + final BatteryOptimizeUtils batteryOptimizeUtils = + newBatteryOptimizeUtils(mContext, packageName, mBatteryOptimizeUtils); + if (batteryOptimizeUtils == null) { return; } - final BatteryOptimizeUtils batteryOptimizeUtils = - mBatteryOptimizeUtils != null - ? mBatteryOptimizeUtils /*testing only*/ - : new BatteryOptimizeUtils(mContext, uid, packageName); batteryOptimizeUtils.setAppUsageState( mode, BatteryOptimizeHistoricalLogEntry.Action.RESTORE); Log.d(TAG, String.format("restore:%s mode=%d", packageName, mode)); @@ -294,8 +313,4 @@ public final class BatteryBackupHelper implements BackupHelper { Log.e(TAG, "writeBackupData() is failed for " + dataKey, e); } } - - private static boolean isOwner() { - return UserHandle.myUserId() == UserHandle.USER_SYSTEM; - } } diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index b9ac64dd781..00611de7817 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -31,11 +31,14 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.settings.R; import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; +import java.util.List; /** A utility class for application usage operation. */ public class BatteryOptimizeUtils { @@ -214,6 +217,11 @@ public class BatteryOptimizeUtils { || powerAllowlistBackend.isDefaultActiveApp(packageName, uid); } + static List getAllowList(Context context) { + return Arrays.asList(context.getResources().getStringArray( + R.array.config_disable_optimization_mode_apps)); + } + private static void setAppUsageStateInternal( Context context, @OptimizationMode int mode, int uid, String packageName, BatteryUtils batteryUtils, PowerAllowlistBackend powerAllowlistBackend, diff --git a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java index c54e6d8c503..4b9e6efaff0 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java @@ -23,16 +23,27 @@ import android.content.Intent; import android.provider.Settings; import android.util.Log; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.R; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry; import com.android.settings.fuelgauge.batterysaver.BatterySaverScheduleRadioButtonsController; import com.android.settingslib.fuelgauge.BatterySaverUtils; +import java.util.List; + /** Execute battery settings migration tasks in the device booting stage. */ public final class BatterySettingsMigrateChecker extends BroadcastReceiver { private static final String TAG = "BatterySettingsMigrateChecker"; + @VisibleForTesting + static BatteryOptimizeUtils sBatteryOptimizeUtils = null; + @Override public void onReceive(Context context, Intent intent) { - if (intent != null && Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { + if (intent != null + && Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()) + && BatteryBackupHelper.isOwner()) { verifyConfiguration(context); } } @@ -40,9 +51,35 @@ public final class BatterySettingsMigrateChecker extends BroadcastReceiver { static void verifyConfiguration(Context context) { context = context.getApplicationContext(); verifySaverConfiguration(context); + verifyOptimizationModes(context); } - private static void verifySaverConfiguration(Context context) { + /** Avoid users set important apps into the unexpected battery optimize modes */ + static void verifyOptimizationModes(Context context) { + Log.d(TAG, "invoke verifyOptimizationModes()"); + verifyOptimizationModes(context, BatteryOptimizeUtils.getAllowList(context)); + } + + @VisibleForTesting + static void verifyOptimizationModes(Context context, List allowList) { + allowList.forEach(packageName -> { + final BatteryOptimizeUtils batteryOptimizeUtils = + BatteryBackupHelper.newBatteryOptimizeUtils(context, packageName, + /* testOptimizeUtils */ sBatteryOptimizeUtils); + if (batteryOptimizeUtils == null) { + return; + } + if (batteryOptimizeUtils.getAppOptimizationMode() != + BatteryOptimizeUtils.MODE_OPTIMIZED) { + Log.w(TAG, "Reset optimization mode for: " + packageName); + batteryOptimizeUtils.setAppUsageState(BatteryOptimizeUtils.MODE_OPTIMIZED, + BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET); + } + }); + } + + static void verifySaverConfiguration(Context context) { + Log.d(TAG, "invoke verifySaverConfiguration()"); final ContentResolver resolver = context.getContentResolver(); final int threshold = Settings.Global.getInt(resolver, Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java index dfee3e797b9..c34dcecce73 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java @@ -18,35 +18,76 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; + import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.UserHandle; +import android.os.UserManager; import com.android.settings.TestUtils; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry; import com.android.settings.fuelgauge.batterysaver.BatterySaverScheduleRadioButtonsController; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InOrder; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + +import java.util.ArrayList; +import java.util.Arrays; @RunWith(RobolectricTestRunner.class) +@Config(shadows = {BatterySettingsMigrateCheckerTest.ShadowUserHandle.class}) public final class BatterySettingsMigrateCheckerTest { private static final Intent BOOT_COMPLETED_INTENT = new Intent(Intent.ACTION_BOOT_COMPLETED); + private static final int UID = 2003; + private static final String PACKAGE_NAME = "com.android.test.app"; private Context mContext; private BatterySettingsMigrateChecker mBatterySettingsMigrateChecker; + @Mock + private PackageManager mPackageManager; + @Mock + private BatteryOptimizeUtils mBatteryOptimizeUtils; + @Before - public void setUp() { + public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); + doReturn(mContext).when(mContext).getApplicationContext(); + doReturn(mPackageManager).when(mContext).getPackageManager(); + doReturn(UID).when(mPackageManager) + .getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA); + BatterySettingsMigrateChecker.sBatteryOptimizeUtils = mBatteryOptimizeUtils; mBatterySettingsMigrateChecker = new BatterySettingsMigrateChecker(); } + @After + public void resetShadows() { + ShadowUserHandle.reset(); + } + @Test public void onReceive_invalidScheduledLevel_resetScheduledValue() { final int invalidScheduledLevel = 5; @@ -98,6 +139,54 @@ public final class BatterySettingsMigrateCheckerTest { assertThat(getScheduledLevel()).isEqualTo(invalidScheduledLevel); } + @Test + public void onReceive_nonOwner_noAction() { + ShadowUserHandle.setUid(1); + final int invalidScheduledLevel = 5; + setScheduledLevel(invalidScheduledLevel); + + mBatterySettingsMigrateChecker.onReceive(mContext, BOOT_COMPLETED_INTENT); + + assertThat(getScheduledLevel()).isEqualTo(invalidScheduledLevel); + } + + @Test + public void verifyOptimizationModes_inAllowList_resetOptimizationMode() throws Exception { + doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils) + .getAppOptimizationMode(); + + mBatterySettingsMigrateChecker.verifyOptimizationModes( + mContext, Arrays.asList(PACKAGE_NAME)); + + final InOrder inOrder = inOrder(mBatteryOptimizeUtils); + inOrder.verify(mBatteryOptimizeUtils).getAppOptimizationMode(); + inOrder.verify(mBatteryOptimizeUtils).setAppUsageState( + BatteryOptimizeUtils.MODE_OPTIMIZED, + BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET); + } + + @Test + public void verifyOptimizationModes_optimizedMode_noAction() throws Exception { + doReturn(BatteryOptimizeUtils.MODE_OPTIMIZED).when(mBatteryOptimizeUtils) + .getAppOptimizationMode(); + + mBatterySettingsMigrateChecker.verifyOptimizationModes( + mContext, Arrays.asList(PACKAGE_NAME)); + + verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt(), any()); + } + + @Test + public void verifyOptimizationModes_notInAllowList_noAction() throws Exception { + doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils) + .getAppOptimizationMode(); + + mBatterySettingsMigrateChecker.verifyOptimizationModes( + mContext, new ArrayList()); + + verifyNoInteractions(mBatteryOptimizeUtils); + } + private void setScheduledLevel(int scheduledLevel) { TestUtils.setScheduledLevel(mContext, scheduledLevel); } @@ -105,4 +194,24 @@ public final class BatterySettingsMigrateCheckerTest { private int getScheduledLevel() { return TestUtils.getScheduledLevel(mContext); } + + @Implements(UserHandle.class) + public static class ShadowUserHandle { + // Sets the default as thte OWNER role. + private static int sUid = 0; + + public static void setUid(int uid) { + sUid = uid; + } + + @Implementation + public static int myUserId() { + return sUid; + } + + @Resetter + public static void reset() { + sUid = 0; + } + } } From 5cd3a7298e250ae8ddf4d6118ff726670052ce84 Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 15 May 2023 15:02:52 +0800 Subject: [PATCH 4/4] Disable the optimization mode preference if the app is not settable https://screenshot.googleplex.com/BbQyEv6YCjPVwUF (allowlist) https://screenshot.googleplex.com/3hTb8TQwGMQqcwS https://screenshot.googleplex.com/6hdTAT2yNFucD9N (system app) https://screenshot.googleplex.com/77T5JyAD5nZJpDT (normal app) Fix: 281566984 Test: make test RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.fuelgauge.* Change-Id: If7aa4b61bc806daa570187da24b7f454cd069dec --- .../fuelgauge/AdvancedPowerUsageDetail.java | 2 +- .../settings/fuelgauge/BatteryOptimizeUtils.java | 9 ++++----- .../fuelgauge/OptimizedPreferenceController.java | 4 ++-- .../fuelgauge/RestrictedPreferenceController.java | 5 ++--- .../fuelgauge/UnrestrictedPreferenceController.java | 4 ++-- .../fuelgauge/AdvancedPowerUsageDetailTest.java | 6 +++--- .../fuelgauge/BatteryOptimizeUtilsTest.java | 8 ++++---- .../OptimizedPreferenceControllerTest.java | 10 +++++----- .../RestrictedPreferenceControllerTest.java | 12 ++++++------ .../UnrestrictedPreferenceControllerTest.java | 13 ++++++------- 10 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 777e4281764..79e01940ecd 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -343,7 +343,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements final String stateString; final String footerString; - if (!mBatteryOptimizeUtils.isValidPackageName()) { + if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) { // Present optimized only string when the package name is invalid. stateString = context.getString(R.string.manager_battery_usage_optimized_only); footerString = context.getString( diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index 00611de7817..589e1fd4055 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -128,11 +128,10 @@ public class BatteryOptimizeUtils { mContext, mode, mUid, mPackageName, mBatteryUtils, mPowerAllowListBackend, action); } - /** - * Return {@code true} if package name is valid (can get an uid). - */ - public boolean isValidPackageName() { - return mBatteryUtils.getPackageUid(mPackageName) != BatteryUtils.UID_NULL; + /** Return {@code true} if it is disabled for default optimized mode only. */ + public boolean isDisabledForOptimizeModeOnly() { + return getAllowList(mContext).contains(mPackageName) + || mBatteryUtils.getPackageUid(mPackageName) == BatteryUtils.UID_NULL; } /** diff --git a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java index 88241b6ff39..ca75b0e8d22 100644 --- a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java @@ -46,8 +46,8 @@ public class OptimizedPreferenceController extends AbstractPreferenceController @Override public void updateState(Preference preference) { - if (!mBatteryOptimizeUtils.isValidPackageName()) { - Log.d(TAG, "invalid package name, optimized states only"); + if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) { + Log.d(TAG, "disable preference for " + mBatteryOptimizeUtils.getPackageName()); preference.setEnabled(true); ((SelectorWithWidgetPreference) preference).setChecked(true); return; diff --git a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java index fe896a6aed0..7db77f15e40 100644 --- a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package com.android.settings.fuelgauge; import android.content.Context; @@ -43,8 +42,8 @@ public class RestrictedPreferenceController extends AbstractPreferenceController @Override public void updateState(Preference preference) { - if (!mBatteryOptimizeUtils.isValidPackageName()) { - Log.d(TAG, "invalid package name, disable pref"); + if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) { + Log.d(TAG, "disable preference for " + mBatteryOptimizeUtils.getPackageName()); preference.setEnabled(false); return; } else { diff --git a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java index be4091c782f..4578723ce5e 100644 --- a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java @@ -42,8 +42,8 @@ public class UnrestrictedPreferenceController extends AbstractPreferenceControll @Override public void updateState(Preference preference) { - if (!mBatteryOptimizeUtils.isValidPackageName()) { - Log.d(TAG, "invalid package name, disable pref"); + if (mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()) { + Log.d(TAG, "disable preference for " + mBatteryOptimizeUtils.getPackageName()); preference.setEnabled(false); return; } else { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 0278553b2a5..5e9fb738672 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -710,7 +710,7 @@ public class AdvancedPowerUsageDetailTest { @Test public void initPreferenceForTriState_isValidPackageName_hasCorrectString() { - when(mBatteryOptimizeUtils.isValidPackageName()).thenReturn(false); + when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true); mFragment.initPreferenceForTriState(mContext); @@ -720,7 +720,7 @@ public class AdvancedPowerUsageDetailTest { @Test public void initPreferenceForTriState_isSystemOrDefaultApp_hasCorrectString() { - when(mBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); mFragment.initPreferenceForTriState(mContext); @@ -731,7 +731,7 @@ public class AdvancedPowerUsageDetailTest { @Test public void initPreferenceForTriState_hasCorrectString() { - when(mBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false); mFragment.initPreferenceForTriState(mContext); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index 83a75f61e96..f9d3108f904 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -136,16 +136,16 @@ public class BatteryOptimizeUtilsTest { } @Test - public void testIsValidPackageName_InvalidPackageName_returnFalse() { + public void isDisabledForOptimizeModeOnly_invalidPackageName_returnTrue() { final BatteryOptimizeUtils testBatteryOptimizeUtils = new BatteryOptimizeUtils(mContext, UID, null); - assertThat(testBatteryOptimizeUtils.isValidPackageName()).isFalse(); + assertThat(testBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).isTrue(); } @Test - public void testIsValidPackageName_validPackageName_returnTrue() { - assertThat(mBatteryOptimizeUtils.isValidPackageName()).isTrue(); + public void isDisabledForOptimizeModeOnly_validPackageName_returnFalse() { + assertThat(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).isFalse(); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java index 1fec92a8134..71bb998e4b8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java @@ -52,7 +52,7 @@ public class OptimizedPreferenceControllerTest { @Test public void testUpdateState_invalidPackage_prefEnabled() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(false); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true); mController.updateState(mPreference); @@ -62,7 +62,7 @@ public class OptimizedPreferenceControllerTest { @Test public void testUpdateState_isSystemOrDefaultAppAndOptimizeStates_prefChecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( BatteryOptimizeUtils.MODE_OPTIMIZED); @@ -74,7 +74,7 @@ public class OptimizedPreferenceControllerTest { @Test public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); mController.updateState(mPreference); @@ -85,7 +85,7 @@ public class OptimizedPreferenceControllerTest { @Test public void testUpdateState_isOptimizedStates_prefChecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( BatteryOptimizeUtils.MODE_OPTIMIZED); @@ -96,7 +96,7 @@ public class OptimizedPreferenceControllerTest { @Test public void testUpdateState_prefUnchecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); mController.updateState(mPreference); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java index 944376c77dd..bcddbc2500b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java @@ -52,7 +52,7 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_isValidPackage_prefEnabled() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); mController.updateState(mPreference); @@ -61,7 +61,7 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_invalidPackage_prefDisabled() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(false); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true); mController.updateState(mPreference); @@ -70,7 +70,7 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_isSystemOrDefaultAppAndRestrictedStates_prefChecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( BatteryOptimizeUtils.MODE_RESTRICTED); @@ -82,7 +82,7 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); mController.updateState(mPreference); @@ -93,7 +93,7 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_isRestrictedStates_prefChecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( BatteryOptimizeUtils.MODE_RESTRICTED); @@ -104,7 +104,7 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_prefUnchecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); mController.updateState(mPreference); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java index c5642df576c..9bed9bad152 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; @@ -53,7 +52,7 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_isValidPackage_prefEnabled() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); mController.updateState(mPreference); @@ -62,7 +61,7 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_invalidPackage_prefDisabled() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(false); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true); mController.updateState(mPreference); @@ -71,7 +70,7 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_isSystemOrDefaultAppAndUnrestrictedStates_prefChecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( BatteryOptimizeUtils.MODE_UNRESTRICTED); @@ -83,7 +82,7 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); mController.updateState(mPreference); @@ -94,7 +93,7 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_isUnrestrictedStates_prefChecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( BatteryOptimizeUtils.MODE_UNRESTRICTED); @@ -105,7 +104,7 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_prefUnchecked() { - when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); + when(mockBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); mController.updateState(mPreference);