From f1213365fc2070974c4d23aa1fd817847a1e19cc Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Fri, 13 Jul 2018 14:50:04 -0700 Subject: [PATCH] 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 --- .../defaultapps/DefaultAppPickerFragment.java | 3 ++ .../defaultapps/DefaultPhonePicker.java | 1 + .../defaultapps/DefaultSmsPicker.java | 3 ++ .../deviceadmin/DeviceAdminAdd.java | 5 +-- .../settings/fuelgauge/BatteryUtils.java | 10 ++++++ .../defaultapps/DefaultPhonePickerTest.java | 12 +++++++ .../defaultapps/DefaultSmsPickerTest.java | 11 +++++++ .../deviceadmin/DeviceAdminAddTest.java | 8 ++++- .../settings/fuelgauge/BatteryUtilsTest.java | 31 +++++++++++++++++++ 9 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java index d0493e9706c..3838d299575 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java @@ -28,6 +28,7 @@ import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settings.widget.RadioButtonPreference; import com.android.settingslib.applications.DefaultAppInfo; @@ -43,11 +44,13 @@ import androidx.fragment.app.FragmentActivity; public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment { protected PackageManager mPm; + protected BatteryUtils mBatteryUtils; @Override public void onAttach(Context context) { super.onAttach(context); mPm = context.getPackageManager(); + mBatteryUtils = BatteryUtils.getInstance(context); } @Override diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java index e462ab88a7e..0bda2ec5610 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java +++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java @@ -80,6 +80,7 @@ public class DefaultPhonePicker extends DefaultAppPickerFragment { @Override protected boolean setDefaultKey(String key) { if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) { + mBatteryUtils.clearForceAppStandby(key); return mDefaultKeyUpdater.setDefaultDialerApplication(getContext(), key, mUserId); } return false; diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java index 91f9cafe95e..b5a2880461e 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java +++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java @@ -16,6 +16,7 @@ package com.android.settings.applications.defaultapps; +import android.app.AppOpsManager; import android.content.ComponentName; import android.content.Context; 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.settings.R; import com.android.settings.Utils; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.widget.CandidateInfo; @@ -74,6 +76,7 @@ public class DefaultSmsPicker extends DefaultAppPickerFragment { protected boolean setDefaultKey(String key) { if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) { mDefaultKeyUpdater.setDefaultApplication(getContext(), key); + mBatteryUtils.clearForceAppStandby(key); return true; } return false; diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index 6e0f915af9e..04757348e88 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -455,10 +455,7 @@ public class DeviceAdminAdd extends Activity { void unrestrictAppIfPossible(BatteryUtils batteryUtils) { // Unrestrict admin app if it is already been restricted final String packageName = mDeviceAdmin.getComponent().getPackageName(); - final int uid = batteryUtils.getPackageUid(packageName); - if (batteryUtils.isForceAppStandbyEnabled(uid, packageName)) { - batteryUtils.setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED); - } + batteryUtils.clearForceAppStandby(packageName); } void continueRemoveAction(CharSequence msg) { diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index f92f8adbc35..9e920c47978 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -407,6 +407,16 @@ public class BatteryUtils { 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, UserManager userManager) { statsHelper.create(bundle); diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java index f304b49cb32..57d31cf84f9 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java @@ -29,6 +29,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.os.UserManager; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -53,6 +54,8 @@ public class DefaultPhonePickerTest { private DefaultPhonePicker.DefaultKeyUpdater mDefaultKeyUpdater; @Mock private PackageManager mPackageManager; + @Mock + private BatteryUtils mBatteryUtils; private DefaultPhonePicker mPicker; @@ -66,6 +69,7 @@ public class DefaultPhonePickerTest { ReflectionHelpers.setField(mPicker, "mPm", mPackageManager); ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater); + ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils); doReturn(RuntimeEnvironment.application).when(mPicker).getContext(); } @@ -87,6 +91,14 @@ public class DefaultPhonePickerTest { @Test public void getDefaultAppKey_shouldReturnDefault() { mPicker.getDefaultKey(); + verify(mDefaultKeyUpdater).getDefaultDialerApplication(any(Context.class), anyInt()); } + + @Test + public void setDefaultKey_shouldUnrestrictApp() { + mPicker.setDefaultKey(TEST_APP_KEY); + + verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY); + } } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java index 18bb60e64ad..ade62a13cb1 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java @@ -28,6 +28,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.os.UserManager; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -52,6 +53,8 @@ public class DefaultSmsPickerTest { private DefaultSmsPicker.DefaultKeyUpdater mDefaultKeyUpdater; @Mock private PackageManager mPackageManager; + @Mock + private BatteryUtils mBatteryUtils; private DefaultSmsPicker mPicker; @@ -64,6 +67,7 @@ public class DefaultSmsPickerTest { ReflectionHelpers.setField(mPicker, "mPm", mPackageManager); ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater); + ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils); doReturn(RuntimeEnvironment.application).when(mPicker).getContext(); } @@ -80,4 +84,11 @@ public class DefaultSmsPickerTest { verify(mDefaultKeyUpdater).getDefaultApplication(any(Context.class)); } + + @Test + public void setDefaultKey_shouldUnrestrictApp() { + mPicker.setDefaultKey(TEST_APP_KEY); + + verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY); + } } diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java index e85f3f6a1bd..6bc143ca25b 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java @@ -17,9 +17,13 @@ package com.android.settings.applications.specialaccess.deviceadmin; 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.doNothing; 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; @@ -39,6 +43,7 @@ import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; +import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class DeviceAdminAddTest { @@ -47,7 +52,6 @@ public class DeviceAdminAddTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private DeviceAdminInfo mDeviceAdmin; - @Mock private BatteryUtils mBatteryUtils; private FakeFeatureFactory mFeatureFactory; private DeviceAdminAdd mDeviceAdminAdd; @@ -56,6 +60,8 @@ public class DeviceAdminAddTest { public void setUp() { MockitoAnnotations.initMocks(this); + mBatteryUtils = spy(BatteryUtils.getInstance(RuntimeEnvironment.application)); + doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt()); mFeatureFactory = FakeFeatureFactory.setupForTest(); mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java index 238a88ba1d4..df34b785e6c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java @@ -653,4 +653,35 @@ public class BatteryUtilsTest { assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID, 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); + } }