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 e1cd33e50e98d1a136af4927636f30c7871f7a8d..a95493d6e723c4b4fb6fb4db024c685fd7643f0c 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 |
@@ -6,10 +6,17 @@ |
#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/prefs/pref_service.h" |
+#include "components/sync/driver/sync_client.h" |
+#include "components/sync/driver/sync_prefs.h" |
+#include "components/sync/driver/sync_service.h" |
#include "content/public/browser/browser_thread.h" |
+// ArcPackage sync service is controlled by apps checkbox in sync settings. Arc |
+// apps and regular Chrome apps have same user control. |
ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController( |
syncer::ModelType type, |
const base::Closure& error_callback, |
@@ -21,13 +28,57 @@ ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController( |
error_callback, |
type, |
sync_client), |
- profile_(profile) {} |
+ profile_(profile), |
+ 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))); |
+} |
ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {} |
bool ArcPackageSyncDataTypeController::ReadyForStart() const { |
ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_); |
- if (prefs && prefs->app_instance_holder()->instance()) |
- return true; |
- return false; |
+ return profile_->GetPrefs()->GetBoolean( |
+ sync_driver::SyncPrefs::GetPrefNameForDataType(type())) && |
+ prefs && prefs->app_instance_holder()->instance(); |
+} |
+ |
+void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() { |
+ DCHECK(ui_thread()->BelongsToCurrentThread()); |
+ |
+ if (!ReadyForStart()) { |
+ // If apps sync in advanced sync 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()); |
+ OnSingleDataTypeUnrecoverableError(error); |
+ } |
+ return; |
+ } |
+ sync_driver::SyncService* sync_service = sync_client_->GetSyncService(); |
+ DCHECK(sync_service); |
+ sync_service->ReenableDatatype(type()); |
+} |
+ |
+void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() { |
+ 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()); |
+ OnSingleDataTypeUnrecoverableError(error); |
+ } |
+ } |
} |