| Index: chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc
|
| diff --git a/chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc b/chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc
|
| index 601e410fada7a33851c065d254708d578ef59518..0ca0cfd6ff30e418f26bea25beff162849f49f55 100644
|
| --- a/chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc
|
| +++ b/chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc
|
| @@ -4,18 +4,29 @@
|
|
|
| #include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h"
|
|
|
| +#include "chrome/browser/chromeos/arc/arc_auth_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
|
| #include "chrome/common/pref_names.h"
|
| -#include "components/arc/common/app.mojom.h"
|
| -#include "components/arc/instance_holder.h"
|
| +#include "components/arc/arc_bridge_service.h"
|
| #include "components/prefs/pref_service.h"
|
| +#include "components/sync/driver/pref_names.h"
|
| #include "components/sync/driver/sync_client.h"
|
| #include "components/sync/driver/sync_prefs.h"
|
| #include "components/sync/driver/sync_service.h"
|
|
|
| // ArcPackage sync service is controlled by apps checkbox in sync settings. Arc
|
| // apps and regular Chrome apps have same user control.
|
| +namespace {
|
| +
|
| +// Indicates whether ARC is enabled on this machine.
|
| +bool IsArcEnabled(Profile* profile) {
|
| + return arc::ArcAuthService::IsAllowedForProfile(profile) &&
|
| + profile->GetPrefs()->GetBoolean(prefs::kArcEnabled);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController(
|
| syncer::ModelType type,
|
| const base::Closure& dump_stack,
|
| @@ -26,55 +37,73 @@ ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController(
|
| sync_client_(sync_client) {
|
| pref_registrar_.Init(profile_->GetPrefs());
|
| pref_registrar_.Add(
|
| - sync_driver::SyncPrefs::GetPrefNameForDataType(type),
|
| - base::Bind(&ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged,
|
| - base::Unretained(this)));
|
| - pref_registrar_.Add(
|
| prefs::kArcEnabled,
|
| base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged,
|
| base::Unretained(this)));
|
| +
|
| + arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
|
| + if (arc_bridge_service)
|
| + arc_bridge_service->app()->AddObserver(this);
|
| }
|
|
|
| -ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {}
|
| +ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {
|
| + arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
|
| + if (arc_bridge_service)
|
| + arc_bridge_service->app()->RemoveObserver(this);
|
| +}
|
|
|
| bool ArcPackageSyncDataTypeController::ReadyForStart() const {
|
| DCHECK(CalledOnValidThread());
|
| + return IsArcEnabled(profile_) && ShouldSyncArc();
|
| +}
|
| +
|
| +void ArcPackageSyncDataTypeController::OnInstanceReady() {
|
| + // model_normal_start_ is true by default. Normally,
|
| + // ArcPackageSyncDataTypeController::StartModels() gets called before Arc is
|
| + // ready. But in integration test, the order can be either way. If
|
| + // OnInstanceReady comes before ArcPackageSyncDataTypeController
|
| + // ::StartModels(), this function is no-op and waits for StartModels() to be
|
| + // called.
|
| + if (model_normal_start_)
|
| + return;
|
| +
|
| + model_normal_start_ = true;
|
| + OnModelLoaded();
|
| +}
|
| +
|
| +bool ArcPackageSyncDataTypeController::StartModels() {
|
| + DCHECK_EQ(state(), MODEL_STARTING);
|
| ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
|
| - return profile_->GetPrefs()->GetBoolean(
|
| - sync_driver::SyncPrefs::GetPrefNameForDataType(type())) &&
|
| - prefs && prefs->app_instance_holder()->has_instance();
|
| + model_normal_start_ = prefs && prefs->app_instance_holder()->has_instance();
|
| + return model_normal_start_;
|
| }
|
|
|
| -void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() {
|
| +void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() {
|
| DCHECK(CalledOnValidThread());
|
|
|
| if (!ReadyForStart()) {
|
| - // If apps sync in advanced sync settings is turned off then generate an
|
| - // unrecoverable error.
|
| + // If enable Arc in settings is turned off then generate an unrecoverable
|
| + // error.
|
| if (state() != NOT_RUNNING && state() != STOPPING) {
|
| syncer::SyncError error(
|
| FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
|
| - "Arc package sync is now disabled by user.", type());
|
| + "Arc package sync is now disabled because user disables Arc.",
|
| + type());
|
| CreateErrorHandler()->OnUnrecoverableError(error);
|
| }
|
| return;
|
| }
|
| + EnableDataType();
|
| +}
|
| +
|
| +void ArcPackageSyncDataTypeController::EnableDataType() {
|
| sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
|
| DCHECK(sync_service);
|
| sync_service->ReenableDatatype(type());
|
| }
|
|
|
| -void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() {
|
| - DCHECK(CalledOnValidThread());
|
| - if (!profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled)) {
|
| - // If enable Arc in settings is turned off then generate an unrecoverable
|
| - // error.
|
| - if (state() != NOT_RUNNING && state() != STOPPING) {
|
| - syncer::SyncError error(
|
| - FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
|
| - "Arc package sync is now disabled because user disables Arc.",
|
| - type());
|
| - CreateErrorHandler()->OnUnrecoverableError(error);
|
| - }
|
| - }
|
| +bool ArcPackageSyncDataTypeController::ShouldSyncArc() const {
|
| + sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
|
| + DCHECK(sync_service);
|
| + return sync_service->GetPreferredDataTypes().Has(type());
|
| }
|
|
|