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