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