blob: 720d954303413c4aa791967100806d8baa8d3e76 [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_ASH_ARC_SESSION_ARC_REQUIREMENT_CHECKER_H_
#define CHROME_BROWSER_ASH_ARC_SESSION_ARC_REQUIREMENT_CHECKER_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/timer/timer.h"
#include "chrome/browser/ash/arc/arc_support_host.h"
#include "chrome/browser/ash/arc/policy/arc_android_management_checker.h"
#include "components/policy/core/common/policy_service.h"
class Profile;
namespace arc {
class ArcTermsOfServiceNegotiator;
// ArcRequirementChecker performs necessary checks to make sure that it's OK to
// start ARC for the user.
//
// TODO(hashimoto): Move any ArcSessionManager code related to
// CHECKING_REQUIREMENTS into this class. This includes letting this class own
// ArcSupportHost.
class ArcRequirementChecker : public policy::PolicyService::Observer {
public:
class Observer : public base::CheckedObserver {
public:
// Called to notify that checking of Android management status started
// during the opt-in flow.
virtual void OnArcOptInManagementCheckStarted() = 0;
};
using AndroidManagementCheckerFactory =
base::RepeatingCallback<std::unique_ptr<ArcAndroidManagementChecker>(
Profile* profile,
bool retry_on_error)>;
static AndroidManagementCheckerFactory
GetDefaultAndroidManagementCheckerFactory();
ArcRequirementChecker(
Profile* profile,
ArcSupportHost* support_host,
AndroidManagementCheckerFactory android_management_checker_factory);
ArcRequirementChecker(const ArcRequirementChecker&) = delete;
const ArcRequirementChecker& operator=(const ArcRequirementChecker&) = delete;
~ArcRequirementChecker() override;
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
static void SetUiEnabledForTesting(bool enabled);
static void SetArcTermsOfServiceOobeNegotiatorEnabledForTesting(bool enabled);
static void EnableCheckAndroidManagementForTesting(bool enable);
// Invokes functions as if requirement checks are completed for testing.
void EmulateRequirementCheckCompletionForTesting();
// Starts negotiating the terms of service to user, and checking Android
// management. This is for first boot case (= Opt-in or OOBE flow case). On a
// regular boot, use StartBackgroundChecks() instead.
enum class RequirementCheckResult {
kOk,
kTermsOfServicesDeclined,
kDisallowedByAndroidManagement,
kAndroidManagementCheckError,
};
using StartRequirementChecksCallback =
base::OnceCallback<void(RequirementCheckResult result)>;
void StartRequirementChecks(bool is_terms_of_service_negotiation_needed,
StartRequirementChecksCallback callback);
// Starts requirement checks in background (in parallel with starting ARC).
// This is for a regular boot case.
enum class BackgroundCheckResult {
kNoActionRequired,
kArcShouldBeDisabled,
kArcShouldBeRestarted,
};
using StartBackgroundChecksCallback =
base::OnceCallback<void(BackgroundCheckResult result)>;
void StartBackgroundChecks(StartBackgroundChecksCallback callback);
// policy::PolicyServer::Observer override.
void OnFirstPoliciesLoaded(policy::PolicyDomain domain) override;
private:
enum class State {
kStopped,
kNegotiatingTermsOfService,
kCheckingAndroidManagement,
kCheckingAndroidManagementBackground,
kWaitingForPoliciesBackground,
};
void OnTermsOfServiceNegotiated(bool accepted);
void StartAndroidManagementCheck();
void OnAndroidManagementChecked(
ArcAndroidManagementChecker::CheckResult result);
void OnBackgroundAndroidManagementChecked(
ArcAndroidManagementChecker::CheckResult result);
// Sets up a timer to wait for policies load, or immediately calls
// OnFirstPoliciesLoadedOrTimeout.
void WaitForPoliciesLoad();
// Called when first policies are loaded or when wait_for_policy_timer_
// expires.
void OnFirstPoliciesLoadedOrTimeout();
Profile* const profile_;
ArcSupportHost* const support_host_;
const AndroidManagementCheckerFactory android_management_checker_factory_;
State state_ = State::kStopped;
std::unique_ptr<ArcTermsOfServiceNegotiator> terms_of_service_negotiator_;
std::unique_ptr<ArcAndroidManagementChecker> android_management_checker_;
StartRequirementChecksCallback requirement_check_callback_;
StartBackgroundChecksCallback background_check_callback_;
// Timer to wait for policiesin case we are suspecting the user might be
// transitioning to the managed state.
base::OneShotTimer wait_for_policy_timer_;
base::ObserverList<Observer> observers_;
base::WeakPtrFactory<ArcRequirementChecker> weak_ptr_factory_{this};
};
} // namespace arc
#endif // CHROME_BROWSER_ASH_ARC_SESSION_ARC_REQUIREMENT_CHECKER_H_