Merge "Update insets state for each window if its mBehindIme is changed" into rvc-dev

This commit is contained in:
Jorim Jaggi
2020-04-02 10:54:47 +00:00
committed by Android (Google) Code Review
3 changed files with 59 additions and 1 deletions

View File

@@ -503,6 +503,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
/** Windows removed since {@link #mCurrentFocus} was set to null. Used for ANR blaming. */ /** Windows removed since {@link #mCurrentFocus} was set to null. Used for ANR blaming. */
final ArrayList<WindowState> mWinRemovedSinceNullFocus = new ArrayList<>(); final ArrayList<WindowState> mWinRemovedSinceNullFocus = new ArrayList<>();
/** Windows whose client's insets states are not up-to-date. */
final ArrayList<WindowState> mWinInsetsChanged = new ArrayList<>();
private ScreenRotationAnimation mScreenRotationAnimation; private ScreenRotationAnimation mScreenRotationAnimation;
/** /**
@@ -708,7 +711,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
} }
// Sets mBehindIme for each window. Windows behind IME can get IME insets. // Sets mBehindIme for each window. Windows behind IME can get IME insets.
w.mBehindIme = mTmpWindowsBehindIme; if (w.mBehindIme != mTmpWindowsBehindIme) {
w.mBehindIme = mTmpWindowsBehindIme;
mWinInsetsChanged.add(w);
}
if (w == mInputMethodWindow) { if (w == mInputMethodWindow) {
mTmpWindowsBehindIme = true; mTmpWindowsBehindIme = true;
} }

View File

@@ -227,10 +227,19 @@ class InsetsStateController {
for (int i = mProviders.size() - 1; i >= 0; i--) { for (int i = mProviders.size() - 1; i >= 0; i--) {
mProviders.valueAt(i).onPostLayout(); mProviders.valueAt(i).onPostLayout();
} }
final ArrayList<WindowState> winInsetsChanged = mDisplayContent.mWinInsetsChanged;
if (!mLastState.equals(mState)) { if (!mLastState.equals(mState)) {
mLastState.set(mState, true /* copySources */); mLastState.set(mState, true /* copySources */);
notifyInsetsChanged(); notifyInsetsChanged();
} else {
// The global insets state has not changed but there might be windows whose conditions
// (e.g., z-order) have changed. They can affect the insets states that we dispatch to
// the clients.
for (int i = winInsetsChanged.size() - 1; i >= 0; i--) {
winInsetsChanged.get(i).notifyInsetsChanged();
}
} }
winInsetsChanged.clear();
} }
void onInsetsModified(InsetsControlTarget windowState, InsetsState state) { void onInsetsModified(InsetsControlTarget windowState, InsetsState state) {

View File

@@ -32,6 +32,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.graphics.Rect; import android.graphics.Rect;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
@@ -168,6 +172,45 @@ public class InsetsStateControllerTest extends WindowTestsBase {
assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME)); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
} }
@Test
public void testStripForDispatch_imeOrderChanged() {
getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
// This window can be the IME target while app cannot be the IME target.
createWindow(null, TYPE_APPLICATION, "base");
// Send our spy window (app) into the system so that we can detect the invocation.
final WindowState win = createWindow(null, TYPE_APPLICATION, "app");
final WindowToken parent = win.mToken;
parent.removeChild(win);
final WindowState app = spy(win);
parent.addWindow(app);
// Adding FLAG_NOT_FOCUSABLE makes app above IME.
app.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
mDisplayContent.computeImeTarget(true);
mDisplayContent.setLayoutNeeded();
mDisplayContent.applySurfaceChangesTransaction();
// app won't get IME insets while above IME.
assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
// Reset invocation counter.
clearInvocations(app);
// Removing FLAG_NOT_FOCUSABLE makes app below IME.
app.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE;
mDisplayContent.computeImeTarget(true);
mDisplayContent.setLayoutNeeded();
mDisplayContent.applySurfaceChangesTransaction();
// Make sure app got notified.
verify(app, atLeast(1)).notifyInsetsChanged();
// app will get IME insets while below IME.
assertNotNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_IME));
}
@Test @Test
public void testStripForDispatch_childWindow_altFocusable() { public void testStripForDispatch_childWindow_altFocusable() {
final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app");