Unrestrict SMS/PHONE app if it been set active
If an app been set default SMS/PHONE app, we need to unrestrict this app. This CL extract a common function and invoke it when necessary. Change-Id: Id29c5138438aa6f6f22cdd9c4ecf336de8481782 Fixes: 80305978 Test: robotests
This commit is contained in:
@@ -28,6 +28,7 @@ import android.util.Pair;
|
|||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||||
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settings.widget.RadioButtonPickerFragment;
|
import com.android.settings.widget.RadioButtonPickerFragment;
|
||||||
import com.android.settings.widget.RadioButtonPreference;
|
import com.android.settings.widget.RadioButtonPreference;
|
||||||
import com.android.settingslib.applications.DefaultAppInfo;
|
import com.android.settingslib.applications.DefaultAppInfo;
|
||||||
@@ -43,11 +44,13 @@ import androidx.fragment.app.FragmentActivity;
|
|||||||
public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment {
|
public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment {
|
||||||
|
|
||||||
protected PackageManager mPm;
|
protected PackageManager mPm;
|
||||||
|
protected BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Context context) {
|
public void onAttach(Context context) {
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
mPm = context.getPackageManager();
|
mPm = context.getPackageManager();
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -80,6 +80,7 @@ public class DefaultPhonePicker extends DefaultAppPickerFragment {
|
|||||||
@Override
|
@Override
|
||||||
protected boolean setDefaultKey(String key) {
|
protected boolean setDefaultKey(String key) {
|
||||||
if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
|
if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
|
||||||
|
mBatteryUtils.clearForceAppStandby(key);
|
||||||
return mDefaultKeyUpdater.setDefaultDialerApplication(getContext(), key, mUserId);
|
return mDefaultKeyUpdater.setDefaultDialerApplication(getContext(), key, mUserId);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.applications.defaultapps;
|
package com.android.settings.applications.defaultapps;
|
||||||
|
|
||||||
|
import android.app.AppOpsManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@@ -25,6 +26,7 @@ import com.android.internal.logging.nano.MetricsProto;
|
|||||||
import com.android.internal.telephony.SmsApplication;
|
import com.android.internal.telephony.SmsApplication;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settingslib.applications.DefaultAppInfo;
|
import com.android.settingslib.applications.DefaultAppInfo;
|
||||||
import com.android.settingslib.widget.CandidateInfo;
|
import com.android.settingslib.widget.CandidateInfo;
|
||||||
|
|
||||||
@@ -74,6 +76,7 @@ public class DefaultSmsPicker extends DefaultAppPickerFragment {
|
|||||||
protected boolean setDefaultKey(String key) {
|
protected boolean setDefaultKey(String key) {
|
||||||
if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
|
if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
|
||||||
mDefaultKeyUpdater.setDefaultApplication(getContext(), key);
|
mDefaultKeyUpdater.setDefaultApplication(getContext(), key);
|
||||||
|
mBatteryUtils.clearForceAppStandby(key);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@@ -455,10 +455,7 @@ public class DeviceAdminAdd extends Activity {
|
|||||||
void unrestrictAppIfPossible(BatteryUtils batteryUtils) {
|
void unrestrictAppIfPossible(BatteryUtils batteryUtils) {
|
||||||
// Unrestrict admin app if it is already been restricted
|
// Unrestrict admin app if it is already been restricted
|
||||||
final String packageName = mDeviceAdmin.getComponent().getPackageName();
|
final String packageName = mDeviceAdmin.getComponent().getPackageName();
|
||||||
final int uid = batteryUtils.getPackageUid(packageName);
|
batteryUtils.clearForceAppStandby(packageName);
|
||||||
if (batteryUtils.isForceAppStandbyEnabled(uid, packageName)) {
|
|
||||||
batteryUtils.setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void continueRemoveAction(CharSequence msg) {
|
void continueRemoveAction(CharSequence msg) {
|
||||||
|
@@ -407,6 +407,16 @@ public class BatteryUtils {
|
|||||||
packageName) == AppOpsManager.MODE_IGNORED;
|
packageName) == AppOpsManager.MODE_IGNORED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean clearForceAppStandby(String packageName) {
|
||||||
|
final int uid = getPackageUid(packageName);
|
||||||
|
if (uid != UID_NULL && isForceAppStandbyEnabled(uid, packageName)) {
|
||||||
|
setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
|
public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
|
||||||
UserManager userManager) {
|
UserManager userManager) {
|
||||||
statsHelper.create(bundle);
|
statsHelper.create(bundle);
|
||||||
|
@@ -29,6 +29,7 @@ import android.content.Context;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
|
||||||
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -53,6 +54,8 @@ public class DefaultPhonePickerTest {
|
|||||||
private DefaultPhonePicker.DefaultKeyUpdater mDefaultKeyUpdater;
|
private DefaultPhonePicker.DefaultKeyUpdater mDefaultKeyUpdater;
|
||||||
@Mock
|
@Mock
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
|
@Mock
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
private DefaultPhonePicker mPicker;
|
private DefaultPhonePicker mPicker;
|
||||||
|
|
||||||
@@ -66,6 +69,7 @@ public class DefaultPhonePickerTest {
|
|||||||
|
|
||||||
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
|
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
|
||||||
ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
|
ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
|
||||||
|
ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils);
|
||||||
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
|
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +91,14 @@ public class DefaultPhonePickerTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getDefaultAppKey_shouldReturnDefault() {
|
public void getDefaultAppKey_shouldReturnDefault() {
|
||||||
mPicker.getDefaultKey();
|
mPicker.getDefaultKey();
|
||||||
|
|
||||||
verify(mDefaultKeyUpdater).getDefaultDialerApplication(any(Context.class), anyInt());
|
verify(mDefaultKeyUpdater).getDefaultDialerApplication(any(Context.class), anyInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setDefaultKey_shouldUnrestrictApp() {
|
||||||
|
mPicker.setDefaultKey(TEST_APP_KEY);
|
||||||
|
|
||||||
|
verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,7 @@ import android.content.Context;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
|
|
||||||
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -52,6 +53,8 @@ public class DefaultSmsPickerTest {
|
|||||||
private DefaultSmsPicker.DefaultKeyUpdater mDefaultKeyUpdater;
|
private DefaultSmsPicker.DefaultKeyUpdater mDefaultKeyUpdater;
|
||||||
@Mock
|
@Mock
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
|
@Mock
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
private DefaultSmsPicker mPicker;
|
private DefaultSmsPicker mPicker;
|
||||||
|
|
||||||
@@ -64,6 +67,7 @@ public class DefaultSmsPickerTest {
|
|||||||
|
|
||||||
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
|
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
|
||||||
ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
|
ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
|
||||||
|
ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils);
|
||||||
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
|
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,4 +84,11 @@ public class DefaultSmsPickerTest {
|
|||||||
|
|
||||||
verify(mDefaultKeyUpdater).getDefaultApplication(any(Context.class));
|
verify(mDefaultKeyUpdater).getDefaultApplication(any(Context.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setDefaultKey_shouldUnrestrictApp() {
|
||||||
|
mPicker.setDefaultKey(TEST_APP_KEY);
|
||||||
|
|
||||||
|
verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,9 +17,13 @@
|
|||||||
package com.android.settings.applications.specialaccess.deviceadmin;
|
package com.android.settings.applications.specialaccess.deviceadmin;
|
||||||
|
|
||||||
import static org.mockito.Matchers.any;
|
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.Matchers.eq;
|
||||||
|
import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
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 static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@@ -39,6 +43,7 @@ import org.mockito.Answers;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.Robolectric;
|
import org.robolectric.Robolectric;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
public class DeviceAdminAddTest {
|
public class DeviceAdminAddTest {
|
||||||
@@ -47,7 +52,6 @@ public class DeviceAdminAddTest {
|
|||||||
|
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private DeviceAdminInfo mDeviceAdmin;
|
private DeviceAdminInfo mDeviceAdmin;
|
||||||
@Mock
|
|
||||||
private BatteryUtils mBatteryUtils;
|
private BatteryUtils mBatteryUtils;
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private DeviceAdminAdd mDeviceAdminAdd;
|
private DeviceAdminAdd mDeviceAdminAdd;
|
||||||
@@ -56,6 +60,8 @@ public class DeviceAdminAddTest {
|
|||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
|
mBatteryUtils = spy(BatteryUtils.getInstance(RuntimeEnvironment.application));
|
||||||
|
doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt());
|
||||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get();
|
mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get();
|
||||||
|
|
||||||
|
@@ -653,4 +653,35 @@ public class BatteryUtilsTest {
|
|||||||
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
mAnomalyInfo)).isTrue();
|
mAnomalyInfo)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearForceAppStandby_appRestricted_clearAndReturnTrue() {
|
||||||
|
when(mBatteryUtils.getPackageUid(HIGH_SDK_PACKAGE)).thenReturn(UID);
|
||||||
|
when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
|
||||||
|
HIGH_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
|
||||||
|
|
||||||
|
assertThat(mBatteryUtils.clearForceAppStandby(HIGH_SDK_PACKAGE)).isTrue();
|
||||||
|
verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
|
||||||
|
HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearForceAppStandby_appInvalid_returnFalse() {
|
||||||
|
when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(BatteryUtils.UID_NULL);
|
||||||
|
|
||||||
|
assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
|
||||||
|
verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
|
||||||
|
PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearForceAppStandby_appUnrestricted_returnFalse() {
|
||||||
|
when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(UID);
|
||||||
|
when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
|
||||||
|
PACKAGE_NAME)).thenReturn(AppOpsManager.MODE_ALLOWED);
|
||||||
|
|
||||||
|
assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
|
||||||
|
verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
|
||||||
|
PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user