| Index: chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
|
| diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
|
| index 378cbf405716ef43425deba992c4b71eb1782dcf..bfcf0f85a8691ae7101ba77cc9dcbc06a2b2f5dc 100644
|
| --- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
|
| +++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
|
| @@ -35,24 +35,25 @@
|
|
|
| namespace {
|
|
|
| -const char kActivity[] = "activity";
|
| -const char kIconResourceId[] = "icon_resource_id";
|
| -const char kInstallTime[] = "install_time";
|
| -const char kIntentUri[] = "intent_uri";
|
| -const char kLastBackupAndroidId[] = "last_backup_android_id";
|
| -const char kLastBackupTime[] = "last_backup_time";
|
| -const char kLastLaunchTime[] = "lastlaunchtime";
|
| -const char kLaunchable[] = "launchable";
|
| -const char kName[] = "name";
|
| -const char kNotificationsEnabled[] = "notifications_enabled";
|
| -const char kOrientationLock[] = "orientation_lock";
|
| -const char kPackageName[] = "package_name";
|
| -const char kPackageVersion[] = "package_version";
|
| -const char kSticky[] = "sticky";
|
| -const char kShortcut[] = "shortcut";
|
| -const char kShouldSync[] = "should_sync";
|
| -const char kSystem[] = "system";
|
| -const char kUninstalled[] = "uninstalled";
|
| +constexpr char kActivity[] = "activity";
|
| +constexpr char kIconResourceId[] = "icon_resource_id";
|
| +constexpr char kInstallTime[] = "install_time";
|
| +constexpr char kIntentUri[] = "intent_uri";
|
| +constexpr char kInvalidatedIcons[] = "invalidated_icons";
|
| +constexpr char kLastBackupAndroidId[] = "last_backup_android_id";
|
| +constexpr char kLastBackupTime[] = "last_backup_time";
|
| +constexpr char kLastLaunchTime[] = "lastlaunchtime";
|
| +constexpr char kLaunchable[] = "launchable";
|
| +constexpr char kName[] = "name";
|
| +constexpr char kNotificationsEnabled[] = "notifications_enabled";
|
| +constexpr char kOrientationLock[] = "orientation_lock";
|
| +constexpr char kPackageName[] = "package_name";
|
| +constexpr char kPackageVersion[] = "package_version";
|
| +constexpr char kSticky[] = "sticky";
|
| +constexpr char kShortcut[] = "shortcut";
|
| +constexpr char kShouldSync[] = "should_sync";
|
| +constexpr char kSystem[] = "system";
|
| +constexpr char kUninstalled[] = "uninstalled";
|
|
|
| constexpr base::TimeDelta kDetectDefaultAppAvailabilityTimeout =
|
| base::TimeDelta::FromSeconds(15);
|
| @@ -114,9 +115,7 @@ class SetNotificationsEnabledDeferred {
|
| PrefService* const prefs_;
|
| };
|
|
|
| -bool InstallIconFromFileThread(const std::string& app_id,
|
| - ui::ScaleFactor scale_factor,
|
| - const base::FilePath& icon_path,
|
| +bool InstallIconFromFileThread(const base::FilePath& icon_path,
|
| const std::vector<uint8_t>& content_png) {
|
| DCHECK(!content_png.empty());
|
|
|
| @@ -128,9 +127,10 @@ bool InstallIconFromFileThread(const std::string& app_id,
|
| if (wrote != static_cast<int>(content_png.size())) {
|
| VLOG(2) << "Failed to write ARC icon file: " << icon_path.MaybeAsASCII()
|
| << ".";
|
| - if (!base::DeleteFile(icon_path, false))
|
| + if (!base::DeleteFile(icon_path, false)) {
|
| VLOG(2) << "Couldn't delete broken icon file" << icon_path.MaybeAsASCII()
|
| << ".";
|
| + }
|
| return false;
|
| }
|
|
|
| @@ -900,13 +900,14 @@ void ArcAppListPrefs::AddAppAndShortcut(
|
| }
|
|
|
| if (app_ready) {
|
| + int icon_update_mask = 0;
|
| + app_dict->GetInteger(kInvalidatedIcons, &icon_update_mask);
|
| auto pending_icons = request_icon_recorded_.find(app_id);
|
| - if (pending_icons != request_icon_recorded_.end()) {
|
| - for (uint32_t i = ui::SCALE_FACTOR_100P; i < ui::NUM_SCALE_FACTORS; ++i) {
|
| - if (pending_icons->second & (1 << i)) {
|
| - RequestIcon(app_id, static_cast<ui::ScaleFactor>(i));
|
| - }
|
| - }
|
| + if (pending_icons != request_icon_recorded_.end())
|
| + icon_update_mask |= pending_icons->second;
|
| + for (ui::ScaleFactor scale_factor : ui::GetSupportedScaleFactors()) {
|
| + if (icon_update_mask & (1 << scale_factor))
|
| + RequestIcon(app_id, scale_factor);
|
| }
|
|
|
| bool deferred_notifications_enabled;
|
| @@ -1098,8 +1099,20 @@ void ArcAppListPrefs::OnPackageAppListRefreshed(
|
| std::unordered_set<std::string> apps_to_remove =
|
| GetAppsForPackage(package_name);
|
| default_apps_.MaybeMarkPackageUninstalled(package_name, false);
|
| +
|
| + int invalidated_icon_mask = 0;
|
| + for (ui::ScaleFactor scale_factor : ui::GetSupportedScaleFactors())
|
| + invalidated_icon_mask |= (1 << scale_factor);
|
| +
|
| for (const auto& app : apps) {
|
| - apps_to_remove.erase(GetAppId(app->package_name, app->activity));
|
| + const std::string app_id = GetAppId(app->package_name, app->activity);
|
| + apps_to_remove.erase(app_id);
|
| +
|
| + // Mark app icons as invalidated.
|
| + ScopedArcPrefUpdate update(prefs_, app_id, prefs::kArcApps);
|
| + base::DictionaryValue* app_dict = update.Get();
|
| + app_dict->SetInteger(kInvalidatedIcons, invalidated_icon_mask);
|
| +
|
| AddApp(*app);
|
| }
|
|
|
| @@ -1432,11 +1445,10 @@ base::Time ArcAppListPrefs::GetInstallTime(const std::string& app_id) const {
|
| void ArcAppListPrefs::InstallIcon(const std::string& app_id,
|
| ui::ScaleFactor scale_factor,
|
| const std::vector<uint8_t>& content_png) {
|
| - base::FilePath icon_path = GetIconPath(app_id, scale_factor);
|
| + const base::FilePath icon_path = GetIconPath(app_id, scale_factor);
|
| base::PostTaskWithTraitsAndReplyWithResult(
|
| FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND},
|
| - base::Bind(&InstallIconFromFileThread, app_id, scale_factor, icon_path,
|
| - content_png),
|
| + base::Bind(&InstallIconFromFileThread, icon_path, content_png),
|
| base::Bind(&ArcAppListPrefs::OnIconInstalled,
|
| weak_ptr_factory_.GetWeakPtr(), app_id, scale_factor));
|
| }
|
| @@ -1448,6 +1460,13 @@ void ArcAppListPrefs::OnIconInstalled(const std::string& app_id,
|
| if (!install_succeed)
|
| return;
|
|
|
| + ScopedArcPrefUpdate update(prefs_, app_id, prefs::kArcApps);
|
| + int invalidated_icon_mask = 0;
|
| + base::DictionaryValue* app_dict = update.Get();
|
| + app_dict->GetInteger(kInvalidatedIcons, &invalidated_icon_mask);
|
| + invalidated_icon_mask &= (~(1 << scale_factor));
|
| + app_dict->SetInteger(kInvalidatedIcons, invalidated_icon_mask);
|
| +
|
| for (auto& observer : observer_list_)
|
| observer.OnAppIconUpdated(app_id, scale_factor);
|
| }
|
|
|