HdmiClient.java revision 61f4fbd2e8436a1ecd478c2a1f516d064a24d43b
1119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimpackage android.hardware.hdmi; 2119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 36ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kimimport android.annotation.NonNull; 4119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimimport android.annotation.SystemApi; 5119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimimport android.hardware.hdmi.HdmiControlManager.VendorCommandListener; 6119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimimport android.hardware.hdmi.IHdmiVendorCommandListener; 7119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimimport android.os.RemoteException; 8119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimimport android.util.Log; 9119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 10119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim/** 11119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * Parent for classes of various HDMI-CEC device type used to access 12119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * {@link HdmiControlService}. Contains methods and data used in common. 13119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * 14119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * @hide 15119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim */ 16fa68c30bbd91c63cf1cf29822b9d0ea9b0bb5b86Ying Wang@SystemApi 17119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimpublic abstract class HdmiClient { 18119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim private static final String TAG = "HdmiClient"; 19119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 20119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim protected final IHdmiControlService mService; 21119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 22119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim protected abstract int getDeviceType(); 23119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 24119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim public HdmiClient(IHdmiControlService service) { 25119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim mService = service; 26119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 27119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 28c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim /** 296ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim * Returns the active source information. 306ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim * 3161f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang * @return {@link HdmiDeviceInfo} object that describes the active source 326ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim * or active routing path 336ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim */ 3461f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang public HdmiDeviceInfo getActiveSource() { 356ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim try { 366ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim return mService.getActiveSource(); 376ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim } catch (RemoteException e) { 386ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim Log.e(TAG, "getActiveSource threw exception ", e); 396ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim } 406ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim return null; 416ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim } 426ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim 436ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim /** 44c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * Send a key event to other logical device. 45c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * 46c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * @param keyCode key code to send. Defined in {@link android.view.KeyEvent}. 47c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * @param isPressed true if this is key press event 48c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim */ 49c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim public void sendKeyEvent(int keyCode, boolean isPressed) { 50c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim try { 51c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim mService.sendKeyEvent(getDeviceType(), keyCode, isPressed); 52c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim } catch (RemoteException e) { 53c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim Log.e(TAG, "queryDisplayStatus threw exception ", e); 54c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim } 55c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim } 56c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim 57c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim /** 58c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * Send vendor-specific command. 59c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * 60c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * @param targetAddress address of the target device 61c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * @param params vendor-specific parameter. For <Vendor Command With ID> do not 62c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * include the first 3 bytes (vendor ID). 63c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * @param hasVendorId {@code true} if the command type will be <Vendor Command With ID>. 64c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * {@code false} if the command will be <Vendor Command> 65c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim */ 66119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim public void sendVendorCommand(int targetAddress, byte[] params, boolean hasVendorId) { 67119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim try { 68119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim mService.sendVendorCommand(getDeviceType(), targetAddress, params, hasVendorId); 69119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } catch (RemoteException e) { 70119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim Log.e(TAG, "failed to send vendor command: ", e); 71119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 72119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 73119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 74c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim /** 75c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * Add a listener used to receive incoming vendor-specific command. 76c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * 77c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim * @param listener listener object 78c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim */ 796ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim public void addVendorCommandListener(@NonNull VendorCommandListener listener) { 806ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim if (listener == null) { 816ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim throw new IllegalArgumentException("listener cannot be null"); 826ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim } 83119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim try { 84119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim mService.addVendorCommandListener(getListenerWrapper(listener), getDeviceType()); 85119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } catch (RemoteException e) { 86119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim Log.e(TAG, "failed to add vendor command listener: ", e); 87119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 88119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 89119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim 90119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim private static IHdmiVendorCommandListener getListenerWrapper( 91119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim final VendorCommandListener listener) { 92119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim return new IHdmiVendorCommandListener.Stub() { 93119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim @Override 94119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim public void onReceived(int srcAddress, byte[] params, boolean hasVendorId) { 95119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim listener.onReceived(srcAddress, params, hasVendorId); 96119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 97119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim }; 98119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim } 99119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim} 100