1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.hardware.display;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 import java.util.Arrays;
23 
24 /**
25  * Describes the current global state of Wifi display connectivity, including the
26  * currently connected display and all available or remembered displays.
27  * <p>
28  * This object is immutable.
29  * </p>
30  *
31  * @hide
32  */
33 public final class WifiDisplayStatus implements Parcelable {
34     private final int mFeatureState;
35     private final int mScanState;
36     private final int mActiveDisplayState;
37     private final WifiDisplay mActiveDisplay;
38     private final WifiDisplay[] mDisplays;
39 
40     /** Session info needed for Miracast Certification */
41     private final WifiDisplaySessionInfo mSessionInfo;
42 
43     /** Feature state: Wifi display is not available on this device. */
44     public static final int FEATURE_STATE_UNAVAILABLE = 0;
45     /** Feature state: Wifi display is disabled, probably because Wifi is disabled. */
46     public static final int FEATURE_STATE_DISABLED = 1;
47     /** Feature state: Wifi display is turned off in settings. */
48     public static final int FEATURE_STATE_OFF = 2;
49     /** Feature state: Wifi display is turned on in settings. */
50     public static final int FEATURE_STATE_ON = 3;
51 
52     /** Scan state: Not currently scanning. */
53     public static final int SCAN_STATE_NOT_SCANNING = 0;
54     /** Scan state: Currently scanning. */
55     public static final int SCAN_STATE_SCANNING = 1;
56 
57     /** Display state: Not connected. */
58     public static final int DISPLAY_STATE_NOT_CONNECTED = 0;
59     /** Display state: Connecting to active display. */
60     public static final int DISPLAY_STATE_CONNECTING = 1;
61     /** Display state: Connected to active display. */
62     public static final int DISPLAY_STATE_CONNECTED = 2;
63 
64     public static final Creator<WifiDisplayStatus> CREATOR = new Creator<WifiDisplayStatus>() {
65         public WifiDisplayStatus createFromParcel(Parcel in) {
66             int featureState = in.readInt();
67             int scanState = in.readInt();
68             int activeDisplayState= in.readInt();
69 
70             WifiDisplay activeDisplay = null;
71             if (in.readInt() != 0) {
72                 activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
73             }
74 
75             WifiDisplay[] displays = WifiDisplay.CREATOR.newArray(in.readInt());
76             for (int i = 0; i < displays.length; i++) {
77                 displays[i] = WifiDisplay.CREATOR.createFromParcel(in);
78             }
79 
80             WifiDisplaySessionInfo sessionInfo =
81                     WifiDisplaySessionInfo.CREATOR.createFromParcel(in);
82 
83             return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
84                     activeDisplay, displays, sessionInfo);
85         }
86 
87         public WifiDisplayStatus[] newArray(int size) {
88             return new WifiDisplayStatus[size];
89         }
90     };
91 
WifiDisplayStatus()92     public WifiDisplayStatus() {
93         this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
94                 null, WifiDisplay.EMPTY_ARRAY, null);
95     }
96 
WifiDisplayStatus(int featureState, int scanState, int activeDisplayState, WifiDisplay activeDisplay, WifiDisplay[] displays, WifiDisplaySessionInfo sessionInfo)97     public WifiDisplayStatus(int featureState, int scanState, int activeDisplayState,
98             WifiDisplay activeDisplay, WifiDisplay[] displays, WifiDisplaySessionInfo sessionInfo) {
99         if (displays == null) {
100             throw new IllegalArgumentException("displays must not be null");
101         }
102 
103         mFeatureState = featureState;
104         mScanState = scanState;
105         mActiveDisplayState = activeDisplayState;
106         mActiveDisplay = activeDisplay;
107         mDisplays = displays;
108 
109         mSessionInfo = (sessionInfo != null) ? sessionInfo : new WifiDisplaySessionInfo();
110     }
111 
112     /**
113      * Returns the state of the Wifi display feature on this device.
114      * <p>
115      * The value of this property reflects whether the device supports the Wifi display,
116      * whether it has been enabled by the user and whether the prerequisites for
117      * connecting to displays have been met.
118      * </p>
119      */
getFeatureState()120     public int getFeatureState() {
121         return mFeatureState;
122     }
123 
124     /**
125      * Returns the current state of the Wifi display scan.
126      *
127      * @return One of: {@link #SCAN_STATE_NOT_SCANNING} or {@link #SCAN_STATE_SCANNING}.
128      */
getScanState()129     public int getScanState() {
130         return mScanState;
131     }
132 
133     /**
134      * Get the state of the currently active display.
135      *
136      * @return One of: {@link #DISPLAY_STATE_NOT_CONNECTED}, {@link #DISPLAY_STATE_CONNECTING},
137      * or {@link #DISPLAY_STATE_CONNECTED}.
138      */
getActiveDisplayState()139     public int getActiveDisplayState() {
140         return mActiveDisplayState;
141     }
142 
143     /**
144      * Gets the Wifi display that is currently active.  It may be connecting or
145      * connected.
146      */
getActiveDisplay()147     public WifiDisplay getActiveDisplay() {
148         return mActiveDisplay;
149     }
150 
151     /**
152      * Gets the list of Wifi displays, returns a combined list of all available
153      * Wifi displays as reported by the most recent scan, and all remembered
154      * Wifi displays (not necessarily available at the time).
155      */
getDisplays()156     public WifiDisplay[] getDisplays() {
157         return mDisplays;
158     }
159 
160     /**
161      * Gets the Wifi display session info (required for certification only)
162      */
getSessionInfo()163     public WifiDisplaySessionInfo getSessionInfo() {
164         return mSessionInfo;
165     }
166 
167     @Override
writeToParcel(Parcel dest, int flags)168     public void writeToParcel(Parcel dest, int flags) {
169         dest.writeInt(mFeatureState);
170         dest.writeInt(mScanState);
171         dest.writeInt(mActiveDisplayState);
172 
173         if (mActiveDisplay != null) {
174             dest.writeInt(1);
175             mActiveDisplay.writeToParcel(dest, flags);
176         } else {
177             dest.writeInt(0);
178         }
179 
180         dest.writeInt(mDisplays.length);
181         for (WifiDisplay display : mDisplays) {
182             display.writeToParcel(dest, flags);
183         }
184 
185         mSessionInfo.writeToParcel(dest, flags);
186     }
187 
188     @Override
describeContents()189     public int describeContents() {
190         return 0;
191     }
192 
193     // For debugging purposes only.
194     @Override
toString()195     public String toString() {
196         return "WifiDisplayStatus{featureState=" + mFeatureState
197                 + ", scanState=" + mScanState
198                 + ", activeDisplayState=" + mActiveDisplayState
199                 + ", activeDisplay=" + mActiveDisplay
200                 + ", displays=" + Arrays.toString(mDisplays)
201                 + ", sessionInfo=" + mSessionInfo
202                 + "}";
203     }
204 }
205