summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/IWindowManager.aidl38
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java31
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java8
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java4
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java46
-rw-r--r--services/core/java/com/android/server/wm/DragState.java2
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java4
-rw-r--r--services/core/java/com/android/server/wm/Task.java14
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java105
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java4
-rw-r--r--tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java5
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java14
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
}