HdmiClient.java revision 0608b9328b1c2f804ffb2d4165c34383d34bde2a
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.os.RemoteException;
7119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimimport android.util.Log;
8119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
9119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim/**
10119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * Parent for classes of various HDMI-CEC device type used to access
11119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * {@link HdmiControlService}. Contains methods and data used in common.
12119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim *
13119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim * @hide
14119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim */
15fa68c30bbd91c63cf1cf29822b9d0ea9b0bb5b86Ying Wang@SystemApi
16119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimpublic abstract class HdmiClient {
17119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    private static final String TAG = "HdmiClient";
18119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
19119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    protected final IHdmiControlService mService;
20119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
21119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    protected abstract int getDeviceType();
22119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
23119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    public HdmiClient(IHdmiControlService service) {
24119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        mService = service;
25119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
26119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
27c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim    /**
286ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim     * Returns the active source information.
296ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim     *
3061f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang     * @return {@link HdmiDeviceInfo} object that describes the active source
316ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim     *         or active routing path
326ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim     */
3361f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang    public HdmiDeviceInfo getActiveSource() {
346ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim        try {
356ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim            return mService.getActiveSource();
366ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim        } catch (RemoteException e) {
376ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim            Log.e(TAG, "getActiveSource threw exception ", e);
386ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim        }
396ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim        return null;
406ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim    }
416ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim
426ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim    /**
43c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * Send a key event to other logical device.
44c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     *
45c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * @param keyCode key code to send. Defined in {@link android.view.KeyEvent}.
46c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * @param isPressed true if this is key press event
47c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     */
48c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim    public void sendKeyEvent(int keyCode, boolean isPressed) {
49c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim        try {
50c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim            mService.sendKeyEvent(getDeviceType(), keyCode, isPressed);
51c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim        } catch (RemoteException e) {
52f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang            Log.e(TAG, "sendKeyEvent threw exception ", e);
53c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim        }
54c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim    }
55c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim
56c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim    /**
57c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * Send vendor-specific command.
58c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     *
59c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * @param targetAddress address of the target device
60c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * @param params vendor-specific parameter. For <Vendor Command With ID> do not
61c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     *               include the first 3 bytes (vendor ID).
62c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * @param hasVendorId {@code true} if the command type will be <Vendor Command With ID>.
63c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     *                    {@code false} if the command will be <Vendor Command>
64c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     */
65119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    public void sendVendorCommand(int targetAddress, byte[] params, boolean hasVendorId) {
66119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        try {
67119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            mService.sendVendorCommand(getDeviceType(), targetAddress, params, hasVendorId);
68119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        } catch (RemoteException e) {
69119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            Log.e(TAG, "failed to send vendor command: ", e);
70119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        }
71119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
72119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
73c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim    /**
74c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * Add a listener used to receive incoming vendor-specific command.
75c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     *
76c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     * @param listener listener object
77c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim     */
786ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim    public void addVendorCommandListener(@NonNull VendorCommandListener listener) {
796ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim        if (listener == null) {
806ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim            throw new IllegalArgumentException("listener cannot be null");
816ffb03816f7410c001072a25c3e4161a2da4f501Jinsuk Kim        }
82119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        try {
83119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            mService.addVendorCommandListener(getListenerWrapper(listener), getDeviceType());
84119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        } catch (RemoteException e) {
85119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            Log.e(TAG, "failed to add vendor command listener: ", e);
86119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        }
87119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
88119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
89119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    private static IHdmiVendorCommandListener getListenerWrapper(
90119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            final VendorCommandListener listener) {
91119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        return new IHdmiVendorCommandListener.Stub() {
92119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            @Override
930608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo            public void onReceived(int srcAddress, int destAddress, byte[] params,
940608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                    boolean hasVendorId) {
950608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                listener.onReceived(srcAddress, destAddress, params, hasVendorId);
960608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo            }
970608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo            @Override
980608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo            public void onControlStateChanged(boolean enabled, int reason) {
990608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                listener.onControlStateChanged(enabled, reason);
100119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            }
101119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        };
102119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
103119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim}
104