#ifndef SERVICES_DEVICE_WAKE_LOCK_WAKE_LOCK_H_
#define SERVICES_DEVICE_WAKE_LOCK_WAKE_LOCK_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "build/build_config.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "services/device/public/mojom/wake_lock.mojom.h"
#include "services/device/wake_lock/power_save_blocker/power_save_blocker.h"
#include "ui/gfx/native_ui_types.h"
#include "arkweb/build/features/features.h"
namespace device {
using WakeLockContextCallback = base::RepeatingCallback<gfx::NativeView(int)>;
class WakeLock : public mojom::WakeLock {
public:
class Observer {
public:
virtual ~Observer() = default;
virtual void OnWakeLockActivated(mojom::WakeLockType type) {}
virtual void OnWakeLockDeactivated(mojom::WakeLockType type) {}
virtual void OnWakeLockChanged(mojom::WakeLockType old_type,
mojom::WakeLockType new_type) {}
virtual void OnConnectionError(mojom::WakeLockType type,
WakeLock* wake_lock) {}
};
WakeLock(mojo::PendingReceiver<mojom::WakeLock> receiver,
mojom::WakeLockType type,
mojom::WakeLockReason reason,
const std::string& description,
int context_id,
WakeLockContextCallback native_view_getter,
Observer* observer);
WakeLock(const WakeLock&) = delete;
WakeLock& operator=(const WakeLock&) = delete;
~WakeLock() override;
void RequestWakeLock() override;
void CancelWakeLock() override;
void AddClient(mojo::PendingReceiver<mojom::WakeLock> receiver) override;
void ChangeType(mojom::WakeLockType type,
ChangeTypeCallback callback) override;
void HasWakeLockForTests(HasWakeLockForTestsCallback callback) override;
protected:
int num_lock_requests_;
private:
virtual void UpdateWakeLock();
virtual void CreateWakeLock();
virtual void RemoveWakeLock();
virtual void SwapWakeLock();
void OnConnectionError();
mojom::WakeLockType type_;
mojom::WakeLockReason reason_;
std::unique_ptr<std::string> description_;
#if BUILDFLAG(IS_ANDROID)
int context_id_;
WakeLockContextCallback native_view_getter_;
#elif BUILDFLAG(ARKWEB_SCREEN_LOCK)
int context_id_;
#endif
scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
std::unique_ptr<PowerSaveBlocker> wake_lock_;
const raw_ptr<Observer> observer_;
mojo::ReceiverSet<mojom::WakeLock, std::unique_ptr<bool>> receiver_set_;
};
}
#endif