Loading services/core/java/com/android/server/apphibernation/AppHibernationService.java +45 −1 Original line number Diff line number Diff line Loading @@ -23,9 +23,12 @@ import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION; import static com.android.server.apphibernation.AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityThread; import android.app.IActivityManager; import android.apphibernation.IAppHibernationService; import android.content.BroadcastReceiver; Loading @@ -45,6 +48,8 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; Loading Loading @@ -93,6 +98,9 @@ public final class AppHibernationService extends SystemService { private final HibernationStateDiskStore<GlobalLevelState> mGlobalLevelHibernationDiskStore; private final Injector mInjector; @VisibleForTesting boolean mIsServiceEnabled; /** * Initializes the system service. * <p> Loading Loading @@ -139,6 +147,13 @@ public final class AppHibernationService extends SystemService { initializeGlobalHibernationStates(states); } } if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { mIsServiceEnabled = isAppHibernationEnabled(); DeviceConfig.addOnPropertiesChangedListener( NAMESPACE_APP_HIBERNATION, ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChanged); } } /** Loading @@ -149,6 +164,10 @@ public final class AppHibernationService extends SystemService { * @return true if package is hibernating for the user */ boolean isHibernatingForUser(String packageName, int userId) { if (!checkHibernationEnabled("isHibernatingForUser")) { return false; } userId = handleIncomingUser(userId, "isHibernating"); if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { Slog.e(TAG, "Attempt to get hibernation state of stopped or nonexistent user " Loading @@ -174,6 +193,9 @@ public final class AppHibernationService extends SystemService { * @param packageName package to check */ boolean isHibernatingGlobally(String packageName) { if (!checkHibernationEnabled("isHibernatingGlobally")) { return false; } synchronized (mLock) { GlobalLevelState state = mGlobalHibernationStates.get(packageName); if (state == null) { Loading @@ -192,6 +214,9 @@ public final class AppHibernationService extends SystemService { * @param isHibernating new hibernation state */ void setHibernatingForUser(String packageName, int userId, boolean isHibernating) { if (!checkHibernationEnabled("setHibernatingForUser")) { return; } userId = handleIncomingUser(userId, "setHibernating"); if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { Slog.w(TAG, "Attempt to set hibernation state for a stopped or nonexistent user " Loading Loading @@ -229,6 +254,9 @@ public final class AppHibernationService extends SystemService { * @param isHibernating new hibernation state */ void setHibernatingGlobally(String packageName, boolean isHibernating) { if (!checkHibernationEnabled("setHibernatingGlobally")) { return; } synchronized (mLock) { GlobalLevelState state = mGlobalHibernationStates.get(packageName); if (state == null) { Loading Loading @@ -444,6 +472,15 @@ public final class AppHibernationService extends SystemService { } } private void onDeviceConfigChanged(Properties properties) { for (String key : properties.getKeyset()) { if (TextUtils.equals(KEY_APP_HIBERNATION_ENABLED, key)) { mIsServiceEnabled = isAppHibernationEnabled(); break; } } } /** * Private helper method to get the real user id and enforce permission checks. * Loading @@ -461,6 +498,13 @@ public final class AppHibernationService extends SystemService { } } private boolean checkHibernationEnabled(String methodName) { if (!mIsServiceEnabled) { Slog.w(TAG, String.format("Attempted to call %s on unsupported device.", methodName)); } return mIsServiceEnabled; } private final AppHibernationServiceStub mServiceStub = new AppHibernationServiceStub(this); static final class AppHibernationServiceStub extends IAppHibernationService.Stub { Loading Loading @@ -536,7 +580,7 @@ public final class AppHibernationService extends SystemService { public static boolean isAppHibernationEnabled() { return DeviceConfig.getBoolean( NAMESPACE_APP_HIBERNATION, AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED, KEY_APP_HIBERNATION_ENABLED, false /* defaultValue */); } Loading services/java/com/android/server/SystemServer.java +3 −6 Original line number Diff line number Diff line Loading @@ -97,7 +97,6 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.ILockSettings; import com.android.server.am.ActivityManagerService; import com.android.server.appbinding.AppBindingService; import com.android.server.apphibernation.AppHibernationService; import com.android.server.attention.AttentionManagerService; import com.android.server.audio.AudioService; import com.android.server.biometrics.AuthService; Loading Loading @@ -1883,11 +1882,9 @@ public final class SystemServer { mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS); t.traceEnd(); if (AppHibernationService.isAppHibernationEnabled()) { t.traceBegin("StartAppHibernationService"); mSystemServiceManager.startService(APP_HIBERNATION_SERVICE_CLASS); t.traceEnd(); } if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) { t.traceBegin("StartGestureLauncher"); Loading services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,8 @@ public final class AppHibernationServiceTest { UserInfo userInfo = addUser(USER_ID_1); mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(userInfo)); doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_1); mAppHibernationService.mIsServiceEnabled = true; } @Test Loading Loading
services/core/java/com/android/server/apphibernation/AppHibernationService.java +45 −1 Original line number Diff line number Diff line Loading @@ -23,9 +23,12 @@ import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION; import static com.android.server.apphibernation.AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityThread; import android.app.IActivityManager; import android.apphibernation.IAppHibernationService; import android.content.BroadcastReceiver; Loading @@ -45,6 +48,8 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; Loading Loading @@ -93,6 +98,9 @@ public final class AppHibernationService extends SystemService { private final HibernationStateDiskStore<GlobalLevelState> mGlobalLevelHibernationDiskStore; private final Injector mInjector; @VisibleForTesting boolean mIsServiceEnabled; /** * Initializes the system service. * <p> Loading Loading @@ -139,6 +147,13 @@ public final class AppHibernationService extends SystemService { initializeGlobalHibernationStates(states); } } if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { mIsServiceEnabled = isAppHibernationEnabled(); DeviceConfig.addOnPropertiesChangedListener( NAMESPACE_APP_HIBERNATION, ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChanged); } } /** Loading @@ -149,6 +164,10 @@ public final class AppHibernationService extends SystemService { * @return true if package is hibernating for the user */ boolean isHibernatingForUser(String packageName, int userId) { if (!checkHibernationEnabled("isHibernatingForUser")) { return false; } userId = handleIncomingUser(userId, "isHibernating"); if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { Slog.e(TAG, "Attempt to get hibernation state of stopped or nonexistent user " Loading @@ -174,6 +193,9 @@ public final class AppHibernationService extends SystemService { * @param packageName package to check */ boolean isHibernatingGlobally(String packageName) { if (!checkHibernationEnabled("isHibernatingGlobally")) { return false; } synchronized (mLock) { GlobalLevelState state = mGlobalHibernationStates.get(packageName); if (state == null) { Loading @@ -192,6 +214,9 @@ public final class AppHibernationService extends SystemService { * @param isHibernating new hibernation state */ void setHibernatingForUser(String packageName, int userId, boolean isHibernating) { if (!checkHibernationEnabled("setHibernatingForUser")) { return; } userId = handleIncomingUser(userId, "setHibernating"); if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { Slog.w(TAG, "Attempt to set hibernation state for a stopped or nonexistent user " Loading Loading @@ -229,6 +254,9 @@ public final class AppHibernationService extends SystemService { * @param isHibernating new hibernation state */ void setHibernatingGlobally(String packageName, boolean isHibernating) { if (!checkHibernationEnabled("setHibernatingGlobally")) { return; } synchronized (mLock) { GlobalLevelState state = mGlobalHibernationStates.get(packageName); if (state == null) { Loading Loading @@ -444,6 +472,15 @@ public final class AppHibernationService extends SystemService { } } private void onDeviceConfigChanged(Properties properties) { for (String key : properties.getKeyset()) { if (TextUtils.equals(KEY_APP_HIBERNATION_ENABLED, key)) { mIsServiceEnabled = isAppHibernationEnabled(); break; } } } /** * Private helper method to get the real user id and enforce permission checks. * Loading @@ -461,6 +498,13 @@ public final class AppHibernationService extends SystemService { } } private boolean checkHibernationEnabled(String methodName) { if (!mIsServiceEnabled) { Slog.w(TAG, String.format("Attempted to call %s on unsupported device.", methodName)); } return mIsServiceEnabled; } private final AppHibernationServiceStub mServiceStub = new AppHibernationServiceStub(this); static final class AppHibernationServiceStub extends IAppHibernationService.Stub { Loading Loading @@ -536,7 +580,7 @@ public final class AppHibernationService extends SystemService { public static boolean isAppHibernationEnabled() { return DeviceConfig.getBoolean( NAMESPACE_APP_HIBERNATION, AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED, KEY_APP_HIBERNATION_ENABLED, false /* defaultValue */); } Loading
services/java/com/android/server/SystemServer.java +3 −6 Original line number Diff line number Diff line Loading @@ -97,7 +97,6 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.ILockSettings; import com.android.server.am.ActivityManagerService; import com.android.server.appbinding.AppBindingService; import com.android.server.apphibernation.AppHibernationService; import com.android.server.attention.AttentionManagerService; import com.android.server.audio.AudioService; import com.android.server.biometrics.AuthService; Loading Loading @@ -1883,11 +1882,9 @@ public final class SystemServer { mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS); t.traceEnd(); if (AppHibernationService.isAppHibernationEnabled()) { t.traceBegin("StartAppHibernationService"); mSystemServiceManager.startService(APP_HIBERNATION_SERVICE_CLASS); t.traceEnd(); } if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) { t.traceBegin("StartGestureLauncher"); Loading
services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,8 @@ public final class AppHibernationServiceTest { UserInfo userInfo = addUser(USER_ID_1); mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(userInfo)); doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_1); mAppHibernationService.mIsServiceEnabled = true; } @Test Loading