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
19c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.annotation.NonNull;
20c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.annotation.Nullable;
21fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.Context;
22c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.MediaProjection;
2398365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.os.Handler;
24bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.util.SparseArray;
2598365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.Display;
26a506a6ec94863a35acca9feb165db76ddac3892cJeff Brownimport android.view.Surface;
2798365d7663cbd82979a5700faf0050220b01084dJeff Brown
2892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brownimport java.util.ArrayList;
2992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
31bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Manages the properties of attached displays.
32fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p>
33fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Get an instance of this class by calling
34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * {@link android.content.Context#getSystemService(java.lang.String)
35fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Context.getSystemService()} with the argument
36fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * {@link android.content.Context#DISPLAY_SERVICE}.
37fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p>
38fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
39fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class DisplayManager {
40fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private static final String TAG = "DisplayManager";
4198365d7663cbd82979a5700faf0050220b01084dJeff Brown    private static final boolean DEBUG = false;
4298365d7663cbd82979a5700faf0050220b01084dJeff Brown
43bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final Context mContext;
44bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final DisplayManagerGlobal mGlobal;
4598365d7663cbd82979a5700faf0050220b01084dJeff Brown
46bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final Object mLock = new Object();
47bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final SparseArray<Display> mDisplays = new SparseArray<Display>();
4898365d7663cbd82979a5700faf0050220b01084dJeff Brown
4992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    private final ArrayList<Display> mTempDisplays = new ArrayList<Display>();
5092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
51e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
52e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Broadcast receiver that indicates when the Wifi display status changes.
53e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * <p>
54e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The status is provided as a {@link WifiDisplayStatus} object in the
55e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * {@link #EXTRA_WIFI_DISPLAY_STATUS} extra.
56e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * </p><p>
57bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * This broadcast is only sent to registered receivers and can only be sent by the system.
58e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * </p>
59e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
60e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
61e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final String ACTION_WIFI_DISPLAY_STATUS_CHANGED =
62e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            "android.hardware.display.action.WIFI_DISPLAY_STATUS_CHANGED";
63e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
64e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
65e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Contains a {@link WifiDisplayStatus} object.
66e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
67e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
68e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final String EXTRA_WIFI_DISPLAY_STATUS =
69e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            "android.hardware.display.extra.WIFI_DISPLAY_STATUS";
70e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
7192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
7292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display category: Presentation displays.
7392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * <p>
7492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * This category can be used to identify secondary displays that are suitable for
757d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * use as presentation displays such as HDMI or Wireless displays.  Applications
767d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * may automatically project their content to presentation displays to provide
777d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * richer second screen experiences.
7892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * </p>
7992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     *
80511cd35fcc0b8ab048f284a6af374de8ccc69865Jeff Brown     * @see android.app.Presentation
817d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @see Display#FLAG_PRESENTATION
8292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @see #getDisplays(String)
8392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
8492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public static final String DISPLAY_CATEGORY_PRESENTATION =
8592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            "android.hardware.display.category.PRESENTATION";
8692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
877d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    /**
887d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Virtual display flag: Create a public display.
897d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
907d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <h3>Public virtual displays</h3>
917d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <p>
927d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * When this flag is set, the virtual display is public.
937d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p><p>
947d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * A public virtual display behaves just like most any other display that is connected
957d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * to the system such as an HDMI or Wireless display.  Applications can open
967d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * windows on the display and the system may mirror the contents of other displays
977d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * onto it.
987d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p><p>
996720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * Creating a public virtual display that isn't restricted to own-content only implicitly
1006720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * creates an auto-mirroring display. See {@link #VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR} for
1016720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * restrictions on who is allowed to create an auto-mirroring display.
1027d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p>
1037d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
1047d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <h3>Private virtual displays</h3>
1057d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <p>
1067d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * When this flag is not set, the virtual display is private as defined by the
1077d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * {@link Display#FLAG_PRIVATE} display flag.
1087d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p>
1096720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     *
1106720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * <p>
1117d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * A private virtual display belongs to the application that created it.
1127d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Only the a owner of a private virtual display is allowed to place windows upon it.
1137d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * The private virtual display also does not participate in display mirroring: it will
1147d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * neither receive mirrored content from another display nor allow its own content to
1157d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * be mirrored elsewhere.  More precisely, the only processes that are allowed to
1167d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * enumerate or interact with the private display are those that have the same UID as the
1177d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * application that originally created the private virtual display.
1186720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * </p>
1197d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
1207d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @see #createVirtualDisplay
121d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * @see #VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
1226720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * @see #VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR
1237d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     */
1247d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    public static final int VIRTUAL_DISPLAY_FLAG_PUBLIC = 1 << 0;
1257d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown
1267d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    /**
1277d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Virtual display flag: Create a presentation display.
1287d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
1297d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <h3>Presentation virtual displays</h3>
1307d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <p>
1317d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * When this flag is set, the virtual display is registered as a presentation
1327d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * display in the {@link #DISPLAY_CATEGORY_PRESENTATION presentation display category}.
1337d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Applications may automatically project their content to presentation displays
1347d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * to provide richer second screen experiences.
1357d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p>
1367d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
1377d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <h3>Non-presentation virtual displays</h3>
1387d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <p>
1397d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * When this flag is not set, the virtual display is not registered as a presentation
1407d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * display.  Applications can still project their content on the display but they
1417d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * will typically not do so automatically.  This option is appropriate for
1427d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * more special-purpose displays.
1437d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p>
1447d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
145511cd35fcc0b8ab048f284a6af374de8ccc69865Jeff Brown     * @see android.app.Presentation
1467d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @see #createVirtualDisplay
1477d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @see #DISPLAY_CATEGORY_PRESENTATION
1487d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @see Display#FLAG_PRESENTATION
1497d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     */
1507d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    public static final int VIRTUAL_DISPLAY_FLAG_PRESENTATION = 1 << 1;
1517d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown
1527d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    /**
1537d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Virtual display flag: Create a secure display.
1547d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
1557d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <h3>Secure virtual displays</h3>
1567d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <p>
1577d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * When this flag is set, the virtual display is considered secure as defined
1587d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * by the {@link Display#FLAG_SECURE} display flag.  The caller promises to take
1597d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * reasonable measures, such as over-the-air encryption, to prevent the contents
1607d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * of the display from being intercepted or recorded on a persistent medium.
1617d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p><p>
1627d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Creating a secure virtual display requires the
1637d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * {@link android.Manifest.permission#CAPTURE_SECURE_VIDEO_OUTPUT} permission.
1647d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * This permission is reserved for use by system components and is not available to
1657d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * third-party applications.
1667d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p>
1677d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
1687d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <h3>Non-secure virtual displays</h3>
1697d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * <p>
1707d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * When this flag is not set, the virtual display is considered unsecure.
1717d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * The content of secure windows will be blanked if shown on this display.
1727d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p>
1737d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
174511cd35fcc0b8ab048f284a6af374de8ccc69865Jeff Brown     * @see Display#FLAG_SECURE
1757d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @see #createVirtualDisplay
1767d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     */
1777d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    public static final int VIRTUAL_DISPLAY_FLAG_SECURE = 1 << 2;
1787d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown
179d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown    /**
180d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * Virtual display flag: Only show this display's own content; do not mirror
181d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * the content of another display.
182d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     *
183d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * <p>
184d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * This flag is used in conjunction with {@link #VIRTUAL_DISPLAY_FLAG_PUBLIC}.
185d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * Ordinarily public virtual displays will automatically mirror the content of the
186d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * default display if they have no windows of their own.  When this flag is
187d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * specified, the virtual display will only ever show its own content and
188d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * will be blanked instead if it has no windows.
189d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * </p>
190d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     *
1916720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * <p>
1926720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * This flag is mutually exclusive with {@link #VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR}.  If both
1936720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * flags are specified then the own-content only behavior will be applied.
1946720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * </p>
1956720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     *
1966720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * <p>
1976720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * This behavior of this flag is implied whenever neither {@link #VIRTUAL_DISPLAY_FLAG_PUBLIC}
1986720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * nor {@link #VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR} have been set.  This flag is only required to
1996720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * override the default behavior when creating a public display.
2006720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * </p>
2016720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     *
202d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * @see #createVirtualDisplay
203d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     */
204d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown    public static final int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 1 << 3;
205d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown
206c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
207c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    /**
2086720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * Virtual display flag: Allows content to be mirrored on private displays when no content is
2096720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * being shown.
2106720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     *
2116720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * <p>
2126720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * This flag is mutually exclusive with {@link #VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY}.
2136720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * If both flags are specified then the own-content only behavior will be applied.
2146720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * </p>
215c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     *
2169469cdde2ce55051b18fdbd6bf80bc710517c358Michael Wright     * <p>
2176720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * The behavior of this flag is implied whenever {@link #VIRTUAL_DISPLAY_FLAG_PUBLIC} is set
2186720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * and {@link #VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY} has not been set.   This flag is only
2196720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * required to override the default behavior when creating a private display.
2209469cdde2ce55051b18fdbd6bf80bc710517c358Michael Wright     * </p>
221c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     *
2229469cdde2ce55051b18fdbd6bf80bc710517c358Michael Wright     * <p>
2236720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * Creating an auto-mirroing virtual display requires the
2246720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * {@link android.Manifest.permission#CAPTURE_VIDEO_OUTPUT}
2256720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * or {@link android.Manifest.permission#CAPTURE_SECURE_VIDEO_OUTPUT} permission.
2266720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * These permissions are reserved for use by system components and are not available to
2276720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * third-party applications.
2286720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     *
2296720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * Alternatively, an appropriate {@link MediaProjection} may be used to create an
2306720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * auto-mirroring virtual display.
2319469cdde2ce55051b18fdbd6bf80bc710517c358Michael Wright     * </p>
232c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     *
233c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     * @see #createVirtualDisplay
234c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     */
2356720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright    public static final int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 1 << 4;
236c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
237bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /** @hide */
238bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayManager(Context context) {
239bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mContext = context;
240bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mGlobal = DisplayManagerGlobal.getInstance();
241fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
242fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
243fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
244bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Gets information about a logical display.
245848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
246bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * The display metrics may be adjusted to provide compatibility
247bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * for legacy applications.
248848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
249bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @param displayId The logical display id.
250bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @return The display object, or null if there is no valid display with the given id.
251fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
252bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public Display getDisplay(int displayId) {
253bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
254bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            return getOrCreateDisplayLocked(displayId, false /*assumeValid*/);
255fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
256fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
257fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
258fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
259bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Gets all currently valid logical displays.
260fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     *
261bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @return An array containing all displays.
262fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
263bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public Display[] getDisplays() {
26492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        return getDisplays(null);
26592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    }
26692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
26792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
26892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Gets all currently valid logical displays of the specified category.
26992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * <p>
27092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * When there are multiple displays in a category the returned displays are sorted
27192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * of preference.  For example, if the requested category is
27292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * {@link #DISPLAY_CATEGORY_PRESENTATION} and there are multiple presentation displays
27392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * then the displays are sorted so that the first display in the returned array
27492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * is the most preferred presentation display.  The application may simply
27592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * use the first display or allow the user to choose.
27692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * </p>
27792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     *
27892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @param category The requested display category or null to return all displays.
27992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @return An array containing all displays sorted by order of preference.
28092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     *
28192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * @see #DISPLAY_CATEGORY_PRESENTATION
28292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
28392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public Display[] getDisplays(String category) {
28492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        final int[] displayIds = mGlobal.getDisplayIds();
285bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
28692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            try {
28792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                if (category == null) {
2887d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    addAllDisplaysLocked(mTempDisplays, displayIds);
28992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                } else if (category.equals(DISPLAY_CATEGORY_PRESENTATION)) {
2907d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_WIFI);
2917d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_HDMI);
2927d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_OVERLAY);
2937d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_VIRTUAL);
294bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
29592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                return mTempDisplays.toArray(new Display[mTempDisplays.size()]);
29692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            } finally {
29792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                mTempDisplays.clear();
298bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
29992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        }
30092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    }
30192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
3027d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    private void addAllDisplaysLocked(ArrayList<Display> displays, int[] displayIds) {
3037d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        for (int i = 0; i < displayIds.length; i++) {
3047d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            Display display = getOrCreateDisplayLocked(displayIds[i], true /*assumeValid*/);
3057d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            if (display != null) {
3067d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                displays.add(display);
3077d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            }
3087d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        }
3097d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    }
3107d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown
3117d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    private void addPresentationDisplaysLocked(
31292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            ArrayList<Display> displays, int[] displayIds, int matchType) {
31392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        for (int i = 0; i < displayIds.length; i++) {
31492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            Display display = getOrCreateDisplayLocked(displayIds[i], true /*assumeValid*/);
31592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown            if (display != null
3167d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    && (display.getFlags() & Display.FLAG_PRESENTATION) != 0
3177d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown                    && display.getType() == matchType) {
31892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                displays.add(display);
319bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
320fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
321fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
32298365d7663cbd82979a5700faf0050220b01084dJeff Brown
323bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
324bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        Display display = mDisplays.get(displayId);
325bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if (display == null) {
326bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            display = mGlobal.getCompatibleDisplay(displayId,
32748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                    mContext.getDisplayAdjustments(displayId));
328bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (display != null) {
329bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                mDisplays.put(displayId, display);
330bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
331bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        } else if (!assumeValid && !display.isValid()) {
332bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            display = null;
33398365d7663cbd82979a5700faf0050220b01084dJeff Brown        }
334bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return display;
335bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
33698365d7663cbd82979a5700faf0050220b01084dJeff Brown
33798365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
33898365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Registers an display listener to receive notifications about when
33998365d7663cbd82979a5700faf0050220b01084dJeff Brown     * displays are added, removed or changed.
34098365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
34198365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @param listener The listener to register.
34298365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @param handler The handler on which the listener should be invoked, or null
34398365d7663cbd82979a5700faf0050220b01084dJeff Brown     * if the listener should be invoked on the calling thread's looper.
34498365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
34598365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @see #unregisterDisplayListener
34698365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
34798365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void registerDisplayListener(DisplayListener listener, Handler handler) {
348bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mGlobal.registerDisplayListener(listener, handler);
34998365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
35098365d7663cbd82979a5700faf0050220b01084dJeff Brown
35198365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
352c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     * Unregisters a display listener.
35398365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
35498365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @param listener The listener to unregister.
35598365d7663cbd82979a5700faf0050220b01084dJeff Brown     *
35698365d7663cbd82979a5700faf0050220b01084dJeff Brown     * @see #registerDisplayListener
35798365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
35898365d7663cbd82979a5700faf0050220b01084dJeff Brown    public void unregisterDisplayListener(DisplayListener listener) {
359bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mGlobal.unregisterDisplayListener(listener);
36098365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
36198365d7663cbd82979a5700faf0050220b01084dJeff Brown
36298365d7663cbd82979a5700faf0050220b01084dJeff Brown    /**
363ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * Starts scanning for available Wifi displays.
364e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
365af574183c274f51d04487a9c8355e9f34a1150f2Jeff Brown     * <p>
366ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * Calls to this method nest and must be matched by an equal number of calls to
367ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * {@link #stopWifiDisplayScan()}.
368ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * </p><p>
369ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
370ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * </p>
371ce468a35b388ca46578934706b38dbae94941643Jeff Brown     *
372ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * @hide
373ce468a35b388ca46578934706b38dbae94941643Jeff Brown     */
374ce468a35b388ca46578934706b38dbae94941643Jeff Brown    public void startWifiDisplayScan() {
375ce468a35b388ca46578934706b38dbae94941643Jeff Brown        mGlobal.startWifiDisplayScan();
376ce468a35b388ca46578934706b38dbae94941643Jeff Brown    }
377ce468a35b388ca46578934706b38dbae94941643Jeff Brown
378ce468a35b388ca46578934706b38dbae94941643Jeff Brown    /**
379ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * Stops scanning for available Wifi displays.
380ce468a35b388ca46578934706b38dbae94941643Jeff Brown     * <p>
381af574183c274f51d04487a9c8355e9f34a1150f2Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
382af574183c274f51d04487a9c8355e9f34a1150f2Jeff Brown     * </p>
383af574183c274f51d04487a9c8355e9f34a1150f2Jeff Brown     *
384e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
385e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
386ce468a35b388ca46578934706b38dbae94941643Jeff Brown    public void stopWifiDisplayScan() {
387ce468a35b388ca46578934706b38dbae94941643Jeff Brown        mGlobal.stopWifiDisplayScan();
388e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
389e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
390e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
391e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Connects to a Wifi display.
392e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
39389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
39489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Automatically remembers the display after a successful connection, if not
39589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * already remembered.
396bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * </p><p>
397af574183c274f51d04487a9c8355e9f34a1150f2Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
39889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
399e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     *
400e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @param deviceAddress The MAC address of the device to which we should connect.
401e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
402e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
403e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void connectWifiDisplay(String deviceAddress) {
404e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mGlobal.connectWifiDisplay(deviceAddress);
405e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
406e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
4071f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    /** @hide */
4081f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    public void pauseWifiDisplay() {
4091f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang        mGlobal.pauseWifiDisplay();
4101f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    }
4111f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
4121f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    /** @hide */
4131f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    public void resumeWifiDisplay() {
4141f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang        mGlobal.resumeWifiDisplay();
4151f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    }
4161f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
417e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
418e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Disconnects from the current Wifi display.
419e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
420e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
421e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
422e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void disconnectWifiDisplay() {
423e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mGlobal.disconnectWifiDisplay();
424e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
425e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
426e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
42789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Renames a Wifi display.
42889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
42989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * The display must already be remembered for this call to succeed.  In other words,
43089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * we must already have successfully connected to the display at least once and then
43189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * not forgotten it.
432bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * </p><p>
433bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
43489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
43589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     *
43689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @param deviceAddress The MAC address of the device to rename.
43789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @param alias The alias name by which to remember the device, or null
43889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * or empty if no alias should be used.
43989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @hide
44089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
44189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public void renameWifiDisplay(String deviceAddress, String alias) {
44289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        mGlobal.renameWifiDisplay(deviceAddress, alias);
44389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    }
44489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
44589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /**
44689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Forgets a previously remembered Wifi display.
44789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
44889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Automatically disconnects from the display if currently connected to it.
449bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * </p><p>
450bc335457462a12434a9df6955de1dd693cdccac7Jeff Brown     * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}.
45189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
45289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     *
45389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @param deviceAddress The MAC address of the device to forget.
45489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * @hide
45589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
45689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public void forgetWifiDisplay(String deviceAddress) {
45789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        mGlobal.forgetWifiDisplay(deviceAddress);
45889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    }
45989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
46089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /**
461e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Gets the current Wifi display status.
462e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Watch for changes in the status by registering a broadcast receiver for
463e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED}.
464e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     *
465e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @return The current Wifi display status.
466e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * @hide
467e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
468e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public WifiDisplayStatus getWifiDisplayStatus() {
469e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return mGlobal.getWifiDisplayStatus();
470e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
471e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
472e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
4737d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Creates a virtual display.
474c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     *
47575ee9fcde4d9e1be3883eba6c8d193db4375b052Michael Wright     * @see #createVirtualDisplay(String, int, int, int, Surface, int, VirtualDisplay.Callback)
476c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     */
477c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public VirtualDisplay createVirtualDisplay(@NonNull String name,
478c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            int width, int height, int densityDpi, @Nullable Surface surface, int flags) {
479c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        return createVirtualDisplay(name, width, height, densityDpi, surface, flags, null, null);
480c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
481c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
482c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    /**
483c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     * Creates a virtual display.
484a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
485a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The content of a virtual display is rendered to a {@link Surface} provided
4867d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * by the application.
487a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p><p>
4887d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * The virtual display should be {@link VirtualDisplay#release released}
4897d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * when no longer needed.  Because a virtual display renders to a surface
490a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * provided by the application, it will be released automatically when the
491a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * process terminates and all remaining windows on it will be forcibly removed.
4927d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * </p><p>
4937d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * The behavior of the virtual display depends on the flags that are provided
4947d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * to this method.  By default, virtual displays are created to be private,
4957d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * non-presentation and unsecure.  Permissions may be required to use certain flags.
49692207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * </p><p>
49792207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * As of {@link android.os.Build.VERSION_CODES#KITKAT_WATCH}, the surface may
49892207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * be attached or detached dynamically using {@link VirtualDisplay#setSurface}.
49992207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * Previously, the surface had to be non-null when {@link #createVirtualDisplay}
50092207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * was called and could not be changed for the lifetime of the display.
50192207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * </p><p>
50292207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * Detaching the surface that backs a virtual display has a similar effect to
50392207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * turning off the screen.
504a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
505a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     *
506a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * @param name The name of the virtual display, must be non-empty.
507a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * @param width The width of the virtual display in pixels, must be greater than 0.
508a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * @param height The height of the virtual display in pixels, must be greater than 0.
509a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * @param densityDpi The density of the virtual display in dpi, must be greater than 0.
510a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * @param surface The surface to which the content of the virtual display should
51192207df753c27b094e9e0ca80d41bc0d54dc6bd5Jeff Brown     * be rendered, or null if there is none initially.
5127d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @param flags A combination of virtual display flags:
513d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * {@link #VIRTUAL_DISPLAY_FLAG_PUBLIC}, {@link #VIRTUAL_DISPLAY_FLAG_PRESENTATION},
514c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright     * {@link #VIRTUAL_DISPLAY_FLAG_SECURE}, {@link #VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY},
5156720be4e8c65e90d4453ddad5cef192bc3820038Michael Wright     * or {@link #VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR}.
51675ee9fcde4d9e1be3883eba6c8d193db4375b052Michael Wright     * @param callback Callback to call when the state of the {@link VirtualDisplay} changes
5175438e4e173c756a24061da38bfe9142765c56f9dMichael Wright     * @param handler The handler on which the listener should be invoked, or null
5185438e4e173c756a24061da38bfe9142765c56f9dMichael Wright     * if the listener should be invoked on the calling thread's looper.
519a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * @return The newly created virtual display, or null if the application could
520a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * not create the virtual display.
5217d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     *
5227d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * @throws SecurityException if the caller does not have permission to create
5237d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * a virtual display with the specified flags.
524a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
525c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public VirtualDisplay createVirtualDisplay(@NonNull String name,
526c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            int width, int height, int densityDpi, @Nullable Surface surface, int flags,
52775ee9fcde4d9e1be3883eba6c8d193db4375b052Michael Wright            @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) {
528c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        return createVirtualDisplay(null,
52975ee9fcde4d9e1be3883eba6c8d193db4375b052Michael Wright                name, width, height, densityDpi, surface, flags, callback, handler);
530c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
531c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
532c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    /** @hide */
533c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public VirtualDisplay createVirtualDisplay(@Nullable MediaProjection projection,
534c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            @NonNull String name, int width, int height, int densityDpi, @Nullable Surface surface,
53575ee9fcde4d9e1be3883eba6c8d193db4375b052Michael Wright            int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) {
536c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        return mGlobal.createVirtualDisplay(mContext, projection,
53775ee9fcde4d9e1be3883eba6c8d193db4375b052Michael Wright                name, width, height, densityDpi, surface, flags, callback, handler);
538a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    }
539a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
540a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
54198365d7663cbd82979a5700faf0050220b01084dJeff Brown     * Listens for changes in available display devices.
54298365d7663cbd82979a5700faf0050220b01084dJeff Brown     */
54398365d7663cbd82979a5700faf0050220b01084dJeff Brown    public interface DisplayListener {
54498365d7663cbd82979a5700faf0050220b01084dJeff Brown        /**
54598365d7663cbd82979a5700faf0050220b01084dJeff Brown         * Called whenever a logical display has been added to the system.
546bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown         * Use {@link DisplayManager#getDisplay} to get more information about
547bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown         * the display.
54898365d7663cbd82979a5700faf0050220b01084dJeff Brown         *
54998365d7663cbd82979a5700faf0050220b01084dJeff Brown         * @param displayId The id of the logical display that was added.
55098365d7663cbd82979a5700faf0050220b01084dJeff Brown         */
55198365d7663cbd82979a5700faf0050220b01084dJeff Brown        void onDisplayAdded(int displayId);
55298365d7663cbd82979a5700faf0050220b01084dJeff Brown
55398365d7663cbd82979a5700faf0050220b01084dJeff Brown        /**
55498365d7663cbd82979a5700faf0050220b01084dJeff Brown         * Called whenever a logical display has been removed from the system.
55598365d7663cbd82979a5700faf0050220b01084dJeff Brown         *
55698365d7663cbd82979a5700faf0050220b01084dJeff Brown         * @param displayId The id of the logical display that was removed.
55798365d7663cbd82979a5700faf0050220b01084dJeff Brown         */
55898365d7663cbd82979a5700faf0050220b01084dJeff Brown        void onDisplayRemoved(int displayId);
55998365d7663cbd82979a5700faf0050220b01084dJeff Brown
56098365d7663cbd82979a5700faf0050220b01084dJeff Brown        /**
56198365d7663cbd82979a5700faf0050220b01084dJeff Brown         * Called whenever the properties of a logical display have changed.
56298365d7663cbd82979a5700faf0050220b01084dJeff Brown         *
56398365d7663cbd82979a5700faf0050220b01084dJeff Brown         * @param displayId The id of the logical display that changed.
56498365d7663cbd82979a5700faf0050220b01084dJeff Brown         */
56598365d7663cbd82979a5700faf0050220b01084dJeff Brown        void onDisplayChanged(int displayId);
56698365d7663cbd82979a5700faf0050220b01084dJeff Brown    }
567fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
568