Merge "Optimize battery optimize page control flow" into sc-v2-dev am: c6a5bcc933

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/16138630

Change-Id: Ic9d497517b6778c413909917d485575a054dc331
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 0d0cdba..4ad4de7 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -283,6 +283,15 @@
     }
 
     @Override
+    public void onPause() {
+        super.onPause();
+        if (mEnableTriState) {
+            Log.d(TAG, "Leave with mode: " + getSelectedPreference());
+            mBatteryOptimizeUtils.setAppUsageState(getSelectedPreference());
+        }
+    }
+
+    @Override
     public void onDestroy() {
         super.onDestroy();
         notifyBackupManager();
@@ -490,6 +499,18 @@
         mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
     }
 
+    private int getSelectedPreference() {
+        if (mRestrictedPreference.isChecked()) {
+            return BatteryOptimizeUtils.MODE_RESTRICTED;
+        } else if (mUnrestrictedPreference.isChecked()) {
+            return BatteryOptimizeUtils.MODE_UNRESTRICTED;
+        } else if (mOptimizePreference.isChecked()) {
+            return BatteryOptimizeUtils.MODE_OPTIMIZED;
+        } else {
+            return BatteryOptimizeUtils.MODE_UNKNOWN;
+        }
+    }
+
     private CharSequence getAppActiveTime(Bundle bundle) {
         final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
         final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
index af16edb..fdbd12a 100644
--- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
+++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
@@ -29,8 +29,8 @@
 import android.content.pm.UserInfo;
 import android.os.Build;
 import android.os.IDeviceIdleController;
-import android.os.RemoteException;
 import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -230,7 +230,7 @@
                 mBatteryOptimizeUtils != null
                         ? mBatteryOptimizeUtils /*testing only*/
                         : new BatteryOptimizeUtils(mContext, uid, packageName);
-        batteryOptimizeUtils.setAppOptimizationMode(mode);
+        batteryOptimizeUtils.setAppUsageState(mode);
         Log.d(TAG, String.format("restore:%s mode=%d", packageName, mode));
     }
 
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
index 3d95395..9306a34 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.app.AppOpsManager;
 import android.content.Context;
+import android.os.AsyncTask;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -89,36 +90,28 @@
         return getAppOptimizationMode(mMode, mAllowListed);
     }
 
-    public void setAppOptimizationMode(@OptimizationMode int mode) {
-        try {
-            setAppUsageStateInternal(mode);
-        } catch (Exception e) {
-            Log.e(TAG, "setAppUsageState() is failed for " + mPackageName, e);
-        }
-    }
-
     /** Sets the {@link OptimizationMode} for associated app. */
