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

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: Remove redundant pref observer. 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(
29 sync_driver::SyncPrefs::GetPrefNameForDataType(type),
30 base::Bind(&ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged,
31 base::Unretained(this)));
32 pref_registrar_.Add(
33 prefs::kArcEnabled, 40 prefs::kArcEnabled,
34 base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged, 41 base::Bind(&ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged,
35 base::Unretained(this))); 42 base::Unretained(this)));
43
44 arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
45 if (arc_bridge_service)
46 arc_bridge_service->app()->AddObserver(this);
36 } 47 }
37 48
38 ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {} 49 ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {
50 arc::ArcBridgeService* arc_bridge_service = arc::ArcBridgeService::Get();
51 if (arc_bridge_service)
52 arc_bridge_service->app()->RemoveObserver(this);
53 }
39 54
40 bool ArcPackageSyncDataTypeController::ReadyForStart() const { 55 bool ArcPackageSyncDataTypeController::ReadyForStart() const {
41 DCHECK(CalledOnValidThread()); 56 DCHECK(CalledOnValidThread());
42 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_); 57 return IsArcEnabled(profile_) && ShouldSyncArc();
43 return profile_->GetPrefs()->GetBoolean(
44 sync_driver::SyncPrefs::GetPrefNameForDataType(type())) &&
45 prefs && prefs->app_instance_holder()->has_instance();
46 } 58 }
47 59
48 void ArcPackageSyncDataTypeController::OnArcAppsSyncPrefChanged() { 60 void ArcPackageSyncDataTypeController::OnInstanceReady() {
49 DCHECK(CalledOnValidThread()); 61 // model_normal_start_ is true by default. Normally,
62 // ArcPackageSyncDataTypeController::StartModels() gets called before Arc is
63 // ready. But in integration test, the order can be either way. If
64 // OnInstanceReady comes before ArcPackageSyncDataTypeController
65 // ::StartModels(), this function is no-op and waits for StartModels() to be
66 // called.
67 if (model_normal_start_)
68 return;
50 69
51 if (!ReadyForStart()) { 70 model_normal_start_ = true;
52 // If apps sync in advanced sync settings is turned off then generate an 71 OnModelLoaded();
53 // unrecoverable error. 72 }
54 if (state() != NOT_RUNNING && state() != STOPPING) { 73
55 syncer::SyncError error( 74 bool ArcPackageSyncDataTypeController::StartModels() {
56 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR, 75 DCHECK_EQ(state(), MODEL_STARTING);
57 "Arc package sync is now disabled by user.", type()); 76 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_);
58 CreateErrorHandler()->OnUnrecoverableError(error); 77 model_normal_start_ = prefs && prefs->app_instance_holder()->has_instance();
59 } 78 return model_normal_start_;
60 return;
61 }
62 sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
63 DCHECK(sync_service);
64 sync_service->ReenableDatatype(type());
65 } 79 }
66 80
67 void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() { 81 void ArcPackageSyncDataTypeController::OnArcEnabledPrefChanged() {
68 DCHECK(CalledOnValidThread()); 82 DCHECK(CalledOnValidThread());
69 if (!profile_->GetPrefs()->GetBoolean(prefs::kArcEnabled)) { 83
84 if (!ReadyForStart()) {
70 // If enable Arc in settings is turned off then generate an unrecoverable 85 // If enable Arc in settings is turned off then generate an unrecoverable
71 // error. 86 // error.
72 if (state() != NOT_RUNNING && state() != STOPPING) { 87 if (state() != NOT_RUNNING && state() != STOPPING) {
73 syncer::SyncError error( 88 syncer::SyncError error(
74 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR, 89 FROM_HERE, syncer::SyncError::DATATYPE_POLICY_ERROR,
75 "Arc package sync is now disabled because user disables Arc.", 90 "Arc package sync is now disabled because user disables Arc.",
76 type()); 91 type());
77 CreateErrorHandler()->OnUnrecoverableError(error); 92 CreateErrorHandler()->OnUnrecoverableError(error);
78 } 93 }
94 return;
79 } 95 }
96 EnableDataType();
80 } 97 }
98
99 void ArcPackageSyncDataTypeController::EnableDataType() {
100 sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
101 DCHECK(sync_service);
102 sync_service->ReenableDatatype(type());
103 }
104
105 bool ArcPackageSyncDataTypeController::ShouldSyncArc() const {
106 sync_driver::SyncService* sync_service = sync_client_->GetSyncService();
107 DCHECK(sync_service);
108 return sync_service->GetPreferredDataTypes().Has(type());
109 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698