Merge "Auto resuming app switch for visible apps" into sc-v2-dev

This commit is contained in:
Louis Chang
2021-12-09 03:33:36 +00:00
committed by Android (Google) Code Review
3 changed files with 48 additions and 10 deletions

View File

@@ -72,6 +72,8 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_USER_
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.ANIMATE;
import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_ALLOW;
import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_FG_ONLY;
import static com.android.server.wm.ActivityTaskSupervisor.DEFER_RESUME; import static com.android.server.wm.ActivityTaskSupervisor.DEFER_RESUME;
import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP; import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP;
import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS; import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;
@@ -1275,7 +1277,10 @@ class ActivityStarter {
// This is used to block background activity launch even if the app is still // This is used to block background activity launch even if the app is still
// visible to user after user clicking home button. // visible to user after user clicking home button.
final boolean appSwitchAllowed = mService.getBalAppSwitchesAllowed(); final int appSwitchState = mService.getBalAppSwitchesState();
final boolean appSwitchAllowed = appSwitchState == APP_SWITCH_ALLOW;
final boolean appSwitchAllowedOrFg =
appSwitchState == APP_SWITCH_ALLOW || appSwitchState == APP_SWITCH_FG_ONLY;
// don't abort if the callingUid has a visible window or is a persistent system process // don't abort if the callingUid has a visible window or is a persistent system process
final int callingUidProcState = mService.mActiveUids.getUidState(callingUid); final int callingUidProcState = mService.mActiveUids.getUidState(callingUid);
@@ -1288,7 +1293,7 @@ class ActivityStarter {
// Normal apps with visible app window will be allowed to start activity if app switching // Normal apps with visible app window will be allowed to start activity if app switching
// is allowed, or apps like live wallpaper with non app visible window will be allowed. // is allowed, or apps like live wallpaper with non app visible window will be allowed.
if (((appSwitchAllowed || mService.mActiveUids.hasNonAppVisibleWindow(callingUid)) if (((appSwitchAllowedOrFg || mService.mActiveUids.hasNonAppVisibleWindow(callingUid))
&& callingUidHasAnyVisibleWindow) && callingUidHasAnyVisibleWindow)
|| isCallingUidPersistentSystemProcess) { || isCallingUidPersistentSystemProcess) {
if (DEBUG_ACTIVITY_STARTS) { if (DEBUG_ACTIVITY_STARTS) {
@@ -1426,7 +1431,7 @@ class ActivityStarter {
// anything that has fallen through would currently be aborted // anything that has fallen through would currently be aborted
Slog.w(TAG, "Background activity start [callingPackage: " + callingPackage Slog.w(TAG, "Background activity start [callingPackage: " + callingPackage
+ "; callingUid: " + callingUid + "; callingUid: " + callingUid
+ "; appSwitchAllowed: " + appSwitchAllowed + "; appSwitchState: " + appSwitchState
+ "; isCallingUidForeground: " + isCallingUidForeground + "; isCallingUidForeground: " + isCallingUidForeground
+ "; callingUidHasAnyVisibleWindow: " + callingUidHasAnyVisibleWindow + "; callingUidHasAnyVisibleWindow: " + callingUidHasAnyVisibleWindow
+ "; callingUidProcState: " + DebugUtils.valueToString(ActivityManager.class, + "; callingUidProcState: " + DebugUtils.valueToString(ActivityManager.class,

View File

@@ -504,7 +504,27 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
* Whether normal application switches are allowed; a call to {@link #stopAppSwitches() * Whether normal application switches are allowed; a call to {@link #stopAppSwitches()
* disables this. * disables this.
*/ */
private volatile boolean mAppSwitchesAllowed = true; private volatile int mAppSwitchesState = APP_SWITCH_ALLOW;
// The duration of resuming foreground app switch from disallow.
private static final long RESUME_FG_APP_SWITCH_MS = 500;
/** App switch is not allowed. */
static final int APP_SWITCH_DISALLOW = 0;
/** App switch is allowed only if the activity launch was requested by a foreground app. */
static final int APP_SWITCH_FG_ONLY = 1;
/** App switch is allowed. */
static final int APP_SWITCH_ALLOW = 2;
@IntDef({
APP_SWITCH_DISALLOW,
APP_SWITCH_FG_ONLY,
APP_SWITCH_ALLOW,
})
@Retention(RetentionPolicy.SOURCE)
@interface AppSwitchState {}
/** /**
* Last stop app switches time, apps finished before this time cannot start background activity * Last stop app switches time, apps finished before this time cannot start background activity
@@ -1247,7 +1267,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
if (topFocusedRootTask != null && topFocusedRootTask.getTopResumedActivity() != null if (topFocusedRootTask != null && topFocusedRootTask.getTopResumedActivity() != null
&& topFocusedRootTask.getTopResumedActivity().info.applicationInfo.uid && topFocusedRootTask.getTopResumedActivity().info.applicationInfo.uid
== Binder.getCallingUid()) { == Binder.getCallingUid()) {
mAppSwitchesAllowed = true; mAppSwitchesState = APP_SWITCH_ALLOW;
} }
} }
return pir.sendInner(0, fillInIntent, resolvedType, allowlistToken, null, null, return pir.sendInner(0, fillInIntent, resolvedType, allowlistToken, null, null,
@@ -2158,8 +2178,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
/** /**
* Return true if app switching is allowed. * Return true if app switching is allowed.
*/ */
boolean getBalAppSwitchesAllowed() { @AppSwitchState int getBalAppSwitchesState() {
return mAppSwitchesAllowed; return mAppSwitchesState;
} }
/** Register an {@link AnrController} to control the ANR dialog behavior */ /** Register an {@link AnrController} to control the ANR dialog behavior */
@@ -3680,8 +3700,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
public void stopAppSwitches() { public void stopAppSwitches() {
mAmInternal.enforceCallingPermission(STOP_APP_SWITCHES, "stopAppSwitches"); mAmInternal.enforceCallingPermission(STOP_APP_SWITCHES, "stopAppSwitches");
synchronized (mGlobalLock) { synchronized (mGlobalLock) {
mAppSwitchesAllowed = false; mAppSwitchesState = APP_SWITCH_DISALLOW;
mLastStopAppSwitchesTime = SystemClock.uptimeMillis(); mLastStopAppSwitchesTime = SystemClock.uptimeMillis();
mH.removeMessages(H.RESUME_FG_APP_SWITCH_MSG);
mH.sendEmptyMessageDelayed(H.RESUME_FG_APP_SWITCH_MSG, RESUME_FG_APP_SWITCH_MS);
} }
} }
@@ -3689,7 +3711,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
public void resumeAppSwitches() { public void resumeAppSwitches() {
mAmInternal.enforceCallingPermission(STOP_APP_SWITCHES, "resumeAppSwitches"); mAmInternal.enforceCallingPermission(STOP_APP_SWITCHES, "resumeAppSwitches");
synchronized (mGlobalLock) { synchronized (mGlobalLock) {
mAppSwitchesAllowed = true; mAppSwitchesState = APP_SWITCH_ALLOW;
mH.removeMessages(H.RESUME_FG_APP_SWITCH_MSG);
} }
} }
@@ -5170,6 +5193,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
static final int REPORT_TIME_TRACKER_MSG = 1; static final int REPORT_TIME_TRACKER_MSG = 1;
static final int UPDATE_PROCESS_ANIMATING_STATE = 2; static final int UPDATE_PROCESS_ANIMATING_STATE = 2;
static final int END_POWER_MODE_UNKNOWN_VISIBILITY_MSG = 3; static final int END_POWER_MODE_UNKNOWN_VISIBILITY_MSG = 3;
static final int RESUME_FG_APP_SWITCH_MSG = 4;
static final int FIRST_ACTIVITY_TASK_MSG = 100; static final int FIRST_ACTIVITY_TASK_MSG = 100;
static final int FIRST_SUPERVISOR_TASK_MSG = 200; static final int FIRST_SUPERVISOR_TASK_MSG = 200;
@@ -5207,6 +5231,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
} }
} }
break; break;
case RESUME_FG_APP_SWITCH_MSG: {
synchronized (mGlobalLock) {
if (mAppSwitchesState == APP_SWITCH_DISALLOW) {
mAppSwitchesState = APP_SWITCH_FG_ONLY;
}
}
}
break;
} }
} }
} }

View File

@@ -37,6 +37,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFI
import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_RELEASE; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_RELEASE;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_ALLOW;
import static com.android.server.wm.ActivityTaskManagerService.INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MILLIS; import static com.android.server.wm.ActivityTaskManagerService.INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MILLIS;
import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE;
@@ -512,7 +513,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
*/ */
@HotPath(caller = HotPath.START_SERVICE) @HotPath(caller = HotPath.START_SERVICE)
public boolean areBackgroundFgsStartsAllowed() { public boolean areBackgroundFgsStartsAllowed() {
return areBackgroundActivityStartsAllowed(mAtm.getBalAppSwitchesAllowed(), return areBackgroundActivityStartsAllowed(mAtm.getBalAppSwitchesState() == APP_SWITCH_ALLOW,
true /* isCheckingForFgsStart */); true /* isCheckingForFgsStart */);
} }