-    public void setAppUsageStateInternal(@OptimizationMode int mode) {
+    public void setAppUsageState(@OptimizationMode int mode) {
         if (getAppOptimizationMode(mMode, mAllowListed) == mode) {
             Log.w(TAG, "set the same optimization mode for: " + mPackageName);
             return;
         }
-        switch (mode) {
-            case MODE_RESTRICTED:
-                mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_IGNORED);
-                mPowerAllowListBackend.removeApp(mPackageName);
-                break;
-            case MODE_UNRESTRICTED:
-                mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED);
-                mPowerAllowListBackend.addApp(mPackageName);
-                break;
-            case MODE_OPTIMIZED:
-                mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED);
-                mPowerAllowListBackend.removeApp(mPackageName);
-                break;
-            default:
-                Log.d(TAG, "set unknown app optimization mode.");
-        }
+
+        AsyncTask.execute(() -> {
+            switch (mode) {
+                case MODE_RESTRICTED:
+                    setAppOptimizationMode(AppOpsManager.MODE_IGNORED, /* allowListed */ false);
+                    break;
+                case MODE_UNRESTRICTED:
+                    setAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ true);
+                    break;
+                case MODE_OPTIMIZED:
+                    setAppOptimizationMode(AppOpsManager.MODE_ALLOWED, /* allowListed */ false);
+                    break;
+                default:
+                    Log.d(TAG, "set unknown app optimization mode.");
+            }
+        });
     }
 
     /**
@@ -142,6 +135,19 @@
         return mPackageName == null ? UNKNOWN_PACKAGE : mPackageName;
     }
 
+    private void setAppOptimizationMode(int appStandbyMode, boolean allowListed) {
+        try {
+            mBatteryUtils.setForceAppStandby(mUid, mPackageName, appStandbyMode);
+            if (allowListed) {
+                mPowerAllowListBackend.addApp(mPackageName);
+            } else {
+                mPowerAllowListBackend.removeApp(mPackageName);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "set OPTIMIZED failed for " + mPackageName, e);
+        }
+    }
+
     private void refreshState() {
         mPowerAllowListBackend.refreshList();
         mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName);
diff --git a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
index ffec50d..4b1862a 100644
--- a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
@@ -73,12 +73,6 @@
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (!KEY_OPTIMIZED_PREF.equals(preference.getKey())) {
-            return false;
-        }
-
-        mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_OPTIMIZED);
-        Log.d(TAG, "Set optimized");
-        return true;
+        return getPreferenceKey().equals(preference.getKey());
     }
 }
diff --git a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
index d50926e..5da439d 100644
--- a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
@@ -76,12 +76,6 @@
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (!KEY_RESTRICTED_PREF.equals(preference.getKey())) {
-            return false;
-        }
-
-        mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_RESTRICTED);
-        Log.d(TAG, "Set restricted");
-        return true;
+        return getPreferenceKey().equals(preference.getKey());
     }
 }
diff --git a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
index 1d66c6c..40b2f8d 100644
--- a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
@@ -74,12 +74,6 @@
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (!KEY_UNRESTRICTED_PREF.equals(preference.getKey())) {
-            return false;
-        }
-
-        mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_UNRESTRICTED);
-        Log.d(TAG, "Set unrestricted");
-        return true;
+        return getPreferenceKey().equals(preference.getKey());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
index 5ac8553..0f178e0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
@@ -20,6 +20,7 @@
 import static com.android.settings.fuelgauge.BatteryBackupHelper.DELIMITER_MODE;
 import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_RESTRICTED;
 import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_UNRESTRICTED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -33,7 +34,6 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
 
 import android.app.AppOpsManager;
 import android.app.backup.BackupDataInputStream;
@@ -51,9 +51,6 @@
 
 import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -69,6 +66,10 @@
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {BatteryBackupHelperTest.ShadowUserHandle.class})
 public final class BatteryBackupHelperTest {
@@ -305,10 +306,11 @@
                 PACKAGE_NAME2 + DELIMITER_MODE + invalidNumberFormat;
 
         mBatteryBackupHelper.restoreOptimizationMode(packageModes.getBytes());
+        TimeUnit.SECONDS.sleep(1);
 
         final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
-        inOrder.verify(mBatteryOptimizeUtils).setAppOptimizationMode(MODE_RESTRICTED);
-        inOrder.verify(mBatteryOptimizeUtils, never()).setAppOptimizationMode(anyInt());
+        inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_RESTRICTED);
+        inOrder.verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt());
     }
 
     @Test
@@ -319,11 +321,12 @@
                 PACKAGE_NAME3 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER;
 
         mBatteryBackupHelper.restoreOptimizationMode(packageModes.getBytes());
+        TimeUnit.SECONDS.sleep(1);
 
         final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
-        inOrder.verify(mBatteryOptimizeUtils).setAppOptimizationMode(MODE_RESTRICTED);
-        inOrder.verify(mBatteryOptimizeUtils).setAppOptimizationMode(MODE_UNRESTRICTED);
-        inOrder.verify(mBatteryOptimizeUtils, never()).setAppOptimizationMode(MODE_RESTRICTED);
+        inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_RESTRICTED);
+        inOrder.verify(mBatteryOptimizeUtils).setAppUsageState(MODE_UNRESTRICTED);
+        inOrder.verify(mBatteryOptimizeUtils, never()).setAppUsageState(MODE_RESTRICTED);
     }
 
     private void mockUid(int uid, String packageName) throws Exception {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
index 53101c0..c154f42 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
@@ -42,6 +42,8 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
+import java.util.concurrent.TimeUnit;
+
 @RunWith(RobolectricTestRunner.class)
 public class BatteryOptimizeUtilsTest {
 
@@ -125,12 +127,13 @@
     }
 
     @Test
-    public void testSetAppOptimizationMode_Restricted_verifyAction() {
+    public void testSetAppUsageState_Restricted_verifyAction() throws Exception {
         // Sets the current mode as MODE_UNRESTRICTED.
         mBatteryOptimizeUtils.mAllowListed = false;
         mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_ALLOWED;
 
-        mBatteryOptimizeUtils.setAppOptimizationMode(MODE_RESTRICTED);
+        mBatteryOptimizeUtils.setAppUsageState(MODE_RESTRICTED);
+        TimeUnit.SECONDS.sleep(1);
 
         verify(mMockBatteryUtils).setForceAppStandby(UID,
                 PACKAGE_NAME, AppOpsManager.MODE_IGNORED);
@@ -138,8 +141,9 @@
     }
 
     @Test
-    public void testSetAppOptimizationMode_Unrestricted_verifyAction() {
-        mBatteryOptimizeUtils.setAppOptimizationMode(MODE_UNRESTRICTED);
+    public void testSetAppUsageState_Unrestricted_verifyAction() throws Exception {
+        mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED);
+        TimeUnit.SECONDS.sleep(1);
 
         verify(mMockBatteryUtils).setForceAppStandby(UID,
                 PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
@@ -147,8 +151,9 @@
     }
 
     @Test
-    public void testSetAppOptimizationMode_Optimized_verifyAction() {
-        mBatteryOptimizeUtils.setAppOptimizationMode(MODE_OPTIMIZED);
+    public void testSetAppUsageState_Optimized_verifyAction() throws Exception {
+        mBatteryOptimizeUtils.setAppUsageState(MODE_OPTIMIZED);
+        TimeUnit.SECONDS.sleep(1);
 
         verify(mMockBatteryUtils).setForceAppStandby(UID,
                 PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
@@ -156,12 +161,13 @@
     }
 
     @Test
-    public void testSetAppOptimizationMode_sameUnrestrictedMode_verifyNoAction() {
+    public void testSetAppUsageState_sameUnrestrictedMode_verifyNoAction() throws Exception {
         // Sets the current mode as MODE_UNRESTRICTED.
         mBatteryOptimizeUtils.mAllowListed = true;
         mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_ALLOWED;
 
-        mBatteryOptimizeUtils.setAppOptimizationMode(MODE_UNRESTRICTED);
+        mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED);
+        TimeUnit.SECONDS.sleep(1);
 
         verifyZeroInteractions(mMockBackend);
         verifyZeroInteractions(mMockBatteryUtils);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
index 9df3ac9..c0b1394 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import com.android.settingslib.widget.RadioButtonPreference;
@@ -98,14 +96,11 @@
         mPreference.setKey(mController.KEY_OPTIMIZED_PREF);
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
-                BatteryOptimizeUtils.MODE_OPTIMIZED);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
     }
 
     @Test
     public void testHandlePreferenceTreeClick_incorrectPrefKey_noAction() {
-        mController.handlePreferenceTreeClick(mPreference);
-
-        verifyZeroInteractions(mockBatteryOptimizeUtils);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
index 0986153..d826c8d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import com.android.settingslib.widget.RadioButtonPreference;
@@ -106,14 +104,11 @@
         mPreference.setKey(mController.KEY_RESTRICTED_PREF);
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
-                BatteryOptimizeUtils.MODE_RESTRICTED);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
     }
 
     @Test
     public void testHandlePreferenceTreeClick_incorrectPrefKey_noAction() {
-        mController.handlePreferenceTreeClick(mPreference);
-
-        verifyZeroInteractions(mockBatteryOptimizeUtils);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
index 004e97c..b0e9184 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
@@ -19,8 +19,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import com.android.settingslib.widget.RadioButtonPreference;
@@ -106,14 +104,11 @@
         mPreference.setKey(mController.KEY_UNRESTRICTED_PREF);
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
-                BatteryOptimizeUtils.MODE_UNRESTRICTED);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
     }
 
     @Test
     public void testHandlePreferenceTreeClick_incorrectPrefKey_noAction() {
-        mController.handlePreferenceTreeClick(mPreference);
-
-        verifyZeroInteractions(mockBatteryOptimizeUtils);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
     }
 }