// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SensorProviderProxy_h
#define SensorProviderProxy_h

#include "core/frame/LocalFrame.h"
#include "device/generic_sensor/public/interfaces/sensor.mojom-blink.h"
#include "device/generic_sensor/public/interfaces/sensor_provider.mojom-blink.h"
#include "platform/Supplementable.h"
#include "platform/heap/Handle.h"

namespace blink {

class Page;
class SensorProxy;
class SensorReadingFactory;

// This class wraps 'SensorProvider' mojo interface and it manages
// 'SensorProxy' instances.
class SensorProviderProxy final
    : public GarbageCollectedFinalized<SensorProviderProxy>,
      public Supplement<LocalFrame> {
  USING_GARBAGE_COLLECTED_MIXIN(SensorProviderProxy);
  WTF_MAKE_NONCOPYABLE(SensorProviderProxy);

 public:
  static SensorProviderProxy* from(LocalFrame*);

  ~SensorProviderProxy();

  SensorProxy* createSensorProxy(device::mojom::blink::SensorType,
                                 Page*,
                                 std::unique_ptr<SensorReadingFactory>);

  SensorProxy* getSensorProxy(device::mojom::blink::SensorType);

  DECLARE_VIRTUAL_TRACE();

 private:
  friend class SensorProxy;  // To call getSensorProvider().

  explicit SensorProviderProxy(LocalFrame*);
  static const char* supplementName();
  void initialize(LocalFrame*);
  bool isInitialized() const { return m_sensorProvider; }

  device::mojom::blink::SensorProvider* getSensorProvider() const {
    return m_sensorProvider.get();
  }

  void onSensorProviderConnectionError();

  using SensorsSet = HeapHashSet<WeakMember<SensorProxy>>;
  SensorsSet m_sensorProxies;

  device::mojom::blink::SensorProviderPtr m_sensorProvider;
};

}  // namespace blink

#endif  // SensorProviderProxy_h
