chromium/chrome/browser/chromeos/echo/echo_util.cc

// Copyright 2024 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/chromeos/echo/echo_util.h"

#include <optional>
#include <string>
#include <utility>

#include "base/task/bind_post_task.h"
#include "build/chromeos_buildflags.h"

#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chromeos/ash/components/report/utils/time_utils.h"
#endif  // BUILDFLAG(IS_CHROMEOS_ASH)

#if BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chromeos/crosapi/mojom/echo_private.mojom.h"  // nogncheck
#include "chromeos/lacros/lacros_service.h"
#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)

namespace chromeos::echo_util {
namespace {

#if BUILDFLAG(IS_CHROMEOS_LACROS)
// Parse the given timestamp from Lacros.
std::optional<base::Time> ParseTime(const std::string& str) {
  base::Time result;
  if (!base::Time::FromUTCString(str.c_str(), &result)) {
    return std::nullopt;
  }
  return {result};
}
#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)

}  // namespace

void GetOobeTimestamp(GetOobeTimestampCallback callback) {
  // NOTE: Ensure that `callback` will run asynchronously.
  callback = base::BindPostTaskToCurrentDefault(std::move(callback));
#if BUILDFLAG(IS_CHROMEOS_ASH)
  std::move(callback).Run(ash::report::utils::GetFirstActiveWeek());
#else  // BUILDFLAG(IS_CHROMEOS_ASH)
  auto* lacros_service = chromeos::LacrosService::Get();
  if (lacros_service->IsAvailable<crosapi::mojom::EchoPrivate>() &&
      static_cast<uint32_t>(
          lacros_service->GetInterfaceVersion<crosapi::mojom::EchoPrivate>()) >=
          crosapi::mojom::EchoPrivate::kGetOobeTimestampMinVersion) {
    lacros_service->GetRemote<crosapi::mojom::EchoPrivate>()->GetOobeTimestamp(
        base::BindOnce(&ParseTime).Then(std::move(callback)));
  } else {
    std::move(callback).Run(std::nullopt);
  }
#endif
}

}  // namespace chromeos::echo_util