Chromium Code Reviews| 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..decea68461f565b2d6a3156a91c0504b33f23e90 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,24 +4,56 @@ |
| #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 { |
| + |
| +bool ValidateEnableArcPackageSyncPref(Profile* profile) { |
| + PrefService* pref_service = profile->GetPrefs(); |
| + // If device is set to sync everything, Arc package should be synced. |
| + if (pref_service->GetBoolean(sync_driver::prefs::kSyncKeepEverythingSynced)) |
| + return true; |
| + |
| + const bool apps_sync_enable = pref_service->GetBoolean( |
| + sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::APPS)); |
| + // ArcPackage sync service is controlled by apps checkbox in sync settings. |
| + // Update ArcPackage sync setting pref if it is different from apps sync |
| + // setting pref. |
| + const char* arc_sync_path = |
| + sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::ARC_PACKAGE); |
| + if (apps_sync_enable != pref_service->GetBoolean(arc_sync_path)) { |
| + pref_service->SetBoolean(arc_sync_path, apps_sync_enable); |
| + } |
| + |
| + return apps_sync_enable; |
| +} |
| + |
| +// 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, |
| sync_driver::SyncClient* sync_client, |
| Profile* profile) |
| : sync_driver::UIDataTypeController(type, dump_stack, sync_client), |
| + model_normal_start_(true), |
|
khmel
2016/09/28 17:25:49
nit: move init of model_normal_start_ to header. I
lgcheng
2016/09/28 17:28:50
Done. Sorry I miss the remove.
|
| profile_(profile), |
| sync_client_(sync_client) { |
| pref_registrar_.Init(profile_->GetPrefs()); |
| @@ -33,16 +65,42 @@ ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController( |
| 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_) && ValidateEnableArcPackageSyncPref(profile_); |
| +} |
| + |
| +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() { |
| @@ -59,14 +117,13 @@ void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() { |
| } |
| return; |
| } |
| - sync_driver::SyncService* sync_service = sync_client_->GetSyncService(); |
| - DCHECK(sync_service); |
| - sync_service->ReenableDatatype(type()); |
| + EnableDataType(); |
| } |
| void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() { |
| DCHECK(CalledOnValidThread()); |
| - if (!profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled)) { |
| + |
| + if (!ReadyForStart()) { |
| // If enable Arc in settings is turned off then generate an unrecoverable |
| // error. |
| if (state() != NOT_RUNNING && state() != STOPPING) { |
| @@ -76,5 +133,13 @@ void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() { |
| type()); |
| CreateErrorHandler()->OnUnrecoverableError(error); |
| } |
| + return; |
| } |
| + EnableDataType(); |
| +} |
| + |
| +void ArcPackageSyncDataTypeController::EnableDataType() { |
| + sync_driver::SyncService* sync_service = sync_client_->GetSyncService(); |
| + DCHECK(sync_service); |
| + sync_service->ReenableDatatype(type()); |
| } |