1e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown/*
2e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * Copyright (C) 2012 The Android Open Source Project
3e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown *
4e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * you may not use this file except in compliance with the License.
6e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * You may obtain a copy of the License at
7e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown *
8e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown *
10e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * Unless required by applicable law or agreed to in writing, software
11e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * See the License for the specific language governing permissions and
14e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * limitations under the License.
15e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown */
16e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
17e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brownpackage android.hardware.display;
18e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
19e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brownimport android.os.Parcel;
20e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brownimport android.os.Parcelable;
21e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
22e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brownimport java.util.Arrays;
23e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
24e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown/**
25e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * Describes the current global state of Wifi display connectivity, including the
2689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown * currently connected display and all available or remembered displays.
27e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * <p>
28e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * This object is immutable.
29e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * </p>
30e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown *
31e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * @hide
32e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown */
33e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brownpublic final class WifiDisplayStatus implements Parcelable {
3489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    private final int mFeatureState;
35180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    private final int mScanState;
36180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    private final int mActiveDisplayState;
37180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    private final WifiDisplay mActiveDisplay;
38ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    private final WifiDisplay[] mDisplays;
3989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
401f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    /** Session info needed for Miracast Certification */
411f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    private final WifiDisplaySessionInfo mSessionInfo;
421f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
4389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Feature state: Wifi display is not available on this device. */
4489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public static final int FEATURE_STATE_UNAVAILABLE = 0;
4589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Feature state: Wifi display is disabled, probably because Wifi is disabled. */
4689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public static final int FEATURE_STATE_DISABLED = 1;
4789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Feature state: Wifi display is turned off in settings. */
4889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public static final int FEATURE_STATE_OFF = 2;
4989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Feature state: Wifi display is turned on in settings. */
5089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public static final int FEATURE_STATE_ON = 3;
5189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
5289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Scan state: Not currently scanning. */
53180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public static final int SCAN_STATE_NOT_SCANNING = 0;
5489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Scan state: Currently scanning. */
55180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public static final int SCAN_STATE_SCANNING = 1;
56180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown
5789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Display state: Not connected. */
58180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public static final int DISPLAY_STATE_NOT_CONNECTED = 0;
5989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Display state: Connecting to active display. */
60180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public static final int DISPLAY_STATE_CONNECTING = 1;
6189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /** Display state: Connected to active display. */
62180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public static final int DISPLAY_STATE_CONNECTED = 2;
63e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
64e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final Creator<WifiDisplayStatus> CREATOR = new Creator<WifiDisplayStatus>() {
65e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        public WifiDisplayStatus createFromParcel(Parcel in) {
6689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown            int featureState = in.readInt();
67180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown            int scanState = in.readInt();
68180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown            int activeDisplayState= in.readInt();
69e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
70180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown            WifiDisplay activeDisplay = null;
71e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            if (in.readInt() != 0) {
72180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown                activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
73e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            }
74e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
75ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            WifiDisplay[] displays = WifiDisplay.CREATOR.newArray(in.readInt());
76ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            for (int i = 0; i < displays.length; i++) {
77ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang                displays[i] = WifiDisplay.CREATOR.createFromParcel(in);
78e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            }
79e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
801f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang            WifiDisplaySessionInfo sessionInfo =
811f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang                    WifiDisplaySessionInfo.CREATOR.createFromParcel(in);
821f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
8389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown            return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
841f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang                    activeDisplay, displays, sessionInfo);
85e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
86e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
87e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        public WifiDisplayStatus[] newArray(int size) {
88e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            return new WifiDisplayStatus[size];
89e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
90e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    };
91e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
92e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public WifiDisplayStatus() {
9389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
941f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang                null, WifiDisplay.EMPTY_ARRAY, null);
95e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
96e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
971f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    public WifiDisplayStatus(int featureState, int scanState, int activeDisplayState,
981f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang            WifiDisplay activeDisplay, WifiDisplay[] displays, WifiDisplaySessionInfo sessionInfo) {
99ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        if (displays == null) {
100ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            throw new IllegalArgumentException("displays must not be null");
101e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
102e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
10389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        mFeatureState = featureState;
104180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        mScanState = scanState;
105180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        mActiveDisplayState = activeDisplayState;
106180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        mActiveDisplay = activeDisplay;
107ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        mDisplays = displays;
1081f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
1091f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang        mSessionInfo = (sessionInfo != null) ? sessionInfo : new WifiDisplaySessionInfo();
110e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
111e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
112e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
11389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Returns the state of the Wifi display feature on this device.
114e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * <p>
11589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * The value of this property reflects whether the device supports the Wifi display,
11689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * whether it has been enabled by the user and whether the prerequisites for
11789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * connecting to displays have been met.
118e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * </p>
119e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
12089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public int getFeatureState() {
12189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        return mFeatureState;
122e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
123e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
124e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
125180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * Returns the current state of the Wifi display scan.
126180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     *
127180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * @return One of: {@link #SCAN_STATE_NOT_SCANNING} or {@link #SCAN_STATE_SCANNING}.
128e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
129180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public int getScanState() {
130180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        return mScanState;
131e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
132e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
133e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
134180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * Get the state of the currently active display.
135180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     *
136180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * @return One of: {@link #DISPLAY_STATE_NOT_CONNECTED}, {@link #DISPLAY_STATE_CONNECTING},
137180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * or {@link #DISPLAY_STATE_CONNECTED}.
138e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
139180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public int getActiveDisplayState() {
140180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        return mActiveDisplayState;
141e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
142e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
143e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
144180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * Gets the Wifi display that is currently active.  It may be connecting or
145180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown     * connected.
146e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
147180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown    public WifiDisplay getActiveDisplay() {
148180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        return mActiveDisplay;
149e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
150e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
151e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
152ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * Gets the list of Wifi displays, returns a combined list of all available
1531f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang     * Wifi displays as reported by the most recent scan, and all remembered
154ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * Wifi displays (not necessarily available at the time).
15589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
156ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    public WifiDisplay[] getDisplays() {
157ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        return mDisplays;
158e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
159e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
1601f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    /**
1611f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang     * Gets the Wifi display session info (required for certification only)
1621f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang     */
1631f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    public WifiDisplaySessionInfo getSessionInfo() {
1641f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang        return mSessionInfo;
1651f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang    }
1661f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
167e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
168e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
16989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        dest.writeInt(mFeatureState);
170180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        dest.writeInt(mScanState);
171180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        dest.writeInt(mActiveDisplayState);
172e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
173180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown        if (mActiveDisplay != null) {
174e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            dest.writeInt(1);
175180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown            mActiveDisplay.writeToParcel(dest, flags);
176e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        } else {
177e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            dest.writeInt(0);
178e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
179e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
180ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        dest.writeInt(mDisplays.length);
181ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        for (WifiDisplay display : mDisplays) {
182e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            display.writeToParcel(dest, flags);
183e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
1841f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang
1851f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang        mSessionInfo.writeToParcel(dest, flags);
186e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
187e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
188e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
189e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public int describeContents() {
190e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return 0;
191e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
192e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
193e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    // For debugging purposes only.
194e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
195e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public String toString() {
19689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        return "WifiDisplayStatus{featureState=" + mFeatureState
197180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown                + ", scanState=" + mScanState
198180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown                + ", activeDisplayState=" + mActiveDisplayState
199180bbc71810496e280e9993177bfeddb3ad1f558Jeff Brown                + ", activeDisplay=" + mActiveDisplay
200ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang                + ", displays=" + Arrays.toString(mDisplays)
2011f3ecaae6303d5ee6c5ca8499262c9962f036365Chong Zhang                + ", sessionInfo=" + mSessionInfo
202e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown                + "}";
203e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
204e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown}
205