diff options
author | 2016-12-08 18:58:50 -0800 | |
---|---|---|
committer | 2016-12-12 15:09:03 -0800 | |
commit | 72919d2c310db04fdb860e926ccb0bfe6e3aef08 (patch) | |
tree | ed6a621c4f23032516a822fc97816070113fa700 | |
parent | 00f9a1a4735f8ba6b40cee5294a034bd60b28df4 (diff) |
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
17 files changed, 147 insertions, 154 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index bd1ad8e01b3c..21875fe168bc 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -89,51 +89,33 @@ interface IWindowManager void addWindowToken(IBinder token, int type, int displayId); void removeWindowToken(IBinder token, int displayId); /** - * Adds an application token to the specified task Id. + * Creates the object representation for the application token in the window manager and adds it + * to the specified task Id. + * * @param addPos The position to add the token to in the task. * @param token The token to add. * @param taskId The Id of the task we are adding the token to. - * @param stackId Stack Id to create a new Task with the input task Id on - * if the task doesn't exist yet. * @param requestedOrientation Orientation to use. * @param fullscreen True if the application token is fullscreen. * @param showWhenLocked True if the application token should be shown when locked. - * @param userId Id of user to associate the token with. * @param configChanges Input configuration changes. * @param voiceInteraction True if the token is in voice interaction mode. * @param launchTaskBehind True if the token is been launched from behind. - * @param taskBounds Bounds to use when creating a new Task with the input task Id if - * the task doesn't exist yet. - * @param overrideConfig Override configuration that is being used with this task. - * @param taskResizeMode The resize mode of the task. * @param alwaysFocusable True if the app windows are always focusable regardless of the stack * they are in. - * @param homeTask True if this is the task. * @param targetSdkVersion The application's target SDK version - * @param isOnTopLauncher True if this task is an on-top launcher. */ - void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId, - int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId, - int configChanges, boolean voiceInteraction, boolean launchTaskBehind, - in Rect taskBounds, in Configuration overrideConfig, int taskResizeMode, - boolean alwaysFocusable, boolean homeTask, int targetSdkVersion, - int rotationAnimationHint, boolean isOnTopLauncher); + void addAppToken(int addPos, IApplicationToken token, int taskId, int requestedOrientation, + boolean fullscreen, boolean showWhenLocked, int configChanges, boolean voiceInteraction, + boolean launchTaskBehind, boolean alwaysFocusable, int targetSdkVersion, + int rotationAnimationHint); /** + * Adds an already existing application token on the window manager side to the input task id. * * @param token The token we are adding to the input task Id. * @param taskId The Id of the task we are adding the token to. - * @param stackId Stack Id to create a new Task with the input task Id on - * if the task doesn't exist yet. - * @param taskBounds Bounds to use when creating a new Task with the input task Id if - * the task doesn't exist yet. - * @param overrideConfig Override configuration that is being used with this task. - * @param taskResizeMode The resize mode of the task. - * @param homeTask True if this is the task. - * @param isOnTopLauncher True if this task is an on-top launcher. - */ - void setAppTask(IBinder token, int taskId, int stackId, in Rect taskBounds, - in Configuration overrideConfig, int taskResizeMode, boolean homeTask, - boolean isOnTopLauncher); + */ + void addAppToTask(IBinder token, int taskId); void setAppOrientation(IApplicationToken token, int requestedOrientation); int getAppOrientation(IApplicationToken token); void setFocusedApp(IBinder token, boolean moveFocusNow); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index d160a4644baa..436eaf6049f2 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2857,7 +2857,7 @@ final class ActivityStack extends ConfigurationContainer { } else { targetTask = createTaskRecord( mStackSupervisor.getNextTaskIdForUserLocked(target.userId), - target.info, null, null, null, false); + target.info, null, null, null, false, target.mActivityType); targetTask.affinityIntent = target.intent; if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Start pushing activity " + target + " out to new task " + target.task); @@ -4897,9 +4897,9 @@ final class ActivityStack extends ConfigurationContainer { TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - boolean toTop) { + boolean toTop, int type) { TaskRecord task = new TaskRecord(mService, taskId, info, intent, voiceSession, - voiceInteractor); + voiceInteractor, type); // add the task to stack first, mTaskPositioner might need the stack association addTask(task, toTop, "createTaskRecord"); final boolean isLockscreenShown = @@ -4908,6 +4908,11 @@ final class ActivityStack extends ConfigurationContainer { && !isLockscreenShown) { task.updateOverrideConfiguration(mBounds); } + final Rect bounds = task.updateOverrideConfigurationFromLaunchBounds(); + final boolean showForAllUsers = (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0; + mWindowManager.addTask(taskId, mStackId, task.userId, bounds, + task.getOverrideConfiguration(), task.mResizeMode, task.isHomeTask(), + task.isOnTopLauncher(), toTop, showForAllUsers); return task; } @@ -4974,15 +4979,13 @@ final class ActivityStack extends ConfigurationContainer { } void addConfigOverride(ActivityRecord r, TaskRecord task) { - final Rect bounds = task.updateOverrideConfigurationFromLaunchBounds(); + task.updateOverrideConfigurationFromLaunchBounds(); // TODO: VI deal with activity mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken, - r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen, - (r.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId, r.info.configChanges, - task.voiceSession != null, r.mLaunchTaskBehind, bounds, - task.getOverrideConfiguration(), task.mResizeMode, r.isAlwaysFocusable(), - task.isHomeTask(), r.appInfo.targetSdkVersion, r.mRotationAnimationHint, - task.isOnTopLauncher()); + r.task.taskId, r.info.screenOrientation, r.fullscreen, + (r.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0, r.info.configChanges, + task.voiceSession != null, r.mLaunchTaskBehind, r.isAlwaysFocusable(), + r.appInfo.targetSdkVersion, r.mRotationAnimationHint); r.onOverrideConfigurationSent(); } @@ -5021,7 +5024,7 @@ final class ActivityStack extends ConfigurationContainer { final TaskRecord task = createTaskRecord( mStackSupervisor.getNextTaskIdForUserLocked(r.userId), - r.info, r.intent, null, null, true); + r.info, r.intent, null, null, true, r.mActivityType); r.setTask(task, null); task.addActivityToTop(r); setAppTask(r, task); @@ -5033,10 +5036,8 @@ final class ActivityStack extends ConfigurationContainer { } private void setAppTask(ActivityRecord r, TaskRecord task) { - final Rect bounds = task.updateOverrideConfigurationFromLaunchBounds(); - mWindowManager.setAppTask(r.appToken, task.taskId, mStackId, bounds, - task.getOverrideConfiguration(), task.mResizeMode, task.isHomeTask(), - task.isOnTopLauncher()); + task.updateOverrideConfigurationFromLaunchBounds(); + mWindowManager.addAppToTask(r.appToken, task.taskId); r.onOverrideConfigurationSent(); } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 281812ca08c5..db9e0f608efe 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2424,7 +2424,11 @@ public class ActivityStackSupervisor extends ConfigurationContainer return false; } - stack.addTask(task, false, "restoreRecentTask"); + stack.addTask(task, false /* toTop */, "restoreRecentTask"); + final Rect bounds = task.updateOverrideConfigurationFromLaunchBounds(); + mWindowManager.addTask(task.taskId, stack.mStackId, task.userId, bounds, + task.getOverrideConfiguration(), task.mResizeMode, task.isHomeTask(), + task.isOnTopLauncher(), false /* toTop */, true /* showForAllUsers */); if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, "Added restored task=" + task + " to stack=" + stack); final ArrayList<ActivityRecord> activities = task.mActivities; diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index d0960a0c73a3..3bb9ccc22a87 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1642,8 +1642,8 @@ class ActivityStarter { final TaskRecord task = mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId), mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, - mNewTaskIntent != null ? mNewTaskIntent : mIntent, - mVoiceSession, mVoiceInteractor, !mLaunchTaskBehind /* toTop */); + mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, + mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity.mActivityType); mStartActivity.setTask(task, taskToAffiliate); if (mLaunchBounds != null) { final int stackId = mTargetStack.mStackId; @@ -1817,8 +1817,8 @@ class ActivityStarter { } final ActivityRecord prev = mTargetStack.topActivity(); final TaskRecord task = (prev != null) ? prev.task : mTargetStack.createTaskRecord( - mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId), - mStartActivity.info, mIntent, null, null, true); + mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId), mStartActivity.info, + mIntent, null, null, true, mStartActivity.mActivityType); mStartActivity.setTask(task, null); mWindowManager.moveTaskToTop(mStartActivity.task.taskId); if (DEBUG_TASKS) Slog.v(TAG_TASKS, diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 383f1068793f..a6444bc88fed 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -281,7 +281,7 @@ final class TaskRecord extends ConfigurationContainer { private Configuration mTmpConfig = new Configuration(); TaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info, Intent _intent, - IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) { + IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor, int type) { mService = service; mFilename = String.valueOf(_taskId) + TASK_THUMBNAIL_SUFFIX + TaskPersister.IMAGE_EXTENSION; @@ -296,6 +296,7 @@ final class TaskRecord extends ConfigurationContainer { mActivities = new ArrayList<>(); mCallingUid = info.applicationInfo.uid; mCallingPackage = info.packageName; + taskType = type; setIntent(_intent, info); setMinDimensions(info); touchActiveTime(); @@ -321,7 +322,6 @@ final class TaskRecord extends ConfigurationContainer { setIntent(_intent, info); setMinDimensions(info); - taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE; isPersistable = true; // Clamp to [1, max]. maxRecents = Math.min(Math.max(info.maxRecents, 1), diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 00c37d2d899a..6147885a4a2e 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_NORMAL; 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 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree @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 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean mLaunchTaskBehind; boolean mEnteringAnimation; - boolean mAlwaysFocusable; + private boolean mAlwaysFocusable; boolean mAppStopped; int mRotationAnimationHint; @@ -167,12 +170,31 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree 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 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree 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 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree 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 0e4add8afc46..36520a9642a1 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 @@ class DragState { // 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 495be094c982..8d6c73a4b03f 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 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { 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 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { } 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 612af755a0f9..aa6e3c7c3e45 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 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU 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 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU 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 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU 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 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU 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 02376e9c47eb..4a1c0678a661 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 @@ class WindowContainer<E extends WindowContainer> implements Comparable<WindowCon /** 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 e68960cc141d..158fd2bfa9e5 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.ContentResolver; 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.SHOW_VERBOSE_TRANSA 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 @@ public class WindowManagerService extends IWindowManager.Stub // 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 @@ public class WindowManagerService extends IWindowManager.Stub } } - 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 @@ public class WindowManagerService extends IWindowManager.Stub 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 @@ public class WindowManagerService extends IWindowManager.Stub 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); + } + 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); } - newTask.addAppToken(Integer.MAX_VALUE /* at top */, atoken, taskResizeMode, homeTask); + 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 @@ public class WindowManagerService extends IWindowManager.Stub } 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 e2027fd8764b..3daad4373d06 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_SURFACE_TRACE 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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } 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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override public boolean isVoiceInteraction() { - return mAppToken != null && mAppToken.voiceInteraction; + return mAppToken != null && mAppToken.mVoiceInteraction; } boolean setReportResizeHints() { @@ -1225,7 +1224,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP public long getInputDispatchingTimeoutNanos() { return mAppToken != null - ? mAppToken.inputDispatchingTimeoutNanos + ? mAppToken.mInputDispatchingTimeoutNanos : WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; } @@ -2887,7 +2886,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // 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 de808377e880..1aabd5ea66f9 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_SAVED_SURFACE; 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_INTRA_OPEN; 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.WindowManagerDebugConfig.TAG_WM; 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.Display; 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 @@ class WindowSurfacePlacer { } } - voiceInteraction |= wtoken.voiceInteraction; + voiceInteraction |= wtoken.mVoiceInteraction; if (wtoken.fillsParent()) { final WindowState ws = wtoken.findMainWindow(); diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java index b10c27342a29..ef6ee32c805b 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java @@ -76,7 +76,7 @@ public class WindowFrameTests { final Rect mInsetBounds = new Rect(); boolean mFullscreenForTest = true; TaskWithBounds(Rect bounds) { - super(0, mStubStack, 0, sWm, null, null, false); + super(0, mStubStack, 0, sWm, null, null, false, 0, false); mBounds = bounds; } @Override diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java index ab6968b6c149..e72986418190 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java @@ -106,10 +106,10 @@ public class WindowTestsBase { final int stackId = sNextStackId++; dc.addStackToDisplay(stackId, true); final TaskStack stack = sWm.mStackIdToStack.get(stackId); - final Task task = new Task(sNextTaskId++, stack, 0, sWm, null, EMPTY, false); + final Task task = new Task(sNextTaskId++, stack, 0, sWm, null, EMPTY, false, 0, false); stack.addTask(task, true); final TestAppWindowToken token = new TestAppWindowToken(dc); - task.addAppToken(0, token, 0, false); + task.addChild(token, 0); return token; } diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java index 7d6f32bd8f88..28a2cb399cd0 100644 --- a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java +++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java @@ -93,8 +93,7 @@ public class WindowManagerPermissionTests extends TestCase { } try { - mWm.addAppToken(0, null, 0, 0, 0, false, false, 0, 0, false, false, null, - Configuration.EMPTY, 0, false, false, 0, -1, false); + mWm.addAppToken(0, null, 0, 0, false, false, 0, false, false, false, 0, -1); fail("IWindowManager.addAppToken did not throw SecurityException as" + " expected"); } catch (SecurityException e) { @@ -104,7 +103,7 @@ public class WindowManagerPermissionTests extends TestCase { } try { - mWm.setAppTask(null, 0, INVALID_STACK_ID, null, null, 0, false, false); + mWm.addAppToTask(null, 0); fail("IWindowManager.setAppGroupId did not throw SecurityException as" + " expected"); } catch (SecurityException e) { diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index a0ded8745508..4b9815d93ac7 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -34,7 +34,6 @@ import android.os.IRemoteCallback; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.DisplayMetrics; -import android.view.AppTransitionAnimationSpec; import java.lang.Override; @@ -78,11 +77,10 @@ public class IWindowManagerImpl implements IWindowManager { // ---- unused implementation of IWindowManager ---- @Override - public void addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, int arg4, - boolean arg5, boolean arg6, int arg7, int arg8, boolean arg9, boolean arg10, - Rect arg11, Configuration arg12, int arg13, boolean arg14, boolean arg15, int arg16, - int arg17, boolean arg18) - throws RemoteException { + public void addAppToken(int addPos, IApplicationToken token, int taskId, + int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int configChanges, + boolean voiceInteraction, boolean launchTaskBehind, boolean alwaysFocusable, + int targetSdkVersion, int rotationAnimationHint) throws RemoteException { // TODO Auto-generated method stub } @@ -327,9 +325,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void setAppTask(IBinder arg0, int arg1, int arg2, Rect arg3, Configuration arg4, - int arg5, boolean arg6, boolean arg7) - throws RemoteException { + public void addAppToTask(IBinder arg0, int arg1) throws RemoteException { // TODO Auto-generated method stub } |