Merge "Unrestricting app when put on power whitelist" into pi-dev
am: e70e27ccea
Change-Id: If9e91bde1f531a004b440a66eede2c93a565c2df
This commit is contained in:
@@ -8718,7 +8718,7 @@
|
|||||||
<string name="ignore_optimizations_off">Optimize</string>
|
<string name="ignore_optimizations_off">Optimize</string>
|
||||||
|
|
||||||
<!-- Ignore battery optimizations on description [CHAR LIMIT=NONE] -->
|
<!-- Ignore battery optimizations on description [CHAR LIMIT=NONE] -->
|
||||||
<string name="ignore_optimizations_on_desc">May drain your battery more quickly</string>
|
<string name="ignore_optimizations_on_desc">May drain your battery more quickly. App will no longer be restricted from using background battery.</string>
|
||||||
|
|
||||||
<!-- Ignore battery optimizations off description [CHAR LIMIT=NONE] -->
|
<!-- Ignore battery optimizations off description [CHAR LIMIT=NONE] -->
|
||||||
<string name="ignore_optimizations_off_desc">Recommended for better battery life</string>
|
<string name="ignore_optimizations_off_desc">Recommended for better battery life</string>
|
||||||
|
@@ -545,7 +545,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
startAppInfoFragment(AppStorageSettings.class, R.string.storage_settings);
|
startAppInfoFragment(AppStorageSettings.class, R.string.storage_settings);
|
||||||
break;
|
break;
|
||||||
case LIST_TYPE_HIGH_POWER:
|
case LIST_TYPE_HIGH_POWER:
|
||||||
HighPowerDetail.show(this, mCurrentPkgName, INSTALLED_APP_DETAILS);
|
HighPowerDetail.show(this, mCurrentUid, mCurrentPkgName, INSTALLED_APP_DETAILS);
|
||||||
break;
|
break;
|
||||||
case LIST_TYPE_OVERLAY:
|
case LIST_TYPE_OVERLAY:
|
||||||
startAppInfoFragment(DrawOverlayDetails.class, R.string.overlay_settings);
|
startAppInfoFragment(DrawOverlayDetails.class, R.string.overlay_settings);
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
import android.app.AppOpsManager;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.content.Context;
|
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 static final String ARG_DEFAULT_ON = "default_on";
|
||||||
|
|
||||||
private final PowerWhitelistBackend mBackend = PowerWhitelistBackend.getInstance();
|
@VisibleForTesting
|
||||||
|
PowerWhitelistBackend mBackend;
|
||||||
private String mPackageName;
|
@VisibleForTesting
|
||||||
|
BatteryUtils mBatteryUtils;
|
||||||
|
@VisibleForTesting
|
||||||
|
String mPackageName;
|
||||||
|
@VisibleForTesting
|
||||||
|
int mPackageUid;
|
||||||
private CharSequence mLabel;
|
private CharSequence mLabel;
|
||||||
private boolean mDefaultOn;
|
private boolean mDefaultOn;
|
||||||
private boolean mIsEnabled;
|
@VisibleForTesting
|
||||||
|
boolean mIsEnabled;
|
||||||
private Checkable mOptionOn;
|
private Checkable mOptionOn;
|
||||||
private Checkable mOptionOff;
|
private Checkable mOptionOff;
|
||||||
|
|
||||||
@@ -60,8 +67,11 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(getContext());
|
||||||
|
mBackend = PowerWhitelistBackend.getInstance();
|
||||||
|
|
||||||
mPackageName = getArguments().getString(AppInfoBase.ARG_PACKAGE_NAME);
|
mPackageName = getArguments().getString(AppInfoBase.ARG_PACKAGE_NAME);
|
||||||
|
mPackageUid = getArguments().getInt(AppInfoBase.ARG_PACKAGE_UID);
|
||||||
PackageManager pm = getContext().getPackageManager();
|
PackageManager pm = getContext().getPackageManager();
|
||||||
try {
|
try {
|
||||||
mLabel = pm.getApplicationInfo(mPackageName, 0).loadLabel(pm);
|
mLabel = pm.getApplicationInfo(mPackageName, 0).loadLabel(pm);
|
||||||
@@ -129,6 +139,8 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli
|
|||||||
if (newValue != oldValue) {
|
if (newValue != oldValue) {
|
||||||
logSpecialPermissionChange(newValue, mPackageName, getContext());
|
logSpecialPermissionChange(newValue, mPackageName, getContext());
|
||||||
if (newValue) {
|
if (newValue) {
|
||||||
|
mBatteryUtils.setForceAppStandby(mPackageUid, mPackageName,
|
||||||
|
AppOpsManager.MODE_ALLOWED);
|
||||||
mBackend.addApp(mPackageName);
|
mBackend.addApp(mPackageName);
|
||||||
} else {
|
} else {
|
||||||
mBackend.removeApp(mPackageName);
|
mBackend.removeApp(mPackageName);
|
||||||
@@ -165,10 +177,11 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli
|
|||||||
: R.string.high_power_off);
|
: 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();
|
HighPowerDetail fragment = new HighPowerDetail();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putString(AppInfoBase.ARG_PACKAGE_NAME, packageName);
|
args.putString(AppInfoBase.ARG_PACKAGE_NAME, packageName);
|
||||||
|
args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid);
|
||||||
fragment.setArguments(args);
|
fragment.setArguments(args);
|
||||||
fragment.setTargetFragment(caller, requestCode);
|
fragment.setTargetFragment(caller, requestCode);
|
||||||
fragment.show(caller.getFragmentManager(), HighPowerDetail.class.getSimpleName());
|
fragment.show(caller.getFragmentManager(), HighPowerDetail.class.getSimpleName());
|
||||||
|
@@ -18,27 +18,49 @@ package com.android.settings.fuelgauge;
|
|||||||
|
|
||||||
import static org.mockito.Matchers.any;
|
import static org.mockito.Matchers.any;
|
||||||
import static org.mockito.Matchers.eq;
|
import static org.mockito.Matchers.eq;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.AppOpsManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto;
|
import com.android.internal.logging.nano.MetricsProto;
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
public class HighPowerDetailTest {
|
public class HighPowerDetailTest {
|
||||||
|
private static final int TEST_UID = 12000;
|
||||||
|
private static final String TEST_PACKAGE = "com.test.package";
|
||||||
|
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
|
private HighPowerDetail mFragment;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private PowerWhitelistBackend mPowerWhitelistBackend;
|
||||||
|
@Mock
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
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
|
@Test
|
||||||
@@ -53,4 +75,13 @@ public class HighPowerDetailTest {
|
|||||||
verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
|
verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
|
||||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_BATTERY_ALLOW), eq("app"));
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user