// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/crosapi/primary_profile_creation_waiter.h"
#include <utility>
#include "base/functional/callback.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/scoped_observation.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_manager_observer.h"
#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
#include "components/user_manager/user_manager.h"
namespace crosapi {
PrimaryProfileCreationWaiter::PrimaryProfileCreationWaiter(
ProfileManager* profile_manager,
base::OnceClosure callback)
: profile_manager_(profile_manager), callback_(std::move(callback)) {
profile_manager_observation_.Observe(profile_manager_.get());
}
PrimaryProfileCreationWaiter::~PrimaryProfileCreationWaiter() = default;
std::unique_ptr<PrimaryProfileCreationWaiter>
PrimaryProfileCreationWaiter::WaitOrRun(ProfileManager* profile_manager,
base::OnceClosure callback) {
// If the primary user's profile has already been created, run callback now.
auto* primary_user = user_manager::UserManager::Get()->GetPrimaryUser();
if (primary_user && primary_user->is_profile_created()) {
std::move(callback).Run();
return nullptr;
}
// Otherwise, return a waiter object which will invoke the callback
// once the profile for the primary user has been created.
return base::WrapUnique(
new PrimaryProfileCreationWaiter(profile_manager, std::move(callback)));
}
void PrimaryProfileCreationWaiter::OnProfileAdded(Profile* profile) {
// If the profile is the primary user's profile, run the callback.
auto* user =
ash::BrowserContextHelper::Get()->GetUserByBrowserContext(profile);
if (user_manager::UserManager::Get()->IsPrimaryUser(user)) {
profile_manager_observation_.Reset();
std::move(callback_).Run();
}
}
} // namespace crosapi