11779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian/*
21779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Copyright (C) 2016 The Android Open Source Project
31779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian *
41779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Licensed under the Apache License, Version 2.0 (the "License");
51779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * you may not use this file except in compliance with the License.
61779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * You may obtain a copy of the License at
71779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian *
81779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian *      http://www.apache.org/licenses/LICENSE-2.0
91779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian *
101779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Unless required by applicable law or agreed to in writing, software
111779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * distributed under the License is distributed on an "AS IS" BASIS,
121779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * See the License for the specific language governing permissions and
141779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * limitations under the License
151779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian */
161779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
171779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianpackage com.android.server.am;
181779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
191779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
201779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport org.junit.Test;
211779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport org.junit.runner.RunWith;
221779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
231779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport android.content.res.Configuration;
241779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport android.platform.test.annotations.Presubmit;
251779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport android.support.test.filters.SmallTest;
261779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport android.support.test.runner.AndroidJUnit4;
271779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
281779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport java.util.ArrayList;
291779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport java.util.List;
301779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
311779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
321779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
331779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
341779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
351779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianimport static org.junit.Assert.assertEquals;
361779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
371779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian/**
381779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Test class for {@link ConfigurationContainer}. Mostly duplicates configuration tests from
391779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * {@link com.android.server.wm.WindowContainerTests}.
401779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian *
411779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Build: mmma -j32 frameworks/base/services/tests/servicestests
421779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Install: adb install -r out/target/product/$TARGET_PRODUCT/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
431779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian * Run: adb shell am instrument -w -e class com.android.server.am.ConfigurationContainerTests com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
441779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian */
451779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian@SmallTest
461779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian@Presubmit
471779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian@RunWith(AndroidJUnit4.class)
481779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulianpublic class ConfigurationContainerTests {
491779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
501779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    @Test
511779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    public void testConfigurationInit() throws Exception {
521779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check root container initial config.
531779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer root = new TestConfigurationContainer();
541779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, root.getOverrideConfiguration());
551779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, root.getMergedOverrideConfiguration());
561779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, root.getConfiguration());
571779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
581779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check child initial config.
591779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer child1 = root.addChild();
601779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, child1.getOverrideConfiguration());
611779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, child1.getMergedOverrideConfiguration());
621779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, child1.getConfiguration());
631779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
641779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check child initial config if root has overrides.
651779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration rootOverrideConfig = new Configuration();
661779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootOverrideConfig.fontScale = 1.3f;
671779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.onOverrideConfigurationChanged(rootOverrideConfig);
681779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer child2 = root.addChild();
691779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, child2.getOverrideConfiguration());
701779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, child2.getMergedOverrideConfiguration());
711779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, child2.getConfiguration());
721779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
731779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check child initial config if root has parent config set.
741779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration rootParentConfig = new Configuration();
751779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootParentConfig.fontScale = 0.8f;
761779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootParentConfig.orientation = SCREEN_ORIENTATION_LANDSCAPE;
771779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.onConfigurationChanged(rootParentConfig);
781779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration rootFullConfig = new Configuration(rootParentConfig);
791779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootFullConfig.updateFrom(rootOverrideConfig);
801779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
811779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer child3 = root.addChild();
821779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(Configuration.EMPTY, child3.getOverrideConfiguration());
831779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, child3.getMergedOverrideConfiguration());
841779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootFullConfig, child3.getConfiguration());
851779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    }
861779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
871779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    @Test
881779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    public void testConfigurationChangeOnAddRemove() throws Exception {
891779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Init root's config.
901779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer root = new TestConfigurationContainer();
911779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration rootOverrideConfig = new Configuration();
921779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootOverrideConfig.fontScale = 1.3f;
931779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.onOverrideConfigurationChanged(rootOverrideConfig);
941779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
951779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Init child's config.
961779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer child = root.addChild();
971779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration childOverrideConfig = new Configuration();
981779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        childOverrideConfig.densityDpi = 320;
991779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        child.onOverrideConfigurationChanged(childOverrideConfig);
100b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        final Configuration mergedOverrideConfig = new Configuration(root.getConfiguration());
101b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        mergedOverrideConfig.updateFrom(childOverrideConfig);
1021779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1031779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check configuration update when child is removed from parent.
1041779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.removeChild(child);
1051779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(childOverrideConfig, child.getOverrideConfiguration());
106b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        assertEquals(mergedOverrideConfig, child.getMergedOverrideConfiguration());
107b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        assertEquals(mergedOverrideConfig, child.getConfiguration());
1081779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1091779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // It may be paranoia... but let's check if parent's config didn't change after removal.
1101779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getOverrideConfiguration());
1111779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getMergedOverrideConfiguration());
1121779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getConfiguration());
1131779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
114b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        // Init different root
115b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        final TestConfigurationContainer root2 = new TestConfigurationContainer();
116b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        final Configuration rootOverrideConfig2 = new Configuration();
117b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        rootOverrideConfig2.fontScale = 1.1f;
118b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        root2.onOverrideConfigurationChanged(rootOverrideConfig2);
119b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian
120b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        // Check configuration update when child is added to different parent.
121b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        mergedOverrideConfig.setTo(rootOverrideConfig2);
1221779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedOverrideConfig.updateFrom(childOverrideConfig);
123b94292e5fe18a459aa521b9b9631d2db0485ac1bAndrii Kulian        root2.addChild(child);
1241779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(childOverrideConfig, child.getOverrideConfiguration());
1251779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedOverrideConfig, child.getMergedOverrideConfiguration());
1261779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedOverrideConfig, child.getConfiguration());
1271779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    }
1281779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1291779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    @Test
1301779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    public void testConfigurationChangePropagation() throws Exception {
1311779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Builds 3-level vertical hierarchy with one configuration container on each level.
1321779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // In addition to different overrides on each level, everyone in hierarchy will have one
1331779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // common overridden value - orientation;
1341779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1351779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Init root's config.
1361779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer root = new TestConfigurationContainer();
1371779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration rootOverrideConfig = new Configuration();
1381779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootOverrideConfig.fontScale = 1.3f;
1391779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootOverrideConfig.orientation = SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
1401779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.onOverrideConfigurationChanged(rootOverrideConfig);
1411779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1421779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Init children.
1431779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer child1 = root.addChild();
1441779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration childOverrideConfig1 = new Configuration();
1451779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        childOverrideConfig1.densityDpi = 320;
1461779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        childOverrideConfig1.orientation = SCREEN_ORIENTATION_LANDSCAPE;
1471779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        child1.onOverrideConfigurationChanged(childOverrideConfig1);
1481779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1491779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final TestConfigurationContainer child2 = child1.addChild();
1501779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration childOverrideConfig2 = new Configuration();
1511779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        childOverrideConfig2.screenWidthDp = 150;
1521779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        childOverrideConfig2.orientation = SCREEN_ORIENTATION_PORTRAIT;
1531779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        child2.onOverrideConfigurationChanged(childOverrideConfig2);
1541779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1551779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check configuration on all levels when root override is updated.
1561779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootOverrideConfig.smallestScreenWidthDp = 200;
1571779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.onOverrideConfigurationChanged(rootOverrideConfig);
1581779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1591779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration mergedOverrideConfig1 = new Configuration(rootOverrideConfig);
1601779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedOverrideConfig1.updateFrom(childOverrideConfig1);
1611779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration mergedConfig1 = new Configuration(mergedOverrideConfig1);
1621779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1631779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration mergedOverrideConfig2 = new Configuration(mergedOverrideConfig1);
1641779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedOverrideConfig2.updateFrom(childOverrideConfig2);
1651779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration mergedConfig2 = new Configuration(mergedOverrideConfig2);
1661779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1671779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getOverrideConfiguration());
1681779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getMergedOverrideConfiguration());
1691779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getConfiguration());
1701779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1711779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(childOverrideConfig1, child1.getOverrideConfiguration());
1721779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedOverrideConfig1, child1.getMergedOverrideConfiguration());
1731779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedConfig1, child1.getConfiguration());
1741779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1751779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(childOverrideConfig2, child2.getOverrideConfiguration());
1761779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedOverrideConfig2, child2.getMergedOverrideConfiguration());
1771779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedConfig2, child2.getConfiguration());
1781779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1791779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        // Check configuration on all levels when root parent config is updated.
1801779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration rootParentConfig = new Configuration();
1811779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootParentConfig.screenHeightDp = 100;
1821779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        rootParentConfig.orientation = SCREEN_ORIENTATION_REVERSE_PORTRAIT;
1831779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        root.onConfigurationChanged(rootParentConfig);
1841779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        final Configuration mergedRootConfig = new Configuration(rootParentConfig);
1851779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedRootConfig.updateFrom(rootOverrideConfig);
1861779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1871779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedConfig1.setTo(mergedRootConfig);
1881779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedConfig1.updateFrom(mergedOverrideConfig1);
1891779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1901779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedConfig2.setTo(mergedConfig1);
1911779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        mergedConfig2.updateFrom(mergedOverrideConfig2);
1921779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1931779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getOverrideConfiguration());
1941779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(rootOverrideConfig, root.getMergedOverrideConfiguration());
1951779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedRootConfig, root.getConfiguration());
1961779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
1971779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(childOverrideConfig1, child1.getOverrideConfiguration());
1981779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedOverrideConfig1, child1.getMergedOverrideConfiguration());
1991779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedConfig1, child1.getConfiguration());
2001779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2011779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(childOverrideConfig2, child2.getOverrideConfiguration());
2021779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedOverrideConfig2, child2.getMergedOverrideConfiguration());
2031779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        assertEquals(mergedConfig2, child2.getConfiguration());
2041779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    }
2051779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2061779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    /**
2071779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian     * Contains minimal implementation of {@link ConfigurationContainer}'s abstract behavior needed
2081779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian     * for testing.
2091779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian     */
2101779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    private class TestConfigurationContainer
2111779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            extends ConfigurationContainer<TestConfigurationContainer> {
2121779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        private List<TestConfigurationContainer> mChildren = new ArrayList<>();
2131779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        private TestConfigurationContainer mParent;
2141779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2151779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        TestConfigurationContainer addChild(TestConfigurationContainer childContainer) {
2161779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            childContainer.mParent = this;
2171779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            childContainer.onParentChanged();
2181779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            mChildren.add(childContainer);
2191779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            return childContainer;
2201779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        }
2211779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2221779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        TestConfigurationContainer addChild() {
2231779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            return addChild(new TestConfigurationContainer());
2241779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        }
2251779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2261779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        void removeChild(TestConfigurationContainer child) {
2271779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            child.mParent = null;
2281779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            child.onParentChanged();
2291779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        }
2301779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2311779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        @Override
2321779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        protected int getChildCount() {
2331779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            return mChildren.size();
2341779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        }
2351779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2361779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        @Override
2371779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        protected TestConfigurationContainer getChildAt(int index) {
2381779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            return mChildren.get(index);
2391779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        }
2401779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian
2411779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        @Override
2421779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        protected ConfigurationContainer getParent() {
2431779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian            return mParent;
2441779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian        }
2451779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian    }
2461779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian}
247