blob: 1954993e6043c2850e0601ef5ace16395c36ee78 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_STARTUP_SILENT_SYNC_ENABLER_H_
#define CHROME_BROWSER_UI_STARTUP_SILENT_SYNC_ENABLER_H_
#include "base/functional/callback_forward.h"
#include "base/scoped_observation.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#if !BUILDFLAG(IS_CHROMEOS_LACROS)
#error This is only supported on lacros.
#endif
class Profile;
// Allows turning on Sync silently by running through the regular flow without
// showing any UI.
// Use it by calling `SilentSyncEnabler::StartAttempt()`, keep the returned
// instance around to make sure multiple attempts are not happening at the same
// time.
// Intended to be used when migrating previously syncing profiles to Lacros.
class SilentSyncEnabler : public signin::IdentityManager::Observer {
public:
explicit SilentSyncEnabler(Profile* profile);
~SilentSyncEnabler() override;
SilentSyncEnabler(const SilentSyncEnabler&) = delete;
SilentSyncEnabler& operator=(const SilentSyncEnabler&) = delete;
// Attempts to turn Sync on with `profile_`'s primary account and runs
// `callback` when the attempts completes, whether it succeeded or not.
// Notes:
// - Deleting the returned instance will not cancel the attempt and
// `callback` can potentially be executed after this instance has been
// deleted. It is the caller's responsibility to ensure that it is safe to
// do so.
// - If this is called while another attempt is happening on the same profile,
// the other attempt will be cancelled (per TurnSyncOnHelper's behaviour,
// only one can be attached to a profile at a time).
void StartAttempt(base::OnceClosure callback);
private:
void TryEnableSyncSilentlyWithToken();
// signin::IdentityManager::Observer:
void OnRefreshTokensLoaded() override;
raw_ptr<Profile> profile_;
base::OnceClosure callback_;
base::ScopedObservation<signin::IdentityManager,
signin::IdentityManager::Observer>
scoped_observation_{this};
};
#endif // CHROME_BROWSER_UI_STARTUP_SILENT_SYNC_ENABLER_H_