1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef SERVICES_DEVICE_DEVICE_SERVICE_H_
6 #define SERVICES_DEVICE_DEVICE_SERVICE_H_
11 #include "base/functional/callback.h"
12 #include "base/memory/raw_ptr.h"
13 #include "base/memory/scoped_refptr.h"
14 #include "base/threading/sequence_bound.h"
15 #include "build/build_config.h"
16 #include "build/chromeos_buildflags.h"
17 #include "mojo/public/cpp/bindings/pending_receiver.h"
18 #include "mojo/public/cpp/bindings/receiver_set.h"
19 #include "services/device/geolocation/geolocation_provider.h"
20 #include "services/device/geolocation/geolocation_provider_impl.h"
21 #include "services/device/geolocation/public_ip_address_geolocation_provider.h"
22 #include "services/device/public/mojom/battery_monitor.mojom.h"
23 #include "services/device/public/mojom/device_posture_provider.mojom.h"
24 #include "services/device/public/mojom/device_service.mojom.h"
25 #include "services/device/public/mojom/fingerprint.mojom.h"
26 #include "services/device/public/mojom/geolocation.mojom.h"
27 #include "services/device/public/mojom/geolocation_config.mojom.h"
28 #include "services/device/public/mojom/geolocation_context.mojom.h"
29 #include "services/device/public/mojom/geolocation_control.mojom.h"
30 #include "services/device/public/mojom/geolocation_internals.mojom.h"
31 #include "services/device/public/mojom/power_monitor.mojom.h"
32 #include "services/device/public/mojom/pressure_manager.mojom.h"
33 #include "services/device/public/mojom/screen_orientation.mojom.h"
34 #include "services/device/public/mojom/sensor_provider.mojom.h"
35 #include "services/device/public/mojom/serial.mojom.h"
36 #include "services/device/public/mojom/time_zone_monitor.mojom.h"
37 #include "services/device/public/mojom/usb_manager.mojom.h"
38 #include "services/device/public/mojom/usb_manager_test.mojom.h"
39 #include "services/device/public/mojom/vibration_manager.mojom.h"
40 #include "services/device/public/mojom/wake_lock_provider.mojom.h"
41 #include "services/device/usb/mojo/device_manager_impl.h"
42 #include "services/device/usb/mojo/device_manager_test.h"
43 #include "services/device/wake_lock/wake_lock_context.h"
44 #include "services/device/wake_lock/wake_lock_provider.h"
45 #include "services/service_manager/public/cpp/interface_provider.h"
47 #if BUILDFLAG(IS_ANDROID)
48 #include "base/android/scoped_java_ref.h"
49 #include "services/device/public/mojom/nfc_provider.mojom.h"
51 #include "services/device/public/mojom/hid.mojom.h"
54 #if BUILDFLAG(IS_CHROMEOS_ASH)
55 #include "services/device/media_transfer_protocol/mtp_device_manager.h"
58 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(USE_UDEV)
59 #include "services/device/public/mojom/input_service.mojom.h"
63 class SingleThreadTaskRunner;
67 class NetworkConnectionTracker;
68 class SharedURLLoaderFactory;
69 } // namespace network
73 #if !BUILDFLAG(IS_ANDROID)
75 class SerialPortManagerImpl;
78 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
79 class DevicePostureProviderImpl;
83 class GeolocationManager;
84 class PowerMonitorMessageBroadcaster;
85 class PressureManagerImpl;
86 class PublicIpAddressLocationNotifier;
87 class SensorProviderImpl;
88 class TimeZoneMonitor;
90 // NOTE: See the comments on the definitions of PublicIpAddressLocationNotifier,
91 // |WakeLockContextCallback|, |CustomLocationProviderCallback| and
92 // NFCDelegate.java to understand the semantics and usage of these parameters.
93 struct DeviceServiceParams {
94 DeviceServiceParams();
95 ~DeviceServiceParams();
97 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner;
98 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner;
99 scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory;
100 raw_ptr<network::NetworkConnectionTracker> network_connection_tracker =
102 std::string geolocation_api_key;
103 CustomLocationProviderCallback custom_location_provider_callback;
104 bool use_gms_core_location_provider = false;
105 raw_ptr<GeolocationManager> geolocation_manager = nullptr;
106 WakeLockContextCallback wake_lock_context_callback;
108 #if BUILDFLAG(IS_ANDROID)
109 base::android::ScopedJavaGlobalRef<jobject> java_nfc_delegate;
110 #endif // BUILDFLAG(IS_ANDROID)
113 std::unique_ptr<DeviceService> CreateDeviceService(
114 std::unique_ptr<DeviceServiceParams> params,
115 mojo::PendingReceiver<mojom::DeviceService> receiver);
117 class DeviceService : public mojom::DeviceService {
119 DeviceService(std::unique_ptr<DeviceServiceParams> params,
120 mojo::PendingReceiver<mojom::DeviceService> receiver);
122 DeviceService(const DeviceService&) = delete;
123 DeviceService& operator=(const DeviceService&) = delete;
125 ~DeviceService() override;
127 void AddReceiver(mojo::PendingReceiver<mojom::DeviceService> receiver);
129 void SetSensorProviderImplForTesting(
130 std::unique_ptr<SensorProviderImpl> sensor_provider);
132 // Supports global override of GeolocationContext binding within the service.
133 using GeolocationContextBinder = base::RepeatingCallback<void(
134 mojo::PendingReceiver<mojom::GeolocationContext>)>;
135 static void OverrideGeolocationContextBinderForTesting(
136 GeolocationContextBinder binder);
138 // Supports global override of PressureManager binding within the service.
139 using PressureManagerBinder = base::RepeatingCallback<void(
140 mojo::PendingReceiver<mojom::PressureManager>)>;
141 static void OverridePressureManagerBinderForTesting(
142 PressureManagerBinder binder);
144 #if BUILDFLAG(IS_ANDROID)
145 // Allows tests to override how frame hosts bind NFCProvider receivers.
146 using NFCProviderBinder = base::RepeatingCallback<void(
147 mojo::PendingReceiver<device::mojom::NFCProvider>)>;
148 static void OverrideNFCProviderBinderForTesting(NFCProviderBinder binder);
151 #if BUILDFLAG(IS_TIZEN_TV)
152 void UpdateTimeZone(const std::string& timezone) override;
156 // mojom::DeviceService implementation:
157 void BindFingerprint(
158 mojo::PendingReceiver<mojom::Fingerprint> receiver) override;
159 void BindGeolocationConfig(
160 mojo::PendingReceiver<mojom::GeolocationConfig> receiver) override;
161 void BindGeolocationContext(
162 mojo::PendingReceiver<mojom::GeolocationContext> receiver) override;
163 void BindGeolocationControl(
164 mojo::PendingReceiver<mojom::GeolocationControl> receiver) override;
165 void BindGeolocationInternals(
166 mojo::PendingReceiver<mojom::GeolocationInternals> receiver) override;
168 #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(USE_UDEV)
169 void BindInputDeviceManager(
170 mojo::PendingReceiver<mojom::InputDeviceManager> receiver) override;
173 void BindBatteryMonitor(
174 mojo::PendingReceiver<mojom::BatteryMonitor> receiver) override;
176 void BindPressureManager(
177 mojo::PendingReceiver<mojom::PressureManager> receiver) override;
179 #if BUILDFLAG(IS_ANDROID)
180 void BindNFCProvider(
181 mojo::PendingReceiver<mojom::NFCProvider> receiver) override;
184 void BindVibrationManager(
185 mojo::PendingReceiver<mojom::VibrationManager> receiver) override;
187 #if !BUILDFLAG(IS_ANDROID)
189 mojo::PendingReceiver<mojom::HidManager> receiver) override;
192 #if BUILDFLAG(IS_CHROMEOS_ASH)
194 mojo::PendingReceiver<mojom::MtpManager> receiver) override;
197 void BindPowerMonitor(
198 mojo::PendingReceiver<mojom::PowerMonitor> receiver) override;
200 void BindPublicIpAddressGeolocationProvider(
201 mojo::PendingReceiver<mojom::PublicIpAddressGeolocationProvider> receiver)
204 void BindScreenOrientationListener(
205 mojo::PendingReceiver<mojom::ScreenOrientationListener> receiver)
208 void BindSensorProvider(
209 mojo::PendingReceiver<mojom::SensorProvider> receiver) override;
211 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
212 void BindDevicePostureProvider(
213 mojo::PendingReceiver<mojom::DevicePostureProvider> receiver) override;
216 void BindSerialPortManager(
217 mojo::PendingReceiver<mojom::SerialPortManager> receiver) override;
219 void BindTimeZoneMonitor(
220 mojo::PendingReceiver<mojom::TimeZoneMonitor> receiver) override;
222 void BindWakeLockProvider(
223 mojo::PendingReceiver<mojom::WakeLockProvider> receiver) override;
225 void BindUsbDeviceManager(
226 mojo::PendingReceiver<mojom::UsbDeviceManager> receiver) override;
228 void BindUsbDeviceManagerTest(
229 mojo::PendingReceiver<mojom::UsbDeviceManagerTest> receiver) override;
231 mojo::ReceiverSet<mojom::DeviceService> receivers_;
232 std::unique_ptr<PressureManagerImpl> pressure_manager_;
233 std::unique_ptr<PowerMonitorMessageBroadcaster>
234 power_monitor_message_broadcaster_;
235 std::unique_ptr<PublicIpAddressGeolocationProvider>
236 public_ip_address_geolocation_provider_;
237 std::unique_ptr<SensorProviderImpl> sensor_provider_;
238 std::unique_ptr<TimeZoneMonitor> time_zone_monitor_;
239 std::unique_ptr<usb::DeviceManagerImpl> usb_device_manager_;
240 std::unique_ptr<usb::DeviceManagerTest> usb_device_manager_test_;
241 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
242 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
243 scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
244 raw_ptr<network::NetworkConnectionTracker> network_connection_tracker_;
246 const std::string geolocation_api_key_;
247 WakeLockContextCallback wake_lock_context_callback_;
248 WakeLockProvider wake_lock_provider_;
250 #if BUILDFLAG(IS_ANDROID)
251 // Binds |java_interface_provider_| to an interface registry that exposes
252 // factories for the interfaces that are provided via Java on Android.
253 service_manager::InterfaceProvider* GetJavaInterfaceProvider();
255 // InterfaceProvider that is bound to the Java-side interface registry.
256 service_manager::InterfaceProvider java_interface_provider_{
257 base::SingleThreadTaskRunner::GetCurrentDefault()};
259 bool java_interface_provider_initialized_ = false;
261 base::android::ScopedJavaGlobalRef<jobject> java_nfc_delegate_;
263 std::unique_ptr<HidManagerImpl> hid_manager_;
266 #if defined(IS_SERIAL_ENABLED_PLATFORM)
267 base::SequenceBound<SerialPortManagerImpl> serial_port_manager_;
268 #endif // defined(IS_SERIAL_ENABLED_PLATFORM)
270 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
271 std::unique_ptr<DevicePostureProviderImpl> device_posture_provider_;
274 #if BUILDFLAG(IS_CHROMEOS_ASH)
275 std::unique_ptr<MtpDeviceManager> mtp_device_manager_;
279 } // namespace device
281 #endif // SERVICES_DEVICE_DEVICE_SERVICE_H_