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