chromium/chrome/browser/ash/child_accounts/child_policy_observer.cc

// Copyright 2019 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/child_accounts/child_policy_observer.h"

#include <optional>

#include "base/timer/timer.h"
#include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h"
#include "chrome/browser/profiles/profile.h"
#include "components/policy/core/common/cloud/cloud_policy_core.h"

namespace ash {

ChildPolicyObserver::ChildPolicyObserver(Profile* profile) : profile_(profile) {
  policy::CloudPolicyService* cloud_policy_service =
      GetUserCloudPolicyManager()->core()->service();
  std::optional<bool> initial_policy_refresh_result =
      cloud_policy_service->initial_policy_refresh_result();
  if (initial_policy_refresh_result) {
    OnPolicyReady(*initial_policy_refresh_result
                      ? InitialPolicyRefreshResult::kPolicyRefreshed
                      : InitialPolicyRefreshResult::kPolicyRefreshError);
  }
  cloud_policy_service->AddObserver(this);
}

ChildPolicyObserver::~ChildPolicyObserver() {
  GetUserCloudPolicyManager()->core()->service()->RemoveObserver(this);
}

void ChildPolicyObserver::NotifyWhenPolicyReady(
    PolicyReadyCallback on_policy_ready,
    base::TimeDelta timeout) {
  DCHECK(!on_policy_ready_);

  if (IsChildPolicyReady()) {
    std::move(on_policy_ready).Run(profile_.get(), refresh_result_);
    return;
  }

  on_policy_ready_ = std::move(on_policy_ready);
  refresh_timeout_timer_ = std::make_unique<base::OneShotTimer>();
  refresh_timeout_timer_->Start(
      FROM_HERE, timeout,
      base::BindOnce(&ChildPolicyObserver::OnPolicyReady,
                     base::Unretained(this),
                     InitialPolicyRefreshResult::kPolicyRefreshTimeout));
}

void ChildPolicyObserver::OnCloudPolicyServiceInitializationCompleted() {}

void ChildPolicyObserver::OnPolicyRefreshed(bool success) {
  OnPolicyReady(success ? InitialPolicyRefreshResult::kPolicyRefreshed
                        : InitialPolicyRefreshResult::kPolicyRefreshError);
}

bool ChildPolicyObserver::IsChildPolicyReady() const {
  return refresh_result_ != InitialPolicyRefreshResult::kUnknown;
}

void ChildPolicyObserver::OnPolicyReady(
    InitialPolicyRefreshResult refresh_result) {
  DCHECK_NE(InitialPolicyRefreshResult::kUnknown, refresh_result);

  refresh_timeout_timer_.reset();

  if (refresh_result_ == InitialPolicyRefreshResult::kUnknown)
    refresh_result_ = refresh_result;

  if (on_policy_ready_)
    std::move(on_policy_ready_).Run(profile_.get(), refresh_result_);
}

policy::UserCloudPolicyManagerAsh*
ChildPolicyObserver::GetUserCloudPolicyManager() {
  policy::UserCloudPolicyManagerAsh* user_cloud_policy_manager =
      profile_->GetUserCloudPolicyManagerAsh();
  DCHECK(user_cloud_policy_manager);
  return user_cloud_policy_manager;
}

std::string_view ChildPolicyObserver::name() const {
  return "ChildPolicyObserver";
}

}  // namespace ash