Untangle creation of Task from addition of AppToken in WM.
Makes it easier to follow what is going on and also clean-up in
preparation of stand way for AM to interact with containers in WM.
Test: Existing tests pass and manual testing
Change-Id: I91754b6d974dce2f696453cdaed175efb0f10c73
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 00c37d2..6147885 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -17,6 +17,8 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId;
+import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
+import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
@@ -45,6 +47,7 @@
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.logWithStack;
+import android.content.pm.ActivityInfo;
import android.os.Debug;
import com.android.internal.util.ToBooleanFunction;
import com.android.server.input.InputApplicationHandle;
@@ -81,18 +84,18 @@
@NonNull final AppWindowAnimator mAppAnimator;
- final boolean voiceInteraction;
+ final boolean mVoiceInteraction;
// TODO: Use getParent instead?
Task mTask;
/** @see WindowContainer#fillsParent() */
private boolean mFillsParent;
boolean layoutConfigChanges;
- boolean showForAllUsers;
- int targetSdk;
+ boolean mShowForAllUsers;
+ int mTargetSdk;
// The input dispatching timeout for this application token in nanoseconds.
- long inputDispatchingTimeoutNanos;
+ long mInputDispatchingTimeoutNanos;
// These are used for determining when all windows associated with
// an activity have been drawn, so they can be made visible together
@@ -152,7 +155,7 @@
boolean mLaunchTaskBehind;
boolean mEnteringAnimation;
- boolean mAlwaysFocusable;
+ private boolean mAlwaysFocusable;
boolean mAppStopped;
int mRotationAnimationHint;
@@ -167,12 +170,31 @@
ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();
- AppWindowToken(WindowManagerService service, IApplicationToken token, boolean _voiceInteraction,
- DisplayContent displayContent) {
- super(service, token != null ? token.asBinder() : null, TYPE_APPLICATION, true,
- displayContent);
+ AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction,
+ DisplayContent dc, long inputDispatchingTimeoutNanos, boolean fullscreen,
+ boolean showForAllUsers, int targetSdk, int orientation, int rotationAnimationHint,
+ int configChanges, boolean launchTaskBehind, boolean alwaysFocusable) {
+ this(service, token, voiceInteraction, dc);
+ mInputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
+ mFillsParent = fullscreen;
+ mShowForAllUsers = showForAllUsers;
+ mTargetSdk = targetSdk;
+ mOrientation = orientation;
+ layoutConfigChanges = (configChanges & (CONFIG_SCREEN_SIZE | CONFIG_ORIENTATION)) != 0;
+ mLaunchTaskBehind = launchTaskBehind;
+ mAlwaysFocusable = alwaysFocusable;
+ mRotationAnimationHint = rotationAnimationHint;
+
+ // Application tokens start out hidden.
+ hidden = true;
+ hiddenRequested = true;
+ }
+
+ AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction,
+ DisplayContent dc) {
+ super(service, token != null ? token.asBinder() : null, TYPE_APPLICATION, true, dc);
appToken = token;
- voiceInteraction = _voiceInteraction;
+ mVoiceInteraction = voiceInteraction;
mInputApplicationHandle = new InputApplicationHandle(this);
mAppAnimator = new AppWindowAnimator(this, service);
}
@@ -407,7 +429,7 @@
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Removing app token: " + this);
- boolean delayed = setVisibility(null, false, TRANSIT_UNSET, true, voiceInteraction);
+ boolean delayed = setVisibility(null, false, TRANSIT_UNSET, true, mVoiceInteraction);
mService.mOpeningApps.remove(this);
mService.mUnknownAppVisibilityController.appRemoved(this);
@@ -1350,7 +1372,7 @@
void dump(PrintWriter pw, String prefix) {
super.dump(pw, prefix);
if (appToken != null) {
- pw.print(prefix); pw.print("app=true voiceInteraction="); pw.println(voiceInteraction);
+ pw.println(prefix + "app=true mVoiceInteraction=" + mVoiceInteraction);
}
pw.print(prefix); pw.print("task="); pw.println(mTask);
pw.print(prefix); pw.print(" mFillsParent="); pw.print(mFillsParent);
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index 0e4add8..36520a9 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -327,7 +327,7 @@
// Global drags are limited to system windows, and windows for apps that are targeting N and
// above.
return targetWin.mAppToken == null
- || targetWin.mAppToken.targetSdk >= Build.VERSION_CODES.N;
+ || targetWin.mAppToken.mTargetSdk >= Build.VERSION_CODES.N;
}
/* helper - send a ACTION_DRAG_STARTED event only if the window has not
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 495be09..8d6c73a 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -258,7 +258,7 @@
if (! abort) {
// The activity manager declined to abort dispatching.
// Wait a bit longer and timeout again later.
- return appWindowToken.inputDispatchingTimeoutNanos;
+ return appWindowToken.mInputDispatchingTimeoutNanos;
}
} catch (RemoteException ex) {
}
@@ -504,7 +504,7 @@
} else {
final InputApplicationHandle handle = newApp.mInputApplicationHandle;
handle.name = newApp.toString();
- handle.dispatchingTimeoutNanos = newApp.inputDispatchingTimeoutNanos;
+ handle.dispatchingTimeoutNanos = newApp.mInputDispatchingTimeoutNanos;
mService.mInputManager.setFocusedApplication(handle);
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 612af75..aa6e3c7 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -88,12 +88,15 @@
private boolean mIsOnTopLauncher;
Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
- Configuration overrideConfig, boolean isOnTopLauncher) {
+ Configuration overrideConfig, boolean isOnTopLauncher, int resizeMode,
+ boolean homeTask) {
mTaskId = taskId;
mStack = stack;
mUserId = userId;
mService = service;
mIsOnTopLauncher = isOnTopLauncher;
+ mResizeMode = resizeMode;
+ mHomeTask = homeTask;
setBounds(bounds, overrideConfig);
}
@@ -101,7 +104,8 @@
return mStack.getDisplayContent();
}
- void addAppToken(int addPos, AppWindowToken wtoken, int resizeMode, boolean homeTask) {
+ @Override
+ void addChild(AppWindowToken wtoken, int addPos) {
final int lastPos = mChildren.size();
if (addPos >= lastPos) {
addPos = lastPos;
@@ -118,11 +122,9 @@
if (parent != null) {
parent.removeChild(wtoken);
}
- addChild(wtoken, addPos);
+ super.addChild(wtoken, addPos);
wtoken.mTask = this;
mDeferRemoval = false;
- mResizeMode = resizeMode;
- mHomeTask = homeTask;
}
private boolean hasWindowsAlive() {
@@ -536,7 +538,7 @@
boolean showForAllUsers() {
final int tokensCount = mChildren.size();
- return (tokensCount != 0) && mChildren.get(tokensCount - 1).showForAllUsers;
+ return (tokensCount != 0) && mChildren.get(tokensCount - 1).mShowForAllUsers;
}
boolean inFreeformWorkspace() {
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 02376e9..4a1c067 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -129,7 +129,7 @@
/** Adds the input window container has a child of this container at the input index. */
@CallSuper
- protected void addChild(E child, int index) {
+ void addChild(E child, int index) {
if (child.getParent() != null) {
throw new IllegalArgumentException("addChild: container=" + child.getName()
+ " is already a child of container=" + child.getParent().getName()
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index e68960c..158fd2b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -32,7 +32,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.CompatibilityInfo;
@@ -238,6 +237,7 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import static java.lang.Integer.MAX_VALUE;
/** {@hide} */
public class WindowManagerService extends IWindowManager.Stub
@@ -1480,7 +1480,7 @@
// Try using the target SDK of the root window
if (attachedWindow != null) {
return attachedWindow.mAppToken != null
- && attachedWindow.mAppToken.targetSdk > Build.VERSION_CODES.N_MR1;
+ && attachedWindow.mAppToken.mTargetSdk > Build.VERSION_CODES.N_MR1;
} else {
// Otherwise, look at the package
try {
@@ -2439,28 +2439,11 @@
}
}
- private Task createTaskLocked(int taskId, int stackId, int userId, AppWindowToken atoken,
- Rect bounds, Configuration overrideConfig, boolean isOnTopLauncher) {
- if (DEBUG_STACK) Slog.i(TAG_WM, "createTaskLocked: taskId=" + taskId + " stackId=" + stackId
- + " atoken=" + atoken + " bounds=" + bounds);
- final TaskStack stack = mStackIdToStack.get(stackId);
- if (stack == null) {
- throw new IllegalArgumentException("createTaskLocked: invalid stackId=" + stackId);
- }
- EventLog.writeEvent(WM_TASK_CREATED, taskId, stackId);
- Task task = new Task(taskId, stack, userId, this, bounds, overrideConfig, isOnTopLauncher);
- mTaskIdToTask.put(taskId, task);
- stack.addTask(task, !atoken.mLaunchTaskBehind /* toTop */, atoken.showForAllUsers);
- return task;
- }
-
@Override
- public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
- int requestedOrientation, boolean fullscreen, boolean showForAllUsers, int userId,
+ public void addAppToken(int addPos, IApplicationToken token, int taskId,
+ int requestedOrientation, boolean fullscreen, boolean showForAllUsers,
int configChanges, boolean voiceInteraction, boolean launchTaskBehind,
- Rect taskBounds, Configuration overrideConfig, int taskResizeMode,
- boolean alwaysFocusable, boolean homeTask, int targetSdkVersion,
- int rotationAnimationHint, boolean isOnTopLauncher) {
+ boolean alwaysFocusable, int targetSdkVersion, int rotationAnimationHint) {
if (!checkCallingPermission(MANAGE_APP_TOKENS, "addAppToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -2486,42 +2469,24 @@
return;
}
- final TaskStack stack = mStackIdToStack.get(stackId);
- if (stack == null) {
- throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
- }
-
- atoken = new AppWindowToken(this, token, voiceInteraction, stack.getDisplayContent());
- atoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
- atoken.setFillsParent(fullscreen);
- atoken.showForAllUsers = showForAllUsers;
- atoken.targetSdk = targetSdkVersion;
- atoken.setOrientation(requestedOrientation);
- atoken.layoutConfigChanges = (configChanges &
- (ActivityInfo.CONFIG_SCREEN_SIZE | ActivityInfo.CONFIG_ORIENTATION)) != 0;
- atoken.mLaunchTaskBehind = launchTaskBehind;
- atoken.mAlwaysFocusable = alwaysFocusable;
- if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "addAppToken: " + atoken
- + " to stack=" + stackId + " task=" + taskId + " at " + addPos);
- atoken.mRotationAnimationHint = rotationAnimationHint;
-
Task task = mTaskIdToTask.get(taskId);
if (task == null) {
- task = createTaskLocked(taskId, stackId, userId, atoken, taskBounds, overrideConfig,
- isOnTopLauncher);
+ throw new IllegalArgumentException("addAppToken: invalid taskId=" + taskId);
}
- task.addAppToken(addPos, atoken, taskResizeMode, homeTask);
- // Application tokens start out hidden.
- atoken.hidden = true;
- atoken.hiddenRequested = true;
+ atoken = new AppWindowToken(this, token, voiceInteraction, task.getDisplayContent(),
+ inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdkVersion,
+ requestedOrientation, rotationAnimationHint, configChanges, launchTaskBehind,
+ alwaysFocusable);
+ if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "addAppToken: " + atoken
+ + " task=" + taskId + " at " + addPos);
+
+ task.addChild(atoken, addPos);
}
}
@Override
- public void setAppTask(IBinder token, int taskId, int stackId, Rect taskBounds,
- Configuration overrideConfig, int taskResizeMode, boolean homeTask,
- boolean isOnTopLauncher) {
+ public void addAppToTask(IBinder token, int taskId) {
if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppTask()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -2533,12 +2498,40 @@
return;
}
- Task newTask = mTaskIdToTask.get(taskId);
- if (newTask == null) {
- newTask = createTaskLocked(taskId, stackId, atoken.mTask.mUserId, atoken,
- taskBounds, overrideConfig, isOnTopLauncher);
+ Task task = mTaskIdToTask.get(taskId);
+ if (task == null) {
+ throw new IllegalArgumentException("setAppTask: invalid taskId=" + taskId);
}
- newTask.addAppToken(Integer.MAX_VALUE /* at top */, atoken, taskResizeMode, homeTask);
+ task.addChild(atoken, MAX_VALUE /* at top */);
+ }
+ }
+
+ public void addTask(int taskId, int stackId, int userId, Rect bounds,
+ Configuration overrideConfig, int resizeMode, boolean homeTask, boolean isOnTopLauncher,
+ boolean toTop, boolean showForAllUsers) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "addTask()")) {
+ throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
+ }
+
+ synchronized(mWindowMap) {
+ Task task = mTaskIdToTask.get(taskId);
+ if (task != null) {
+ throw new IllegalArgumentException(
+ "addTask: Attempt to add already existing task=" + task);
+ }
+
+ if (DEBUG_STACK) Slog.i(TAG_WM, "createTaskLocked: taskId=" + taskId
+ + " stackId=" + stackId + " bounds=" + bounds);
+
+ final TaskStack stack = mStackIdToStack.get(stackId);
+ if (stack == null) {
+ throw new IllegalArgumentException("addTask: invalid stackId=" + stackId);
+ }
+ EventLog.writeEvent(WM_TASK_CREATED, taskId, stackId);
+ task = new Task(taskId, stack, userId, this, bounds, overrideConfig, isOnTopLauncher,
+ resizeMode, homeTask);
+ mTaskIdToTask.put(taskId, task);
+ stack.addTask(task, toTop, showForAllUsers);
}
}
@@ -3203,7 +3196,7 @@
}
final long origId = Binder.clearCallingIdentity();
- wtoken.setVisibility(null, visible, TRANSIT_UNSET, true, wtoken.voiceInteraction);
+ wtoken.setVisibility(null, visible, TRANSIT_UNSET, true, wtoken.mVoiceInteraction);
wtoken.updateReportedVisibilityLocked();
Binder.restoreCallingIdentity(origId);
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index e2027fd..3daad43 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -124,7 +124,6 @@
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
@@ -634,7 +633,7 @@
}
mIsFloatingLayer = mIsImWindow || mIsWallpaper;
- if (mAppToken != null && mAppToken.showForAllUsers) {
+ if (mAppToken != null && mAppToken.mShowForAllUsers) {
// Windows for apps that can show for all users should also show when the device is
// locked.
mAttrs.flags |= FLAG_SHOW_WHEN_LOCKED;
@@ -1035,7 +1034,7 @@
@Override
public boolean isVoiceInteraction() {
- return mAppToken != null && mAppToken.voiceInteraction;
+ return mAppToken != null && mAppToken.mVoiceInteraction;
}
boolean setReportResizeHints() {
@@ -1225,7 +1224,7 @@
public long getInputDispatchingTimeoutNanos() {
return mAppToken != null
- ? mAppToken.inputDispatchingTimeoutNanos
+ ? mAppToken.mInputDispatchingTimeoutNanos
: WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
}
@@ -2887,7 +2886,7 @@
// Child windows are evaluated based on their parent window.
final WindowState win = getTopParentWindow();
if (win.mAttrs.type < FIRST_SYSTEM_WINDOW
- && win.mAppToken != null && win.mAppToken.showForAllUsers) {
+ && win.mAppToken != null && win.mAppToken.mShowForAllUsers) {
// All window frames that are fullscreen extend above status bar, but some don't extend
// below navigation bar. Thus, check for display frame for top/left and stable frame for
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index de80837..1aabd5e 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -5,8 +5,6 @@
import static android.app.ActivityManagerInternal.APP_TRANSITION_STARTING_WINDOW;
import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
import static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
-import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_CLOSE;
@@ -27,7 +25,6 @@
import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_OPEN;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -35,7 +32,6 @@
import static com.android.server.wm.WindowManagerService.H.DO_TRAVERSAL;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
import static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE;
-import static com.android.server.wm.WindowManagerService.H.UPDATE_DOCKED_STACK_DIVIDER;
import static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
@@ -53,7 +49,6 @@
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.SurfaceControl;
-import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.view.animation.Animation;
@@ -293,7 +288,7 @@
}
}
- voiceInteraction |= wtoken.voiceInteraction;
+ voiceInteraction |= wtoken.mVoiceInteraction;
if (wtoken.fillsParent()) {
final WindowState ws = wtoken.findMainWindow();