Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66d300bd authored by Ming-Shin Lu's avatar Ming-Shin Lu Committed by Android (Google) Code Review
Browse files

Merge "Fix IME being shifted when the app setRequestedOrientation"

parents e43bd460 45537b75
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -2374,7 +2374,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        // IME parent may failed to attach to the app during rotating the screen.
        // See DisplayContent#shouldImeAttachedToApp, DisplayContent#isImeControlledByApp
        if (windowConfigChanged) {
            getDisplayContent().updateImeControlTarget();
            // If the window was the IME layering target, updates the IME surface parent in case
            // the IME surface may be wrongly positioned when the window configuration affects the
            // IME surface association. (e.g. Attach IME surface on the display instead of the
            // app when the app bounds being letterboxed.)
            mDisplayContent.updateImeControlTarget(isImeLayeringTarget() /* updateImeParent */);
        }
    }

+3 −1
Original line number Diff line number Diff line
@@ -1145,7 +1145,9 @@ public class WindowStateTests extends WindowTestsBase {
        spyOn(app.getDisplayContent());
        app.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_FULLSCREEN);

        verify(app.getDisplayContent()).updateImeControlTarget();
        // Expect updateImeParent will be invoked when the configuration of the IME control
        // target has changed.
        verify(app.getDisplayContent()).updateImeControlTarget(eq(true) /* updateImeParent */);
        assertEquals(mAppWindow, mDisplayContent.getImeTarget(IME_TARGET_CONTROL).getWindow());
    }

+13 −0
Original line number Diff line number Diff line
@@ -119,4 +119,17 @@ constructor(
        }
        return false
    }

    fun toggleFixPortraitOrientation(wmHelper: WindowManagerStateHelper) {
        val button = uiDevice.wait(Until.findObject(By.res(getPackage(),
                "toggle_fixed_portrait_btn")), FIND_TIMEOUT)
        require(button != null) {
            "Button not found, this usually happens when the device " +
                    "was left in an unknown state (e.g. Screen turned off)"
        }
        button.click()
        mInstrumentation.waitForIdleSync()
        // Ensure app relaunching transition finish and the IME has shown
        waitIMEShown(wmHelper)
    }
}
+124 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.server.wm.flicker.ime

import android.platform.test.annotations.Postsubmit
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.BaseTest
import com.android.server.wm.flicker.FlickerBuilder
import com.android.server.wm.flicker.junit.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTest
import com.android.server.wm.flicker.FlickerTestFactory
import com.android.server.wm.flicker.helpers.ImeAppAutoFocusHelper
import com.android.server.wm.flicker.helpers.WindowUtils
import com.android.server.wm.flicker.traces.region.RegionSubject
import com.android.server.wm.traces.common.ComponentNameMatcher
import com.android.server.wm.traces.common.service.PlatformConsts
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import org.junit.runners.Parameterized

/**
 * Test IME window shown on the app with fixing portrait orientation.
 * To run this test: `atest FlickerTests:OpenImeWindowToFixedPortraitAppTest`
 */
@RequiresDevice
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class OpenImeWindowToFixedPortraitAppTest(flicker: FlickerTest) : BaseTest(flicker) {
    private val testApp = ImeAppAutoFocusHelper(instrumentation, flicker.scenario.startRotation)

    /** {@inheritDoc} */
    override val transition: FlickerBuilder.() -> Unit = {
        setup {
            testApp.launchViaIntent(wmHelper)
            testApp.openIME(wmHelper)
            // Enable letterbox when the app calls setRequestedOrientation
            device.executeShellCommand("cmd window set-ignore-orientation-request true")
        }
        transitions {
            testApp.toggleFixPortraitOrientation(wmHelper)
        }
        teardown {
            testApp.exit()
            device.executeShellCommand("cmd window set-ignore-orientation-request false")
        }
    }

    @Postsubmit
    @Test
    fun imeLayerVisibleStart() {
        flicker.assertLayersStart {
            this.isVisible(ComponentNameMatcher.IME)
        }
    }

    @Postsubmit
    @Test
    fun imeLayerExistsEnd() {
        flicker.assertLayersEnd {
            this.isVisible(ComponentNameMatcher.IME)
        }
    }

    @Postsubmit
    @Test
    fun imeLayerVisibleRegionKeepsTheSame() {
        var imeLayerVisibleRegionBeforeTransition: RegionSubject? = null
        flicker.assertLayersStart {
            imeLayerVisibleRegionBeforeTransition = this.visibleRegion(ComponentNameMatcher.IME)
        }
        flicker.assertLayersEnd {
            this.visibleRegion(ComponentNameMatcher.IME)
                    .coversExactly(imeLayerVisibleRegionBeforeTransition!!.region)
        }
    }

    @Postsubmit
    @Test
    fun appWindowWithLetterboxCoversExactlyOnScreen() {
        val displayBounds = WindowUtils.getDisplayBounds(flicker.scenario.startRotation)
        flicker.assertLayersEnd {
            this.visibleRegion(testApp.or(ComponentNameMatcher.LETTERBOX))
                    .coversExactly(displayBounds)
        }
    }

    companion object {
        /**
         * Creates the test configurations.
         *
         * See [FlickerTestFactory.nonRotationTests] for configuring screen orientation and
         * navigation modes.
         */
        @Parameterized.Parameters(name = "{0}")
        @JvmStatic
        fun getParams(): Collection<FlickerTest> {
            return FlickerTestFactory.nonRotationTests(
                            supportedRotations = listOf(
                                PlatformConsts.Rotation.ROTATION_90,
                            ),
                            supportedNavigationModes = listOf(
                                PlatformConsts.NavBar.MODE_3BUTTON,
                                PlatformConsts.NavBar.MODE_GESTURAL
                            )
                    )
        }
    }
}
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@
                  android:theme="@style/CutoutShortEdges"
                  android:taskAffinity="com.android.server.wm.flicker.testapp.ImeActivityAutoFocus"
                  android:windowSoftInputMode="stateVisible"
                  android:configChanges="orientation|screenSize"
                  android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
                  android:label="ImeAppAutoFocus"
                  android:exported="true">
            <intent-filter>
Loading