131245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski/* 231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * 431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * you may not use this file except in compliance with the License. 631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * You may obtain a copy of the License at 731245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * 831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 931245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * 1031245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1131245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * See the License for the specific language governing permissions and 1431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * limitations under the License. 1531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski */ 1631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 174c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "androidfw/ResourceTypes.h" 184c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 194c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "utils/Log.h" 204c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "utils/String8.h" 214c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "utils/Vector.h" 2231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 2331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski#include "TestHelpers.h" 244c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "gtest/gtest.h" 2531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 2631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinskinamespace android { 2731245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 2831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinskistatic ResTable_config selectBest(const ResTable_config& target, 294c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski const Vector<ResTable_config>& configs) { 304c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config bestConfig; 314c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&bestConfig, 0, sizeof(bestConfig)); 324c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski const size_t configCount = configs.size(); 334c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski for (size_t i = 0; i < configCount; i++) { 344c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski const ResTable_config& thisConfig = configs[i]; 354c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (!thisConfig.match(target)) { 364c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski continue; 374c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 384c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 394c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (thisConfig.isBetterThan(bestConfig, &target)) { 404c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski bestConfig = thisConfig; 4131245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski } 424c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 434c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return bestConfig; 4431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski} 4531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 4631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinskistatic ResTable_config buildDensityConfig(int density) { 474c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config config; 484c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&config, 0, sizeof(config)); 494c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski config.density = uint16_t(density); 504c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski config.sdkVersion = 4; 514c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return config; 5231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski} 5331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 5431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigTest, shouldSelectBestDensity) { 554c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config deviceConfig; 564c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&deviceConfig, 0, sizeof(deviceConfig)); 574c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.density = ResTable_config::DENSITY_XHIGH; 584c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.sdkVersion = 21; 5931245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 604c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski Vector<ResTable_config> configs; 6131245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 624c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config expectedBest = 634c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski buildDensityConfig(ResTable_config::DENSITY_HIGH); 644c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 654c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 6631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 674c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski expectedBest = buildDensityConfig(ResTable_config::DENSITY_XXHIGH); 684c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 694c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 7031245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 714c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski expectedBest = buildDensityConfig(int(ResTable_config::DENSITY_XXHIGH) - 20); 724c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 734c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 7431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 754c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(buildDensityConfig(int(ResTable_config::DENSITY_HIGH) + 20)); 764c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 7731245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 784c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski expectedBest = buildDensityConfig(ResTable_config::DENSITY_XHIGH); 794c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 804c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 8131245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 824c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski expectedBest = buildDensityConfig(ResTable_config::DENSITY_ANY); 834c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski expectedBest.sdkVersion = 21; 844c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 854c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 8631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski} 8731245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 8831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam LesinskiTEST(ConfigTest, shouldSelectBestDensityWhenNoneSpecified) { 894c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config deviceConfig; 904c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&deviceConfig, 0, sizeof(deviceConfig)); 914c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.sdkVersion = 21; 9231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 934c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski Vector<ResTable_config> configs; 944c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(buildDensityConfig(ResTable_config::DENSITY_HIGH)); 9531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 964c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config expectedBest = 974c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski buildDensityConfig(ResTable_config::DENSITY_MEDIUM); 984c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 994c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 10031245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 1014c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski expectedBest = buildDensityConfig(ResTable_config::DENSITY_ANY); 1024c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski configs.add(expectedBest); 1034c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(expectedBest, selectBest(deviceConfig, configs)); 10431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski} 10531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 1062738c96d998dedfae5b4670d588d0cd299c4ca0fAdam LesinskiTEST(ConfigTest, shouldMatchRoundQualifier) { 1074c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config deviceConfig; 1084c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&deviceConfig, 0, sizeof(deviceConfig)); 1092738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1104c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config roundConfig; 1114c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&roundConfig, 0, sizeof(roundConfig)); 1124c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski roundConfig.screenLayout2 = ResTable_config::SCREENROUND_YES; 1132738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1144c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_FALSE(roundConfig.match(deviceConfig)); 1152738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1164c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.screenLayout2 = ResTable_config::SCREENROUND_YES; 1172738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1184c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(roundConfig.match(deviceConfig)); 1192738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1204c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.screenLayout2 = ResTable_config::SCREENROUND_NO; 1212738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1224c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_FALSE(roundConfig.match(deviceConfig)); 1232738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1244c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config notRoundConfig; 1254c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(¬RoundConfig, 0, sizeof(notRoundConfig)); 1264c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski notRoundConfig.screenLayout2 = ResTable_config::SCREENROUND_NO; 1272738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1284c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(notRoundConfig.match(deviceConfig)); 1292738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski} 1302738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1312738c96d998dedfae5b4670d588d0cd299c4ca0fAdam LesinskiTEST(ConfigTest, RoundQualifierShouldHaveStableSortOrder) { 1324c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config defaultConfig; 1334c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&defaultConfig, 0, sizeof(defaultConfig)); 1342738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1354c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config longConfig = defaultConfig; 1364c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski longConfig.screenLayout = ResTable_config::SCREENLONG_YES; 1372738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1384c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config longRoundConfig = longConfig; 1394c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski longRoundConfig.screenLayout2 = ResTable_config::SCREENROUND_YES; 1402738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1414c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config longRoundPortConfig = longConfig; 1424c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski longRoundPortConfig.orientation = ResTable_config::ORIENTATION_PORT; 1432738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1444c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longConfig.compare(longRoundConfig) < 0); 1454c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longConfig.compareLogical(longRoundConfig) < 0); 1464c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longRoundConfig.compare(longConfig) > 0); 1474c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longRoundConfig.compareLogical(longConfig) > 0); 1482738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1494c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longRoundConfig.compare(longRoundPortConfig) < 0); 1504c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longRoundConfig.compareLogical(longRoundPortConfig) < 0); 1514c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longRoundPortConfig.compare(longRoundConfig) > 0); 1524c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(longRoundPortConfig.compareLogical(longRoundConfig) > 0); 1532738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski} 1542738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1552738c96d998dedfae5b4670d588d0cd299c4ca0fAdam LesinskiTEST(ConfigTest, ScreenShapeHasCorrectDiff) { 1564c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config defaultConfig; 1574c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&defaultConfig, 0, sizeof(defaultConfig)); 1582738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1594c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config roundConfig = defaultConfig; 1604c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski roundConfig.screenLayout2 = ResTable_config::SCREENROUND_YES; 1612738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1624c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_EQ(defaultConfig.diff(roundConfig), 1634c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config::CONFIG_SCREEN_ROUND); 1642738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski} 1652738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1662738c96d998dedfae5b4670d588d0cd299c4ca0fAdam LesinskiTEST(ConfigTest, RoundIsMoreSpecific) { 1674c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config deviceConfig; 1684c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&deviceConfig, 0, sizeof(deviceConfig)); 1694c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.screenLayout2 = ResTable_config::SCREENROUND_YES; 1704c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski deviceConfig.screenLayout = ResTable_config::SCREENLONG_YES; 1712738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1724c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config targetConfigA; 1734c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski memset(&targetConfigA, 0, sizeof(targetConfigA)); 1742738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1754c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config targetConfigB = targetConfigA; 1764c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski targetConfigB.screenLayout = ResTable_config::SCREENLONG_YES; 1772738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1784c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ResTable_config targetConfigC = targetConfigB; 1794c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski targetConfigC.screenLayout2 = ResTable_config::SCREENROUND_YES; 1802738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 1814c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(targetConfigB.isBetterThan(targetConfigA, &deviceConfig)); 1824c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski EXPECT_TRUE(targetConfigC.isBetterThan(targetConfigB, &deviceConfig)); 1832738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski} 1842738c96d998dedfae5b4670d588d0cd299c4ca0fAdam Lesinski 185c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain GuyTEST(ConfigTest, ScreenIsWideGamut) { 186c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy ResTable_config defaultConfig; 187c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy memset(&defaultConfig, 0, sizeof(defaultConfig)); 188c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy 189c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy ResTable_config wideGamutConfig = defaultConfig; 1904832745b84d6a358582f2264d22acacf25e01b07Romain Guy wideGamutConfig.colorMode = ResTable_config::WIDE_COLOR_GAMUT_YES; 191c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy 1924832745b84d6a358582f2264d22acacf25e01b07Romain Guy EXPECT_EQ(defaultConfig.diff(wideGamutConfig), ResTable_config::CONFIG_COLOR_MODE); 193c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy} 194c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy 195c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain GuyTEST(ConfigTest, ScreenIsHdr) { 196c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy ResTable_config defaultConfig; 197c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy memset(&defaultConfig, 0, sizeof(defaultConfig)); 198c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy 199c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy ResTable_config hdrConfig = defaultConfig; 2004832745b84d6a358582f2264d22acacf25e01b07Romain Guy hdrConfig.colorMode = ResTable_config::HDR_YES; 201c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy 2024832745b84d6a358582f2264d22acacf25e01b07Romain Guy EXPECT_EQ(defaultConfig.diff(hdrConfig), ResTable_config::CONFIG_COLOR_MODE); 203c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy} 204c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy 20531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski} // namespace android. 206