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