diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 320031e53bf..2f8e28ef45e 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -230,7 +230,7 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase implements 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 946a9b89292..7c5bda218f8 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; 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 @@ public class BatteryOptimizationPreferenceController extends PreferenceControlle 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 @@ -48,6 +64,12 @@ public class BatteryOptimizationPreferenceController extends PreferenceControlle return true; } + @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 @@ public class BatteryOptimizationPreferenceController extends PreferenceControlle 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 7199af871ce..5590a46f4d1 100644 --- a/src/com/android/settings/fuelgauge/PowerWhitelistBackend.java +++ b/src/com/android/settings/fuelgauge/PowerWhitelistBackend.java @@ -18,6 +18,8 @@ package com.android.settings.fuelgauge; 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 @@ public class PowerWhitelistBackend { 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 mWhitelistedApps = new ArraySet<>(); @@ -73,7 +75,8 @@ public class PowerWhitelistBackend { } } - private void refreshList() { + @VisibleForTesting + void refreshList() { mSysWhitelistedApps.clear(); mWhitelistedApps.clear(); try { @@ -91,7 +94,10 @@ public class PowerWhitelistBackend { } 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 2c5296aca48..b3afbb42f06 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.any; 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.junit.runner.RunWith; 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 @@ public class BatteryOptimizationPreferenceControllerTest { @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 @@ public class BatteryOptimizationPreferenceControllerTest { @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 @@ public class BatteryOptimizationPreferenceControllerTest { 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 + } + } }