summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/wm/DisplayContent.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/wm/DisplayContent.java')
-rw-r--r--services/java/com/android/server/wm/DisplayContent.java91
1 files changed, 91 insertions, 0 deletions
diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java
index 8343986..45f018d 100644
--- a/services/java/com/android/server/wm/DisplayContent.java
+++ b/services/java/com/android/server/wm/DisplayContent.java
@@ -18,10 +18,12 @@ package com.android.server.wm;
import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
import static com.android.server.wm.WindowManagerService.DEBUG_STACK;
+import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerService.TAG;
import android.graphics.Rect;
import android.util.Slog;
+import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.InputChannel;
@@ -104,6 +106,8 @@ class DisplayContent {
/** Detect user tapping outside of current focused stack bounds .*/
StackTapDetector mTapDetector;
+ SparseArray<UserStacks> mUserStacks = new SparseArray<UserStacks>();
+
/**
* @param display May not be null.
*/
@@ -145,6 +149,22 @@ class DisplayContent {
*/
ArrayList<Task> getTasks() {
mTmpTasks.clear();
+ // First do the tasks belonging to other users.
+ final int numUserStacks = mUserStacks.size();
+ for (int i = 0; i < numUserStacks; ++i) {
+ UserStacks userStacks = mUserStacks.valueAt(i);
+ ArrayList<TaskStack> stacks = userStacks.mSavedStackHistory;
+ final int numStacks = stacks.size();
+ for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
+ TaskStack stack = stacks.get(stackNdx);
+ if (stack != mHomeStack) {
+ if (WindowManagerService.DEBUG_LAYERS) Slog.i(TAG, "getTasks: mStackHistory=" +
+ mStackHistory);
+ mTmpTasks.addAll(stack.getTasks());
+ }
+ }
+ }
+ // Now do the current user's tasks.
final int numStacks = mStackHistory.size();
for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
mTmpTasks.addAll(mStackHistory.get(stackNdx).getTasks());
@@ -292,6 +312,14 @@ class DisplayContent {
return bounds;
}
}
+ // Not in the visible stacks, try the saved ones.
+ for (int userNdx = mUserStacks.size() - 1; userNdx >= 0; --userNdx) {
+ UserStacks userStacks = mUserStacks.valueAt(userNdx);
+ Rect bounds = userStacks.mSavedStackBox.getStackBounds(stackId);
+ if (bounds != null) {
+ return bounds;
+ }
+ }
return null;
}
@@ -300,6 +328,26 @@ class DisplayContent {
return topBox.stackIdFromPoint(x, y);
}
+ void switchUserStacks(int oldUserId, int newUserId) {
+ final WindowList windows = getWindowList();
+ for (int i = 0; i < windows.size(); i++) {
+ final WindowState win = windows.get(i);
+ if (win.isHiddenFromUserLocked()) {
+ if (DEBUG_VISIBILITY) Slog.w(TAG, "user changing " + newUserId + " hiding "
+ + win + ", attrs=" + win.mAttrs.type + ", belonging to "
+ + win.mOwnerUid);
+ win.hideLw(false);
+ }
+ }
+ // Clear the old user's non-home StackBox
+ mUserStacks.put(oldUserId, new UserStacks());
+ UserStacks userStacks = mUserStacks.get(newUserId);
+ if (userStacks != null) {
+ userStacks.restore();
+ mUserStacks.delete(newUserId);
+ }
+ }
+
public void dump(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("Display: mDisplayId="); pw.println(mDisplayId);
final String subPrefix = " " + prefix;
@@ -365,6 +413,49 @@ class DisplayContent {
token.dump(pw, " ");
}
}
+ if (mUserStacks.size() > 0) {
+ pw.println();
+ pw.println(" Saved user stacks:");
+ for (int i = 0; i < mUserStacks.size(); ++i) {
+ UserStacks userStacks = mUserStacks.valueAt(i);
+ pw.print(" UserId="); pw.println(Integer.toHexString(mUserStacks.keyAt(i)));
+ pw.print(" StackHistory="); pw.println(userStacks.mSavedStackHistory);
+ pw.print(" StackBox="); userStacks.mSavedStackBox.dump(" ", pw);
+ }
+ }
pw.println();
}
+
+ private final class UserStacks {
+ final ArrayList<TaskStack> mSavedStackHistory;
+ StackBox mSavedStackBox;
+ int mBoxNdx;
+
+ public UserStacks() {
+ mSavedStackHistory = new ArrayList<TaskStack>(mStackHistory);
+ for (int stackNdx = mStackHistory.size() - 1; stackNdx >=0; --stackNdx) {
+ if (mStackHistory.get(stackNdx) != mHomeStack) {
+ mStackHistory.remove(stackNdx);
+ }
+ }
+ mSavedStackBox = null;
+ mBoxNdx = -1;
+ for (int boxNdx = mStackBoxes.size() - 1; boxNdx >= 0; --boxNdx) {
+ StackBox box = mStackBoxes.get(boxNdx);
+ if (box.mStack != mHomeStack) {
+ mSavedStackBox = box;
+ mBoxNdx = boxNdx;
+ mStackBoxes.remove(boxNdx);
+ break;
+ }
+ }
+ }
+
+ void restore() {
+ mStackHistory = mSavedStackHistory;
+ if (mBoxNdx >= 0) {
+ mStackBoxes.add(mBoxNdx, mSavedStackBox);
+ }
+ }
+ }
}