Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc

Issue 2353213002: arc: Fix Android App resurrected by sync. (Closed)
Patch Set: Nit. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h " 5 #include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h "
6 6
7 #include "chrome/browser/profiles/profile.h" 7 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" 8 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
9 #include "chrome/common/pref_names.h" 9 #include "chrome/common/pref_names.h"
10 #include "components/arc/common/app.mojom.h" 10 #include "components/arc/arc_bridge_service.h"
11 #include "components/arc/instance_holder.h"
12 #include "components/prefs/pref_service.h" 11 #include "components/prefs/pref_service.h"
12 #include "components/sync/driver/pref_names.h"
13 #include "components/sync/driver/sync_client.h" 13 #include "components/sync/driver/sync_client.h"
14 #include "components/sync/driver/sync_prefs.h" 14 #include "components/sync/driver/sync_prefs.h"
15 #include "components/sync/driver/sync_service.h" 15 #include "components/sync/driver/sync_service.h"
16 16
17 // ArcPackage sync service is controlled by apps checkbox in sync settings. Arc 17 // ArcPackage sync service is controlled by apps checkbox in sync settings. Arc
18 // apps and regular Chrome apps have same user control. 18 // apps and regular Chrome apps have same user control.
19 namespace {
20
21 bool ValidateEnableArcPackageSyncPref(Profile* profile) {
22 PrefService* pref_service = profile->GetPrefs();
23 // If device is set to sync everything, Arc package should be synced.
24 if (pref_service->GetBoolean(sync_driver::prefs::kSyncKeepEverythingSynced))
25 return true;
26
27 bool apps_sync_enable = pref_service->GetBoolean(
khmel 2016/09/28 17:01:56 nit: const bool apps_...
lgcheng 2016/09/28 17:22:41 Done.
28 sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::APPS));
29 // ArcPackage sync service is controlled by apps checkbox in sync settings.
30 // Update ArcPackage sync setting pref if it is different from apps sync
31 // setting pref.
32 const char* arc_sync_path =
33 sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::ARC_PACKAGE);
34 if (apps_sync_enable != pref_service->GetBoolean(arc_sync_path)) {
35 pref_service->SetBoolean(arc_sync_path, apps_sync_enable);
36 }
37
38 return apps_sync_enable;
39 }
40
41 // Indicates whether ARC is enabled on this machine.
42 bool IsArcEnabled(Profile* profile) {
43 return profile->GetPrefs()->GetBoolean(prefs::kArcEnabled);
khmel 2016/09/28 17:01:56 This could be dangerous. ArcEnabled may be set in
lgcheng 2016/09/28 17:22:41 Thanks for pointing out this logic! Done. But did
44 }
45
46 } // namespace
47
19 ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController( 48 ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController(
20 syncer::ModelType type, 49 syncer::ModelType type,
21 const base::Closure& dump_stack, 50 const base::Closure& dump_stack,
22 sync_driver::SyncClient* sync_client, 51 sync_driver::SyncClient* sync_client,
23 Profile* profile) 52 Profile* profile)
24 : sync_driver::UIDataTypeController(type, dump_stack, sync_client), 53 : sync_driver::UIDataTypeController(type, dump_stack, sync_client),
54 model_normal_start_(true),
xiyuan 2016/09/28 16:31:14 nit: move this initializer to header
lgcheng 2016/09/28 16:58:10 Done.
25 profile_(profile), 55 profile_(profile),
26 sync_client_(sync_client) { 56 sync_client_(sync_client) {
27 pref_registrar_.Init(profile_->GetPrefs()); 57 pref_registrar_.Init(profile_->GetPrefs());
28 pref_registrar_.Add( 58 pref_registrar_.Add(
29 sync_driver::SyncPrefs::GetPrefNameForDataType(type), 59 sync_driver::SyncPrefs::GetPrefNameForDataType(type),
30 base::Bind(&ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged, 60 base::Bind(&ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged,
31 base::Unretained(this))); 61 base::Unretained(this)));
32 pref_registrar_.Add( 62 pref_registrar_.Add(
33 prefs::kArcEnabled, 63 prefs::kArcEnabled,
34 base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged, 64 base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged,
35 base::Unretained(this))); 65 base::Unretained(this)));
66
67 arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
68 if (arc_bridge_service)
69 arc_bridge_service->app()->AddObserver(this);
36 } 70 }
37 71
38 ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {} 72 ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {
73 arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
74 if (arc_bridge_service)
75 arc_bridge_service->app()->RemoveObserver(this);
76 }
39 77
40 bool ArcPackageSyncDataTypeController::ReadyForStart() const { 78 bool ArcPackageSyncDataTypeController::ReadyForStart() const {
41 DCHECK(CalledOnValidThread()); 79 DCHECK(CalledOnValidThread());
80 return ValidateEnableArcPackageSyncPref(profile_) && IsArcEnabled(profile_);
xiyuan 2016/09/28 16:31:14 nit: swap the two conditions to check IsArcEnabled
lgcheng 2016/09/28 16:58:10 Thanks for pointing out that swap the order normal
81 }
82
83 void ArcPackageSyncDataTypeController::OnInstanceReady() {
84 // Normally, ArcPackageSyncDataTypeController::StartModels() gets called
85 // before Arc is ready. But in integration test, the order can be either way.
86 // If OnInstanceReady comes before ArcPackageSyncDataTypeController
87 // ::StartModels(), this function is no-op and waits for StartModels() to be
88 // called.
xiyuan 2016/09/28 16:31:14 nit: mention that |model_normal_start_| is initial
lgcheng 2016/09/28 16:58:10 Done.
89 if (model_normal_start_)
90 return;
91
92 model_normal_start_ = true;
93 OnModelLoaded();
94 }
95
96 bool ArcPackageSyncDataTypeController::StartModels() {
97 DCHECK_EQ(state(), MODEL_STARTING);
42 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_); 98 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
43 return profile_->GetPrefs()->GetBoolean( 99 model_normal_start_ = prefs && prefs->app_instance_holder()->has_instance();
44 sync_driver::SyncPrefs::GetPrefNameForDataType(type())) && 100 return model_normal_start_;
45 prefs && prefs->app_instance_holder()->has_instance();
46 } 101 }
47 102
48 void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() { 103 void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() {
49 DCHECK(CalledOnValidThread()); 104 DCHECK(CalledOnValidThread());
50 105
51 if (!ReadyForStart()) { 106 if (!ReadyForStart()) {
52 // If apps sync in advanced sync settings is turned off then generate an 107 // If apps sync in advanced sync settings is turned off then generate an
53 // unrecoverable error. 108 // unrecoverable error.
54 if (state() != NOT_RUNNING && state() != STOPPING) { 109 if (state() != NOT_RUNNING && state() != STOPPING) {
55 syncer::SyncError error( 110 syncer::SyncError error(
56 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR, 111 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
57 "Arc package sync is now disabled by user.", type()); 112 "Arc package sync is now disabled by user.", type());
58 CreateErrorHandler()->OnUnrecoverableError(error); 113 CreateErrorHandler()->OnUnrecoverableError(error);
59 } 114 }
60 return; 115 return;
61 } 116 }
62 sync_driver::SyncService* sync_service = sync_client_->GetSyncService(); 117 EnableDataType();
63 DCHECK(sync_service);
64 sync_service->ReenableDatatype(type());
65 } 118 }
66 119
67 void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() { 120 void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() {
68 DCHECK(CalledOnValidThread()); 121 DCHECK(CalledOnValidThread());
69 if (!profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled)) { 122
123 if (!ReadyForStart()) {
70 // If enable Arc in settings is turned off then generate an unrecoverable 124 // If enable Arc in settings is turned off then generate an unrecoverable
71 // error. 125 // error.
72 if (state() != NOT_RUNNING && state() != STOPPING) { 126 if (state() != NOT_RUNNING && state() != STOPPING) {
73 syncer::SyncError error( 127 syncer::SyncError error(
74 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR, 128 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
75 "Arc package sync is now disabled because user disables Arc.", 129 "Arc package sync is now disabled because user disables Arc.",
76 type()); 130 type());
77 CreateErrorHandler()->OnUnrecoverableError(error); 131 CreateErrorHandler()->OnUnrecoverableError(error);
78 } 132 }
133 return;
79 } 134 }
135 EnableDataType();
80 } 136 }
137
138 void ArcPackageSyncDataTypeController::EnableDataType() {
139 sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
140 DCHECK(sync_service);
141 sync_service->ReenableDatatype(type());
142 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698