From 4b34271f7daff252880b4f3a74cff1d9b0a70de9 Mon Sep 17 00:00:00 2001 From: Kevin Han Date: Tue, 25 May 2021 17:45:23 -0700 Subject: [PATCH] Ensure hibernation exemption toggle uses pre-S flag For dogfood, we want hibernation to target apps that target pre-S. This was done on the PermissionController side but the toggle in Settings did not visually reflect this policy, confusing dogfood/teamfood participants. This updates the default toggle position to consider whether the pre-S flag is on and then default to the "on" position for apps targeting pre-S if the flag was on for the device. Bug: 189260947 Test: atest HibernationSwitchPreferenceControllerTest Test: manual Change-Id: I9cd16e82e1eee4589cb17a356b6bf2e3297a8dd2 --- src/com/android/settings/Utils.java | 4 ++++ .../HibernationSwitchPreferenceController.java | 13 +++++++++++-- ...HibernationSwitchPreferenceControllerTest.java | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 7614070981f..6e926404674 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -161,6 +161,10 @@ public final class Utils extends com.android.settingslib.Utils { /** Whether or not app hibernation is enabled on the device **/ public static final String PROPERTY_APP_HIBERNATION_ENABLED = "app_hibernation_enabled"; + /** Whether or not app hibernation targets apps that target a pre-S SDK **/ + public static final String PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS = + "app_hibernation_targets_pre_s_apps"; + /** Whether or not Settings Shared Axis transition is enabled */ public static final String SETTINGS_SHARED_AXIS_ENABLED = "settings_shared_axis_enabled"; diff --git a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java index 40be629d724..42f862dac17 100644 --- a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java @@ -23,6 +23,7 @@ import static android.app.AppOpsManager.OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED; import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION; import static com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED; +import static com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS; import android.app.AppOpsManager; import android.content.Context; @@ -95,8 +96,11 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen : android.os.Build.VERSION_CODES.Q; try { mPackageUid = packageManager.getPackageUid(packageName, /* flags */ 0); - mIsPackageExemptByDefault = packageManager.getTargetSdkVersion(packageName) - <= maxTargetSdkVersionForExemptApps; + mIsPackageExemptByDefault = + hibernationTargetsPreSApps() + ? false + : packageManager.getTargetSdkVersion(packageName) + <= maxTargetSdkVersionForExemptApps; mIsPackageSet = true; } catch (PackageManager.NameNotFoundException e) { Slog.w(TAG, "Package [" + mPackageName + "] is not found!"); @@ -142,4 +146,9 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen return DeviceConfig.getBoolean( NAMESPACE_APP_HIBERNATION, PROPERTY_APP_HIBERNATION_ENABLED, false); } + + private static boolean hibernationTargetsPreSApps() { + return DeviceConfig.getBoolean( + NAMESPACE_APP_HIBERNATION, PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS, false); + } } diff --git a/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java index 65ffe4b7657..1e1799a282b 100644 --- a/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java @@ -22,6 +22,7 @@ import static android.app.AppOpsManager.OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED; import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION; import static com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED; +import static com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.google.common.truth.Truth.assertThat; @@ -143,4 +144,18 @@ public class HibernationSwitchPreferenceControllerTest { verify(mPreference).setChecked(false); } + + @Test + public void updateState_exemptedByDefaultPackageOverriddenByPreSFlag_shouldCheck() { + DeviceConfig.setProperty(NAMESPACE_APP_HIBERNATION, PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS, + "true", true /* makeDefault */); + when(mAppOpsManager.unsafeCheckOpNoThrow( + eq(OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED), anyInt(), eq(EXEMPTED_PACKAGE_NAME))) + .thenReturn(MODE_DEFAULT); + mController.setPackage(EXEMPTED_PACKAGE_NAME); + + mController.updateState(mPreference); + + verify(mPreference).setChecked(true); + } }