Update summary when toggle background activity

In previous code, it didn't update summary when preference is changed.
This cl adds it and also updates the title for Battery Optimization.

Bug: 37163617
Test: RunSettingsRoboTests
Change-Id: I276d9a267379104794998a605a8e258660dcf350
diff --git a/res/xml/power_usage_detail_ia.xml b/res/xml/power_usage_detail_ia.xml
index cfaa712..39e6c38 100644
--- a/res/xml/power_usage_detail_ia.xml
+++ b/res/xml/power_usage_detail_ia.xml
@@ -56,7 +56,7 @@
 
         <Preference
             android:key="battery_optimization"
-            android:title="@string/battery_detail_background"
+            android:title="@string/high_power_apps"
             android:summary="@string/high_power_off"
             android:selectable="true"/>
 
diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
index 463d4dc..60a94dd 100644
--- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
@@ -55,16 +55,14 @@
     public void updateState(Preference preference) {
         final int mode = mAppOpsManager
                 .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
-
         if (mode == AppOpsManager.MODE_ERRORED) {
             preference.setEnabled(false);
-            preference.setSummary(R.string.background_activity_summary_disabled);
         } else {
             final boolean checked = mode != AppOpsManager.MODE_IGNORED;
             ((SwitchPreference) preference).setChecked(checked);
-            preference.setSummary(checked ? R.string.background_activity_summary_on
-                    : R.string.background_activity_summary_off);
         }
+
+        updateSummary(preference);
     }
 
     @Override
@@ -92,6 +90,8 @@
         boolean switchOn = (Boolean) newValue;
         mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
                 switchOn ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
+
+        updateSummary(preference);
         return true;
     }
 
@@ -113,4 +113,18 @@
 
         return false;
     }
+
+    @VisibleForTesting
+    void updateSummary(Preference preference) {
+        final int mode = mAppOpsManager
+                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
+
+        if (mode == AppOpsManager.MODE_ERRORED) {
+            preference.setSummary(R.string.background_activity_summary_disabled);
+        } else {
+            final boolean checked = mode != AppOpsManager.MODE_IGNORED;
+            preference.setSummary(checked ? R.string.background_activity_summary_on
+                    : R.string.background_activity_summary_off);
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 0813478..4f48945 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -23,7 +23,9 @@
 import android.os.Build;
 import android.support.v14.preference.SwitchPreference;
 
+import com.android.settings.R;
 import com.android.settings.TestConfig;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,9 +33,12 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -54,17 +59,18 @@
     @Mock
     private AppOpsManager mAppOpsManager;
     @Mock
-    private SwitchPreference mPreference;
-    @Mock
     private ApplicationInfo mHighApplicationInfo;
     @Mock
     private ApplicationInfo mLowApplicationInfo;
     private BackgroundActivityPreferenceController mController;
+    private SwitchPreference mPreference;
+    private Context mShadowContext;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
+        mShadowContext = RuntimeEnvironment.application;
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
         when(mPackageManager.getPackagesForUid(UID_NORMAL)).thenReturn(PACKAGES_NORMAL);
@@ -77,7 +83,8 @@
         mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
         mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
 
-        mController = new BackgroundActivityPreferenceController(mContext, UID_NORMAL);
+        mPreference = new SwitchPreference(mShadowContext);
+        mController = spy(new BackgroundActivityPreferenceController(mContext, UID_NORMAL));
         mController.isAvailable();
     }
 
@@ -87,14 +94,16 @@
 
         verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL,
                 mController.getTargetPackage(), AppOpsManager.MODE_ALLOWED);
+        verify(mController).updateSummary(mPreference);
     }
 
     @Test
     public void testOnPreferenceChange_TurnOffCheck_MethodInvoked() {
-        mController.onPreferenceChange(null, false);
+        mController.onPreferenceChange(mPreference, false);
 
         verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL,
                 mController.getTargetPackage(), AppOpsManager.MODE_IGNORED);
+        verify(mController).updateSummary(mPreference);
     }
 
     @Test
@@ -105,7 +114,8 @@
 
         mController.updateState(mPreference);
 
-        verify(mPreference).setChecked(true);
+        assertThat(mPreference.isChecked()).isTrue();
+        verify(mController).updateSummary(mPreference);
     }
 
     @Test
@@ -116,7 +126,46 @@
 
         mController.updateState(mPreference);
 
-        verify(mPreference).setChecked(false);
+        assertThat(mPreference.isChecked()).isFalse();
+        verify(mController).updateSummary(mPreference);
+    }
+
+    @Test
+    public void testUpdateSummary_modeError_showSummaryDisabled() {
+        when(mAppOpsManager
+                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
+                .thenReturn(AppOpsManager.MODE_ERRORED);
+        final CharSequence expectedSummary = mShadowContext.getText(
+                R.string.background_activity_summary_disabled);
+        mController.updateSummary(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void testUpdateSummary_modeDefault_showSummaryOn() {
+        when(mAppOpsManager
+                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
+                .thenReturn(AppOpsManager.MODE_DEFAULT);
+        final CharSequence expectedSummary = mShadowContext.getText(
+                R.string.background_activity_summary_on);
+
+        mController.updateSummary(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
+    }
+
+    @Test
+    public void testUpdateSummary_modeIgnored_showSummaryOff() {
+        when(mAppOpsManager
+                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
+                .thenReturn(AppOpsManager.MODE_IGNORED);
+        final CharSequence expectedSummary = mShadowContext.getText(
+                R.string.background_activity_summary_off);
+
+        mController.updateSummary(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
     }
 
     @Test
@@ -144,6 +193,6 @@
 
         assertThat(available).isTrue();
         // Should get status from LOW_SDK_PACKAGE
-        verify(mPreference).setChecked(true);
+        assertThat(mPreference.isChecked()).isTrue();
     }
 }