diff options
| author | 2020-05-28 15:09:34 +0000 | |
|---|---|---|
| committer | 2020-05-28 15:09:34 +0000 | |
| commit | 9f2c436699edbf315e767c04a92d96654838092b (patch) | |
| tree | 42407eb45954cf9552b074231860fe2b4eb0eb6e | |
| parent | 77db95ce850b6f9fc8206c86e925d71d48fcef02 (diff) | |
| parent | 9bebe19d680fadce592bf7629cc1d2935f1ac973 (diff) | |
Merge "Allow IME to show when control target differs from DC target" into rvc-dev
| -rw-r--r-- | services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java | 11 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java | 59 | 
2 files changed, 68 insertions, 2 deletions
| diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index a0985fc48422..8298763c1392 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -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;  /** @@ -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. @@ -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;          } @@ -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));      }  } diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java new file mode 100644 index 000000000000..ca739c0dd389 --- /dev/null +++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java @@ -0,0 +1,59 @@ +/* + * 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()); +    } +} |