Relax condition to hide unready IME with fixed rotation

This reduces flickering when opening app in a different
orientation with IME, and the layering target is not the
opening app due to a ALT_FOCUSABLE_IM floating window.

Also
- Make sure mLastConfigReportedToClient detect changes
  if the window (e.g. IME) is a config listener of process.
  So it can report to redraw.
- Reduce duplicated hidden operation.

Bug: 271352469
Test: DisplayContentTests#testApplyTopFixedRotationTransform
Change-Id: I6d24b0ee5294f0e7e145a4cf24e1b142dc8569d6
This commit is contained in:
Riddle Hsu
2023-03-03 16:29:27 +08:00
parent dd218cbaf8
commit 6c625f68c7
4 changed files with 8 additions and 6 deletions

View File

@@ -364,6 +364,7 @@ class AsyncRotationController extends FadeAnimationController implements Consume
/** Hides the window immediately until it is drawn in new rotation. */
void hideImmediately(WindowToken windowToken) {
if (isTargetToken(windowToken)) return;
final boolean original = mHideImmediately;
mHideImmediately = true;
final Operation op = new Operation(Operation.ACTION_FADE);

View File

@@ -4150,13 +4150,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
/** @see WindowManagerInternal#onToggleImeRequested */
void onShowImeRequested() {
if (mImeLayeringTarget == null || mInputMethodWindow == null) {
if (mInputMethodWindow == null) {
return;
}
// If IME window will be shown on the rotated activity, share the transformed state to
// IME window so it can compute rotated frame with rotated configuration.
if (mImeLayeringTarget.mToken.isFixedRotationTransforming()) {
mInputMethodWindow.mToken.linkFixedRotationTransform(mImeLayeringTarget.mToken);
if (mFixedRotationLaunchingApp != null) {
mInputMethodWindow.mToken.linkFixedRotationTransform(mFixedRotationLaunchingApp);
// Hide the window until the rotation is done to avoid intermediate artifacts if the
// parent surface of IME container is changed.
if (mAsyncRotationController != null) {

View File

@@ -2342,9 +2342,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
public void onConfigurationChanged(Configuration newParentConfig) {
mTempConfiguration.setTo(getConfiguration());
// Get from super to avoid using the updated global config from the override method.
final Configuration selfConfiguration = super.getConfiguration();
mTempConfiguration.setTo(selfConfiguration);
super.onConfigurationChanged(newParentConfig);
final int diff = getConfiguration().diff(mTempConfiguration);
final int diff = selfConfiguration.diff(mTempConfiguration);
if (diff != 0) {
mLastConfigReportedToClient = false;
}

View File

@@ -1620,7 +1620,6 @@ public class DisplayContentTests extends WindowTestsBase {
// If the rotated activity requests to show IME, the IME window should use the
// transformation from activity to lay out in the same orientation.
mDisplayContent.setImeLayeringTarget(mAppWindow);
LocalServices.getService(WindowManagerInternal.class).onToggleImeRequested(true /* show */,
app.token, app.token, mDisplayContent.mDisplayId);
assertTrue(asyncRotationController.isTargetToken(mImeWindow.mToken));