Hook up hibernation eligibility to exemption toggle

Use hibernation eligibility API to determine whether toggle should be
enabled or disabled for an app. For apps that are already exempt from
hibernation by the system, the toggle is disabled and unchecked.

Bug: 200087723
Test: manual
Test: atest AppHibernationIntegrationTest
Change-Id: I36a1eafc2bb90a92bcbdc4bf32041426d6377fd4
This commit is contained in:
Kevin Han
2022-01-07 18:42:08 -08:00
parent 5ff3e8dc8a
commit 143cc954f3
2 changed files with 47 additions and 17 deletions

View File

@@ -20,6 +20,8 @@ import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.AppOpsManager.OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED;
import static android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM;
import static android.permission.PermissionControllerManager.HIBERNATION_ELIGIBILITY_UNKNOWN;
import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION;
import static com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED;
@@ -29,6 +31,7 @@ import android.app.AppOpsManager;
import android.apphibernation.AppHibernationManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.permission.PermissionControllerManager;
import android.provider.DeviceConfig;
import android.text.TextUtils;
import android.util.Slog;
@@ -51,7 +54,10 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen
private static final String TAG = "HibernationSwitchPrefController";
private String mPackageName;
private final AppOpsManager mAppOpsManager;
private final PermissionControllerManager mPermissionControllerManager;
private int mPackageUid;
private boolean mHibernationEligibilityLoaded;
private int mHibernationEligibility = HIBERNATION_ELIGIBILITY_UNKNOWN;
@VisibleForTesting
boolean mIsPackageSet;
private boolean mIsPackageExemptByDefault;
@@ -60,6 +66,7 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen
String preferenceKey) {
super(context, preferenceKey);
mAppOpsManager = context.getSystemService(AppOpsManager.class);
mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class);
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@@ -109,10 +116,27 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen
}
}
private boolean isAppEligibleForHibernation() {
return mHibernationEligibilityLoaded
&& mHibernationEligibility != HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM
&& mHibernationEligibility != HIBERNATION_ELIGIBILITY_UNKNOWN;
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
((SwitchPreference) preference).setChecked(!isPackageHibernationExemptByUser());
((SwitchPreference) preference).setChecked(isAppEligibleForHibernation()
&& !isPackageHibernationExemptByUser());
preference.setEnabled(isAppEligibleForHibernation());
if (!mHibernationEligibilityLoaded) {
mPermissionControllerManager.getHibernationEligibility(mPackageName,
mContext.getMainExecutor(),
eligibility -> {
mHibernationEligibility = eligibility;
mHibernationEligibilityLoaded = true;
updateState(preference);
});
}
}
@VisibleForTesting