Theme_test.cpp revision 03ebac8c68f9925592a172fcfd11d56f48cadaeb
19d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski/* 27ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Copyright (C) 2016 The Android Open Source Project 39d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * 49d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 59d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * you may not use this file except in compliance with the License. 69d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * You may obtain a copy of the License at 79d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * 89d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 99d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * 109d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * Unless required by applicable law or agreed to in writing, software 119d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 129d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * See the License for the specific language governing permissions and 149d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski * limitations under the License. 159d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski */ 169d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski 177ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "androidfw/AssetManager2.h" 184c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 197ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "android-base/logging.h" 209d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski 219d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski#include "TestHelpers.h" 22929d6517dfd338f0d481dbe6587643d5aef27ec6Adam Lesinski#include "androidfw/ResourceUtils.h" 23da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "data/lib_one/R.h" 24da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "data/libclient/R.h" 257ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "data/styles/R.h" 2603ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski#include "data/system/R.h" 279d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski 284c67a475a334e4f65238d439a3339195e03c03beAdam Lesinskinamespace app = com::android::app; 29da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskinamespace lib_one = com::android::lib_one; 30da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskinamespace libclient = com::android::libclient; 319d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski 324c67a475a334e4f65238d439a3339195e03c03beAdam Lesinskinamespace android { 339d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski 347ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskiclass ThemeTest : public ::testing::Test { 357ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski public: 367ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski void SetUp() override { 3703ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski system_assets_ = ApkAssets::Load(GetTestDataPath() + "/system/system.apk", true /*system*/); 3803ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski ASSERT_NE(nullptr, system_assets_); 3903ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski 407ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski style_assets_ = ApkAssets::Load(GetTestDataPath() + "/styles/styles.apk"); 417ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(nullptr, style_assets_); 42da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 43da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski libclient_assets_ = ApkAssets::Load(GetTestDataPath() + "/libclient/libclient.apk"); 44da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ASSERT_NE(nullptr, libclient_assets_); 45da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 46da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski lib_one_assets_ = ApkAssets::Load(GetTestDataPath() + "/lib_one/lib_one.apk"); 47da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ASSERT_NE(nullptr, lib_one_assets_); 48da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 49da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski lib_two_assets_ = ApkAssets::Load(GetTestDataPath() + "/lib_two/lib_two.apk"); 50da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ASSERT_NE(nullptr, lib_two_assets_); 517ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 527ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 537ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski protected: 5403ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski std::unique_ptr<const ApkAssets> system_assets_; 550c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> style_assets_; 560c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> libclient_assets_; 570c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> lib_one_assets_; 580c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> lib_two_assets_; 597ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski}; 607ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 617ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiTEST_F(ThemeTest, EmptyTheme) { 627ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager; 637ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assetmanager.SetApkAssets({style_assets_.get()}); 647ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 657ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme = assetmanager.NewTheme(); 667ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(0u, theme->GetChangingConfigurations()); 677ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(&assetmanager, theme->GetAssetManager()); 687ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 697ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 707ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 717ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(kInvalidCookie, theme->GetAttribute(app::R::attr::attr_one, &value, &flags)); 727ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 737ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 747ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiTEST_F(ThemeTest, SingleThemeNoParent) { 757ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager; 767ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assetmanager.SetApkAssets({style_assets_.get()}); 777ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 787ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme = assetmanager.NewTheme(); 797ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(app::R::style::StyleOne)); 807ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 817ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ApkAssetsCookie cookie; 847ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 857ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_one, &value, &flags); 867ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 877ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 887ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(1u, value.data); 897ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 907ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 917ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_two, &value, &flags); 927ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 937ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 947ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(2u, value.data); 957ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 967ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 977ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 987ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiTEST_F(ThemeTest, SingleThemeWithParent) { 997ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager; 1007ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assetmanager.SetApkAssets({style_assets_.get()}); 1017ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1027ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme = assetmanager.NewTheme(); 1037ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(app::R::style::StyleTwo)); 1047ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1057ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 1067ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 1077ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ApkAssetsCookie cookie; 1087ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1097ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_one, &value, &flags); 1107ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1117ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1127ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(1u, value.data); 1137ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1147ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1157ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_two, &value, &flags); 1167ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1177ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_STRING, value.dataType); 1187ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(0, cookie); 1197ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(std::string("string"), 1207ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski GetStringFromPool(assetmanager.GetStringPoolForCookie(0), value.data)); 1217ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1227ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1237ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // This attribute should point to an attr_indirect, so the result should be 3. 1247ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_three, &value, &flags); 1257ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1267ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1277ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(3u, value.data); 1287ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1297ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 1307ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1317ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiTEST_F(ThemeTest, MultipleThemesOverlaidNotForce) { 1327ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager; 1337ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assetmanager.SetApkAssets({style_assets_.get()}); 1347ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1357ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme = assetmanager.NewTheme(); 1367ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(app::R::style::StyleTwo)); 1377ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(app::R::style::StyleThree)); 1387ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1397ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 1407ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 1417ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ApkAssetsCookie cookie; 1427ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1437ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // attr_one is still here from the base. 1447ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_one, &value, &flags); 1457ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1467ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1477ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(1u, value.data); 1487ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1497ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1507ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // check for the new attr_six 1517ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_six, &value, &flags); 1527ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1537ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1547ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(6u, value.data); 1557ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1567ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1577ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // check for the old attr_five (force=true was not used). 1587ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_five, &value, &flags); 1597ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1607ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_REFERENCE, value.dataType); 1617ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(app::R::string::string_one, value.data); 1627ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1637ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 1647ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1657ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiTEST_F(ThemeTest, MultipleThemesOverlaidForced) { 1667ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager; 1677ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assetmanager.SetApkAssets({style_assets_.get()}); 1687ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1697ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme = assetmanager.NewTheme(); 1707ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(app::R::style::StyleTwo)); 1717ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(app::R::style::StyleThree, true /* force */)); 1727ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1737ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 1747ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 1757ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ApkAssetsCookie cookie; 1767ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1777ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // attr_one is still here from the base. 1787ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_one, &value, &flags); 1797ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1807ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1817ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(1u, value.data); 1827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1847ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // check for the new attr_six 1857ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_six, &value, &flags); 1867ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1877ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1887ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(6u, value.data); 1897ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 1907ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1917ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // check for the new attr_five (force=true was used). 1927ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme->GetAttribute(app::R::attr::attr_five, &value, &flags); 1937ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 1947ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 1957ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(5u, value.data); 1967ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 197da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} 198da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 199da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam LesinskiTEST_F(ThemeTest, ResolveDynamicAttributesAndReferencesToSharedLibrary) { 200da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski AssetManager2 assetmanager; 201da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski assetmanager.SetApkAssets( 202da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski {lib_two_assets_.get(), lib_one_assets_.get(), libclient_assets_.get()}); 203da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 204da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski std::unique_ptr<Theme> theme = assetmanager.NewTheme(); 205da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ASSERT_TRUE(theme->ApplyStyle(libclient::R::style::Theme, false /*force*/)); 206da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 207da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski Res_value value; 208da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski uint32_t flags; 209da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ApkAssetsCookie cookie; 210da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 211da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski // The attribute should be resolved to the final value. 212da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski cookie = theme->GetAttribute(libclient::R::attr::foo, &value, &flags); 213da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 214da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 215da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski EXPECT_EQ(700u, value.data); 216da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 217da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 218da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski // The reference should be resolved to a TYPE_REFERENCE. 219da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski cookie = theme->GetAttribute(libclient::R::attr::bar, &value, &flags); 220da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 221da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski EXPECT_EQ(Res_value::TYPE_REFERENCE, value.dataType); 222da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 223da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski // lib_one is assigned package ID 0x03. 224929d6517dfd338f0d481dbe6587643d5aef27ec6Adam Lesinski EXPECT_EQ(3u, get_package_id(value.data)); 225929d6517dfd338f0d481dbe6587643d5aef27ec6Adam Lesinski EXPECT_EQ(get_type_id(lib_one::R::string::foo), get_type_id(value.data)); 226929d6517dfd338f0d481dbe6587643d5aef27ec6Adam Lesinski EXPECT_EQ(get_entry_id(lib_one::R::string::foo), get_entry_id(value.data)); 2277ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 2287ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2297ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiTEST_F(ThemeTest, CopyThemeSameAssetManager) { 2307ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager; 2317ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assetmanager.SetApkAssets({style_assets_.get()}); 2327ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2337ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme_one = assetmanager.NewTheme(); 2347ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme_one->ApplyStyle(app::R::style::StyleOne)); 2357ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2367ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 2377ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 2387ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ApkAssetsCookie cookie; 2397ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2407ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // attr_one is still here from the base. 2417ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme_one->GetAttribute(app::R::attr::attr_one, &value, &flags); 2427ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 2437ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 2447ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(1u, value.data); 2457ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 2467ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2477ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // attr_six is not here. 2487ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(kInvalidCookie, theme_one->GetAttribute(app::R::attr::attr_six, &value, &flags)); 2497ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2507ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::unique_ptr<Theme> theme_two = assetmanager.NewTheme(); 2517ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme_two->ApplyStyle(app::R::style::StyleThree)); 2527ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2537ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // Copy the theme to theme_one. 2547ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme_one->SetTo(*theme_two)); 2557ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2567ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // Clear theme_two to make sure we test that there WAS a copy. 2577ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski theme_two->Clear(); 2587ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2597ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // attr_one is now not here. 2607ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(kInvalidCookie, theme_one->GetAttribute(app::R::attr::attr_one, &value, &flags)); 2617ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2627ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // attr_six is now here because it was copied. 2637ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski cookie = theme_one->GetAttribute(app::R::attr::attr_six, &value, &flags); 2647ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_NE(kInvalidCookie, cookie); 2657ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, value.dataType); 2667ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(6u, value.data); 2677ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), flags); 2687ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 2697ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 27003ebac8c68f9925592a172fcfd11d56f48cadaebAdam LesinskiTEST_F(ThemeTest, OnlyCopySystemThemeWhenAssetManagersDiffer) { 2717ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager_one; 27203ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski assetmanager_one.SetApkAssets({system_assets_.get(), style_assets_.get()}); 2737ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2747ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assetmanager_two; 27503ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski assetmanager_two.SetApkAssets({system_assets_.get(), style_assets_.get()}); 2767ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2777ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski auto theme_one = assetmanager_one.NewTheme(); 2787ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme_one->ApplyStyle(app::R::style::StyleOne)); 2797ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2807ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski auto theme_two = assetmanager_two.NewTheme(); 28103ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski ASSERT_TRUE(theme_two->ApplyStyle(R::style::Theme_One)); 2827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ASSERT_TRUE(theme_two->ApplyStyle(app::R::style::StyleTwo)); 2837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 28403ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski EXPECT_TRUE(theme_one->SetTo(*theme_two)); 28503ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski 28603ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski Res_value value; 28703ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski uint32_t flags; 28803ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski 28903ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski // No app resources. 29003ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski EXPECT_EQ(kInvalidCookie, theme_one->GetAttribute(app::R::attr::attr_one, &value, &flags)); 29103ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski 29203ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski // Only system. 29303ebac8c68f9925592a172fcfd11d56f48cadaebAdam Lesinski EXPECT_NE(kInvalidCookie, theme_one->GetAttribute(R::attr::foreground, &value, &flags)); 2949d9cc6233c7035c32d3b8622aa5dc7d413193dc7Adam Lesinski} 2954c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 2964c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski} // namespace android 297