diff --git a/res/values/strings.xml b/res/values/strings.xml index e5a64612320..252a601c794 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8718,7 +8718,7 @@ Optimize - May drain your battery more quickly + May drain your battery more quickly. App will no longer be restricted from using background battery. Recommended for better battery life diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index eb74b2e3f99..68ed42a4cac 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -549,7 +549,7 @@ public class ManageApplications extends InstrumentedFragment startAppInfoFragment(AppStorageSettings.class, R.string.storage_settings); break; case LIST_TYPE_HIGH_POWER: - HighPowerDetail.show(this, mCurrentPkgName, INSTALLED_APP_DETAILS); + HighPowerDetail.show(this, mCurrentUid, mCurrentPkgName, INSTALLED_APP_DETAILS); break; case LIST_TYPE_OVERLAY: startAppInfoFragment(DrawOverlayDetails.class, R.string.overlay_settings); diff --git a/src/com/android/settings/fuelgauge/HighPowerDetail.java b/src/com/android/settings/fuelgauge/HighPowerDetail.java index 9cafbcba491..4f707008953 100644 --- a/src/com/android/settings/fuelgauge/HighPowerDetail.java +++ b/src/com/android/settings/fuelgauge/HighPowerDetail.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; import android.app.AlertDialog; +import android.app.AppOpsManager; import android.app.Dialog; import android.app.Fragment; import android.content.Context; @@ -43,12 +44,18 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli private static final String ARG_DEFAULT_ON = "default_on"; - private final PowerWhitelistBackend mBackend = PowerWhitelistBackend.getInstance(); - - private String mPackageName; + @VisibleForTesting + PowerWhitelistBackend mBackend; + @VisibleForTesting + BatteryUtils mBatteryUtils; + @VisibleForTesting + String mPackageName; + @VisibleForTesting + int mPackageUid; private CharSequence mLabel; private boolean mDefaultOn; - private boolean mIsEnabled; + @VisibleForTesting + boolean mIsEnabled; private Checkable mOptionOn; private Checkable mOptionOff; @@ -60,8 +67,11 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mBatteryUtils = BatteryUtils.getInstance(getContext()); + mBackend = PowerWhitelistBackend.getInstance(); mPackageName = getArguments().getString(AppInfoBase.ARG_PACKAGE_NAME); + mPackageUid = getArguments().getInt(AppInfoBase.ARG_PACKAGE_UID); PackageManager pm = getContext().getPackageManager(); try { mLabel = pm.getApplicationInfo(mPackageName, 0).loadLabel(pm); @@ -129,6 +139,8 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli if (newValue != oldValue) { logSpecialPermissionChange(newValue, mPackageName, getContext()); if (newValue) { + mBatteryUtils.setForceAppStandby(mPackageUid, mPackageName, + AppOpsManager.MODE_ALLOWED); mBackend.addApp(mPackageName); } else { mBackend.removeApp(mPackageName); @@ -165,10 +177,11 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli : R.string.high_power_off); } - public static void show(Fragment caller, String packageName, int requestCode) { + public static void show(Fragment caller, int uid, String packageName, int requestCode) { HighPowerDetail fragment = new HighPowerDetail(); Bundle args = new Bundle(); args.putString(AppInfoBase.ARG_PACKAGE_NAME, packageName); + args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid); fragment.setArguments(args); fragment.setTargetFragment(caller, requestCode); fragment.show(caller.getFragmentManager(), HighPowerDetail.class.getSimpleName()); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java index 8029c5539ef..1817325e15a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/HighPowerDetailTest.java @@ -18,27 +18,49 @@ package com.android.settings.fuelgauge; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.app.AppOpsManager; import android.content.Context; +import android.content.DialogInterface; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.fuelgauge.PowerWhitelistBackend; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class HighPowerDetailTest { + private static final int TEST_UID = 12000; + private static final String TEST_PACKAGE = "com.test.package"; private FakeFeatureFactory mFeatureFactory; + private HighPowerDetail mFragment; + + @Mock + private PowerWhitelistBackend mPowerWhitelistBackend; + @Mock + private BatteryUtils mBatteryUtils; @Before public void setUp() { mFeatureFactory = FakeFeatureFactory.setupForTest(); + + MockitoAnnotations.initMocks(this); + mFragment = spy(new HighPowerDetail()); + mFragment.mBackend = mPowerWhitelistBackend; + mFragment.mBatteryUtils = mBatteryUtils; + mFragment.mPackageUid = TEST_UID; + mFragment.mPackageName = TEST_PACKAGE; } @Test @@ -53,4 +75,13 @@ public class HighPowerDetailTest { verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_BATTERY_ALLOW), eq("app")); } + + @Test + public void onClick_appAddedToDozeWhitelist_getsUnrestricted() { + mFragment.mIsEnabled = true; + when(mPowerWhitelistBackend.isWhitelisted(TEST_PACKAGE)).thenReturn(false); + mFragment.onClick(null, DialogInterface.BUTTON_POSITIVE); + verify(mBatteryUtils).setForceAppStandby(TEST_UID, TEST_PACKAGE, + AppOpsManager.MODE_ALLOWED); + } }