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