1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_ARC_SESSION_ARC_BRIDGE_SERVICE_H_
6 #define COMPONENTS_ARC_SESSION_ARC_BRIDGE_SERVICE_H_
7 
8 #include "base/macros.h"
9 #include "base/observer_list.h"
10 #include "components/arc/session/connection_holder.h"
11 
12 namespace arc {
13 
14 namespace mojom {
15 
16 // Instead of including components/arc/mojom/arc_bridge.mojom.h, list all
17 // the instance classes here for faster build.
18 class AccessibilityHelperHost;
19 class AccessibilityHelperInstance;
20 class AppHost;
21 class AppInstance;
22 class AppPermissionsInstance;
23 class AppfuseHost;
24 class AppfuseInstance;
25 class AudioHost;
26 class AudioInstance;
27 class AuthHost;
28 class AuthInstance;
29 class BackupSettingsInstance;
30 class BluetoothHost;
31 class BluetoothInstance;
32 class BootPhaseMonitorHost;
33 class BootPhaseMonitorInstance;
34 class CameraHost;
35 class CameraInstance;
36 class CastReceiverInstance;
37 class CertStoreHost;
38 class CertStoreInstance;
39 class ClipboardHost;
40 class ClipboardInstance;
41 class CrashCollectorHost;
42 class CrashCollectorInstance;
43 class DigitalGoodsInstance;
44 class DiskQuotaHost;
45 class DiskQuotaInstance;
46 class EnterpriseReportingHost;
47 class EnterpriseReportingInstance;
48 class FileSystemHost;
49 class FileSystemInstance;
50 class ImeHost;
51 class ImeInstance;
52 class InputMethodManagerHost;
53 class InputMethodManagerInstance;
54 class IntentHelperHost;
55 class IntentHelperInstance;
56 class KeymasterHost;
57 class KeymasterInstance;
58 class KioskHost;
59 class KioskInstance;
60 class LockScreenInstance;
61 class MediaSessionInstance;
62 class MetricsHost;
63 class MetricsInstance;
64 class MidisHost;
65 class MidisInstance;
66 class NetHost;
67 class NetInstance;
68 class ObbMounterHost;
69 class ObbMounterInstance;
70 class OemCryptoHost;
71 class OemCryptoInstance;
72 class PaymentAppInstance;
73 class PipHost;
74 class PipInstance;
75 class PolicyHost;
76 class PolicyInstance;
77 class PowerHost;
78 class PowerInstance;
79 class PrintSpoolerHost;
80 class PrintSpoolerInstance;
81 class ProcessInstance;
82 class PropertyInstance;
83 class RotationLockInstance;
84 class ScreenCaptureHost;
85 class ScreenCaptureInstance;
86 class SensorHost;
87 class SensorInstance;
88 class SharesheetHost;
89 class SharesheetInstance;
90 class SmartCardManagerHost;
91 class SmartCardManagerInstance;
92 class StorageManagerInstance;
93 class TimerHost;
94 class TimerInstance;
95 class TracingInstance;
96 class TtsHost;
97 class TtsInstance;
98 class UsbHostHost;
99 class UsbHostInstance;
100 class VideoHost;
101 class VideoInstance;
102 class VolumeMounterHost;
103 class VolumeMounterInstance;
104 class WakeLockHost;
105 class WakeLockInstance;
106 class WallpaperHost;
107 class WallpaperInstance;
108 
109 }  // namespace mojom
110 
111 // Holds Mojo channels which proxy to ARC side implementation. The actual
112 // instances are set/removed via ArcBridgeHostImpl.
113 class ArcBridgeService {
114  public:
115   // Observer for those services outside of ArcBridgeService which want to know
116   // ArcBridgeService events.
117   class Observer : public base::CheckedObserver {
118    public:
119     // Called immediately before the ArcBridgeHost is closed.
BeforeArcBridgeClosed()120     virtual void BeforeArcBridgeClosed() {}
121     // Called immediately after the ArcBridgeHost is closed.
AfterArcBridgeClosed()122     virtual void AfterArcBridgeClosed() {}
123 
124    protected:
125     ~Observer() override = default;
126   };
127 
128   ArcBridgeService();
129   ~ArcBridgeService();
130 
131   // Adds or removes observers.
132   void AddObserver(Observer* observer);
133   void RemoveObserver(Observer* observer);
134 
135   // Call these methods to invoke the corresponding methods on the observers.
136   void ObserveBeforeArcBridgeClosed();
137   void ObserveAfterArcBridgeClosed();
138 
139   ConnectionHolder<mojom::AccessibilityHelperInstance,
140                    mojom::AccessibilityHelperHost>*
accessibility_helper()141   accessibility_helper() {
142     return &accessibility_helper_;
143   }
app()144   ConnectionHolder<mojom::AppInstance, mojom::AppHost>* app() { return &app_; }
app_permissions()145   ConnectionHolder<mojom::AppPermissionsInstance>* app_permissions() {
146     return &app_permissions_;
147   }
appfuse()148   ConnectionHolder<mojom::AppfuseInstance, mojom::AppfuseHost>* appfuse() {
149     return &appfuse_;
150   }
audio()151   ConnectionHolder<mojom::AudioInstance, mojom::AudioHost>* audio() {
152     return &audio_;
153   }
auth()154   ConnectionHolder<mojom::AuthInstance, mojom::AuthHost>* auth() {
155     return &auth_;
156   }
backup_settings()157   ConnectionHolder<mojom::BackupSettingsInstance>* backup_settings() {
158     return &backup_settings_;
159   }
160   ConnectionHolder<mojom::BluetoothInstance, mojom::BluetoothHost>*
bluetooth()161   bluetooth() {
162     return &bluetooth_;
163   }
164   ConnectionHolder<mojom::BootPhaseMonitorInstance,
165                    mojom::BootPhaseMonitorHost>*
boot_phase_monitor()166   boot_phase_monitor() {
167     return &boot_phase_monitor_;
168   }
camera()169   ConnectionHolder<mojom::CameraInstance, mojom::CameraHost>* camera() {
170     return &camera_;
171   }
cast_receiver()172   ConnectionHolder<mojom::CastReceiverInstance>* cast_receiver() {
173     return &cast_receiver_;
174   }
175   ConnectionHolder<mojom::CertStoreInstance, mojom::CertStoreHost>*
cert_store()176   cert_store() {
177     return &cert_store_;
178   }
179   ConnectionHolder<mojom::ClipboardInstance, mojom::ClipboardHost>*
clipboard()180   clipboard() {
181     return &clipboard_;
182   }
183   ConnectionHolder<mojom::CrashCollectorInstance, mojom::CrashCollectorHost>*
crash_collector()184   crash_collector() {
185     return &crash_collector_;
186   }
digital_goods()187   ConnectionHolder<mojom::DigitalGoodsInstance>* digital_goods() {
188     return &digital_goods_;
189   }
190   ConnectionHolder<mojom::DiskQuotaInstance, mojom::DiskQuotaHost>*
disk_quota()191   disk_quota() {
192     return &disk_quota_;
193   }
194   ConnectionHolder<mojom::EnterpriseReportingInstance,
195                    mojom::EnterpriseReportingHost>*
enterprise_reporting()196   enterprise_reporting() {
197     return &enterprise_reporting_;
198   }
199   ConnectionHolder<mojom::FileSystemInstance, mojom::FileSystemHost>*
file_system()200   file_system() {
201     return &file_system_;
202   }
ime()203   ConnectionHolder<mojom::ImeInstance, mojom::ImeHost>* ime() { return &ime_; }
204   ConnectionHolder<mojom::InputMethodManagerInstance,
205                    mojom::InputMethodManagerHost>*
input_method_manager()206   input_method_manager() {
207     return &input_method_manager_;
208   }
209   ConnectionHolder<mojom::IntentHelperInstance, mojom::IntentHelperHost>*
intent_helper()210   intent_helper() {
211     return &intent_helper_;
212   }
213   ConnectionHolder<mojom::KeymasterInstance, mojom::KeymasterHost>*
keymaster()214   keymaster() {
215     return &keymaster_;
216   }
kiosk()217   ConnectionHolder<mojom::KioskInstance, mojom::KioskHost>* kiosk() {
218     return &kiosk_;
219   }
lock_screen()220   ConnectionHolder<mojom::LockScreenInstance>* lock_screen() {
221     return &lock_screen_;
222   }
media_session()223   ConnectionHolder<mojom::MediaSessionInstance>* media_session() {
224     return &media_session_;
225   }
metrics()226   ConnectionHolder<mojom::MetricsInstance, mojom::MetricsHost>* metrics() {
227     return &metrics_;
228   }
midis()229   ConnectionHolder<mojom::MidisInstance, mojom::MidisHost>* midis() {
230     return &midis_;
231   }
net()232   ConnectionHolder<mojom::NetInstance, mojom::NetHost>* net() { return &net_; }
233   ConnectionHolder<mojom::ObbMounterInstance, mojom::ObbMounterHost>*
obb_mounter()234   obb_mounter() {
235     return &obb_mounter_;
236   }
237   ConnectionHolder<mojom::OemCryptoInstance, mojom::OemCryptoHost>*
oemcrypto()238   oemcrypto() {
239     return &oemcrypto_;
240   }
payment_app()241   ConnectionHolder<mojom::PaymentAppInstance>* payment_app() {
242     return &payment_app_;
243   }
pip()244   ConnectionHolder<mojom::PipInstance, mojom::PipHost>* pip() { return &pip_; }
policy()245   ConnectionHolder<mojom::PolicyInstance, mojom::PolicyHost>* policy() {
246     return &policy_;
247   }
power()248   ConnectionHolder<mojom::PowerInstance, mojom::PowerHost>* power() {
249     return &power_;
250   }
251   ConnectionHolder<mojom::PrintSpoolerInstance, mojom::PrintSpoolerHost>*
print_spooler()252   print_spooler() {
253     return &print_spooler_;
254   }
process()255   ConnectionHolder<mojom::ProcessInstance>* process() { return &process_; }
property()256   ConnectionHolder<mojom::PropertyInstance>* property() { return &property_; }
rotation_lock()257   ConnectionHolder<mojom::RotationLockInstance>* rotation_lock() {
258     return &rotation_lock_;
259   }
260   ConnectionHolder<mojom::ScreenCaptureInstance, mojom::ScreenCaptureHost>*
screen_capture()261   screen_capture() {
262     return &screen_capture_;
263   }
sensor()264   ConnectionHolder<mojom::SensorInstance, mojom::SensorHost>* sensor() {
265     return &sensor_;
266   }
267   ConnectionHolder<mojom::SharesheetInstance, mojom::SharesheetHost>*
sharesheet()268   sharesheet() {
269     return &sharesheet_;
270   }
271   ConnectionHolder<mojom::SmartCardManagerInstance,
272                    mojom::SmartCardManagerHost>*
smart_card_manager()273   smart_card_manager() {
274     return &smart_card_manager_;
275   }
276 
storage_manager()277   ConnectionHolder<mojom::StorageManagerInstance>* storage_manager() {
278     return &storage_manager_;
279   }
timer()280   ConnectionHolder<mojom::TimerInstance, mojom::TimerHost>* timer() {
281     return &timer_;
282   }
tracing()283   ConnectionHolder<mojom::TracingInstance>* tracing() { return &tracing_; }
tts()284   ConnectionHolder<mojom::TtsInstance, mojom::TtsHost>* tts() { return &tts_; }
usb_host()285   ConnectionHolder<mojom::UsbHostInstance, mojom::UsbHostHost>* usb_host() {
286     return &usb_host_;
287   }
video()288   ConnectionHolder<mojom::VideoInstance, mojom::VideoHost>* video() {
289     return &video_;
290   }
291   ConnectionHolder<mojom::VolumeMounterInstance, mojom::VolumeMounterHost>*
volume_mounter()292   volume_mounter() {
293     return &volume_mounter_;
294   }
wake_lock()295   ConnectionHolder<mojom::WakeLockInstance, mojom::WakeLockHost>* wake_lock() {
296     return &wake_lock_;
297   }
298   ConnectionHolder<mojom::WallpaperInstance, mojom::WallpaperHost>*
wallpaper()299   wallpaper() {
300     return &wallpaper_;
301   }
302 
303  private:
304   base::ObserverList<Observer> observer_list_;
305 
306   ConnectionHolder<mojom::AccessibilityHelperInstance,
307                    mojom::AccessibilityHelperHost>
308       accessibility_helper_;
309   ConnectionHolder<mojom::AppInstance, mojom::AppHost> app_;
310   ConnectionHolder<mojom::AppPermissionsInstance> app_permissions_;
311   ConnectionHolder<mojom::AppfuseInstance, mojom::AppfuseHost> appfuse_;
312   ConnectionHolder<mojom::AudioInstance, mojom::AudioHost> audio_;
313   ConnectionHolder<mojom::AuthInstance, mojom::AuthHost> auth_;
314   ConnectionHolder<mojom::BackupSettingsInstance> backup_settings_;
315   ConnectionHolder<mojom::BluetoothInstance, mojom::BluetoothHost> bluetooth_;
316   ConnectionHolder<mojom::BootPhaseMonitorInstance, mojom::BootPhaseMonitorHost>
317       boot_phase_monitor_;
318   ConnectionHolder<mojom::CameraInstance, mojom::CameraHost> camera_;
319   ConnectionHolder<mojom::CastReceiverInstance> cast_receiver_;
320   ConnectionHolder<mojom::CertStoreInstance, mojom::CertStoreHost> cert_store_;
321   ConnectionHolder<mojom::ClipboardInstance, mojom::ClipboardHost> clipboard_;
322   ConnectionHolder<mojom::CrashCollectorInstance, mojom::CrashCollectorHost>
323       crash_collector_;
324   ConnectionHolder<mojom::DigitalGoodsInstance> digital_goods_;
325   ConnectionHolder<mojom::DiskQuotaInstance, mojom::DiskQuotaHost> disk_quota_;
326   ConnectionHolder<mojom::EnterpriseReportingInstance,
327                    mojom::EnterpriseReportingHost>
328       enterprise_reporting_;
329   ConnectionHolder<mojom::FileSystemInstance, mojom::FileSystemHost>
330       file_system_;
331   ConnectionHolder<mojom::ImeInstance, mojom::ImeHost> ime_;
332   ConnectionHolder<mojom::InputMethodManagerInstance,
333                    mojom::InputMethodManagerHost>
334       input_method_manager_;
335   ConnectionHolder<mojom::IntentHelperInstance, mojom::IntentHelperHost>
336       intent_helper_;
337   ConnectionHolder<mojom::KeymasterInstance, mojom::KeymasterHost> keymaster_;
338   ConnectionHolder<mojom::KioskInstance, mojom::KioskHost> kiosk_;
339   ConnectionHolder<mojom::LockScreenInstance> lock_screen_;
340   ConnectionHolder<mojom::MediaSessionInstance> media_session_;
341   ConnectionHolder<mojom::MetricsInstance, mojom::MetricsHost> metrics_;
342   ConnectionHolder<mojom::MidisInstance, mojom::MidisHost> midis_;
343   ConnectionHolder<mojom::NetInstance, mojom::NetHost> net_;
344   ConnectionHolder<mojom::ObbMounterInstance, mojom::ObbMounterHost>
345       obb_mounter_;
346   ConnectionHolder<mojom::OemCryptoInstance, mojom::OemCryptoHost> oemcrypto_;
347   ConnectionHolder<mojom::PaymentAppInstance> payment_app_;
348   ConnectionHolder<mojom::PipInstance, mojom::PipHost> pip_;
349   ConnectionHolder<mojom::PolicyInstance, mojom::PolicyHost> policy_;
350   ConnectionHolder<mojom::PowerInstance, mojom::PowerHost> power_;
351   ConnectionHolder<mojom::PrintSpoolerInstance, mojom::PrintSpoolerHost>
352       print_spooler_;
353   ConnectionHolder<mojom::ProcessInstance> process_;
354   ConnectionHolder<mojom::PropertyInstance> property_;
355   ConnectionHolder<mojom::RotationLockInstance> rotation_lock_;
356   ConnectionHolder<mojom::ScreenCaptureInstance, mojom::ScreenCaptureHost>
357       screen_capture_;
358   ConnectionHolder<mojom::SensorInstance, mojom::SensorHost> sensor_;
359   ConnectionHolder<mojom::SharesheetInstance, mojom::SharesheetHost>
360       sharesheet_;
361   ConnectionHolder<mojom::SmartCardManagerInstance, mojom::SmartCardManagerHost>
362       smart_card_manager_;
363   ConnectionHolder<mojom::StorageManagerInstance> storage_manager_;
364   ConnectionHolder<mojom::TimerInstance, mojom::TimerHost> timer_;
365   ConnectionHolder<mojom::TracingInstance> tracing_;
366   ConnectionHolder<mojom::TtsInstance, mojom::TtsHost> tts_;
367   ConnectionHolder<mojom::UsbHostInstance, mojom::UsbHostHost> usb_host_;
368   ConnectionHolder<mojom::VideoInstance, mojom::VideoHost> video_;
369   ConnectionHolder<mojom::VolumeMounterInstance, mojom::VolumeMounterHost>
370       volume_mounter_;
371   ConnectionHolder<mojom::WakeLockInstance, mojom::WakeLockHost> wake_lock_;
372   ConnectionHolder<mojom::WallpaperInstance, mojom::WallpaperHost> wallpaper_;
373 
374   DISALLOW_COPY_AND_ASSIGN(ArcBridgeService);
375 };
376 
377 }  // namespace arc
378 
379 #endif  // COMPONENTS_ARC_SESSION_ARC_BRIDGE_SERVICE_H_
380