blob: b499592be4138484d630c3d00213233a5d948280 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs_factory.h"
#include "components/sync/base/pref_names.h"
#include "components/sync/base/sync_prefs.h"
#include "components/sync/driver/sync_client.h"
#include "components/sync/driver/sync_service.h"
ArcPackageSyncDataTypeController::ArcPackageSyncDataTypeController(
syncer::ModelType type,
const base::Closure& dump_stack,
syncer::SyncService* sync_service,
syncer::SyncClient* sync_client,
Profile* profile)
: syncer::AsyncDirectoryTypeController(type,
dump_stack,
sync_service,
sync_client,
syncer::GROUP_UI,
base::ThreadTaskRunnerHandle::Get()),
profile_(profile) {
arc::ArcSessionManager* arc_session_manager = arc::ArcSessionManager::Get();
if (arc_session_manager)
arc_session_manager->AddObserver(this);
}
ArcPackageSyncDataTypeController::~ArcPackageSyncDataTypeController() {
arc::ArcSessionManager* arc_session_manager = arc::ArcSessionManager::Get();
if (arc_session_manager)
arc_session_manager->RemoveObserver(this);
}
bool ArcPackageSyncDataTypeController::ReadyForStart() const {
DCHECK(CalledOnValidThread());
// In sync integration test, always consider the DTC as ready for start.
return ArcAppListPrefsFactory::IsFactorySetForSyncTest() ||
(arc::IsArcPlayStoreEnabledForProfile(profile_) && ShouldSyncArc());
}
bool ArcPackageSyncDataTypeController::StartModels() {
DCHECK_EQ(state(), MODEL_STARTING);
ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(profile_);
DCHECK(arc_prefs);
model_normal_start_ = arc_prefs->package_list_initial_refreshed();
arc_prefs->AddObserver(this);
return model_normal_start_;
}
void ArcPackageSyncDataTypeController::StopModels() {
ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(profile_);
if (arc_prefs)
arc_prefs->RemoveObserver(this);
}
void ArcPackageSyncDataTypeController::OnPackageListInitialRefreshed() {
// model_normal_start_ is true by default. Normally,
// ArcPackageSyncDataTypeController::StartModels() gets called before ARC
// package list is refreshed. But in integration test, the order can be either
// way. If OnPackageListInitialRefreshed 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();
}
void ArcPackageSyncDataTypeController::OnArcPlayStoreEnabledChanged(
bool enabled) {
DCHECK(CalledOnValidThread());
// Delay enabling DTC until ARC successfully signed in.
if (ReadyForStart())
return;
// 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());
CreateErrorHandler()->OnUnrecoverableError(error);
}
}
void ArcPackageSyncDataTypeController::OnArcInitialStart() {
EnableDataType();
}
void ArcPackageSyncDataTypeController::EnableDataType() {
sync_service()->ReenableDatatype(type());
}
bool ArcPackageSyncDataTypeController::ShouldSyncArc() const {
return sync_service()->GetPreferredDataTypes().Has(type());
}