Commit c02f2451 authored by khmel@chromium.org's avatar khmel@chromium.org Committed by Commit Bot

arc: Add concept of system default apps.

These apps exist on system image and available for all users. This also
moves custom Play Store case handled separately before to system app.

TEST=unit test
BUG=1013730

Change-Id: Iaf63d52c38c376b6b07930bc8ec88e5b9de4bb58
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1865472Reviewed-by: default avatarJosh Horwich <jhorwich@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Yury Khmel <khmel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#706920}
parent 12f38923
...@@ -733,6 +733,7 @@ class ArcDefaultAppForManagedUserTest : public ArcPlayStoreAppTest { ...@@ -733,6 +733,7 @@ class ArcDefaultAppForManagedUserTest : public ArcPlayStoreAppTest {
bool IsEnabledByPolicy() const { bool IsEnabledByPolicy() const {
switch (GetParam()) { switch (GetParam()) {
case ArcState::ARC_PLAY_STORE_MANAGED_AND_ENABLED: case ArcState::ARC_PLAY_STORE_MANAGED_AND_ENABLED:
return true;
case ArcState::ARC_PLAY_STORE_MANAGED_AND_DISABLED: case ArcState::ARC_PLAY_STORE_MANAGED_AND_DISABLED:
case ArcState::ARC_WITHOUT_PLAY_STORE: case ArcState::ARC_WITHOUT_PLAY_STORE:
return false; return false;
...@@ -2833,8 +2834,20 @@ TEST_P(ArcDefaultAppForManagedUserTest, DefaultAppsForManagedUser) { ...@@ -2833,8 +2834,20 @@ TEST_P(ArcDefaultAppForManagedUserTest, DefaultAppsForManagedUser) {
// There is no default app for managed users except Play Store // There is no default app for managed users except Play Store
for (const auto& app : fake_default_apps()) { for (const auto& app : fake_default_apps()) {
const std::string app_id = ArcAppTest::GetAppId(app); const std::string app_id = ArcAppTest::GetAppId(app);
EXPECT_FALSE(prefs->IsRegistered(app_id)); if (IsEnabledByPolicy()) {
EXPECT_FALSE(prefs->GetApp(app_id)); // Only system apps are allowed. App from package test.app2 is declared as
// a system app.
auto app = prefs->GetApp(app_id);
if (app) {
EXPECT_EQ("test.app2", app->package_name);
EXPECT_TRUE(prefs->IsRegistered(app_id));
} else {
EXPECT_FALSE(prefs->IsRegistered(app_id));
}
} else {
EXPECT_FALSE(prefs->IsRegistered(app_id));
EXPECT_FALSE(prefs->GetApp(app_id));
}
} }
// PlayStor exists for managed and enabled state. // PlayStor exists for managed and enabled state.
......
...@@ -28,6 +28,7 @@ constexpr char kAppPath[] = "app_path"; ...@@ -28,6 +28,7 @@ constexpr char kAppPath[] = "app_path";
constexpr char kName[] = "name"; constexpr char kName[] = "name";
constexpr char kOem[] = "oem"; constexpr char kOem[] = "oem";
constexpr char kPackageName[] = "package_name"; constexpr char kPackageName[] = "package_name";
constexpr char kSystem[] = "system";
constexpr char kDefaultApps[] = "arc.apps.default"; constexpr char kDefaultApps[] = "arc.apps.default";
constexpr char kHidden[] = "hidden"; constexpr char kHidden[] = "hidden";
...@@ -86,12 +87,14 @@ std::unique_ptr<ArcDefaultAppList::AppInfoMap> ReadAppsFromFileThread( ...@@ -86,12 +87,14 @@ std::unique_ptr<ArcDefaultAppList::AppInfoMap> ReadAppsFromFileThread(
std::string activity; std::string activity;
std::string app_path; std::string app_path;
bool oem = false; bool oem = false;
bool system = false;
app_info_dictionary->GetString(kName, &name); app_info_dictionary->GetString(kName, &name);
app_info_dictionary->GetString(kPackageName, &package_name); app_info_dictionary->GetString(kPackageName, &package_name);
app_info_dictionary->GetString(kActivity, &activity); app_info_dictionary->GetString(kActivity, &activity);
app_info_dictionary->GetString(kAppPath, &app_path); app_info_dictionary->GetString(kAppPath, &app_path);
app_info_dictionary->GetBoolean(kOem, &oem); app_info_dictionary->GetBoolean(kOem, &oem);
app_info_dictionary->GetBoolean(kSystem, &system);
if (name.empty() || package_name.empty() || activity.empty() || if (name.empty() || package_name.empty() || activity.empty() ||
app_path.empty()) { app_path.empty()) {
...@@ -103,8 +106,9 @@ std::unique_ptr<ArcDefaultAppList::AppInfoMap> ReadAppsFromFileThread( ...@@ -103,8 +106,9 @@ std::unique_ptr<ArcDefaultAppList::AppInfoMap> ReadAppsFromFileThread(
const std::string app_id = const std::string app_id =
ArcAppListPrefs::GetAppId(package_name, activity); ArcAppListPrefs::GetAppId(package_name, activity);
std::unique_ptr<ArcDefaultAppList::AppInfo> app = std::unique_ptr<ArcDefaultAppList::AppInfo> app =
std::make_unique<ArcDefaultAppList::AppInfo>( std::make_unique<ArcDefaultAppList::AppInfo>(name, package_name,
name, package_name, activity, oem, root_dir.Append(app_path)); activity, oem, system,
root_dir.Append(app_path));
apps.get()->insert( apps.get()->insert(
std::pair<std::string, std::unique_ptr<ArcDefaultAppList::AppInfo>>( std::pair<std::string, std::unique_ptr<ArcDefaultAppList::AppInfo>>(
app_id, std::move(app))); app_id, std::move(app)));
...@@ -206,11 +210,10 @@ void ArcDefaultAppList::OnAppsReady() { ...@@ -206,11 +210,10 @@ void ArcDefaultAppList::OnAppsReady() {
registry->GetInstalledExtension(arc::kPlayStoreAppId); registry->GetInstalledExtension(arc::kPlayStoreAppId);
if (arc_host && arc::IsPlayStoreAvailable()) { if (arc_host && arc::IsPlayStoreAvailable()) {
std::unique_ptr<ArcDefaultAppList::AppInfo> play_store_app = std::unique_ptr<ArcDefaultAppList::AppInfo> play_store_app =
std::make_unique<ArcDefaultAppList::AppInfo>(arc_host->name(), std::make_unique<ArcDefaultAppList::AppInfo>(
arc::kPlayStorePackage, arc_host->name(), arc::kPlayStorePackage, arc::kPlayStoreActivity,
arc::kPlayStoreActivity, false /* oem */, true /* system */,
false /* oem */, base::FilePath() /* app_path */);
base::FilePath() /* app_path */);
AppInfoMap& app_map = AppInfoMap& app_map =
IsAppHidden(prefs, arc::kPlayStoreAppId) ? hidden_apps_ : visible_apps_; IsAppHidden(prefs, arc::kPlayStoreAppId) ? hidden_apps_ : visible_apps_;
app_map.insert( app_map.insert(
...@@ -223,14 +226,16 @@ void ArcDefaultAppList::OnAppsReady() { ...@@ -223,14 +226,16 @@ void ArcDefaultAppList::OnAppsReady() {
const ArcDefaultAppList::AppInfo* ArcDefaultAppList::GetApp( const ArcDefaultAppList::AppInfo* ArcDefaultAppList::GetApp(
const std::string& app_id) const { const std::string& app_id) const {
if ((filter_level_ == FilterLevel::ALL) || if (filter_level_ == FilterLevel::ALL)
(filter_level_ == FilterLevel::OPTIONAL_APPS &&
app_id != arc::kPlayStoreAppId)) {
return nullptr; return nullptr;
}
const auto it = visible_apps_.find(app_id); const auto it = visible_apps_.find(app_id);
if (it == visible_apps_.end()) if (it == visible_apps_.end())
return nullptr; return nullptr;
if (filter_level_ == FilterLevel::OPTIONAL_APPS && !it->second->system)
return nullptr;
return it->second.get(); return it->second.get();
} }
...@@ -294,11 +299,13 @@ ArcDefaultAppList::AppInfo::AppInfo(const std::string& name, ...@@ -294,11 +299,13 @@ ArcDefaultAppList::AppInfo::AppInfo(const std::string& name,
const std::string& package_name, const std::string& package_name,
const std::string& activity, const std::string& activity,
bool oem, bool oem,
bool system,
const base::FilePath app_path) const base::FilePath app_path)
: name(name), : name(name),
package_name(package_name), package_name(package_name),
activity(activity), activity(activity),
oem(oem), oem(oem),
system(system),
app_path(app_path) {} app_path(app_path) {}
ArcDefaultAppList::AppInfo::~AppInfo() {} ArcDefaultAppList::AppInfo::~AppInfo() {}
...@@ -29,24 +29,26 @@ class ArcDefaultAppList { ...@@ -29,24 +29,26 @@ class ArcDefaultAppList {
public: public:
struct AppInfo { struct AppInfo {
AppInfo(const std::string& name, AppInfo(const std::string& name,
const std::string& package_name, const std::string& package_name,
const std::string& activity, const std::string& activity,
bool oem, bool oem,
const base::FilePath app_path); bool system,
const base::FilePath app_path);
~AppInfo(); ~AppInfo();
std::string name; std::string name;
std::string package_name; std::string package_name;
std::string activity; std::string activity;
bool oem; bool oem;
bool system;
base::FilePath app_path; // App folder that contains pre-installed icons. base::FilePath app_path; // App folder that contains pre-installed icons.
}; };
enum class FilterLevel { enum class FilterLevel {
// Filter nothing. // Filter nothing.
NOTHING, NOTHING,
// Filter out only optional apps, excluding Play Store for example. Used in // Filter out only optional apps, leaving system apps available, Play Store
// case when Play Store is managed and enabled. // is also system app.
OPTIONAL_APPS, OPTIONAL_APPS,
// Filter out everything. Used in case when Play Store is managed and // Filter out everything. Used in case when Play Store is managed and
// disabled. // disabled.
......
{
"name": "TestApp2",
"package_name": "test.app2",
"activity": "test.app2.activity",
"system": true,
"app_path": "test_app2"
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment