HdmiControlManager.java revision 12e5dcefe136b58562f39604e6a8460ac92cb895
191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim/* 291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Copyright (C) 2014 The Android Open Source Project 391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Licensed under the Apache License, Version 2.0 (the "License"); 591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * you may not use this file except in compliance with the License. 691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * You may obtain a copy of the License at 791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * http://www.apache.org/licenses/LICENSE-2.0 991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 1091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Unless required by applicable law or agreed to in writing, software 1191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * distributed under the License is distributed on an "AS IS" BASIS, 1291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * See the License for the specific language governing permissions and 1491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * limitations under the License. 1591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 1691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 1791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kimpackage android.hardware.hdmi; 1891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 1991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kimimport android.annotation.Nullable; 20c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kimimport android.annotation.SdkConstant; 21c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kimimport android.annotation.SdkConstant.SdkConstantType; 2266d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kimimport android.annotation.SystemApi; 2378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kimimport android.os.RemoteException; 2478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 2591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim/** 2691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * The {@link HdmiControlManager} class is used to send HDMI control messages 2791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * to attached CEC devices. 2891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 2991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * <p>Provides various HDMI client instances that represent HDMI-CEC logical devices 3091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * hosted in the system. {@link #getTvClient()}, for instance will return an 3191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * {@link HdmiTvClient} object if the system is configured to host one. Android system 3291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * can host more than one logical CEC devices. If multiple types are configured they 3391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * all work as if they were independent logical devices running in the system. 3466d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim * 3566d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim * @hide 3691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 3766d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim@SystemApi 3891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kimpublic final class HdmiControlManager { 3991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim @Nullable private final IHdmiControlService mService; 4091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 41c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim /** 42c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * Broadcast Action: Display OSD message. 43c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * <p>Send when the service has a message to display on screen for events 44c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * that need user's attention such as ARC status change. 45c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * <p>Always contains the extra fields {@link #EXTRA_MESSAGE}. 46c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * <p>Requires {@link android.Manifest.permission#HDMI_CEC} to receive. 47c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim */ 48c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 49c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; 50c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim 51c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim /** 52c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * Used as an extra field in the intent {@link #ACTION_OSD_MESSAGE}. Contains the ID of 53c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim * the message to display on screen. 54c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim */ 55c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; 56c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim 57c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_UNKNOWN = -1; 58c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_ON = 0; 59c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_STANDBY = 1; 60c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; 61c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; 62c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim 63c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_SUCCESS = 0; 64c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_TIMEOUT = 1; 65c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; 66c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_TARGET_NOT_AVAILABLE = 3; 67c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_ALREADY_IN_PROGRESS = 4; 68c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_EXCEPTION = 5; 69c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_INCORRECT_MODE = 6; 70b38cd68b240d99e8c8ae6ff1802a574696b420cdJinsuk Kim public static final int RESULT_COMMUNICATION_FAILED = 7; 71c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim 7212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang // --- One Touch Recording success result 73b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Recording currently selected source. Indicates the status of a recording. */ 7412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 0x01; 75b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Recording Digital Service. Indicates the status of a recording. */ 7612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 0x02; 77b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Recording Analogue Service. Indicates the status of a recording. */ 7812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 0x03; 79b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Recording External input. Indicates the status of a recording. */ 8012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 0x04; 8112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang 8212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang // --- One Touch Record failure result 83b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – unable to record Digital Service. No suitable tuner. */ 8412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 0x05; 85b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – unable to record Analogue Service. No suitable tuner. */ 8612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 0x06; 87b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** 88b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang * No recording – unable to select required service. as suitable tuner, but the requested 89b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang * parameters are invalid or out of range for that tuner. 90b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang */ 9112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 0x07; 92b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – invalid External plug number */ 9312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 0x09; 94b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – invalid External Physical Address */ 9512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 0x0A; 96b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – CA system not supported */ 9712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 0x0B; 98b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No Recording – No or Insufficient CA Entitlements” */ 9912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 0x0C; 100b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – Not allowed to copy source. Source is “copy never”. */ 10112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 0x0D; 102b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – No further copies allowed */ 10312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 0x0E; 104b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – No media */ 10512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_NO_MEDIA = 0x10; 106b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – playing */ 10712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_PLAYING = 0x11; 108b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – already recording */ 10912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 0x12; 110b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – media protected */ 11112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 0x13; 112b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – no source signal */ 11312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 0x14; 114b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – media problem */ 11512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 0x15; 116b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – not enough space available */ 11712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 0x16; 118b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – Parental Lock On */ 11912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 0x17; 120b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Recording terminated normally */ 12112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 0x1A; 122b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Recording has already terminated */ 12312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 0x1B; 124b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording – other reason */ 12512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_OTHER_REASON = 0x1F; 126b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang // From here extra message for recording that is not mentioned in CEC spec 127b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording. Previous recording request in progress. */ 12812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 0x30; 129b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** No recording. Please check recorder and connection. */ 13012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 0x31; 131b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Cannot record currently displayed source. */ 13212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 0x32; 13312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang /** CEC is disabled. */ 13412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 0x33; 135b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang 13612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang // --- Types for timer recording 137b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Timer recording type for digital service source. */ 138b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; 139b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Timer recording type for analogue service source. */ 140b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; 141b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang /** Timer recording type for external source. */ 142b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; 143b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang 14412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang // --- Extra result value for timer recording. 14512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang /** No timer recording - check recorder and connection. */ 14612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int TIME_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 0x01; 14712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang /** No timer recording - cannot record selected source. */ 14812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int TIME_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 0x02; 14912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang /** CEC is disabled. */ 15012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang public static final int TIME_RECORDING_RESULT_EXTRA_CEC_DISABLED = 0x33; 15112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang 15278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // True if we have a logical device of type playback hosted in the system. 15378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private final boolean mHasPlaybackDevice; 15478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // True if we have a logical device of type TV hosted in the system. 15578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private final boolean mHasTvDevice; 15678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 15791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim /** 15891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * @hide - hide this constructor because it has a parameter of type 15991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * IHdmiControlService, which is a system private class. The right way 16091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * to create an instance of this class is using the factory 16191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Context.getSystemService. 16291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 16391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim public HdmiControlManager(IHdmiControlService service) { 16491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim mService = service; 16578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim int[] types = null; 16678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService != null) { 16778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim try { 16878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim types = mService.getSupportedTypes(); 16978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } catch (RemoteException e) { 17078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // Do nothing. 17178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 17278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 173c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim mHasTvDevice = hasDeviceType(types, HdmiCecDeviceInfo.DEVICE_TV); 174c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim mHasPlaybackDevice = hasDeviceType(types, HdmiCecDeviceInfo.DEVICE_PLAYBACK); 17578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 17678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 17778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private static boolean hasDeviceType(int[] types, int type) { 17878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (types == null) { 17978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return false; 18078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 18178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim for (int t : types) { 18278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (t == type) { 18378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return true; 18478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 18578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 18678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return false; 18791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 18891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 18991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim /** 19091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Gets an object that represents a HDMI-CEC logical device of type playback on the system. 19191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 19291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * <p>Used to send HDMI control messages to other devices like TV or audio amplifier through 19391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * HDMI bus. It is also possible to communicate with other logical devices hosted in the same 19491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * system if the system is configured to host more than one type of HDMI-CEC logical devices. 19591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 19691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * @return {@link HdmiPlaybackClient} instance. {@code null} on failure. 19791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 19891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim @Nullable 19991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim public HdmiPlaybackClient getPlaybackClient() { 20078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null || !mHasPlaybackDevice) { 20191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim return null; 20291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 20391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim return new HdmiPlaybackClient(mService); 20491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 20591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 20691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim /** 20791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Gets an object that represents a HDMI-CEC logical device of type TV on the system. 20891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 20991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * <p>Used to send HDMI control messages to other devices and manage them through 21091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * HDMI bus. It is also possible to communicate with other logical devices hosted in the same 21191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * system if the system is configured to host more than one type of HDMI-CEC logical devices. 21291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 21391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * @return {@link HdmiTvClient} instance. {@code null} on failure. 21491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 21591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim @Nullable 21691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim public HdmiTvClient getTvClient() { 21778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null || !mHasTvDevice) { 21878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return null; 21991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 22091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim return new HdmiTvClient(mService); 22191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 22278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 22378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim /** 22478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * Listener used to get hotplug event from HDMI port. 22578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim */ 22678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim public interface HotplugEventListener { 22778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim void onReceived(HdmiHotplugEvent event); 22878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 22978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 23078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim /** 231119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * Listener used to get vendor-specific commands. 232119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim */ 233119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim public interface VendorCommandListener { 234119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim /** 235119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * Called when a vendor command is received. 236119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * 237119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * @param srcAddress source logical address 238119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * @param params vendor-specific parameters 239119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * @param hasVendorId {@code true} if the command is <Vendor Command 240119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * With ID>. The first 3 bytes of params is vendor id. 241119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim */ 242119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim void onReceived(int srcAddress, byte[] params, boolean hasVendorId); 243119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 244119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 245119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim /** 24678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * Adds a listener to get informed of {@link HdmiHotplugEvent}. 24778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * 24878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * <p>To stop getting the notification, 2499302a733b01c3ab4abd7911a286baf4833847d56Jinsuk Kim * use {@link #removeHotplugEventListener(HotplugEventListener)}. 25078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * 25178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * @param listener {@link HotplugEventListener} instance 2529302a733b01c3ab4abd7911a286baf4833847d56Jinsuk Kim * @see HdmiControlManager#removeHotplugEventListener(HotplugEventListener) 25378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim */ 25478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim public void addHotplugEventListener(HotplugEventListener listener) { 25578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null) { 25678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return; 25778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 25878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim try { 25978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim mService.addHotplugEventListener(getHotplugEventListenerWrapper(listener)); 26078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } catch (RemoteException e) { 26178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // Do nothing. 26278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 26378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 26478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 26578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim /** 26678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * Removes a listener to stop getting informed of {@link HdmiHotplugEvent}. 26778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * 26878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * @param listener {@link HotplugEventListener} instance to be removed 26978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim */ 2709302a733b01c3ab4abd7911a286baf4833847d56Jinsuk Kim public void removeHotplugEventListener(HotplugEventListener listener) { 27178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null) { 27278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return; 27378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 27478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim try { 27578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim mService.removeHotplugEventListener(getHotplugEventListenerWrapper(listener)); 27678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } catch (RemoteException e) { 27778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // Do nothing. 27878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 27978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 28078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 28178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private IHdmiHotplugEventListener getHotplugEventListenerWrapper( 28278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim final HotplugEventListener listener) { 28378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return new IHdmiHotplugEventListener.Stub() { 28478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim public void onReceived(HdmiHotplugEvent event) { 28578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim listener.onReceived(event);; 28678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 28778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim }; 28878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 28991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim} 290