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
1966d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kimimport android.annotation.SystemApi;
2091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kimimport android.os.RemoteException;
2191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kimimport android.util.Log;
2291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
2391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim/**
2491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * HdmiPlaybackClient represents HDMI-CEC logical device of type Playback
2591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * in the Android system which acts as a playback device such as set-top box.
2691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * It provides with methods that control, get information from TV/Display device
2791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim * connected through HDMI bus.
2866d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim *
2966d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim * @hide
3091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim */
3166d1eb285b129836d1b3c392ed609283c0dbf830Jinsuk Kim@SystemApi
32119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kimpublic final class HdmiPlaybackClient extends HdmiClient {
3391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    private static final String TAG = "HdmiPlaybackClient";
3491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
358d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim    // Logical address of TV. The secondary TV is not handled.
368d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim    private static final int ADDR_TV = 0;
378d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim
3891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    /**
3991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     * Listener used by the client to get the result of one touch play operation.
4091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     */
4191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    public interface OneTouchPlayCallback {
4291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        /**
4391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         * Called when the result of the feature one touch play is returned.
4491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         *
45c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim         * @param result the result of the operation. {@link HdmiControlManager#RESULT_SUCCESS}
4691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         *         if successful.
4791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         */
4891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        public void onComplete(int result);
4991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
5091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
5191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    /**
5291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     * Listener used by the client to get display device status.
5391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     */
5491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    public interface DisplayStatusCallback {
5591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        /**
5691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         * Called when display device status is reported.
5791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         *
5861f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         * @param status display device status. It should be one of the following values.
5961f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            <ul>
6061f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            <li>{@link HdmiControlManager#POWER_STATUS_ON}
6161f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            <li>{@link HdmiControlManager#POWER_STATUS_STANDBY}
6261f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            <li>{@link HdmiControlManager#POWER_STATUS_TRANSIENT_TO_ON}
6361f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            <li>{@link HdmiControlManager#POWER_STATUS_TRANSIENT_TO_STANDBY}
6461f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            <li>{@link HdmiControlManager#POWER_STATUS_UNKNOWN}
6561f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang         *            </ul>
6691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim         */
6791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        public void onComplete(int status);
6891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
6991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
702b0da5c4c84305f1d391dc78b85e244c9fd92456Yuncheol Heo    /* package */ HdmiPlaybackClient(IHdmiControlService service) {
71119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        super(service);
7291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
7391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
7491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    /**
752b0da5c4c84305f1d391dc78b85e244c9fd92456Yuncheol Heo     * Performs the feature 'one touch play' from playback device to turn on display
7691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     * and switch the input.
7791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     *
7891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     * @param callback {@link OneTouchPlayCallback} object to get informed
7991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     *         of the result
8091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     */
8191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    public void oneTouchPlay(OneTouchPlayCallback callback) {
8291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        // TODO: Use PendingResult.
8391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        try {
8491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            mService.oneTouchPlay(getCallbackWrapper(callback));
8591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        } catch (RemoteException e) {
8691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            Log.e(TAG, "oneTouchPlay threw exception ", e);
8791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        }
8891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
8991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
908e93c84739902f5adaa499b474f39e3c4807bc1cJungshik Jang    @Override
91119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    public int getDeviceType() {
9261f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang        return HdmiDeviceInfo.DEVICE_PLAYBACK;
93119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
94119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
9591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    /**
962b0da5c4c84305f1d391dc78b85e244c9fd92456Yuncheol Heo     * Gets the status of display device connected through HDMI bus.
9791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     *
9891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     * @param callback {@link DisplayStatusCallback} object to get informed
9991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     *         of the result
10091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim     */
10191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    public void queryDisplayStatus(DisplayStatusCallback callback) {
10291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        try {
103304b4a7281ffe4153d21eb50ebed070f1cf685bcJinsuk Kim            mService.queryDisplayStatus(getCallbackWrapper(callback));
10491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        } catch (RemoteException e) {
10591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            Log.e(TAG, "queryDisplayStatus threw exception ", e);
10691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        }
10791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
10891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
1098d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim    /**
1108d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim     * Sends a &lt;Standby&gt; command to TV.
1118d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim     */
1128d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim    public void sendStandby() {
1138d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim        try {
1148d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim            mService.sendStandby(getDeviceType(), HdmiDeviceInfo.idForCecDevice(ADDR_TV));
1158d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim        } catch (RemoteException e) {
1168d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim            Log.e(TAG, "sendStandby threw exception ", e);
1178d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim        }
1188d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim    }
1198d115eb18fce5b85538239e2373c3efd28e46986Jinsuk Kim
12091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    private IHdmiControlCallback getCallbackWrapper(final OneTouchPlayCallback callback) {
12191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        return new IHdmiControlCallback.Stub() {
12291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            @Override
12391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            public void onComplete(int result) {
12491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim                callback.onComplete(result);
12591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            }
12691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        };
12791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
12891120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim
12991120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    private IHdmiControlCallback getCallbackWrapper(final DisplayStatusCallback callback) {
13091120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        return new IHdmiControlCallback.Stub() {
13191120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            @Override
13291120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            public void onComplete(int status) {
13391120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim                callback.onComplete(status);
13491120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim            }
13591120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim        };
13691120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim    }
13791120c541ac0c8c5e256b75759c884b4d6d664fcJinsuk Kim}
138