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

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: Address Pavel's comments. 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/chromeos/arc/arc_auth_service.h"
7 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" 9 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
9 #include "chrome/common/pref_names.h" 10 #include "chrome/common/pref_names.h"
10 #include "components/arc/common/app.mojom.h" 11 #include "components/arc/arc_bridge_service.h"
11 #include "components/arc/instance_holder.h"
12 #include "components/prefs/pref_service.h" 12 #include "components/prefs/pref_service.h"
13 #include "components/sync/driver/pref_names.h"
13 #include "components/sync/driver/sync_client.h" 14 #include "components/sync/driver/sync_client.h"
14 #include "components/sync/driver/sync_prefs.h" 15 #include "components/sync/driver/sync_prefs.h"
15 #include "components/sync/driver/sync_service.h" 16 #include "components/sync/driver/sync_service.h"
16 17
17 // ArcPackage sync service is controlled by apps checkbox in sync settings. Arc 18 // ArcPackage sync service is controlled by apps checkbox in sync settings. Arc
18 // apps and regular Chrome apps have same user control. 19 // apps and regular Chrome apps have same user control.
20 namespace {
21
22 // Indicates whether ARC is enabled on this machine.
23 bool IsArcEnabled(Profile* profile) {
24 return arc::ArcAuthService::IsAllowedForProfile(profile) &&
25 profile->GetPrefs()->GetBoolean(prefs::kArcEnabled);
26 }
27
28 } // namespace
29
19 ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController( 30 ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController(
20 syncer::ModelType type, 31 syncer::ModelType type,
21 const base::Closure& dump_stack, 32 const base::Closure& dump_stack,
22 sync_driver::SyncClient* sync_client, 33 sync_driver::SyncClient* sync_client,
23 Profile* profile) 34 Profile* profile)
24 : sync_driver::UIDataTypeController(type, dump_stack, sync_client), 35 : sync_driver::UIDataTypeController(type, dump_stack, sync_client),
25 profile_(profile), 36 profile_(profile),
26 sync_client_(sync_client) { 37 sync_client_(sync_client) {
27 pref_registrar_.Init(profile_->GetPrefs()); 38 pref_registrar_.Init(profile_->GetPrefs());
28 pref_registrar_.Add( 39 pref_registrar_.Add(
pavely 2016/09/29 08:49:02 You don't need to register for notifications on sy
lgcheng 2016/09/29 17:52:48 I think this is very neat suggestion to remove the
29 sync_driver::SyncPrefs::GetPrefNameForDataType(type), 40 sync_driver::SyncPrefs::GetPrefNameForDataType(type),
30 base::Bind(&ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged, 41 base::Bind(&ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged,
31 base::Unretained(this))); 42 base::Unretained(this)));
32 pref_registrar_.Add( 43 pref_registrar_.Add(
33 prefs::kArcEnabled, 44 prefs::kArcEnabled,
34 base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged, 45 base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged,
35 base::Unretained(this))); 46 base::Unretained(this)));
47
48 arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
49 if (arc_bridge_service)
50 arc_bridge_service->app()->AddObserver(this);
36 } 51 }
37 52
38 ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {} 53 ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {
54 arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
55 if (arc_bridge_service)
56 arc_bridge_service->app()->RemoveObserver(this);
57 }
39 58
40 bool ArcPackageSyncDataTypeController::ReadyForStart() const { 59 bool ArcPackageSyncDataTypeController::ReadyForStart() const {
41 DCHECK(CalledOnValidThread()); 60 DCHECK(CalledOnValidThread());
61 return IsArcEnabled(profile_) && ShouldSyncArc();
62 }
63
64 void ArcPackageSyncDataTypeController::OnInstanceReady() {
65 // model_normal_start_ is true by default. Normally,
66 // ArcPackageSyncDataTypeController::StartModels() gets called before Arc is
67 // ready. But in integration test, the order can be either way. If
68 // OnInstanceReady comes before ArcPackageSyncDataTypeController
69 // ::StartModels(), this function is no-op and waits for StartModels() to be
70 // called.
71 if (model_normal_start_)
72 return;
73
74 model_normal_start_ = true;
75 OnModelLoaded();
76 }
77
78 bool ArcPackageSyncDataTypeController::StartModels() {
79 DCHECK_EQ(state(), MODEL_STARTING);
42 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_); 80 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
43 return profile_->GetPrefs()->GetBoolean( 81 model_normal_start_ = prefs && prefs->app_instance_holder()->has_instance();
44 sync_driver::SyncPrefs::GetPrefNameForDataType(type())) && 82 return model_normal_start_;
45 prefs && prefs->app_instance_holder()->has_instance();
46 } 83 }
47 84
48 void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() { 85 void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() {
49 DCHECK(CalledOnValidThread()); 86 DCHECK(CalledOnValidThread());
50 87
51 if (!ReadyForStart()) { 88 if (!ReadyForStart()) {
52 // If apps sync in advanced sync settings is turned off then generate an 89 // If apps sync in advanced sync settings is turned off then generate an
53 // unrecoverable error. 90 // unrecoverable error.
54 if (state() != NOT_RUNNING && state() != STOPPING) { 91 if (state() != NOT_RUNNING && state() != STOPPING) {
55 syncer::SyncError error( 92 syncer::SyncError error(
56 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR, 93 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
57 "Arc package sync is now disabled by user.", type()); 94 "Arc package sync is now disabled by user.", type());
58 CreateErrorHandler()->OnUnrecoverableError(error); 95 CreateErrorHandler()->OnUnrecoverableError(error);
59 } 96 }
60 return; 97 return;
61 } 98 }
62 sync_driver::SyncService* sync_service = sync_client_->GetSyncService(); 99 EnableDataType();
63 DCHECK(sync_service);
64 sync_service->ReenableDatatype(type());
65 } 100 }
66 101
67 void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() { 102 void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() {
68 DCHECK(CalledOnValidThread()); 103 DCHECK(CalledOnValidThread());
69 if (!profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled)) { 104
105 if (!ReadyForStart()) {
70 // If enable Arc in settings is turned off then generate an unrecoverable 106 // If enable Arc in settings is turned off then generate an unrecoverable
71 // error. 107 // error.
72 if (state() != NOT_RUNNING && state() != STOPPING) { 108 if (state() != NOT_RUNNING && state() != STOPPING) {
73 syncer::SyncError error( 109 syncer::SyncError error(
74 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR, 110 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
75 "Arc package sync is now disabled because user disables Arc.", 111 "Arc package sync is now disabled because user disables Arc.",
76 type()); 112 type());
77 CreateErrorHandler()->OnUnrecoverableError(error); 113 CreateErrorHandler()->OnUnrecoverableError(error);
78 } 114 }
115 return;
79 } 116 }
117 EnableDataType();
80 } 118 }
119
120 void ArcPackageSyncDataTypeController::EnableDataType() {
121 sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
122 DCHECK(sync_service);
123 sync_service->ReenableDatatype(type());
124 }
125
126 bool ArcPackageSyncDataTypeController::ShouldSyncArc() const {
127 sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
128 DCHECK(sync_service);
129 return sync_service->GetPreferredDataTypes().Has(type());
130 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698