1fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/*
2fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Copyright (C) 2012 The Android Open Source Project
3fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *
4fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * you may not use this file except in compliance with the License.
6fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * You may obtain a copy of the License at
7fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *
8fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *
10fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Unless required by applicable law or agreed to in writing, software
11fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * See the License for the specific language governing permissions and
14fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * limitations under the License.
15fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
16fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
17fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpackage android.hardware.display;
18fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
19fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.Context;
2098365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.Handler;
21bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.util.SparseArray;
2298365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.Display;
2398365d7663cbd82979a5700faf0050220b01084dJeff Brown
2492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brownimport java.util.ArrayList;
2592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
26fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
27bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Manages the properties of attached displays.
28fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p>
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Get an instance of this class by calling
30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * {@link android.content.Context#getSystemService(java.lang.String)
31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Context.getSystemService()} with the argument
32fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * {@link android.content.Context#DISPLAY_SERVICE}.
33fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p>
34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
35fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class DisplayManager {
36fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private static final String TAG = "DisplayManager";
3798365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static final boolean DEBUG = false;
3898365d7663cbd82979a5700faf0050220b01084dJeff Brown
39bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final Context mContext;
40bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final DisplayManagerGlobal mGlobal;
4198365d7663cbd82979a5700faf0050220b01084dJeff Brown
42bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final Object mLock = new Object();
43bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final SparseArray<Display> mDisplays = new SparseArray<Display>();
4498365d7663cbd82979a5700faf0050220b01084dJeff Brown
4592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    private final ArrayList<Display> mTempDisplays = new ArrayList<Display>();
4692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
47e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
48e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Broadcast receiver that indicates when the Wifi display status changes.
49e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * <p>
50e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The status is provided as a {@link WifiDisplayStatus} object in the
51e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * {@link #EXTRA_WIFI_DISPLAY_STATUS} extra.
52e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * </p><p>
53bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * This broadcast is only sent to registered receivers and can only be sent by the system.
54e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * </p>
55e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
56e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
57e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final String ACTION_WIFI_DISPLAY_STATUS_CHANGED =
58e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            "android.hardware.display.action.WIFI_DISPLAY_STATUS_CHANGED";
59e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
60e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
61e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Contains a {@link WifiDisplayStatus} object.
62e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
63e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
64e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final String EXTRA_WIFI_DISPLAY_STATUS =
65e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            "android.hardware.display.extra.WIFI_DISPLAY_STATUS";
66e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
6792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
6892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display category: Presentation displays.
6992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * <p>
7092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * This category can be used to identify secondary displays that are suitable for
7192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * use as presentation displays.
7292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * </p>
7392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     *
7492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @see android.app.Presentation for information about presenting content
7592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * on secondary displays.
7692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @see #getDisplays(String)
7792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
7892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public static final String DISPLAY_CATEGORY_PRESENTATION =
7992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            "android.hardware.display.category.PRESENTATION";
8092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
81bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /** @hide */
82bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayManager(Context context) {
83bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mContext = context;
84bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mGlobal = DisplayManagerGlobal.getInstance();
85fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
86fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
87fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
88bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Gets information about a logical display.
89848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
90bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * The display metrics may be adjusted to provide compatibility
91bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * for legacy applications.
92848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
93bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @param displayId The logical display id.
94bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @return The display object, or null if there is no valid display with the given id.
95fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
96bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public Display getDisplay(int displayId) {
97bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
98bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            return getOrCreateDisplayLocked(displayId, false /*assumeValid*/);
99fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
100fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
101fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
102fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
103bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Gets all currently valid logical displays.
104fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     *
105bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @return An array containing all displays.
106fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
107bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public Display[] getDisplays() {
10892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        return getDisplays(null);
10992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    }
11092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
11192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
11292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Gets all currently valid logical displays of the specified category.
11392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * <p>
11492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * When there are multiple displays in a category the returned displays are sorted
11592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * of preference.  For example, if the requested category is
11692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * {@link #DISPLAY_CATEGORY_PRESENTATION} and there are multiple presentation displays
11792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * then the displays are sorted so that the first display in the returned array
11892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * is the most preferred presentation display.  The application may simply
11992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * use the first display or allow the user to choose.
12092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * </p>
12192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     *
12292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @param category The requested display category or null to return all displays.
12392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @return An array containing all displays sorted by order of preference.
12492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     *
12592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @see #DISPLAY_CATEGORY_PRESENTATION
12692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
12792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public Display[] getDisplays(String category) {
12892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        final int[] displayIds = mGlobal.getDisplayIds();
129bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
13092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            try {
13192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                if (category == null) {
13292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                    addMatchingDisplaysLocked(mTempDisplays, displayIds, -1);
13392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                } else if (category.equals(DISPLAY_CATEGORY_PRESENTATION)) {
13492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                    addMatchingDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_WIFI);
13592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                    addMatchingDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_HDMI);
13692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                    addMatchingDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_OVERLAY);
137bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
13892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                return mTempDisplays.toArray(new Display[mTempDisplays.size()]);
13992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            } finally {
14092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                mTempDisplays.clear();
141bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
14292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        }
14392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    }
14492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
14592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    private void addMatchingDisplaysLocked(
14692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            ArrayList<Display> displays, int[] displayIds, int matchType) {
14792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        for (int i = 0; i < displayIds.length; i++) {
14892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            Display display = getOrCreateDisplayLocked(displayIds[i], true /*assumeValid*/);
14992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            if (display != null
15092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                    && (matchType < 0 || display.getType() == matchType)) {
15192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                displays.add(display);
152bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
153fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
154fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
15598365d7663cbd82979a5700faf0050220b01084dJeff Brown
156bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
157bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        Display display = mDisplays.get(displayId);
158bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if (display == null) {
159bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            display = mGlobal.getCompatibleDisplay(displayId,
160a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown                    mContext.getCompatibilityInfo(displayId));
161bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (display != null) {
162bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                mDisplays.put(displayId, display);
163bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
164bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        } else if (!assumeValid && !display.isValid()) {
165bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            display = null;
16698365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
167bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return display;
168bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
16998365d7663cbd82979a5700faf0050220b01084dJeff Brown
17098365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
17198365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Registers an display listener to receive notifications about when
17298365d7663cbd82979a5700faf0050220b01084dJeff Brown     * displays are added, removed or changed.
17398365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
17498365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @param listener The listener to register.
17598365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @param handler The handler on which the listener should be invoked, or null
17698365d7663cbd82979a5700faf0050220b01084dJeff Brown     * if the listener should be invoked on the calling thread's looper.
17798365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
17898365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @see #unregisterDisplayListener
17998365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
18098365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void registerDisplayListener(DisplayListener listener, Handler handler) {
181bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mGlobal.registerDisplayListener(listener, handler);
18298365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
18398365d7663cbd82979a5700faf0050220b01084dJeff Brown
18498365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
18598365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Unregisters an input device listener.
18698365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
18798365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @param listener The listener to unregister.
18898365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
18998365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @see #registerDisplayListener
19098365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
19198365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void unregisterDisplayListener(DisplayListener listener) {
192bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mGlobal.unregisterDisplayListener(listener);
19398365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
19498365d7663cbd82979a5700faf0050220b01084dJeff Brown
19598365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
196e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Initiates a fresh scan of availble Wifi displays.
197e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
198e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
199e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
200e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void scanWifiDisplays() {
201e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mGlobal.scanWifiDisplays();
202e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
203e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
204e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
205e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Connects to a Wifi display.
206e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
20789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
20889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Automatically remembers the display after a successful connection, if not
20989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * already remembered.
210bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * </p><p>
211bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY} to connect
212bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * to unknown displays.  No permissions are required to connect to already known displays.
21389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
214e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     *
215e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @param deviceAddress The MAC address of the device to which we should connect.
216e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
217e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
218e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void connectWifiDisplay(String deviceAddress) {
219e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mGlobal.connectWifiDisplay(deviceAddress);
220e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
221e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
222e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
223e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Disconnects from the current Wifi display.
224e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
225e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
226e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
227e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void disconnectWifiDisplay() {
228e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mGlobal.disconnectWifiDisplay();
229e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
230e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
231e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
23289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Renames a Wifi display.
23389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
23489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * The display must already be remembered for this call to succeed.  In other words,
23589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * we must already have successfully connected to the display at least once and then
23689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * not forgotten it.
237bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * </p><p>
238bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
23989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
24089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     *
24189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @param deviceAddress The MAC address of the device to rename.
24289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @param alias The alias name by which to remember the device, or null
24389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * or empty if no alias should be used.
24489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @hide
24589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
24689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public void renameWifiDisplay(String deviceAddress, String alias) {
24789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        mGlobal.renameWifiDisplay(deviceAddress, alias);
24889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    }
24989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
25089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /**
25189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Forgets a previously remembered Wifi display.
25289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
25389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Automatically disconnects from the display if currently connected to it.
254bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * </p><p>
255bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
25689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
25789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     *
25889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @param deviceAddress The MAC address of the device to forget.
25989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @hide
26089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
26189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public void forgetWifiDisplay(String deviceAddress) {
26289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        mGlobal.forgetWifiDisplay(deviceAddress);
26389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    }
26489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
26589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /**
266e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Gets the current Wifi display status.
267e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Watch for changes in the status by registering a broadcast receiver for
268e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED}.
269e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     *
270e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @return The current Wifi display status.
271e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
272e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
273e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public WifiDisplayStatus getWifiDisplayStatus() {
274e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return mGlobal.getWifiDisplayStatus();
275e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
276e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
277e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
27898365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Listens for changes in available display devices.
27998365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
28098365d7663cbd82979a5700faf0050220b01084dJeff Brown    public interface DisplayListener {
28198365d7663cbd82979a5700faf0050220b01084dJeff Brown        /**
28298365d7663cbd82979a5700faf0050220b01084dJeff Brown         * Called whenever a logical display has been added to the system.
283bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown         * Use {@link DisplayManager#getDisplay} to get more information about
284bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown         * the display.
28598365d7663cbd82979a5700faf0050220b01084dJeff Brown         *
28698365d7663cbd82979a5700faf0050220b01084dJeff Brown         * @param displayId The id of the logical display that was added.
28798365d7663cbd82979a5700faf0050220b01084dJeff Brown         */
28898365d7663cbd82979a5700faf0050220b01084dJeff Brown        void onDisplayAdded(int displayId);
28998365d7663cbd82979a5700faf0050220b01084dJeff Brown
29098365d7663cbd82979a5700faf0050220b01084dJeff Brown        /**
29198365d7663cbd82979a5700faf0050220b01084dJeff Brown         * Called whenever a logical display has been removed from the system.
29298365d7663cbd82979a5700faf0050220b01084dJeff Brown         *
29398365d7663cbd82979a5700faf0050220b01084dJeff Brown         * @param displayId The id of the logical display that was removed.
29498365d7663cbd82979a5700faf0050220b01084dJeff Brown         */
29598365d7663cbd82979a5700faf0050220b01084dJeff Brown        void onDisplayRemoved(int displayId);
29698365d7663cbd82979a5700faf0050220b01084dJeff Brown
29798365d7663cbd82979a5700faf0050220b01084dJeff Brown        /**
29898365d7663cbd82979a5700faf0050220b01084dJeff Brown         * Called whenever the properties of a logical display have changed.
29998365d7663cbd82979a5700faf0050220b01084dJeff Brown         *
30098365d7663cbd82979a5700faf0050220b01084dJeff Brown         * @param displayId The id of the logical display that changed.
30198365d7663cbd82979a5700faf0050220b01084dJeff Brown         */
30298365d7663cbd82979a5700faf0050220b01084dJeff Brown        void onDisplayChanged(int displayId);
30398365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
304fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
305