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 765fea0b6a8e5c6980419ab0de52a07cfe85adb7..21e53335590302c42d3e32b53b4ebd31d07c1633 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 |
@@ -53,6 +53,9 @@ const char kUninstalled[] = "uninstalled"; |
constexpr uint32_t kSetNotificationsEnabledMinVersion = 6; |
constexpr uint32_t kRequestIconMinVersion = 9; |
+constexpr base::TimeDelta kValidateDefaultAppaAvailabilityTimeout = |
Luis Héctor Chávez
2017/01/03 19:08:00
nit: s/AppaAvailability/AppAvailability/
khmel
2017/01/03 21:40:56
Thanks!
|
+ base::TimeDelta::FromSeconds(15); |
+ |
// Provider of write access to a dictionary storing ARC prefs. |
class ScopedArcPrefUpdate : public DictionaryPrefUpdate { |
public: |
@@ -400,6 +403,10 @@ std::unique_ptr<ArcAppListPrefs::PackageInfo> ArcAppListPrefs::GetPackage( |
!packages->GetDictionaryWithoutPathExpansion(package_name, &package)) |
return std::unique_ptr<PackageInfo>(); |
+ bool uninstalled; |
Luis Héctor Chávez
2017/01/03 19:08:00
nit: = false.
khmel
2017/01/03 21:40:56
Done.
|
+ if (package->GetBoolean(kUninstalled, &uninstalled) && uninstalled) |
+ return nullptr; |
+ |
int32_t package_version = 0; |
int64_t last_backup_android_id = 0; |
int64_t last_backup_time = 0; |
@@ -660,6 +667,13 @@ void ArcAppListPrefs::SetDefaltAppsReadyCallback(base::Closure callback) { |
default_apps_ready_callback_.Run(); |
} |
+void ArcAppListPrefs::SimulateDefaultAppAvailabilityTimeoutForTesting() { |
+ if (!validate_default_app_availability_timeout_.IsRunning()) |
+ return; |
+ validate_default_app_availability_timeout_.Stop(); |
+ ValidateDefaultAppaAvailability(); |
+} |
+ |
void ArcAppListPrefs::OnInstanceReady() { |
// Init() is also available at version 0. |
arc::mojom::AppInstance* app_instance = |
@@ -681,6 +695,8 @@ void ArcAppListPrefs::OnInstanceReady() { |
void ArcAppListPrefs::OnInstanceClosed() { |
DisableAllApps(); |
installing_packages_count_ = 0; |
+ default_apps_installations_.clear(); |
+ validate_default_app_availability_timeout_.Stop(); |
binding_.Close(); |
if (sync_service_) { |
@@ -908,10 +924,32 @@ void ArcAppListPrefs::OnAppListRefreshed( |
if (!is_initialized_) { |
is_initialized_ = true; |
+ MaybeSetDefaultAppLoadingTimeout(); |
UMA_HISTOGRAM_COUNTS_1000("Arc.AppsInstalledAtStartup", ready_apps_.size()); |
} |
} |
+void ArcAppListPrefs::ValidateDefaultAppaAvailability() { |
Luis Héctor Chávez
2017/01/03 19:08:00
This does not perform validation. How about callin
khmel
2017/01/03 21:40:56
Done.
|
+ for (const auto& package : default_apps_.GetActivePackages()) { |
+ // Check if already installed or installation in progress. |
+ if (!GetPackage(package) && !default_apps_installations_.count(package)) { |
Luis Héctor Chávez
2017/01/03 19:07:59
nit: elide braces
khmel
2017/01/03 21:40:56
Done.
|
+ HandlePackageRemoved(package); |
+ } |
+ } |
+} |
+ |
+void ArcAppListPrefs::MaybeSetDefaultAppLoadingTimeout() { |
+ // Find at least one not installed defualt app package. |
Luis Héctor Chávez
2017/01/03 19:08:00
nit: s/defualt/default/
khmel
2017/01/03 21:40:56
Done.
|
+ for (const auto& package : default_apps_.GetActivePackages()) { |
+ if (!GetPackage(package)) { |
+ validate_default_app_availability_timeout_.Start(FROM_HERE, |
+ kValidateDefaultAppaAvailabilityTimeout, this, |
+ &ArcAppListPrefs::ValidateDefaultAppaAvailability); |
+ break; |
+ } |
+ } |
+} |
+ |
void ArcAppListPrefs::OnTaskOrientationLockRequested( |
int32_t task_id, |
const arc::mojom::OrientationLock orientation_lock) { |
@@ -1010,13 +1048,18 @@ std::unordered_set<std::string> ArcAppListPrefs::GetAppsForPackage( |
return app_set; |
} |
-void ArcAppListPrefs::OnPackageRemoved(const std::string& package_name) { |
+void ArcAppListPrefs::HandlePackageRemoved(const std::string& package_name) { |
const std::unordered_set<std::string> apps_to_remove = |
GetAppsForPackage(package_name); |
for (const auto& app_id : apps_to_remove) |
RemoveApp(app_id); |
RemovePackageFromPrefs(prefs_, package_name); |
+} |
+ |
+void ArcAppListPrefs::OnPackageRemoved(const std::string& package_name) { |
+ HandlePackageRemoved(package_name); |
+ |
for (auto& observer : observer_list_) |
observer.OnPackageRemoved(package_name); |
} |
@@ -1255,14 +1298,26 @@ void ArcAppListPrefs::OnIconInstalled(const std::string& app_id, |
observer.OnAppIconUpdated(app_id, scale_factor); |
} |
-void ArcAppListPrefs::OnInstallationStarted() { |
+void ArcAppListPrefs::OnInstallationStarted( |
+ const base::Optional<std::string>& package_name) { |
// Start new batch installation group if this is first installation. |
if (!installing_packages_count_) |
++current_batch_installation_revision_; |
++installing_packages_count_; |
+ |
+ if (package_name.has_value() && default_apps_.HasPackage(*package_name)) |
+ default_apps_installations_.insert(*package_name); |
} |
-void ArcAppListPrefs::OnInstallationFinished() { |
+void ArcAppListPrefs::OnInstallationFinished( |
+ const base::Optional<std::string>& package_name, bool success) { |
+ if (package_name.has_value() && default_apps_.HasPackage(*package_name)) { |
+ default_apps_installations_.erase(*package_name); |
+ |
+ if (!success && !GetPackage(*package_name)) |
+ HandlePackageRemoved(*package_name); |
Luis Héctor Chávez
2017/01/03 19:07:59
Isn't this a no-op when !GetPackage(*package_name)
khmel
2017/01/03 21:40:56
HandlePackageRemoved explicitly marks package unin
|
+ } |
+ |
if (!installing_packages_count_) { |
VLOG(2) << "Received unexpected installation finished event"; |
return; |