// Copyright 2023 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_GEOLOCATION_SYSTEM_GEOLOCATION_SOURCE_H_
#define CHROME_BROWSER_ASH_GEOLOCATION_SYSTEM_GEOLOCATION_SOURCE_H_

#include <memory>
#include <string>

#include "ash/public/cpp/session/session_controller.h"
#include "ash/public/cpp/session/session_observer.h"
#include "base/scoped_observation.h"
#include "services/device/public/cpp/geolocation/system_geolocation_source.h"

namespace device {
class GeolocationSystemPermissionManager;
}

class PrefService;
class PrefChangeRegistrar;

namespace ash {

// The SystemGeolocationSource is responsible for listening to geolocation
// permissions from the operation system and allows the
// device::GeolocationSystemPermissionManager to access it in a platform
// agnostic manner. This concrete implementation is to be used within the Ash
// browser.
class SystemGeolocationSource : public device::SystemGeolocationSource,
                                public SessionObserver {
 public:
  SystemGeolocationSource();
  ~SystemGeolocationSource() override;

  static std::unique_ptr<device::GeolocationSystemPermissionManager>
  CreateGeolocationSystemPermissionManagerOnAsh();

  // device::SystemGeolocationSource:
  void RegisterPermissionUpdateCallback(
      PermissionUpdateCallback callback) override;
  void OpenSystemPermissionSetting() override;

 private:
  friend class SystemGeolocationSourceTests;

  // SessionObserver:
  void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;

  void OnPrefChanged(const std::string& pref_name);

  PermissionUpdateCallback permission_update_callback_;
  std::unique_ptr<PrefChangeRegistrar> primary_user_pref_change_registrar_;
  base::ScopedObservation<SessionController, SessionObserver> observer_{this};
};

}  // namespace ash
#endif  // CHROME_BROWSER_ASH_GEOLOCATION_SYSTEM_GEOLOCATION_SOURCE_H_
