Merge "Freezing IME insets when screen turned-off"

This commit is contained in:
Ming-Shin Lu
2022-11-09 10:24:28 +00:00
committed by Android (Google) Code Review
3 changed files with 64 additions and 1 deletions

View File

@@ -1638,7 +1638,16 @@ public class DisplayPolicy {
*/
private void applyKeyguardPolicy(WindowState win, WindowState imeTarget) {
if (win.canBeHiddenByKeyguard()) {
if (shouldBeHiddenByKeyguard(win, imeTarget)) {
final boolean shouldBeHiddenByKeyguard = shouldBeHiddenByKeyguard(win, imeTarget);
if (win.mIsImWindow) {
// Notify IME insets provider to freeze the IME insets. In case when turning off
// the screen, the IME insets source window will be hidden because of keyguard
// policy change and affects the system to freeze the last insets state. (And
// unfreeze when the IME is going to show)
mDisplayContent.getInsetsStateController().getImeSourceProvider().setFrozen(
shouldBeHiddenByKeyguard);
}
if (shouldBeHiddenByKeyguard) {
win.hide(false /* doAnimation */, true /* requestAnim */);
} else {
win.show(false /* doAnimation */, true /* requestAnim */);

View File

@@ -55,6 +55,12 @@ final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider
private boolean mImeShowing;
private final InsetsSource mLastSource = new InsetsSource(ITYPE_IME);
/** @see #setFrozen(boolean) */
private boolean mFrozen;
/** @see #setServerVisible(boolean) */
private boolean mServerVisible;
ImeInsetsSourceProvider(InsetsSource source,
InsetsStateController stateController, DisplayContent displayContent) {
super(source, stateController, displayContent);
@@ -80,6 +86,32 @@ final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider
return control;
}
@Override
void setServerVisible(boolean serverVisible) {
mServerVisible = serverVisible;
if (!mFrozen) {
super.setServerVisible(serverVisible);
}
}
/**
* Freeze IME insets source state when required.
*
* When setting {@param frozen} as {@code true}, the IME insets provider will freeze the
* current IME insets state and pending the IME insets state update until setting
* {@param frozen} as {@code false}.
*/
void setFrozen(boolean frozen) {
if (mFrozen == frozen) {
return;
}
mFrozen = frozen;
if (!frozen) {
// Unfreeze and process the pending IME insets states.
super.setServerVisible(mServerVisible);
}
}
@Override
void updateSourceFrame(Rect frame) {
super.updateSourceFrame(frame);

View File

@@ -85,4 +85,26 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase {
mImeProvider.setImeShowing(false);
assertFalse(mImeProvider.isImeShowing());
}
@Test
public void testSetFrozen() {
WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
makeWindowVisibleAndDrawn(ime);
mImeProvider.setWindowContainer(ime, null, null);
mImeProvider.setServerVisible(true);
mImeProvider.setClientVisible(true);
mImeProvider.updateVisibility();
assertTrue(mImeProvider.getSource().isVisible());
// Freezing IME states and set the server visible as false.
mImeProvider.setFrozen(true);
mImeProvider.setServerVisible(false);
// Expect the IME insets visible won't be changed.
assertTrue(mImeProvider.getSource().isVisible());
// Unfreeze IME states and expect the IME insets became invisible due to pending IME
// visible state updated.
mImeProvider.setFrozen(false);
assertFalse(mImeProvider.getSource().isVisible());
}
}