Resize all changed windows and fix moveTaskToStack
- Add all changing windows to mResizingWindows when an ActivityStack
is resized.
- Stop calling TaskStack.setBounds if the bounds haven't changed.
- Make moving a task from one stack to another work properly.
- Eliminate unused methods and redundant variables in WindowState and
WindowStateAnimator.
Change-Id: I3a950c777bcc50cdeced150d44423d4d0b38af4a
diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java
index af7db96..0dbcfb8 100644
--- a/services/java/com/android/server/wm/DisplayContent.java
+++ b/services/java/com/android/server/wm/DisplayContent.java
@@ -309,10 +309,12 @@
* Propagate the new bounds to all child stack boxes, applying weights as we move down.
* @param contentRect The bounds to apply at the top level.
*/
- void setStackBoxSize(Rect contentRect) {
+ boolean setStackBoxSize(Rect contentRect) {
+ boolean change = false;
for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
- mStackBoxes.get(stackBoxNdx).setStackBoxSizes(contentRect);
+ change |= mStackBoxes.get(stackBoxNdx).setStackBoxSizes(contentRect);
}
+ return change;
}
Rect getStackBounds(int stackId) {
diff --git a/services/java/com/android/server/wm/StackBox.java b/services/java/com/android/server/wm/StackBox.java
index 2b43b40..3bd1d4c 100644
--- a/services/java/com/android/server/wm/StackBox.java
+++ b/services/java/com/android/server/wm/StackBox.java
@@ -274,8 +274,10 @@
boolean change;
if (mStack != null) {
change = !mBounds.equals(bounds);
- mBounds.set(bounds);
- mStack.setBounds(bounds);
+ if (change) {
+ mBounds.set(bounds);
+ mStack.setBounds(bounds);
+ }
} else {
mTmpRect.set(bounds);
if (mVertical) {
diff --git a/services/java/com/android/server/wm/TaskStack.java b/services/java/com/android/server/wm/TaskStack.java
index 50d23a1..6fd8745 100644
--- a/services/java/com/android/server/wm/TaskStack.java
+++ b/services/java/com/android/server/wm/TaskStack.java
@@ -225,6 +225,20 @@
void setBounds(Rect bounds) {
mDimLayer.setBounds(bounds);
mAnimationBackgroundSurface.setBounds(bounds);
+
+ final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
+ for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
+ final ArrayList<AppWindowToken> activities = mTasks.get(taskNdx).mAppTokens;
+ for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
+ final ArrayList<WindowState> windows = activities.get(activityNdx).allAppWindows;
+ for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
+ final WindowState win = windows.get(winNdx);
+ if (!resizingWindows.contains(win)) {
+ resizingWindows.add(win);
+ }
+ }
+ }
+ }
}
public void dump(String prefix, PrintWriter pw) {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index a6713a2..f9a5091 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -579,22 +579,6 @@
}
final LayoutFields mInnerFields = new LayoutFields();
- static class AppWindowAnimParams {
- AppWindowAnimator mAppAnimator;
- ArrayList<WindowStateAnimator> mWinAnimators;
-
- public AppWindowAnimParams(final AppWindowAnimator appAnimator) {
- mAppAnimator = appAnimator;
-
- final AppWindowToken atoken = appAnimator.mAppToken;
- mWinAnimators = new ArrayList<WindowStateAnimator>();
- final int N = atoken.allAppWindows.size();
- for (int i = 0; i < N; i++) {
- mWinAnimators.add(atoken.allAppWindows.get(i).mWinAnimator);
- }
- }
- }
-
boolean mAnimationScheduled;
/** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
@@ -4831,6 +4815,7 @@
displayContent.createStack(this, stackId, relativeStackId, position, weight);
mStackIdToStack.put(stackId, stack);
displayContent.moveStack(stack, true);
+ performLayoutAndPlaceSurfacesLocked();
}
}
@@ -4841,7 +4826,7 @@
mStackIdToStack.delete(stackId);
int nextStackId = stack.remove();
stack.getDisplayContent().layoutNeeded = true;
- performLayoutAndPlaceSurfacesLocked();
+ requestTraversalLocked();
return nextStackId;
}
if (DEBUG_STACK) Slog.i(TAG, "removeStack: could not find stackId=" + stackId);
@@ -4849,18 +4834,31 @@
return HOME_STACK_ID;
}
- public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
+ public void removeTask(int taskId) {
synchronized (mWindowMap) {
Task task = mTaskIdToTask.get(taskId);
if (task == null) {
return;
}
- task.mStack.removeTask(task);
+ final TaskStack stack = task.mStack;
+ stack.removeTask(task);
+ stack.getDisplayContent().layoutNeeded = true;
+ }
+ }
+ public void addTask(int taskId, int stackId, boolean toTop) {
+ synchronized (mWindowMap) {
+ Task task = mTaskIdToTask.get(taskId);
+ if (task == null) {
+ return;
+ }
TaskStack stack = mStackIdToStack.get(stackId);
stack.addTask(task, toTop);
- stack.getDisplayContent().layoutNeeded = true;
-
+ final DisplayContent displayContent = stack.getDisplayContent();
+ if (toTop) {
+ displayContent.moveHomeStackBox(stack.isHomeStack());
+ }
+ displayContent.layoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
}
}
@@ -4872,7 +4870,6 @@
STACK_WEIGHT_MAX + ", weight=" + weight);
}
synchronized (mWindowMap) {
- Task task = null;
DisplayContentsIterator iterator = new DisplayContentsIterator();
while (iterator.hasNext()) {
if (iterator.next().resizeStack(stackId, weight)) {
@@ -5658,6 +5655,7 @@
frame.scale(scale);
Matrix matrix = new Matrix();
ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix);
+ // TODO: Test for RTL vs. LTR and use frame.right-width instead of -frame.left
matrix.postTranslate(-FloatMath.ceil(frame.left), -FloatMath.ceil(frame.top));
Canvas canvas = new Canvas(bm);
canvas.drawColor(0xFF000000);
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 116ed8c..377e8e8 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -16,6 +16,9 @@
package com.android.server.wm;
+import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY;
+import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT;
+
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
@@ -57,12 +60,6 @@
import java.util.ArrayList;
class WindowList extends ArrayList<WindowState> {
- WindowList() {
- super();
- }
- WindowList(WindowList windows) {
- super(windows);
- }
}
/**
@@ -71,11 +68,6 @@
final class WindowState implements WindowManagerPolicy.WindowState {
static final String TAG = "WindowState";
- static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY;
- static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS;
- static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
- static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC;
-
final WindowManagerService mService;
final WindowManagerPolicy mPolicy;
final Context mContext;
@@ -440,7 +432,6 @@
public void computeFrameLw(Rect pf, Rect df, Rect of, Rect cf, Rect vf) {
mHaveFrame = true;
- final int type = mAttrs.type;
if (mAppToken != null) {
mContainingFrame.set(getStackBounds());
} else {
@@ -572,17 +563,13 @@
false);
}
- if (WindowManagerService.localLOGV) {
- //if ("com.google.android.youtube".equals(mAttrs.packageName)
- // && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
- Slog.v(TAG, "Resolving (mRequestedWidth="
- + mRequestedWidth + ", mRequestedheight="
- + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
- + "): frame=" + mFrame.toShortString()
- + " ci=" + mContentInsets.toShortString()
- + " vi=" + mVisibleInsets.toShortString());
- //}
- }
+ if (DEBUG_LAYOUT || WindowManagerService.localLOGV) Slog.v(TAG,
+ "Resolving (mRequestedWidth="
+ + mRequestedWidth + ", mRequestedheight="
+ + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
+ + "): frame=" + mFrame.toShortString()
+ + " ci=" + mContentInsets.toShortString()
+ + " vi=" + mVisibleInsets.toShortString());
}
@Override
@@ -964,12 +951,6 @@
return configChanged;
}
- boolean isConfigDiff(int mask) {
- return mConfiguration != mService.mCurConfiguration
- && mConfiguration != null
- && (mConfiguration.diff(mService.mCurConfiguration) & mask) != 0;
- }
-
void removeLocked() {
disposeInputChannel();
@@ -1022,7 +1003,7 @@
Slog.i(TAG, "WIN DEATH: " + win);
if (win != null) {
mService.removeWindowLocked(mSession, win);
- } else if (WindowState.this.mHasSurface) {
+ } else if (mHasSurface) {
Slog.e(TAG, "!!! LEAK !!! Window removed but surface still valid.");
mService.removeWindowLocked(mSession, WindowState.this);
}
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index 8bf7788..a52d85c 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -3,6 +3,16 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+import static com.android.server.wm.WindowManagerService.DEBUG_ANIM;
+import static com.android.server.wm.WindowManagerService.DEBUG_LAYERS;
+import static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION;
+import static com.android.server.wm.WindowManagerService.DEBUG_STARTING_WINDOW;
+import static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE;
+import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS;
+import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY;
+import static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
+import static com.android.server.wm.WindowManagerService.SHOW_SURFACE_ALLOC;
+import static com.android.server.wm.WindowManagerService.localLOGV;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_TURN_ON_SCREEN;
@@ -34,30 +44,12 @@
import java.util.ArrayList;
class WinAnimatorList extends ArrayList<WindowStateAnimator> {
- public WinAnimatorList() {
- super();
- }
-
- public WinAnimatorList(WinAnimatorList other) {
- super(other);
- }
}
/**
* Keep track of animations and surface operations for a single WindowState.
**/
class WindowStateAnimator {
- static final boolean DEBUG_VISIBILITY = WindowManagerService.DEBUG_VISIBILITY;
- static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM;
- static final boolean DEBUG_LAYERS = WindowManagerService.DEBUG_LAYERS;
- static final boolean DEBUG_STARTING_WINDOW = WindowManagerService.DEBUG_STARTING_WINDOW;
- static final boolean SHOW_TRANSACTIONS = WindowManagerService.SHOW_TRANSACTIONS;
- static final boolean SHOW_LIGHT_TRANSACTIONS = WindowManagerService.SHOW_LIGHT_TRANSACTIONS;
- static final boolean SHOW_SURFACE_ALLOC = WindowManagerService.SHOW_SURFACE_ALLOC;
- static final boolean localLOGV = WindowManagerService.localLOGV;
- static final boolean DEBUG_ORIENTATION = WindowManagerService.DEBUG_ORIENTATION;
- static final boolean DEBUG_SURFACE_TRACE = WindowManagerService.DEBUG_SURFACE_TRACE;
-
static final String TAG = "WindowStateAnimator";
// Unchanging local convenience fields.
@@ -339,7 +331,7 @@
mHasTransformation = false;
mHasLocalTransformation = false;
if (mWin.mPolicyVisibility != mWin.mPolicyVisibilityAfterAnim) {
- if (WindowState.DEBUG_VISIBILITY) {
+ if (DEBUG_VISIBILITY) {
Slog.v(TAG, "Policy visibility changing after anim in " + this + ": "
+ mWin.mPolicyVisibilityAfterAnim);
}
@@ -406,7 +398,7 @@
if (mSurfaceControl != null) {
mService.mDestroySurface.add(mWin);
mWin.mDestroying = true;
- if (WindowState.SHOW_TRANSACTIONS) WindowManagerService.logSurface(
+ if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(
mWin, "HIDE (finishExit)", null);
hide();
}
@@ -647,7 +639,7 @@
if ((attrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) {
flags |= SurfaceControl.SECURE;
}
- if (WindowState.DEBUG_VISIBILITY) Slog.v(
+ if (DEBUG_VISIBILITY) Slog.v(
TAG, "Creating surface in session "
+ mSession.mSurfaceSession + " window " + this
+ " w=" + mWin.mCompatFrame.width()