Update Summary for Battery Optimization

Bug: 37221696
Test: RunSettingsRoboTests
Change-Id: I7dc24879521a1375e0ad4b4b73e9a40633b93c3f
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 320031e..2f8e28e 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -230,7 +230,7 @@
 
         controllers.add(new BackgroundActivityPreferenceController(context, uid));
         controllers.add(new BatteryOptimizationPreferenceController(
-                (SettingsActivity) getActivity(), this));
+                (SettingsActivity) getActivity(), this, packageName));
         mAppButtonsPreferenceController = new AppButtonsPreferenceController(
                 (SettingsActivity) getActivity(), this, getLifecycle(), packageName, mState, mDpm,
                 mUserManager, mPackageManager, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN);
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java
index 946a9b8..7c5bda2 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java
@@ -17,6 +17,7 @@
 import android.app.Fragment;
 import android.content.Context;
 import android.os.Bundle;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
 
@@ -33,14 +34,29 @@
 
     private static final String KEY_BACKGROUND_ACTIVITY = "battery_optimization";
 
+
+    private PowerWhitelistBackend mBackend;
     private Fragment mFragment;
     private SettingsActivity mSettingsActivity;
+    private String mPackageName;
 
     public BatteryOptimizationPreferenceController(SettingsActivity settingsActivity,
-            Fragment fragment) {
+            Fragment fragment, String packageName) {
         super(settingsActivity);
         mFragment = fragment;
         mSettingsActivity = settingsActivity;
+        mPackageName = packageName;
+        mBackend = PowerWhitelistBackend.getInstance();
+    }
+
+    @VisibleForTesting
+    BatteryOptimizationPreferenceController(SettingsActivity settingsActivity,
+            Fragment fragment, String packageName, PowerWhitelistBackend backend) {
+        super(settingsActivity);
+        mFragment = fragment;
+        mSettingsActivity = settingsActivity;
+        mPackageName = packageName;
+        mBackend = backend;
     }
 
     @Override
@@ -49,6 +65,12 @@
     }
 
     @Override
+    public void updateState(Preference preference) {
+        final boolean isWhitelisted = mBackend.isWhitelisted(mPackageName);
+        preference.setSummary(isWhitelisted ? R.string.high_power_on : R.string.high_power_off);
+    }
+
+    @Override
     public String getPreferenceKey() {
         return KEY_BACKGROUND_ACTIVITY;
     }
@@ -66,4 +88,5 @@
                 R.string.high_power_apps, null, null, 0);
         return true;
     }
+
 }
diff --git a/src/com/android/settings/fuelgauge/PowerWhitelistBackend.java b/src/com/android/settings/fuelgauge/PowerWhitelistBackend.java
index 7199af8..5590a46 100644
--- a/src/com/android/settings/fuelgauge/PowerWhitelistBackend.java
+++ b/src/com/android/settings/fuelgauge/PowerWhitelistBackend.java
@@ -18,6 +18,8 @@
 import android.os.IDeviceIdleController;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.support.annotation.VisibleForTesting;
+
 import android.util.ArraySet;
 import android.util.Log;
 
@@ -31,7 +33,7 @@
 
     private static final String DEVICE_IDLE_SERVICE = "deviceidle";
 
-    private static final PowerWhitelistBackend INSTANCE = new PowerWhitelistBackend();
+    private static PowerWhitelistBackend sInstance;
 
     private final IDeviceIdleController mDeviceIdleService;
     private final ArraySet<String> mWhitelistedApps = new ArraySet<>();
@@ -73,7 +75,8 @@
         }
     }
 
-    private void refreshList() {
+    @VisibleForTesting
+    void refreshList() {
         mSysWhitelistedApps.clear();
         mWhitelistedApps.clear();
         try {
@@ -91,7 +94,10 @@
     }
 
     public static PowerWhitelistBackend getInstance() {
-        return INSTANCE;
+        if (sInstance == null) {
+            sInstance = new PowerWhitelistBackend();
+        }
+        return sInstance;
     }
 
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java
index 2c5296a..b3afbb4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java
@@ -22,14 +22,18 @@
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.app.Fragment;
+import android.content.Context;
 import android.os.Bundle;
+import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 
+import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
 
@@ -39,11 +43,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class BatteryOptimizationPreferenceControllerTest {
+    private static final String PKG_IN_WHITELIST = "com.pkg.in.whitelist";
+    private static final String PKG_NOT_IN_WHITELIST = "com.pkg.not.in.whitelist";
     private static final String KEY_OPTIMIZATION = "battery_optimization";
     private static final String KEY_OTHER = "other";
     @Mock
@@ -51,20 +58,28 @@
     @Mock
     private Fragment mFragment;
     @Mock
-    private Preference mPreference;
+    private TestPowerWhitelistBackend mBackend;
 
     private BatteryOptimizationPreferenceController mController;
+    private Preference mPreference;
+    private Context mContext;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mController = new BatteryOptimizationPreferenceController(mSettingsActivity, mFragment);
+        mContext = RuntimeEnvironment.application;
+        doReturn(false).when(mBackend).isWhitelisted(PKG_NOT_IN_WHITELIST);
+        doReturn(true).when(mBackend).isWhitelisted(PKG_IN_WHITELIST);
+
+        mPreference = new SwitchPreference(mContext);
+        mController = spy(new BatteryOptimizationPreferenceController(mSettingsActivity, mFragment,
+                PKG_NOT_IN_WHITELIST, mBackend));
     }
 
     @Test
     public void testHandlePreferenceTreeClick_OptimizationPreference_HandleClick() {
-        when(mPreference.getKey()).thenReturn(KEY_OPTIMIZATION);
+        mPreference.setKey(KEY_OPTIMIZATION);
 
         final boolean handled = mController.handlePreferenceTreeClick(mPreference);
 
@@ -76,7 +91,7 @@
 
     @Test
     public void testHandlePreferenceTreeClick_OtherPreference_NotHandleClick() {
-        when(mPreference.getKey()).thenReturn(KEY_OTHER);
+        mPreference.setKey(KEY_OTHER);
 
         final boolean handled = mController.handlePreferenceTreeClick(mPreference);
 
@@ -85,4 +100,33 @@
                 anyString(), any(Bundle.class), anyInt(), any(CharSequence.class),
                 any(Fragment.class), anyInt());
     }
+
+    @Test
+    public void testUpdateState_appInWhitelist_showSummaryNotOptimized() {
+        BatteryOptimizationPreferenceController controller =
+                new BatteryOptimizationPreferenceController(mSettingsActivity, mFragment,
+                        PKG_IN_WHITELIST, mBackend);
+
+        controller.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.high_power_on));
+    }
+
+    @Test
+    public void testUpdateState_appNotInWhitelist_showSummaryOptimized() {
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.high_power_off));
+    }
+
+    /**
+     * Create this test class so we could mock it
+     */
+    public static class TestPowerWhitelistBackend extends PowerWhitelistBackend {
+
+        @Override
+        void refreshList() {
+            // Do nothing so we could mock it without error
+        }
+    }
 }