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

Unified 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 Yury's comment. Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
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());
}

Powered by Google App Engine
This is Rietveld 408576698