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 &lt;Vendor Command
240119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim         *        With ID&gt;. 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