1 /*
2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.hardware.hdmi;
18 
19 import android.annotation.BinderThread;
20 import android.annotation.NonNull;
21 import android.annotation.TestApi;
22 
23 import java.util.ArrayList;
24 import java.util.List;
25 
26 /**
27  * A wrapper of the Binder interface that clients running in the application process
28  * will use to perform HDMI-CEC features by communicating with other devices
29  * on the bus.
30  *
31  * @hide
32  */
33 @TestApi
34 public final class HdmiControlServiceWrapper {
35 
36     /** Pure CEC switch device type. */
37     public static final int DEVICE_PURE_CEC_SWITCH = HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH;
38 
39     private List<HdmiPortInfo> mInfoList = null;
40     private int[] mTypes = null;
41 
42     /**
43      * Create a new HdmiControlManager with the current HdmiControlService wrapper
44      *
45      * @return the created HdmiControlManager
46      */
47     @NonNull
createHdmiControlManager()48     public HdmiControlManager createHdmiControlManager() {
49         return new HdmiControlManager(mInterface);
50     }
51 
52     private final IHdmiControlService mInterface = new IHdmiControlService.Stub() {
53 
54         @Override
55         public int[] getSupportedTypes() {
56             return HdmiControlServiceWrapper.this.getSupportedTypes();
57         }
58 
59         @Override
60         public HdmiDeviceInfo getActiveSource() {
61             return HdmiControlServiceWrapper.this.getActiveSource();
62         }
63 
64         @Override
65         public void oneTouchPlay(IHdmiControlCallback callback) {
66             HdmiControlServiceWrapper.this.oneTouchPlay(callback);
67         }
68 
69         @Override
70         public void toggleAndFollowTvPower() {
71             HdmiControlServiceWrapper.this.toggleAndFollowTvPower();
72         }
73 
74         @Override
75         public boolean shouldHandleTvPowerKey() {
76             return HdmiControlServiceWrapper.this.shouldHandleTvPowerKey();
77         }
78 
79         @Override
80         public void queryDisplayStatus(IHdmiControlCallback callback) {
81             HdmiControlServiceWrapper.this.queryDisplayStatus(callback);
82         }
83 
84         @Override
85         public void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {
86             HdmiControlServiceWrapper.this.addHdmiControlStatusChangeListener(listener);
87         }
88 
89         @Override
90         public void removeHdmiControlStatusChangeListener(
91                 IHdmiControlStatusChangeListener listener) {
92             HdmiControlServiceWrapper.this.removeHdmiControlStatusChangeListener(listener);
93         }
94 
95         @Override
96         public void addHotplugEventListener(IHdmiHotplugEventListener listener) {
97             HdmiControlServiceWrapper.this.addHotplugEventListener(listener);
98         }
99 
100         @Override
101         public void removeHotplugEventListener(IHdmiHotplugEventListener listener) {
102             HdmiControlServiceWrapper.this.removeHotplugEventListener(listener);
103         }
104 
105         @Override
106         public void addDeviceEventListener(IHdmiDeviceEventListener listener) {
107             HdmiControlServiceWrapper.this.addDeviceEventListener(listener);
108         }
109 
110         @Override
111         public void deviceSelect(int deviceId, IHdmiControlCallback callback) {
112             HdmiControlServiceWrapper.this.deviceSelect(deviceId, callback);
113         }
114 
115         @Override
116         public void portSelect(int portId, IHdmiControlCallback callback) {
117             HdmiControlServiceWrapper.this.portSelect(portId, callback);
118         }
119 
120         @Override
121         public void sendKeyEvent(int deviceType, int keyCode, boolean isPressed) {
122             HdmiControlServiceWrapper.this.sendKeyEvent(deviceType, keyCode, isPressed);
123         }
124 
125         @Override
126         public void sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed) {
127             HdmiControlServiceWrapper.this.sendVolumeKeyEvent(deviceType, keyCode, isPressed);
128         }
129 
130         @Override
131         public List<HdmiPortInfo> getPortInfo() {
132             return HdmiControlServiceWrapper.this.getPortInfo();
133         }
134 
135         @Override
136         public boolean canChangeSystemAudioMode() {
137             return HdmiControlServiceWrapper.this.canChangeSystemAudioMode();
138         }
139 
140         @Override
141         public boolean getSystemAudioMode() {
142             return HdmiControlServiceWrapper.this.getSystemAudioMode();
143         }
144 
145         @Override
146         public int getPhysicalAddress() {
147             return HdmiControlServiceWrapper.this.getPhysicalAddress();
148         }
149 
150         @Override
151         public void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback) {
152             HdmiControlServiceWrapper.this.setSystemAudioMode(enabled, callback);
153         }
154 
155         @Override
156         public void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {
157             HdmiControlServiceWrapper.this.addSystemAudioModeChangeListener(listener);
158         }
159 
160         @Override
161         public void removeSystemAudioModeChangeListener(
162                 IHdmiSystemAudioModeChangeListener listener) {
163             HdmiControlServiceWrapper.this.removeSystemAudioModeChangeListener(listener);
164         }
165 
166         @Override
167         public void setArcMode(boolean enabled) {
168             HdmiControlServiceWrapper.this.setArcMode(enabled);
169         }
170 
171         @Override
172         public void setProhibitMode(boolean enabled) {
173             HdmiControlServiceWrapper.this.setProhibitMode(enabled);
174         }
175 
176         @Override
177         public void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex) {
178             HdmiControlServiceWrapper.this.setSystemAudioVolume(oldIndex, newIndex, maxIndex);
179         }
180 
181         @Override
182         public void setSystemAudioMute(boolean mute) {
183             HdmiControlServiceWrapper.this.setSystemAudioMute(mute);
184         }
185 
186         @Override
187         public void setInputChangeListener(IHdmiInputChangeListener listener) {
188             HdmiControlServiceWrapper.this.setInputChangeListener(listener);
189         }
190 
191         @Override
192         public List<HdmiDeviceInfo> getInputDevices() {
193             return HdmiControlServiceWrapper.this.getInputDevices();
194         }
195 
196         @Override
197         public List<HdmiDeviceInfo> getDeviceList() {
198             return HdmiControlServiceWrapper.this.getDeviceList();
199         }
200 
201         @Override
202         public void powerOffRemoteDevice(int logicalAddress, int powerStatus) {
203             HdmiControlServiceWrapper.this.powerOffRemoteDevice(logicalAddress, powerStatus);
204         }
205 
206         @Override
207         public void powerOnRemoteDevice(int logicalAddress, int powerStatus) {
208             HdmiControlServiceWrapper.this.powerOnRemoteDevice(logicalAddress, powerStatus);
209         }
210 
211         @Override
212         public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) {
213             HdmiControlServiceWrapper.this.askRemoteDeviceToBecomeActiveSource(physicalAddress);
214         }
215 
216         @Override
217         public void sendVendorCommand(int deviceType, int targetAddress, byte[] params,
218                 boolean hasVendorId) {
219             HdmiControlServiceWrapper.this.sendVendorCommand(
220                     deviceType, targetAddress, params, hasVendorId);
221         }
222 
223         @Override
224         public void addVendorCommandListener(IHdmiVendorCommandListener listener, int vendorId) {
225             HdmiControlServiceWrapper.this.addVendorCommandListener(listener, vendorId);
226         }
227 
228         @Override
229         public void sendStandby(int deviceType, int deviceId) {
230             HdmiControlServiceWrapper.this.sendStandby(deviceType, deviceId);
231         }
232 
233         @Override
234         public void setHdmiRecordListener(IHdmiRecordListener callback) {
235             HdmiControlServiceWrapper.this.setHdmiRecordListener(callback);
236         }
237 
238         @Override
239         public void startOneTouchRecord(int recorderAddress, byte[] recordSource) {
240             HdmiControlServiceWrapper.this.startOneTouchRecord(recorderAddress, recordSource);
241         }
242 
243         @Override
244         public void stopOneTouchRecord(int recorderAddress) {
245             HdmiControlServiceWrapper.this.stopOneTouchRecord(recorderAddress);
246         }
247 
248         @Override
249         public void startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {
250             HdmiControlServiceWrapper.this.startTimerRecording(
251                     recorderAddress, sourceType, recordSource);
252         }
253 
254         @Override
255         public void clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {
256             HdmiControlServiceWrapper.this.clearTimerRecording(
257                     recorderAddress, sourceType, recordSource);
258         }
259 
260         @Override
261         public void sendMhlVendorCommand(int portId, int offset, int length, byte[] data) {
262             HdmiControlServiceWrapper.this.sendMhlVendorCommand(portId, offset, length, data);
263         }
264 
265         @Override
266         public void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) {
267             HdmiControlServiceWrapper.this.addHdmiMhlVendorCommandListener(listener);
268         }
269 
270         @Override
271         public void setStandbyMode(boolean isStandbyModeOn) {
272             HdmiControlServiceWrapper.this.setStandbyMode(isStandbyModeOn);
273         }
274 
275         @Override
276         public void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute) {
277             HdmiControlServiceWrapper.this.reportAudioStatus(deviceType, volume, maxVolume, isMute);
278         }
279 
280         @Override
281         public void setSystemAudioModeOnForAudioOnlySource() {
282             HdmiControlServiceWrapper.this.setSystemAudioModeOnForAudioOnlySource();
283         }
284 
285         @Override
286         public void addHdmiCecVolumeControlFeatureListener(
287                 IHdmiCecVolumeControlFeatureListener listener) {
288             HdmiControlServiceWrapper.this.addHdmiCecVolumeControlFeatureListener(listener);
289         }
290 
291         @Override
292         public void removeHdmiCecVolumeControlFeatureListener(
293                 IHdmiCecVolumeControlFeatureListener listener) {
294             HdmiControlServiceWrapper.this.removeHdmiCecVolumeControlFeatureListener(listener);
295         }
296 
297         @Override
298         public int getMessageHistorySize() {
299             return HdmiControlServiceWrapper.this.getMessageHistorySize();
300         }
301 
302         @Override
303         public boolean setMessageHistorySize(int newSize) {
304             return HdmiControlServiceWrapper.this.setMessageHistorySize(newSize);
305         }
306 
307         @Override
308         public void addCecSettingChangeListener(String name,
309                 IHdmiCecSettingChangeListener listener) {
310             HdmiControlServiceWrapper.this.addCecSettingChangeListener(name, listener);
311         }
312 
313         @Override
314         public void removeCecSettingChangeListener(String name,
315                 IHdmiCecSettingChangeListener listener) {
316             HdmiControlServiceWrapper.this.removeCecSettingChangeListener(name, listener);
317         }
318 
319         @Override
320         public List<String> getUserCecSettings() {
321             return HdmiControlServiceWrapper.this.getUserCecSettings();
322         }
323 
324         @Override
325         public List<String> getAllowedCecSettingStringValues(String name) {
326             return HdmiControlServiceWrapper.this.getAllowedCecSettingStringValues(name);
327         }
328 
329         @Override
330         public int[] getAllowedCecSettingIntValues(String name) {
331             return HdmiControlServiceWrapper.this.getAllowedCecSettingIntValues(name);
332         }
333 
334         @Override
335         public String getCecSettingStringValue(String name) {
336             return HdmiControlServiceWrapper.this.getCecSettingStringValue(name);
337         }
338 
339         @Override
340         public void setCecSettingStringValue(String name, String value) {
341             HdmiControlServiceWrapper.this.setCecSettingStringValue(name, value);
342         }
343 
344         @Override
345         public int getCecSettingIntValue(String name) {
346             return HdmiControlServiceWrapper.this.getCecSettingIntValue(name);
347         }
348 
349         @Override
350         public void setCecSettingIntValue(String name, int value) {
351             HdmiControlServiceWrapper.this.setCecSettingIntValue(name, value);
352         }
353     };
354 
355     @BinderThread
setPortInfo(@onNull List<HdmiPortInfo> infoList)356     public void setPortInfo(@NonNull List<HdmiPortInfo> infoList) {
357         mInfoList = infoList;
358     }
359 
360     @BinderThread
setDeviceTypes(@onNull int[] types)361     public void setDeviceTypes(@NonNull int[] types) {
362         mTypes = types;
363     }
364 
365     /** @hide */
getPortInfo()366     public List<HdmiPortInfo> getPortInfo() {
367         return mInfoList;
368     }
369 
370     /** @hide */
getSupportedTypes()371     public int[] getSupportedTypes() {
372         return mTypes;
373     }
374 
375     /** @hide */
getActiveSource()376     public HdmiDeviceInfo getActiveSource() {
377         return null;
378     }
379 
380     /** @hide */
oneTouchPlay(IHdmiControlCallback callback)381     public void oneTouchPlay(IHdmiControlCallback callback) {}
382 
383     /** @hide */
toggleAndFollowTvPower()384     public void toggleAndFollowTvPower() {}
385 
386     /** @hide */
shouldHandleTvPowerKey()387     public boolean shouldHandleTvPowerKey() {
388         return true;
389     }
390 
391     /** @hide */
queryDisplayStatus(IHdmiControlCallback callback)392     public void queryDisplayStatus(IHdmiControlCallback callback) {}
393 
394     /** @hide */
addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener)395     public void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {}
396 
397     /** @hide */
removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener)398     public void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {}
399 
400     /** @hide */
addHotplugEventListener(IHdmiHotplugEventListener listener)401     public void addHotplugEventListener(IHdmiHotplugEventListener listener) {}
402 
403     /** @hide */
removeHotplugEventListener(IHdmiHotplugEventListener listener)404     public void removeHotplugEventListener(IHdmiHotplugEventListener listener) {}
405 
406     /** @hide */
addDeviceEventListener(IHdmiDeviceEventListener listener)407     public void addDeviceEventListener(IHdmiDeviceEventListener listener) {}
408 
409     /** @hide */
deviceSelect(int deviceId, IHdmiControlCallback callback)410     public void deviceSelect(int deviceId, IHdmiControlCallback callback) {}
411 
412     /** @hide */
portSelect(int portId, IHdmiControlCallback callback)413     public void portSelect(int portId, IHdmiControlCallback callback) {}
414 
415     /** @hide */
sendKeyEvent(int deviceType, int keyCode, boolean isPressed)416     public void sendKeyEvent(int deviceType, int keyCode, boolean isPressed) {}
417 
418     /** @hide */
sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed)419     public void sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed) {}
420 
421     /** @hide */
canChangeSystemAudioMode()422     public boolean canChangeSystemAudioMode() {
423         return true;
424     }
425 
426     /** @hide */
getSystemAudioMode()427     public boolean getSystemAudioMode() {
428         return true;
429     }
430 
431     /** @hide */
getPhysicalAddress()432     public int getPhysicalAddress() {
433         return 0xffff;
434     }
435 
436     /** @hide */
setSystemAudioMode(boolean enabled, IHdmiControlCallback callback)437     public void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback) {}
438 
439     /** @hide */
addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener)440     public void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {}
441 
442     /** @hide */
removeSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener)443     public void removeSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {}
444 
445     /** @hide */
setArcMode(boolean enabled)446     public void setArcMode(boolean enabled) {}
447 
448     /** @hide */
setProhibitMode(boolean enabled)449     public void setProhibitMode(boolean enabled) {}
450 
451     /** @hide */
setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex)452     public void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex) {}
453 
454     /** @hide */
setSystemAudioMute(boolean mute)455     public void setSystemAudioMute(boolean mute) {}
456 
457     /** @hide */
setInputChangeListener(IHdmiInputChangeListener listener)458     public void setInputChangeListener(IHdmiInputChangeListener listener) {}
459 
460     /** @hide */
getInputDevices()461     public List<HdmiDeviceInfo> getInputDevices() {
462         return null;
463     }
464 
465     /** @hide */
getDeviceList()466     public List<HdmiDeviceInfo> getDeviceList() {
467         return null;
468     }
469 
470     /** @hide */
powerOffRemoteDevice(int logicalAddress, int powerStatus)471     public void powerOffRemoteDevice(int logicalAddress, int powerStatus) {}
472 
473     /** @hide */
powerOnRemoteDevice(int logicalAddress, int powerStatus)474     public void powerOnRemoteDevice(int logicalAddress, int powerStatus) {}
475 
476     /** @hide */
askRemoteDeviceToBecomeActiveSource(int physicalAddress)477     public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) {}
478 
479     /** @hide */
sendVendorCommand(int deviceType, int targetAddress, byte[] params, boolean hasVendorId)480     public void sendVendorCommand(int deviceType, int targetAddress, byte[] params,
481             boolean hasVendorId) {}
482 
483     /** @hide */
addVendorCommandListener(IHdmiVendorCommandListener listener, int vendorId)484     public void addVendorCommandListener(IHdmiVendorCommandListener listener, int vendorId) {}
485 
486     /** @hide */
sendStandby(int deviceType, int deviceId)487     public void sendStandby(int deviceType, int deviceId) {}
488 
489     /** @hide */
setHdmiRecordListener(IHdmiRecordListener callback)490     public void setHdmiRecordListener(IHdmiRecordListener callback) {}
491 
492     /** @hide */
startOneTouchRecord(int recorderAddress, byte[] recordSource)493     public void startOneTouchRecord(int recorderAddress, byte[] recordSource) {}
494 
495     /** @hide */
stopOneTouchRecord(int recorderAddress)496     public void stopOneTouchRecord(int recorderAddress) {}
497 
498     /** @hide */
startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource)499     public void startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {}
500 
501     /** @hide */
clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource)502     public void clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {}
503 
504     /** @hide */
sendMhlVendorCommand(int portId, int offset, int length, byte[] data)505     public void sendMhlVendorCommand(int portId, int offset, int length, byte[] data) {}
506 
507     /** @hide */
addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener)508     public void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) {}
509 
510     /** @hide */
setStandbyMode(boolean isStandbyModeOn)511     public void setStandbyMode(boolean isStandbyModeOn) {}
512 
513     /** @hide */
setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled)514     public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) {}
515 
516     /** @hide */
isHdmiCecVolumeControlEnabled()517     public boolean isHdmiCecVolumeControlEnabled() {
518         return true;
519     }
520 
521     /** @hide */
reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute)522     public void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute) {}
523 
524     /** @hide */
setSystemAudioModeOnForAudioOnlySource()525     public void setSystemAudioModeOnForAudioOnlySource() {}
526 
527     /** @hide */
addHdmiCecVolumeControlFeatureListener( IHdmiCecVolumeControlFeatureListener listener)528     public void addHdmiCecVolumeControlFeatureListener(
529             IHdmiCecVolumeControlFeatureListener listener) {}
530 
531     /** @hide */
removeHdmiCecVolumeControlFeatureListener( IHdmiCecVolumeControlFeatureListener listener)532     public void removeHdmiCecVolumeControlFeatureListener(
533             IHdmiCecVolumeControlFeatureListener listener) {}
534 
535     /** @hide */
getMessageHistorySize()536     public int getMessageHistorySize() {
537         return 0;
538     }
539 
540     /** @hide */
setMessageHistorySize(int newSize)541     public boolean setMessageHistorySize(int newSize) {
542         return true;
543     }
544 
545     /** @hide */
addCecSettingChangeListener(String name, IHdmiCecSettingChangeListener listener)546     public void addCecSettingChangeListener(String name,
547             IHdmiCecSettingChangeListener listener) {}
548 
549     /** @hide */
removeCecSettingChangeListener(String name, IHdmiCecSettingChangeListener listener)550     public void removeCecSettingChangeListener(String name,
551             IHdmiCecSettingChangeListener listener) {}
552 
553     /** @hide */
getUserCecSettings()554     public List<String> getUserCecSettings() {
555         return new ArrayList<>();
556     }
557 
558     /** @hide */
getAllowedCecSettingStringValues(String name)559     public List<String> getAllowedCecSettingStringValues(String name) {
560         return new ArrayList<>();
561     }
562 
563     /** @hide */
getAllowedCecSettingIntValues(String name)564     public int[] getAllowedCecSettingIntValues(String name) {
565         return new int[0];
566     }
567 
568     /** @hide */
getCecSettingStringValue(String name)569     public String getCecSettingStringValue(String name) {
570         return "";
571     }
572 
573     /** @hide */
setCecSettingStringValue(String name, String value)574     public void setCecSettingStringValue(String name, String value) {
575     }
576 
577     /** @hide */
getCecSettingIntValue(String name)578     public int getCecSettingIntValue(String name) {
579         return 0;
580     }
581 
582     /** @hide */
setCecSettingIntValue(String name, int value)583     public void setCecSettingIntValue(String name, int value) {
584     }
585 }
586