blob: 0f9b7217bd243759a5ce3dd15e8a53426ba1b2ec [file] [log] [blame]
Andrii Kulian1779e612016-10-12 21:58:25 -07001/*
Wale Ogunwale98d62312017-07-12 09:24:56 -07002 * Copyright (C) 2017 The Android Open Source Project
Andrii Kulian1779e612016-10-12 21:58:25 -07003 *
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
Wale Ogunwale98d62312017-07-12 09:24:56 -070017package com.android.server.wm;
Andrii Kulian1779e612016-10-12 21:58:25 -070018
19
20import org.junit.Test;
21import org.junit.runner.RunWith;
22
23import android.content.res.Configuration;
24import android.platform.test.annotations.Presubmit;
25import android.support.test.filters.SmallTest;
26import android.support.test.runner.AndroidJUnit4;
27
28import java.util.ArrayList;
29import java.util.List;
30
31import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
32import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
33import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
34import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
35import static org.junit.Assert.assertEquals;
36
37/**
Wale Ogunwale98d62312017-07-12 09:24:56 -070038 * Test class for {@link ConfigurationContainer}.
Andrii Kulian1779e612016-10-12 21:58:25 -070039 *
Wale Ogunwale98d62312017-07-12 09:24:56 -070040 * Build/Install/Run:
41 * bit FrameworksServicesTests:com.android.server.wm.ConfigurationContainerTests
Andrii Kulian1779e612016-10-12 21:58:25 -070042 */
43@SmallTest
44@Presubmit
45@RunWith(AndroidJUnit4.class)
46public class ConfigurationContainerTests {
47
48 @Test
49 public void testConfigurationInit() throws Exception {
50 // Check root container initial config.
51 final TestConfigurationContainer root = new TestConfigurationContainer();
52 assertEquals(Configuration.EMPTY, root.getOverrideConfiguration());
53 assertEquals(Configuration.EMPTY, root.getMergedOverrideConfiguration());
54 assertEquals(Configuration.EMPTY, root.getConfiguration());
55
56 // Check child initial config.
57 final TestConfigurationContainer child1 = root.addChild();
58 assertEquals(Configuration.EMPTY, child1.getOverrideConfiguration());
59 assertEquals(Configuration.EMPTY, child1.getMergedOverrideConfiguration());
60 assertEquals(Configuration.EMPTY, child1.getConfiguration());
61
62 // Check child initial config if root has overrides.
63 final Configuration rootOverrideConfig = new Configuration();
64 rootOverrideConfig.fontScale = 1.3f;
65 root.onOverrideConfigurationChanged(rootOverrideConfig);
66 final TestConfigurationContainer child2 = root.addChild();
67 assertEquals(Configuration.EMPTY, child2.getOverrideConfiguration());
68 assertEquals(rootOverrideConfig, child2.getMergedOverrideConfiguration());
69 assertEquals(rootOverrideConfig, child2.getConfiguration());
70
71 // Check child initial config if root has parent config set.
72 final Configuration rootParentConfig = new Configuration();
73 rootParentConfig.fontScale = 0.8f;
74 rootParentConfig.orientation = SCREEN_ORIENTATION_LANDSCAPE;
75 root.onConfigurationChanged(rootParentConfig);
76 final Configuration rootFullConfig = new Configuration(rootParentConfig);
77 rootFullConfig.updateFrom(rootOverrideConfig);
78
79 final TestConfigurationContainer child3 = root.addChild();
80 assertEquals(Configuration.EMPTY, child3.getOverrideConfiguration());
81 assertEquals(rootOverrideConfig, child3.getMergedOverrideConfiguration());
82 assertEquals(rootFullConfig, child3.getConfiguration());
83 }
84
85 @Test
86 public void testConfigurationChangeOnAddRemove() throws Exception {
87 // Init root's config.
88 final TestConfigurationContainer root = new TestConfigurationContainer();
89 final Configuration rootOverrideConfig = new Configuration();
90 rootOverrideConfig.fontScale = 1.3f;
91 root.onOverrideConfigurationChanged(rootOverrideConfig);
92
93 // Init child's config.
94 final TestConfigurationContainer child = root.addChild();
95 final Configuration childOverrideConfig = new Configuration();
96 childOverrideConfig.densityDpi = 320;
97 child.onOverrideConfigurationChanged(childOverrideConfig);
Andrii Kulianb94292e2016-10-19 13:30:58 -070098 final Configuration mergedOverrideConfig = new Configuration(root.getConfiguration());
99 mergedOverrideConfig.updateFrom(childOverrideConfig);
Andrii Kulian1779e612016-10-12 21:58:25 -0700100
101 // Check configuration update when child is removed from parent.
102 root.removeChild(child);
103 assertEquals(childOverrideConfig, child.getOverrideConfiguration());
Andrii Kulianb94292e2016-10-19 13:30:58 -0700104 assertEquals(mergedOverrideConfig, child.getMergedOverrideConfiguration());
105 assertEquals(mergedOverrideConfig, child.getConfiguration());
Andrii Kulian1779e612016-10-12 21:58:25 -0700106
107 // It may be paranoia... but let's check if parent's config didn't change after removal.
108 assertEquals(rootOverrideConfig, root.getOverrideConfiguration());
109 assertEquals(rootOverrideConfig, root.getMergedOverrideConfiguration());
110 assertEquals(rootOverrideConfig, root.getConfiguration());
111
Andrii Kulianb94292e2016-10-19 13:30:58 -0700112 // Init different root
113 final TestConfigurationContainer root2 = new TestConfigurationContainer();
114 final Configuration rootOverrideConfig2 = new Configuration();
115 rootOverrideConfig2.fontScale = 1.1f;
116 root2.onOverrideConfigurationChanged(rootOverrideConfig2);
117
118 // Check configuration update when child is added to different parent.
119 mergedOverrideConfig.setTo(rootOverrideConfig2);
Andrii Kulian1779e612016-10-12 21:58:25 -0700120 mergedOverrideConfig.updateFrom(childOverrideConfig);
Andrii Kulianb94292e2016-10-19 13:30:58 -0700121 root2.addChild(child);
Andrii Kulian1779e612016-10-12 21:58:25 -0700122 assertEquals(childOverrideConfig, child.getOverrideConfiguration());
123 assertEquals(mergedOverrideConfig, child.getMergedOverrideConfiguration());
124 assertEquals(mergedOverrideConfig, child.getConfiguration());
125 }
126
127 @Test
128 public void testConfigurationChangePropagation() throws Exception {
129 // Builds 3-level vertical hierarchy with one configuration container on each level.
130 // In addition to different overrides on each level, everyone in hierarchy will have one
131 // common overridden value - orientation;
132
133 // Init root's config.
134 final TestConfigurationContainer root = new TestConfigurationContainer();
135 final Configuration rootOverrideConfig = new Configuration();
136 rootOverrideConfig.fontScale = 1.3f;
137 rootOverrideConfig.orientation = SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
138 root.onOverrideConfigurationChanged(rootOverrideConfig);
139
140 // Init children.
141 final TestConfigurationContainer child1 = root.addChild();
142 final Configuration childOverrideConfig1 = new Configuration();
143 childOverrideConfig1.densityDpi = 320;
144 childOverrideConfig1.orientation = SCREEN_ORIENTATION_LANDSCAPE;
145 child1.onOverrideConfigurationChanged(childOverrideConfig1);
146
147 final TestConfigurationContainer child2 = child1.addChild();
148 final Configuration childOverrideConfig2 = new Configuration();
149 childOverrideConfig2.screenWidthDp = 150;
150 childOverrideConfig2.orientation = SCREEN_ORIENTATION_PORTRAIT;
151 child2.onOverrideConfigurationChanged(childOverrideConfig2);
152
153 // Check configuration on all levels when root override is updated.
154 rootOverrideConfig.smallestScreenWidthDp = 200;
155 root.onOverrideConfigurationChanged(rootOverrideConfig);
156
157 final Configuration mergedOverrideConfig1 = new Configuration(rootOverrideConfig);
158 mergedOverrideConfig1.updateFrom(childOverrideConfig1);
159 final Configuration mergedConfig1 = new Configuration(mergedOverrideConfig1);
160
161 final Configuration mergedOverrideConfig2 = new Configuration(mergedOverrideConfig1);
162 mergedOverrideConfig2.updateFrom(childOverrideConfig2);
163 final Configuration mergedConfig2 = new Configuration(mergedOverrideConfig2);
164
165 assertEquals(rootOverrideConfig, root.getOverrideConfiguration());
166 assertEquals(rootOverrideConfig, root.getMergedOverrideConfiguration());
167 assertEquals(rootOverrideConfig, root.getConfiguration());
168
169 assertEquals(childOverrideConfig1, child1.getOverrideConfiguration());
170 assertEquals(mergedOverrideConfig1, child1.getMergedOverrideConfiguration());
171 assertEquals(mergedConfig1, child1.getConfiguration());
172
173 assertEquals(childOverrideConfig2, child2.getOverrideConfiguration());
174 assertEquals(mergedOverrideConfig2, child2.getMergedOverrideConfiguration());
175 assertEquals(mergedConfig2, child2.getConfiguration());
176
177 // Check configuration on all levels when root parent config is updated.
178 final Configuration rootParentConfig = new Configuration();
179 rootParentConfig.screenHeightDp = 100;
180 rootParentConfig.orientation = SCREEN_ORIENTATION_REVERSE_PORTRAIT;
181 root.onConfigurationChanged(rootParentConfig);
182 final Configuration mergedRootConfig = new Configuration(rootParentConfig);
183 mergedRootConfig.updateFrom(rootOverrideConfig);
184
185 mergedConfig1.setTo(mergedRootConfig);
186 mergedConfig1.updateFrom(mergedOverrideConfig1);
187
188 mergedConfig2.setTo(mergedConfig1);
189 mergedConfig2.updateFrom(mergedOverrideConfig2);
190
191 assertEquals(rootOverrideConfig, root.getOverrideConfiguration());
192 assertEquals(rootOverrideConfig, root.getMergedOverrideConfiguration());
193 assertEquals(mergedRootConfig, root.getConfiguration());
194
195 assertEquals(childOverrideConfig1, child1.getOverrideConfiguration());
196 assertEquals(mergedOverrideConfig1, child1.getMergedOverrideConfiguration());
197 assertEquals(mergedConfig1, child1.getConfiguration());
198
199 assertEquals(childOverrideConfig2, child2.getOverrideConfiguration());
200 assertEquals(mergedOverrideConfig2, child2.getMergedOverrideConfiguration());
201 assertEquals(mergedConfig2, child2.getConfiguration());
202 }
203
204 /**
205 * Contains minimal implementation of {@link ConfigurationContainer}'s abstract behavior needed
206 * for testing.
207 */
208 private class TestConfigurationContainer
209 extends ConfigurationContainer<TestConfigurationContainer> {
210 private List<TestConfigurationContainer> mChildren = new ArrayList<>();
211 private TestConfigurationContainer mParent;
212
213 TestConfigurationContainer addChild(TestConfigurationContainer childContainer) {
214 childContainer.mParent = this;
215 childContainer.onParentChanged();
216 mChildren.add(childContainer);
217 return childContainer;
218 }
219
220 TestConfigurationContainer addChild() {
221 return addChild(new TestConfigurationContainer());
222 }
223
224 void removeChild(TestConfigurationContainer child) {
225 child.mParent = null;
226 child.onParentChanged();
227 }
228
229 @Override
230 protected int getChildCount() {
231 return mChildren.size();
232 }
233
234 @Override
235 protected TestConfigurationContainer getChildAt(int index) {
236 return mChildren.get(index);
237 }
238
239 @Override
240 protected ConfigurationContainer getParent() {
241 return mParent;
242 }
243 }
244}