blob: 39cdd2cb907ecce8eb95bc56d9d2ce1e9d206ab2 [file] [log] [blame]
Jorim Jaggif96c90a2018-09-26 16:55:15 +02001/*
2 * Copyright (C) 2018 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
17package com.android.server.wm;
18
Tiger Huang332793b2019-10-29 23:21:27 +080019import static android.view.InsetsState.ITYPE_IME;
20import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
21import static android.view.InsetsState.ITYPE_STATUS_BAR;
Yunfan Chenb04dc002019-02-14 17:08:39 +090022import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
Jorim Jaggif96c90a2018-09-26 16:55:15 +020023import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
24import static org.junit.Assert.assertEquals;
Jorim Jaggi28620472019-01-02 23:21:49 +010025import static org.junit.Assert.assertNotEquals;
Jorim Jaggif96c90a2018-09-26 16:55:15 +020026import static org.junit.Assert.assertNotNull;
Jorim Jaggib6030952018-10-23 18:31:52 +020027import static org.junit.Assert.assertNull;
Jorim Jaggif96c90a2018-09-26 16:55:15 +020028
Jorim Jaggi9b4f4202020-01-28 17:05:06 +010029import android.graphics.Rect;
Jorim Jaggif96c90a2018-09-26 16:55:15 +020030import android.platform.test.annotations.Presubmit;
Jorim Jaggi28620472019-01-02 23:21:49 +010031import android.view.InsetsSource;
Jorim Jaggib6030952018-10-23 18:31:52 +020032import android.view.InsetsSourceControl;
Jorim Jaggif96c90a2018-09-26 16:55:15 +020033import android.view.InsetsState;
Jorim Jaggi28620472019-01-02 23:21:49 +010034import android.view.test.InsetsModeSession;
Jorim Jaggif96c90a2018-09-26 16:55:15 +020035
Yunfan Chenb04dc002019-02-14 17:08:39 +090036import org.junit.AfterClass;
37import org.junit.BeforeClass;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090038import org.junit.Test;
Jorim Jaggi28620472019-01-02 23:21:49 +010039import org.junit.runner.RunWith;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090040
Jorim Jaggi9b4f4202020-01-28 17:05:06 +010041import androidx.test.filters.FlakyTest;
42import androidx.test.filters.SmallTest;
43
Jorim Jaggif96c90a2018-09-26 16:55:15 +020044@SmallTest
Jorim Jaggi28620472019-01-02 23:21:49 +010045@FlakyTest(detail = "Promote to pre-submit once confirmed stable.")
Jorim Jaggif96c90a2018-09-26 16:55:15 +020046@Presubmit
Jorim Jaggi28620472019-01-02 23:21:49 +010047@RunWith(WindowTestRunner.class)
Jorim Jaggif96c90a2018-09-26 16:55:15 +020048public class InsetsStateControllerTest extends WindowTestsBase {
Jorim Jaggi28620472019-01-02 23:21:49 +010049 private static InsetsModeSession sInsetsModeSession;
Yunfan Chenb04dc002019-02-14 17:08:39 +090050
51 @BeforeClass
52 public static void setUpOnce() {
Yunfan Chenb04dc002019-02-14 17:08:39 +090053 // To let the insets provider control the insets visibility, the insets mode has to be
54 // NEW_INSETS_MODE_FULL.
Jorim Jaggi28620472019-01-02 23:21:49 +010055 sInsetsModeSession = new InsetsModeSession(NEW_INSETS_MODE_FULL);
Yunfan Chenb04dc002019-02-14 17:08:39 +090056 }
57
58 @AfterClass
59 public static void tearDownOnce() {
Jorim Jaggi28620472019-01-02 23:21:49 +010060 sInsetsModeSession.close();
Yunfan Chenb04dc002019-02-14 17:08:39 +090061 }
Jorim Jaggif96c90a2018-09-26 16:55:15 +020062
63 @Test
Wale Ogunwale8e85aee2019-04-30 15:55:05 -070064 @FlakyTest(bugId = 131005232)
Jorim Jaggif96c90a2018-09-26 16:55:15 +020065 public void testStripForDispatch_notOwn() {
Tiger Huang332793b2019-10-29 23:21:27 +080066 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
Jorim Jaggi28620472019-01-02 23:21:49 +010067 final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
Jorim Jaggi9b4f4202020-01-28 17:05:06 +010068 getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
Tiger Huang332793b2019-10-29 23:21:27 +080069 statusBar.setControllableInsetProvider(getController().getSourceProvider(ITYPE_STATUS_BAR));
70 assertNotNull(getController().getInsetsForDispatch(app).getSource(ITYPE_STATUS_BAR));
Jorim Jaggif96c90a2018-09-26 16:55:15 +020071 }
72
73 @Test
74 public void testStripForDispatch_own() {
Tiger Huang332793b2019-10-29 23:21:27 +080075 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
76 mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_STATUS_BAR)
Jorim Jaggi9b4f4202020-01-28 17:05:06 +010077 .setWindow(statusBar, null, null);
Tiger Huang332793b2019-10-29 23:21:27 +080078 statusBar.setControllableInsetProvider(getController().getSourceProvider(ITYPE_STATUS_BAR));
79 final InsetsState state = getController().getInsetsForDispatch(statusBar);
Jorim Jaggi28620472019-01-02 23:21:49 +010080 for (int i = state.getSourcesCount() - 1; i >= 0; i--) {
81 final InsetsSource source = state.sourceAt(i);
Tiger Huang332793b2019-10-29 23:21:27 +080082 assertNotEquals(ITYPE_STATUS_BAR, source.getType());
Jorim Jaggi28620472019-01-02 23:21:49 +010083 }
Jorim Jaggif96c90a2018-09-26 16:55:15 +020084 }
85
86 @Test
87 public void testStripForDispatch_navBar() {
Jorim Jaggi28620472019-01-02 23:21:49 +010088 final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar");
Tiger Huang332793b2019-10-29 23:21:27 +080089 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
Jorim Jaggi28620472019-01-02 23:21:49 +010090 final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
Jorim Jaggi9b4f4202020-01-28 17:05:06 +010091 getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
92 getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
93 getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
Jorim Jaggi28620472019-01-02 23:21:49 +010094 assertEquals(0, getController().getInsetsForDispatch(navBar).getSourcesCount());
Jorim Jaggib6030952018-10-23 18:31:52 +020095 }
96
97 @Test
Jorim Jaggi9b4f4202020-01-28 17:05:06 +010098 public void testImeForDispatch() {
99 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
100 final WindowState ime = createWindow(null, TYPE_APPLICATION, "ime");
101 InsetsSourceProvider statusBarProvider =
102 getController().getSourceProvider(ITYPE_STATUS_BAR);
103 statusBarProvider.setWindow(statusBar, null, ((displayFrames, windowState, rect) ->
104 rect.set(0, 1, 2, 3)));
105 getController().getSourceProvider(ITYPE_IME).setWindow(ime, null, null);
106 statusBar.setControllableInsetProvider(statusBarProvider);
107
108 statusBarProvider.onPostLayout();
109
110 final InsetsState state = getController().getInsetsForDispatch(ime);
111 assertEquals(new Rect(0, 1, 2, 3), state.getSource(ITYPE_STATUS_BAR).getFrame());
112 }
113
114 @Test
Jorim Jaggib6030952018-10-23 18:31:52 +0200115 public void testBarControllingWinChanged() {
Jorim Jaggi28620472019-01-02 23:21:49 +0100116 final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar");
Tiger Huang332793b2019-10-29 23:21:27 +0800117 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
Jorim Jaggi28620472019-01-02 23:21:49 +0100118 final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
Jorim Jaggi9b4f4202020-01-28 17:05:06 +0100119 getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
120 getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null);
Jorim Jaggi956ca412019-01-07 14:49:14 +0100121 getController().onBarControlTargetChanged(app, null, app, null);
Jorim Jaggib6030952018-10-23 18:31:52 +0200122 InsetsSourceControl[] controls = getController().getControlsForDispatch(app);
123 assertEquals(2, controls.length);
124 }
125
126 @Test
127 public void testControlRevoked() {
Tiger Huang332793b2019-10-29 23:21:27 +0800128 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
Jorim Jaggi28620472019-01-02 23:21:49 +0100129 final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
Jorim Jaggi9b4f4202020-01-28 17:05:06 +0100130 getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
Jorim Jaggi956ca412019-01-07 14:49:14 +0100131 getController().onBarControlTargetChanged(app, null, null, null);
Jorim Jaggib6030952018-10-23 18:31:52 +0200132 assertNotNull(getController().getControlsForDispatch(app));
Jorim Jaggi956ca412019-01-07 14:49:14 +0100133 getController().onBarControlTargetChanged(null, null, null, null);
Jorim Jaggib6030952018-10-23 18:31:52 +0200134 assertNull(getController().getControlsForDispatch(app));
135 }
136
Yunfan Chend552c162019-02-08 16:51:28 +0900137 @FlakyTest(bugId = 124088319)
Jorim Jaggib6030952018-10-23 18:31:52 +0200138 @Test
139 public void testControlRevoked_animation() {
Tiger Huang332793b2019-10-29 23:21:27 +0800140 final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
Jorim Jaggi28620472019-01-02 23:21:49 +0100141 final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
Jorim Jaggi9b4f4202020-01-28 17:05:06 +0100142 getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null);
Jorim Jaggi956ca412019-01-07 14:49:14 +0100143 getController().onBarControlTargetChanged(app, null, null, null);
Jorim Jaggib6030952018-10-23 18:31:52 +0200144 assertNotNull(getController().getControlsForDispatch(app));
Tiger Huang332793b2019-10-29 23:21:27 +0800145 statusBar.cancelAnimation();
Jorim Jaggib6030952018-10-23 18:31:52 +0200146 assertNull(getController().getControlsForDispatch(app));
147 }
148
149 private InsetsStateController getController() {
150 return mDisplayContent.getInsetsStateController();
Jorim Jaggif96c90a2018-09-26 16:55:15 +0200151 }
152}