HdmiControlManager.java revision b38cd68b240d99e8c8ae6ff1802a574696b420cd
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; 2066d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kimimport android.annotation.SystemApi; 2178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kimimport android.os.RemoteException; 2278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 2391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim/** 2491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * The {@link HdmiControlManager} class is used to send HDMI control messages 2591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * to attached CEC devices. 2691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 2791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * <p>Provides various HDMI client instances that represent HDMI-CEC logical devices 2891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * hosted in the system. {@link #getTvClient()}, for instance will return an 2991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * {@link HdmiTvClient} object if the system is configured to host one. Android system 3091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * can host more than one logical CEC devices. If multiple types are configured they 3191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * all work as if they were independent logical devices running in the system. 3266d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim * 3366d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim * @hide 3491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 3566d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim@SystemApi 3691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kimpublic final class HdmiControlManager { 3791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim @Nullable private final IHdmiControlService mService; 3891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 39c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_UNKNOWN = -1; 40c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_ON = 0; 41c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_STANDBY = 1; 42c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; 43c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; 44c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim 45c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_SUCCESS = 0; 46c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_TIMEOUT = 1; 47c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; 48c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_TARGET_NOT_AVAILABLE = 3; 49c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_ALREADY_IN_PROGRESS = 4; 50c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_EXCEPTION = 5; 51c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim public static final int RESULT_INCORRECT_MODE = 6; 52b38cd68b240d99e8c8ae6ff1802a574696b420cdJinsuk Kim public static final int RESULT_COMMUNICATION_FAILED = 7; 53c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim 5478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // True if we have a logical device of type playback hosted in the system. 5578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private final boolean mHasPlaybackDevice; 5678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // True if we have a logical device of type TV hosted in the system. 5778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private final boolean mHasTvDevice; 5878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 5991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim /** 6091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * @hide - hide this constructor because it has a parameter of type 6191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * IHdmiControlService, which is a system private class. The right way 6291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * to create an instance of this class is using the factory 6391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Context.getSystemService. 6491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 6591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim public HdmiControlManager(IHdmiControlService service) { 6691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim mService = service; 6778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim int[] types = null; 6878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService != null) { 6978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim try { 7078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim types = mService.getSupportedTypes(); 7178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } catch (RemoteException e) { 7278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // Do nothing. 7378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 7478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 75c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim mHasTvDevice = hasDeviceType(types, HdmiCecDeviceInfo.DEVICE_TV); 76c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim mHasPlaybackDevice = hasDeviceType(types, HdmiCecDeviceInfo.DEVICE_PLAYBACK); 7778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 7878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 7978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private static boolean hasDeviceType(int[] types, int type) { 8078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (types == null) { 8178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return false; 8278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 8378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim for (int t : types) { 8478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (t == type) { 8578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return true; 8678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 8778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 8878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return false; 8991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 9091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 9191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim /** 9291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Gets an object that represents a HDMI-CEC logical device of type playback on the system. 9391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 9491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * <p>Used to send HDMI control messages to other devices like TV or audio amplifier through 9591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * HDMI bus. It is also possible to communicate with other logical devices hosted in the same 9691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * system if the system is configured to host more than one type of HDMI-CEC logical devices. 9791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 9891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * @return {@link HdmiPlaybackClient} instance. {@code null} on failure. 9991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 10091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim @Nullable 10191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim public HdmiPlaybackClient getPlaybackClient() { 10278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null || !mHasPlaybackDevice) { 10391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim return null; 10491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 10591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim return new HdmiPlaybackClient(mService); 10691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 10791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim 10891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim /** 10991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * Gets an object that represents a HDMI-CEC logical device of type TV on the system. 11091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 11191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * <p>Used to send HDMI control messages to other devices and manage them through 11291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * HDMI bus. It is also possible to communicate with other logical devices hosted in the same 11391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * system if the system is configured to host more than one type of HDMI-CEC logical devices. 11491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * 11591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * @return {@link HdmiTvClient} instance. {@code null} on failure. 11691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */ 11791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim @Nullable 11891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim public HdmiTvClient getTvClient() { 11978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null || !mHasTvDevice) { 12078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return null; 12191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 12291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim return new HdmiTvClient(mService); 12391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim } 12478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 12578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim /** 12678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * Listener used to get hotplug event from HDMI port. 12778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim */ 12878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim public interface HotplugEventListener { 12978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim void onReceived(HdmiHotplugEvent event); 13078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 13178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 13278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim /** 13378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * Adds a listener to get informed of {@link HdmiHotplugEvent}. 13478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * 13578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * <p>To stop getting the notification, 1369302a733b01c3ab4abd7911a286baf4833847d56Jinsuk Kim * use {@link #removeHotplugEventListener(HotplugEventListener)}. 13778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * 13878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * @param listener {@link HotplugEventListener} instance 1399302a733b01c3ab4abd7911a286baf4833847d56Jinsuk Kim * @see HdmiControlManager#removeHotplugEventListener(HotplugEventListener) 14078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim */ 14178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim public void addHotplugEventListener(HotplugEventListener listener) { 14278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null) { 14378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return; 14478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 14578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim try { 14678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim mService.addHotplugEventListener(getHotplugEventListenerWrapper(listener)); 14778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } catch (RemoteException e) { 14878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // Do nothing. 14978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 15078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 15178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 15278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim /** 15378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * Removes a listener to stop getting informed of {@link HdmiHotplugEvent}. 15478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * 15578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim * @param listener {@link HotplugEventListener} instance to be removed 15678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim */ 1579302a733b01c3ab4abd7911a286baf4833847d56Jinsuk Kim public void removeHotplugEventListener(HotplugEventListener listener) { 15878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim if (mService == null) { 15978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return; 16078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 16178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim try { 16278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim mService.removeHotplugEventListener(getHotplugEventListenerWrapper(listener)); 16378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } catch (RemoteException e) { 16478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim // Do nothing. 16578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 16678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 16778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim 16878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim private IHdmiHotplugEventListener getHotplugEventListenerWrapper( 16978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim final HotplugEventListener listener) { 17078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim return new IHdmiHotplugEventListener.Stub() { 17178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim public void onReceived(HdmiHotplugEvent event) { 17278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim listener.onReceived(event);; 17378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 17478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim }; 17578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim } 17691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim} 177