Merge "Consolidate clearing mImeInsetsFrozenUntilStartInput" into sc-qpr1-dev am: 9ae4d14f5d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16375908

Change-Id: Ia3dce21e5a4198086df914d50299f9513eff108c
This commit is contained in:
TreeHugger Robot
2021-12-07 13:54:53 +00:00
committed by Automerger Merge Worker
4 changed files with 44 additions and 4 deletions

View File

@@ -2837,7 +2837,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return;
}
final IBinder targetWindow = mImeTargetWindowMap.get(startInputToken);
if (targetWindow != null && mLastImeTargetWindow != targetWindow) {
if (targetWindow != null) {
mWindowManagerInternal.updateInputMethodTargetWindow(token, targetWindow);
}
mLastImeTargetWindow = targetWindow;

View File

@@ -1038,6 +1038,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
pw.print(" forceNewConfig="); pw.println(forceNewConfig);
pw.print(prefix); pw.print("mActivityType=");
pw.println(activityTypeToString(getActivityType()));
pw.print(prefix); pw.print("mImeInsetsFrozenUntilStartInput=");
pw.println(mImeInsetsFrozenUntilStartInput);
if (requestedVrComponent != null) {
pw.print(prefix);
pw.print("requestedVrComponent=");

View File

@@ -3969,11 +3969,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* which controls the visibility and animation of the input method window.
*/
void updateImeInputAndControlTarget(WindowState target) {
if (target != null && target.mActivityRecord != null) {
target.mActivityRecord.mImeInsetsFrozenUntilStartInput = false;
}
if (mImeInputTarget != target) {
ProtoLog.i(WM_DEBUG_IME, "setInputMethodInputTarget %s", target);
if (target != null && target.mActivityRecord != null) {
target.mActivityRecord.mImeInsetsFrozenUntilStartInput = false;
}
setImeInputTarget(target);
updateImeControlTarget();
}

View File

@@ -37,6 +37,7 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.os.Process.NOBODY_UID;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.InsetsState.ITYPE_IME;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
@@ -127,6 +128,8 @@ import android.view.IRemoteAnimationFinishedCallback;
import android.view.IRemoteAnimationRunner.Stub;
import android.view.IWindowManager;
import android.view.IWindowSession;
import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationTarget;
import android.view.Surface;
@@ -2884,6 +2887,41 @@ public class ActivityRecordTests extends WindowTestsBase {
assertFalse(app.mActivityRecord.mImeInsetsFrozenUntilStartInput);
}
@UseTestDisplay(addWindows = W_INPUT_METHOD)
@Test
public void testImeInsetsFrozenFlag_resetWhenReportedToBeImeInputTarget() {
final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
InsetsSource imeSource = new InsetsSource(ITYPE_IME);
app.getInsetsState().addSource(imeSource);
mDisplayContent.setImeLayeringTarget(app);
mDisplayContent.updateImeInputAndControlTarget(app);
InsetsState state = mDisplayContent.getInsetsPolicy().getInsetsForWindow(app);
assertFalse(state.getSource(ITYPE_IME).isVisible());
assertTrue(state.getSource(ITYPE_IME).getFrame().isEmpty());
// Simulate app is closing and expect IME insets is frozen.
mDisplayContent.mOpeningApps.clear();
app.mActivityRecord.commitVisibility(false, false);
app.mActivityRecord.onWindowsGone();
assertTrue(app.mActivityRecord.mImeInsetsFrozenUntilStartInput);
// Simulate app re-start input or turning screen off/on then unlocked by un-secure
// keyguard to back to the app, expect IME insets is not frozen
imeSource.setFrame(new Rect(100, 400, 500, 500));
app.getInsetsState().addSource(imeSource);
app.getInsetsState().setSourceVisible(ITYPE_IME, true);
mDisplayContent.updateImeInputAndControlTarget(app);
assertFalse(app.mActivityRecord.mImeInsetsFrozenUntilStartInput);
// Verify when IME is visible and the app can receive the right IME insets from policy.
makeWindowVisibleAndDrawn(app, mImeWindow);
state = mDisplayContent.getInsetsPolicy().getInsetsForWindow(app);
assertTrue(state.getSource(ITYPE_IME).isVisible());
assertEquals(state.getSource(ITYPE_IME).getFrame(), imeSource.getFrame());
}
private void assertHasStartingWindow(ActivityRecord atoken) {
assertNotNull(atoken.mStartingSurface);
assertNotNull(atoken.mStartingData);