HdmiClient.java revision f424932cfb1b16b01a37500d09e295912700a51d
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) {
53f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang            Log.e(TAG, "sendKeyEvent 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