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