1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.wm;
18 
19 import static android.view.InsetsSource.ID_IME;
20 import static android.view.WindowInsets.Type.ime;
21 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
22 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
23 
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertTrue;
26 
27 import android.graphics.PixelFormat;
28 import android.platform.test.annotations.Presubmit;
29 import android.view.InsetsSource;
30 
31 import androidx.test.filters.SmallTest;
32 
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 
37 @SmallTest
38 @Presubmit
39 @RunWith(WindowTestRunner.class)
40 public class ImeInsetsSourceProviderTest extends WindowTestsBase {
41 
42     private InsetsSource mImeSource = new InsetsSource(ID_IME, ime());
43     private ImeInsetsSourceProvider mImeProvider;
44 
45     @Before
setUp()46     public void setUp() throws Exception {
47         mImeSource.setVisible(true);
48         mImeProvider = new ImeInsetsSourceProvider(mImeSource,
49                 mDisplayContent.getInsetsStateController(), mDisplayContent);
50     }
51 
52     @Test
testTransparentControlTargetWindowCanShowIme()53     public void testTransparentControlTargetWindowCanShowIme() {
54         final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app");
55         final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup");
56         mDisplayContent.setImeControlTarget(popup);
57         mDisplayContent.setImeLayeringTarget(appWin);
58         popup.mAttrs.format = PixelFormat.TRANSPARENT;
59         mImeProvider.scheduleShowImePostLayout(appWin, null /* statsToken */);
60         assertTrue(mImeProvider.isReadyToShowIme());
61     }
62 
63     @Test
testInputMethodInputTargetCanShowIme()64     public void testInputMethodInputTargetCanShowIme() {
65         WindowState target = createWindow(null, TYPE_APPLICATION, "app");
66         mDisplayContent.setImeLayeringTarget(target);
67         mDisplayContent.updateImeInputAndControlTarget(target);
68         mImeProvider.scheduleShowImePostLayout(target, null /* statsToken */);
69         assertTrue(mImeProvider.isReadyToShowIme());
70     }
71 
72     @Test
testIsImeShowing()73     public void testIsImeShowing() {
74         WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
75         makeWindowVisibleAndDrawn(ime);
76         mImeProvider.setWindowContainer(ime, null, null);
77 
78         WindowState target = createWindow(null, TYPE_APPLICATION, "app");
79         mDisplayContent.setImeLayeringTarget(target);
80         mDisplayContent.setImeControlTarget(target);
81 
82         mImeProvider.scheduleShowImePostLayout(target, null /* statsToken */);
83         assertFalse(mImeProvider.isImeShowing());
84         mImeProvider.checkShowImePostLayout();
85         assertTrue(mImeProvider.isImeShowing());
86         mImeProvider.setImeShowing(false);
87         assertFalse(mImeProvider.isImeShowing());
88     }
89 
90     @Test
testSetFrozen()91     public void testSetFrozen() {
92         WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
93         makeWindowVisibleAndDrawn(ime);
94         mImeProvider.setWindowContainer(ime, null, null);
95         mImeProvider.setServerVisible(true);
96         mImeProvider.setClientVisible(true);
97         mImeProvider.updateVisibility();
98         assertTrue(mImeProvider.getSource().isVisible());
99 
100         // Freezing IME states and set the server visible as false.
101         mImeProvider.setFrozen(true);
102         mImeProvider.setServerVisible(false);
103         // Expect the IME insets visible won't be changed.
104         assertTrue(mImeProvider.getSource().isVisible());
105 
106         // Unfreeze IME states and expect the IME insets became invisible due to pending IME
107         // visible state updated.
108         mImeProvider.setFrozen(false);
109         assertFalse(mImeProvider.getSource().isVisible());
110     }
111 }
112