Merge changes Ia9df12fa,Ib114e8cb into pi-dev

* changes:
  Avoid calling detachChildren from onAppVisibilityChanged
  Fix computation of child window insets.
This commit is contained in:
Rob Carr
2018-04-02 22:15:49 +00:00
committed by Android (Google) Code Review
4 changed files with 26 additions and 21 deletions

View File

@@ -4976,13 +4976,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void setAttachedWindowFrames(WindowState win, int fl, int adjust, WindowState attached,
boolean insetDecors, Rect pf, Rect df, Rect of, Rect cf, Rect vf,
DisplayFrames displayFrames) {
if (win.getSurfaceLayer() > mDockLayer && attached.getSurfaceLayer() < mDockLayer) {
// Here's a special case: if this attached window is a panel that is above the dock
// window, and the window it is attached to is below the dock window, then the frames we
// computed for the window it is attached to can not be used because the dock is
// effectively part of the underlying window and the attached window is floating on top
// of the whole thing. So, we ignore the attached window and explicitly compute the
// frames that would be appropriate without the dock.
if (!win.isInputMethodTarget() && attached.isInputMethodTarget()) {
// Here's a special case: if the child window is not the 'dock window'
// or input method target, and the window it is attached to is below
// the dock window, then the frames we computed for the window it is
// attached to can not be used because the dock is effectively part
// of the underlying window and the attached window is floating on top
// of the whole thing. So, we ignore the attached window and explicitly
// compute the frames that would be appropriate without the dock.
vf.set(displayFrames.mDock);
cf.set(displayFrames.mDock);
of.set(displayFrames.mDock);
@@ -5009,7 +5010,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
cf.set(attached.getContentFrameLw());
if (attached.isVoiceInteraction()) {
cf.intersectUnchecked(displayFrames.mVoiceContent);
} else if (attached.getSurfaceLayer() < mDockLayer) {
} else if (win.isInputMethodTarget() || attached.isInputMethodTarget()) {
cf.intersectUnchecked(displayFrames.mContent);
}
}
@@ -5500,7 +5501,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
win.computeFrameLw(pf, df, of, cf, vf, dcf, sf, osf, displayFrames.mDisplayCutout,
parentFrameWasClippedByDisplayCutout);
// Dock windows carve out the bottom of the screen, so normal windows
// can't appear underneath them.
if (type == TYPE_INPUT_METHOD && win.isVisibleLw()

View File

@@ -474,6 +474,8 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
public boolean isInputMethodWindow();
public boolean isInputMethodTarget();
public int getDisplayId();
/**

View File

@@ -897,7 +897,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
final WindowState imeWin = mService.mInputMethodWindow;
// IME is up and obscuring this window. Adjust the window position so it is visible.
if (imeWin != null && imeWin.isVisibleNow() && mService.mInputMethodTarget == this) {
if (imeWin != null && imeWin.isVisibleNow() && isInputMethodTarget()) {
if (inFreeformWindowingMode()
&& mContainingFrame.bottom > contentFrame.bottom) {
// In freeform we want to move the top up directly.
@@ -1691,13 +1691,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return changed;
}
// Next up we will notify the client that it's visibility has changed.
// We need to prevent it from destroying child surfaces until
// the animation has finished.
if (!visible && isVisibleNow()) {
mWinAnimator.detachChildren();
}
if (visible != isVisibleNow()) {
if (!runningAppAnimation) {
final AccessibilityController accessibilityController =
@@ -1885,7 +1878,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
final DisplayContent dc = getDisplayContent();
if (mService.mInputMethodTarget == this) {
if (isInputMethodTarget()) {
dc.computeImeTarget(true /* updateImeTarget */);
}
@@ -3949,7 +3942,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private boolean applyInOrderWithImeWindows(ToBooleanFunction<WindowState> callback,
boolean traverseTopToBottom) {
if (traverseTopToBottom) {
if (mService.mInputMethodTarget == this) {
if (isInputMethodTarget()) {
// This window is the current IME target, so we need to process the IME windows
// directly above it.
if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
@@ -3963,7 +3956,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (callback.apply(this)) {
return true;
}
if (mService.mInputMethodTarget == this) {
if (isInputMethodTarget()) {
// This window is the current IME target, so we need to process the IME windows
// directly above it.
if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
@@ -4673,7 +4666,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void assignLayer(Transaction t, int layer) {
// See comment in assignRelativeLayerForImeTargetChild
if (!isChildWindow()
|| (mService.mInputMethodTarget != getParentWindow())
|| (!getParentWindow().isInputMethodTarget())
|| !inSplitScreenWindowingMode()) {
super.assignLayer(t, layer);
return;
@@ -4741,6 +4734,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mTapExcludeRegionHolder.amendRegion(region, getBounds());
}
@Override
public boolean isInputMethodTarget() {
return mService.mInputMethodTarget == this;
}
private final class MoveAnimationSpec implements AnimationSpec {
private final long mDuration;

View File

@@ -258,4 +258,9 @@ public class FakeWindowState implements WindowManagerPolicy.WindowState {
public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId){
throw new UnsupportedOperationException("not implemented");
}
@Override
public boolean isInputMethodTarget() {
return false;
}
}