Loading services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +9 −2 Original line number Diff line number Diff line Loading @@ -18,9 +18,11 @@ package com.android.server.wm; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_IME; import android.graphics.PixelFormat; import android.view.InsetsSource; import android.view.WindowInsets; import com.android.internal.annotations.VisibleForTesting; import com.android.server.protolog.common.ProtoLog; /** Loading Loading @@ -107,7 +109,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { mShowImeRunner = null; } private boolean isImeTargetFromDisplayContentAndImeSame() { @VisibleForTesting boolean isImeTargetFromDisplayContentAndImeSame() { // IMMS#mLastImeTargetWindow always considers focused window as // IME target, however DisplayContent#computeImeTarget() can compute // a different IME target. Loading @@ -118,6 +121,7 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { // TODO(b/139861270): Remove the child & sublayer check once IMMS is aware of // actual IME target. final WindowState dcTarget = mDisplayContent.mInputMethodTarget; final InsetsControlTarget controlTarget = mDisplayContent.mInputMethodControlTarget; if (dcTarget == null || mImeTargetFromIme == null) { return false; } Loading @@ -127,6 +131,9 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget) || (mImeTargetFromIme != null && dcTarget.getParentWindow() == mImeTargetFromIme && dcTarget.mSubLayer > mImeTargetFromIme.mSubLayer) || mImeTargetFromIme == mDisplayContent.getImeFallback(); || mImeTargetFromIme == mDisplayContent.getImeFallback() // If IME target is transparent but control target matches requesting window. || (controlTarget == mImeTargetFromIme && PixelFormat.formatHasAlpha(dcTarget.mAttrs.format)); } } services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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; import static android.view.InsetsState.ITYPE_IME; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static org.junit.Assert.assertTrue; import android.graphics.PixelFormat; import android.platform.test.annotations.Presubmit; import android.view.InsetsSource; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @Presubmit @RunWith(WindowTestRunner.class) public class ImeInsetsSourceProviderTest extends WindowTestsBase { private InsetsSource mImeSource = new InsetsSource(ITYPE_IME); private ImeInsetsSourceProvider mImeProvider; @Before public void setUp() throws Exception { mImeSource.setVisible(true); mImeProvider = new ImeInsetsSourceProvider(mImeSource, mDisplayContent.getInsetsStateController(), mDisplayContent); } @Test public void testTransparentControlTargetWindowCanShowIme() { final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app"); final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup"); mDisplayContent.mInputMethodControlTarget = popup; mDisplayContent.mInputMethodTarget = appWin; popup.mAttrs.format = PixelFormat.TRANSPARENT; mImeProvider.scheduleShowImePostLayout(appWin); assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame()); } } Loading
services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +9 −2 Original line number Diff line number Diff line Loading @@ -18,9 +18,11 @@ package com.android.server.wm; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_IME; import android.graphics.PixelFormat; import android.view.InsetsSource; import android.view.WindowInsets; import com.android.internal.annotations.VisibleForTesting; import com.android.server.protolog.common.ProtoLog; /** Loading Loading @@ -107,7 +109,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { mShowImeRunner = null; } private boolean isImeTargetFromDisplayContentAndImeSame() { @VisibleForTesting boolean isImeTargetFromDisplayContentAndImeSame() { // IMMS#mLastImeTargetWindow always considers focused window as // IME target, however DisplayContent#computeImeTarget() can compute // a different IME target. Loading @@ -118,6 +121,7 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { // TODO(b/139861270): Remove the child & sublayer check once IMMS is aware of // actual IME target. final WindowState dcTarget = mDisplayContent.mInputMethodTarget; final InsetsControlTarget controlTarget = mDisplayContent.mInputMethodControlTarget; if (dcTarget == null || mImeTargetFromIme == null) { return false; } Loading @@ -127,6 +131,9 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget) || (mImeTargetFromIme != null && dcTarget.getParentWindow() == mImeTargetFromIme && dcTarget.mSubLayer > mImeTargetFromIme.mSubLayer) || mImeTargetFromIme == mDisplayContent.getImeFallback(); || mImeTargetFromIme == mDisplayContent.getImeFallback() // If IME target is transparent but control target matches requesting window. || (controlTarget == mImeTargetFromIme && PixelFormat.formatHasAlpha(dcTarget.mAttrs.format)); } }
services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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; import static android.view.InsetsState.ITYPE_IME; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static org.junit.Assert.assertTrue; import android.graphics.PixelFormat; import android.platform.test.annotations.Presubmit; import android.view.InsetsSource; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @Presubmit @RunWith(WindowTestRunner.class) public class ImeInsetsSourceProviderTest extends WindowTestsBase { private InsetsSource mImeSource = new InsetsSource(ITYPE_IME); private ImeInsetsSourceProvider mImeProvider; @Before public void setUp() throws Exception { mImeSource.setVisible(true); mImeProvider = new ImeInsetsSourceProvider(mImeSource, mDisplayContent.getInsetsStateController(), mDisplayContent); } @Test public void testTransparentControlTargetWindowCanShowIme() { final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app"); final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup"); mDisplayContent.mInputMethodControlTarget = popup; mDisplayContent.mInputMethodTarget = appWin; popup.mAttrs.format = PixelFormat.TRANSPARENT; mImeProvider.scheduleShowImePostLayout(appWin); assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame()); } }