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
This commit is contained in:
Craig Mautner
2013-04-28 08:58:21 -07:00
parent 580ea81ccd
commit f76664673e
4 changed files with 56 additions and 19 deletions

View File

@@ -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);
}
}

View File

@@ -625,6 +625,8 @@ public class WindowAnimator {
}
}
mService.setFocusedStackLayer();
if (mService.mWatermark != null) {
mService.mWatermark.drawIfNeeded();
}

View File

@@ -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();

View File

@@ -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;