[B&R] notify BackupManager when app optimization mode is changed

Invoke BackupManager.dataChanged() when app optimization mode is changed
to notify BackupManager to execute Settings agent to backup data in the
next backup session, when performing the partial backup event.

Bug: 192523697
Bug: 197608038
Bug: 194633034
Test: make SettingsRoboTests
Change-Id: I456acc2594d22503763e4ce286435148ae0644a4
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f193a31..a33a6bc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6143,7 +6143,7 @@
     <!-- Activity title for battery usage history details [CHAR LIMIT=60] -->
     <string name="history_details_title">History details</string>
     <!-- Preference title for advanced battery usage [CHAR LIMIT=40] -->
-    <string name="advanced_battery_preference_title">Battery Usage</string>
+    <string name="advanced_battery_preference_title">Battery usage</string>
     <!-- Preference summary for advanced battery usage, for past 24 hours [CHAR LIMIT=40] -->
     <string name="advanced_battery_preference_summary_with_hours">View usage for past 24 hours</string>
     <!-- Preference summary for advanced battery usage, from last full charge [CHAR LIMIT=40] -->
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 3319e1b..be1ea31 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -20,6 +20,7 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.settings.SettingsEnums;
+import android.app.backup.BackupManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -113,7 +114,12 @@
     @VisibleForTesting
     RadioButtonPreference mUnrestrictedPreference;
     @VisibleForTesting
-    boolean enableTriState = true;
+    boolean mEnableTriState = true;
+    @VisibleForTesting
+    @BatteryOptimizeUtils.OptimizationMode
+    int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
+    @VisibleForTesting
+    BackupManager mBackupManager;
 
     private AppButtonsPreferenceController mAppButtonsPreferenceController;
     private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
@@ -245,7 +251,7 @@
         super.onCreate(icicle);
 
         final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
-        if (enableTriState) {
+        if (mEnableTriState) {
             onCreateForTriState(packageName);
         } else {
             mForegroundPreference = findPreference(KEY_PREF_FOREGROUND);
@@ -263,7 +269,7 @@
         super.onResume();
 
         initHeader();
-        if (enableTriState) {
+        if (mEnableTriState) {
             initPreferenceForTriState(getContext());
             final String packageName = mBatteryOptimizeUtils.getPackageName();
             FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
@@ -276,6 +282,22 @@
         }
     }
 
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        notifyBackupManager();
+    }
+
+    @VisibleForTesting
+    void notifyBackupManager() {
+        if (mEnableTriState
+                && mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
+            final BackupManager backupManager = mBackupManager != null
+                    ? mBackupManager : new BackupManager(getContext());
+            backupManager.dataChanged();
+        }
+    }
+
     @VisibleForTesting
     void initHeader() {
         final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);
@@ -303,7 +325,7 @@
             controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
         }
 
-        if (enableTriState) {
+        if (mEnableTriState) {
             final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
             final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
             final String slotTime = bundle.getString(EXTRA_SLOT_TIME, null);
@@ -374,7 +396,7 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return enableTriState ? R.xml.power_usage_detail : R.xml.power_usage_detail_legacy;
+        return mEnableTriState ? R.xml.power_usage_detail : R.xml.power_usage_detail_legacy;
     }
 
     @Override
@@ -388,7 +410,7 @@
                 (SettingsActivity) getActivity(), this, getSettingsLifecycle(), packageName,
                 mState, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN);
         controllers.add(mAppButtonsPreferenceController);
-        if (enableTriState) {
+        if (mEnableTriState) {
             controllers.add(new UnrestrictedPreferenceController(context, uid, packageName));
             controllers.add(new OptimizedPreferenceController(context, uid, packageName));
             controllers.add(new RestrictedPreferenceController(context, uid, packageName));
@@ -467,6 +489,7 @@
 
         mBatteryOptimizeUtils = new BatteryOptimizeUtils(
                 getContext(), getArguments().getInt(EXTRA_UID), packageName);
+        mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
     }
 
     private CharSequence getAppActiveTime(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index b50e083..a2e78c3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,9 +30,11 @@
 import static org.mockito.Mockito.mock;
 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.BackupManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -123,6 +125,9 @@
     private BatteryUtils mBatteryUtils;
     @Mock
     private BatteryOptimizeUtils mBatteryOptimizeUtils;
+    @Mock
+    private BackupManager mBackupManager;
+
     private Context mContext;
     private Preference mForegroundPreference;
     private Preference mBackgroundPreference;
@@ -180,9 +185,10 @@
 
         mFragment.mHeaderPreference = mHeaderPreference;
         mFragment.mState = mState;
-        mFragment.enableTriState = true;
+        mFragment.mEnableTriState = true;
         mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
         mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
+        mFragment.mBackupManager = mBackupManager;
         mAppEntry.info = mock(ApplicationInfo.class);
 
         mTestActivity = spy(new SettingsActivity());
@@ -231,7 +237,7 @@
 
     @Test
     public void testGetPreferenceScreenResId_disableTriState_returnLegacyLayout() {
-        mFragment.enableTriState = false;
+        mFragment.mEnableTriState = false;
         assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.power_usage_detail_legacy);
     }
 
@@ -780,4 +786,38 @@
                     new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
                 });
     }
+
+    @Test
+    public void notifyBackupManager_optimizationModeIsNotChanged_notInvokeDataChanged() {
+        final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
+        mFragment.mOptimizationMode = mode;
+        when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+
+        mFragment.notifyBackupManager();
+
+        verifyZeroInteractions(mBackupManager);
+    }
+
+    @Test
+    public void notifyBackupManager_optimizationModeIsChanged_invokeDataChanged() {
+        mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+        when(mBatteryOptimizeUtils.getAppOptimizationMode())
+                .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
+
+        mFragment.notifyBackupManager();
+
+        verify(mBackupManager).dataChanged();
+    }
+
+    @Test
+    public void notifyBackupManager_triStateIsNotEnabled_notInvokeDataChanged() {
+        mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+        when(mBatteryOptimizeUtils.getAppOptimizationMode())
+                .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
+        mFragment.mEnableTriState = false;
+
+        mFragment.notifyBackupManager();
+
+        verifyZeroInteractions(mBackupManager);
+    }
 }