blob: 8dde559f30b9bbeb5b9e02391997d70370ec0d7a [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.
#include "chrome/browser/enterprise/idle/action_runner.h"
#include <algorithm>
#include <iterator>
#include "base/functional/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "components/enterprise/idle/idle_pref_names.h"
#include "components/enterprise/idle/metrics.h"
#include "components/prefs/pref_service.h"
namespace enterprise_idle {
ActionRunner::ActionRunner(Profile* profile, ActionFactory* action_factory)
: profile_(profile), action_factory_(action_factory) {}
ActionRunner::~ActionRunner() = default;
void ActionRunner::Run() {
ActionQueue actions = GetActions();
if (actions.empty())
return;
actions_start_time_ = base::TimeTicks::Now();
RunNextAction(std::move(actions));
}
ActionRunner::ActionQueue ActionRunner::GetActions() {
std::vector<ActionType> actions =
GetActionTypesFromPrefs(profile_->GetPrefs());
return action_factory_->Build(profile_, actions);
}
void ActionRunner::RunNextAction(ActionQueue actions) {
if (actions.empty()) {
metrics::RecordActionsSuccess(metrics::IdleTimeoutActionType::kAllActions,
true);
metrics::RecordIdleTimeoutActionTimeTaken(
metrics::IdleTimeoutActionType::kAllActions,
base::TimeTicks::Now() - actions_start_time_);
return;
}
const std::unique_ptr<Action>& action = actions.top();
action->Run(profile_, base::BindOnce(&ActionRunner::OnActionFinished,
weak_ptr_factory_.GetWeakPtr(),
std::move(actions)));
}
void ActionRunner::OnActionFinished(ActionQueue remaining_actions,
bool succeeded) {
if (!succeeded) {
metrics::RecordActionsSuccess(metrics::IdleTimeoutActionType::kAllActions,
false);
return; // Previous action failed. Abort.
}
if (remaining_actions.empty())
return; // All done.
remaining_actions.pop();
RunNextAction(std::move(remaining_actions));
}
} // namespace enterprise_idle