From f76664673eed1c7b2fa141ce99e01028bc7a1be0 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Sun, 28 Apr 2013 08:58:21 -0700 Subject: [PATCH] Clean up FocusedStackFrame layer setting. - Putting the stack frame above the highest app window layer ends up putting it over the IME when the caret popup is showing. This puts the stack frame layer above the highest non-child window layer. - Also change the timing so the layer isn't applied until all other layers are also being applied. Change-Id: Ic5f142998822ac1e3890a2943cda7fc86a7e7974 --- .../android/server/wm/FocusedStackFrame.java | 17 +++++- .../com/android/server/wm/WindowAnimator.java | 2 + .../server/wm/WindowManagerService.java | 55 ++++++++++++++----- .../server/wm/WindowStateAnimator.java | 1 - 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/services/java/com/android/server/wm/FocusedStackFrame.java b/services/java/com/android/server/wm/FocusedStackFrame.java index 29949adb373b9..9c18331e068fe 100644 --- a/services/java/com/android/server/wm/FocusedStackFrame.java +++ b/services/java/com/android/server/wm/FocusedStackFrame.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static com.android.server.wm.WindowManagerService.DEBUG_STACK; +import static com.android.server.wm.WindowManagerService.DEBUG_SURFACE_TRACE; import android.graphics.Canvas; import android.graphics.Color; @@ -29,6 +30,8 @@ import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceSession; +import com.android.server.wm.WindowStateAnimator.SurfaceTrace; + class FocusedStackFrame { private static final String TAG = "FocusedStackFrame"; private static final int THICKNESS = 10; @@ -43,10 +46,14 @@ class FocusedStackFrame { public FocusedStackFrame(Display display, SurfaceSession session) { SurfaceControl ctrl = null; try { - ctrl = new SurfaceControl(session, "FocusedStackFrame", - 1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); + if (DEBUG_SURFACE_TRACE) { + ctrl = new SurfaceTrace(session, "FocusedStackFrame", + 1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); + } else { + ctrl = new SurfaceControl(session, "FocusedStackFrame", + 1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); + } ctrl.setLayerStack(display.getLayerStack()); - ctrl.setLayer(WindowManagerService.TYPE_LAYER_MULTIPLIER * 102); ctrl.setAlpha(ALPHA); mSurface.copyFrom(ctrl); } catch (SurfaceControl.OutOfResourcesException e) { @@ -127,4 +134,8 @@ class FocusedStackFrame { if (DEBUG_STACK) Slog.i(TAG, "setBounds: bounds=" + bounds); mBounds.set(bounds); } + + public void setLayer(int layer) { + mSurfaceControl.setLayer(layer); + } } diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 3147497195893..d1016027a18ff 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -625,6 +625,8 @@ public class WindowAnimator { } } + mService.setFocusedStackLayer(); + if (mService.mWatermark != null) { mService.mWatermark.drawIfNeeded(); } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index f3f4e7c81349e..e6adf969d64b1 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -218,6 +218,11 @@ public class WindowManagerService extends IWindowManager.Stub */ static final int LAYER_OFFSET_BLUR = 2; + /** + * FocusedStackFrame layer is immediately above focused window. + */ + static final int LAYER_OFFSET_FOCUSED_STACK = 1; + /** * Animation thumbnail is as far as possible below the window above * the thumbnail (or in other words as far as possible above the window @@ -405,6 +410,8 @@ public class WindowManagerService extends IWindowManager.Stub StrictModeFlash mStrictModeFlash; FocusedStackFrame mFocusedStackFrame; + int mFocusedStackLayer; + final float[] mTmpFloats = new float[9]; boolean mDisplayReady; @@ -3686,7 +3693,32 @@ public class WindowManagerService extends IWindowManager.Stub } } - void setFocusedStackFrame(TaskStack stack) { + /** Call while in a Surface transaction. */ + void setFocusedStackLayer() { + mFocusedStackLayer = 0; + final WindowList windows = mFocusedApp.allAppWindows; + for (int i = windows.size() - 1; i >= 0; --i) { + final WindowState win = windows.get(i); + final int animLayer = win.mWinAnimator.mAnimLayer; + if (win.mAttachedWindow == null && win.isVisibleLw() && + animLayer > mFocusedStackLayer) { + mFocusedStackLayer = animLayer + LAYER_OFFSET_FOCUSED_STACK; + } + } + if (DEBUG_LAYERS) Slog.v(TAG, "Setting FocusedStackFrame to layer=" + + mFocusedStackLayer); + mFocusedStackFrame.setLayer(mFocusedStackLayer); + } + + void setFocusedStackFrame() { + final TaskStack stack; + if (mFocusedApp != null) { + Task task = mTaskIdToTask.get(mFocusedApp.groupId); + stack = task.mStack; + task.getDisplayContent().mTapDetector.setStackBounds(stack.mStackBox.mBounds); + } else { + stack = null; + } if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setFocusedStackFrame"); SurfaceControl.openTransaction(); try { @@ -7858,13 +7890,14 @@ public class WindowManagerService extends IWindowManager.Stub layerChanged = true; anyLayerChanged = true; } + final AppWindowToken wtoken = w.mAppToken; oldLayer = winAnimator.mAnimLayer; if (w.mTargetAppToken != null) { winAnimator.mAnimLayer = w.mLayer + w.mTargetAppToken.mAppAnimator.animLayerAdjustment; - } else if (w.mAppToken != null) { + } else if (wtoken != null) { winAnimator.mAnimLayer = - w.mLayer + w.mAppToken.mAppAnimator.animLayerAdjustment; + w.mLayer + wtoken.mAppAnimator.animLayerAdjustment; } else { winAnimator.mAnimLayer = w.mLayer; } @@ -7884,8 +7917,8 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " + "mBase=" + w.mBaseLayer + " mLayer=" + w.mLayer - + (w.mAppToken == null ? - "" : " mAppLayer=" + w.mAppToken.mAppAnimator.animLayerAdjustment) + + (wtoken == null ? + "" : " mAppLayer=" + wtoken.mAppAnimator.animLayerAdjustment) + " =mAnimLayer=" + winAnimator.mAnimLayer); //System.out.println( // "Assigned layer " + curLayer + " to " + w.mClient.asBinder()); @@ -9269,16 +9302,8 @@ public class WindowManagerService extends IWindowManager.Stub } } - final TaskStack stack; - if (mFocusedApp != null) { - Task task = mTaskIdToTask.get(mFocusedApp.groupId); - stack = task.mStack; - task.getDisplayContent().mTapDetector.setStackBounds(stack.mStackBox.mBounds); - } else { - stack = null; - } - setFocusedStackFrame(stack); - + setFocusedStackFrame(); + // Check to see if we are now in a state where the screen should // be enabled, because the window obscured flags have changed. enableScreenIfNeededLocked(); diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index c07174baf4c37..9e1822788f6a0 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -19,7 +19,6 @@ import android.util.Slog; import android.view.Display; import android.view.DisplayInfo; import android.view.MagnificationSpec; -import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.WindowManager;