#ifndef ASH_COMPONENTS_ARC_TIMER_ARC_TIMER_BRIDGE_H_
#define ASH_COMPONENTS_ARC_TIMER_ARC_TIMER_BRIDGE_H_
#include <map>
#include <memory>
#include <utility>
#include <vector>
#include "ash/components/arc/mojom/timer.mojom.h"
#include "ash/components/arc/session/connection_observer.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
class BrowserContextKeyedServiceFactory;
namespace content {
class BrowserContext;
}
namespace arc {
class ArcBridgeService;
class ArcTimerBridge : public KeyedService,
public ConnectionObserver<mojom::TimerInstance>,
public mojom::TimerHost {
public:
using TimerId = int32_t;
static BrowserContextKeyedServiceFactory* GetFactory();
static ArcTimerBridge* GetForBrowserContext(content::BrowserContext* context);
static ArcTimerBridge* GetForBrowserContextForTesting(
content::BrowserContext* context);
ArcTimerBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service);
ArcTimerBridge(const ArcTimerBridge&) = delete;
ArcTimerBridge& operator=(const ArcTimerBridge&) = delete;
~ArcTimerBridge() override;
void OnConnectionClosed() override;
void CreateTimers(
std::vector<arc::mojom::CreateTimerRequestPtr> arc_timer_requests,
CreateTimersCallback callback) override;
void StartTimer(clockid_t clock_id,
base::TimeTicks absolute_expiration_time,
StartTimerCallback callback) override;
static void EnsureFactoryBuilt();
private:
void DeleteArcTimers();
void OnDeleteArcTimers(bool result);
void OnCreateArcTimers(std::vector<clockid_t> clock_ids,
CreateTimersCallback callback,
absl::optional<std::vector<TimerId>> timer_ids);
absl::optional<TimerId> GetTimerId(clockid_t clock_id) const;
const raw_ptr<ArcBridgeService, ExperimentalAsh> arc_bridge_service_;
std::map<clockid_t, TimerId> timer_ids_;
mojo::Receiver<mojom::TimerHost> receiver_{this};
base::WeakPtrFactory<ArcTimerBridge> weak_ptr_factory_{this};
};
}
#endif