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
2289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brownimport libcore.util.Objects;
2389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
24e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown/**
25e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * Describes the properties of a Wifi display.
26e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * <p>
27e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * This object is immutable.
28e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * </p>
29e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown *
30e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown * @hide
31e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown */
32e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brownpublic final class WifiDisplay implements Parcelable {
33e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    private final String mDeviceAddress;
34e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    private final String mDeviceName;
3589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    private final String mDeviceAlias;
36ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    private final boolean mIsAvailable;
3721f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang    private final boolean mCanConnect;
38ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    private final boolean mIsRemembered;
39e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
40e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final WifiDisplay[] EMPTY_ARRAY = new WifiDisplay[0];
41e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
42e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public static final Creator<WifiDisplay> CREATOR = new Creator<WifiDisplay>() {
43e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        public WifiDisplay createFromParcel(Parcel in) {
44e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            String deviceAddress = in.readString();
45e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            String deviceName = in.readString();
4689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown            String deviceAlias = in.readString();
47ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            boolean isAvailable = (in.readInt() != 0);
4821f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang            boolean canConnect = (in.readInt() != 0);
49ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            boolean isRemembered = (in.readInt() != 0);
50ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            return new WifiDisplay(deviceAddress, deviceName, deviceAlias,
51ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang                    isAvailable, canConnect, isRemembered);
52e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
53e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
54e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        public WifiDisplay[] newArray(int size) {
55e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            return size == 0 ? EMPTY_ARRAY : new WifiDisplay[size];
56e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
57e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    };
58e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
59ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias,
60ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang            boolean available, boolean canConnect, boolean remembered) {
61e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        if (deviceAddress == null) {
62e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            throw new IllegalArgumentException("deviceAddress must not be null");
63e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
64e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        if (deviceName == null) {
65e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown            throw new IllegalArgumentException("deviceName must not be null");
66e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        }
67e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
68e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mDeviceAddress = deviceAddress;
69e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        mDeviceName = deviceName;
7089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        mDeviceAlias = deviceAlias;
71ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        mIsAvailable = available;
7221f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang        mCanConnect = canConnect;
73ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        mIsRemembered = remembered;
74e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
75e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
76e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
77e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Gets the MAC address of the Wifi display device.
78e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
79e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public String getDeviceAddress() {
80e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return mDeviceAddress;
81e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
82e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
83e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    /**
84e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     * Gets the name of the Wifi display device.
85e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown     */
86e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public String getDeviceName() {
87e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return mDeviceName;
88e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
89e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
9089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /**
9189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Gets the user-specified alias of the Wifi display device, or null if none.
9289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * <p>
9389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * The alias should be used in the UI whenever available.  It is the value
9489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * provided by the user when renaming the device.
9589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * </p>
9689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
9789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public String getDeviceAlias() {
9889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        return mDeviceAlias;
9989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    }
10089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
10189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    /**
102ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * Returns true if device is available, false otherwise.
103ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     */
104ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    public boolean isAvailable() {
105ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        return mIsAvailable;
106ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    }
107ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang
108ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    /**
109ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * Returns true if device can be connected to (not in use), false otherwise.
11021f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang     */
11121f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang    public boolean canConnect() {
11221f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang        return mCanConnect;
11321f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang    }
11421f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang
11521f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang    /**
116ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * Returns true if device has been remembered, false otherwise.
117ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     */
118ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    public boolean isRemembered() {
119ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        return mIsRemembered;
120ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    }
121ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang
122ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    /**
12389d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Gets the name to show in the UI.
12489d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     * Uses the device alias if available, otherwise uses the device name.
12589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown     */
12689d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    public String getFriendlyDisplayName() {
12789d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        return mDeviceAlias != null ? mDeviceAlias : mDeviceName;
12889d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown    }
12989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown
130e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
131e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public boolean equals(Object o) {
132e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return o instanceof WifiDisplay && equals((WifiDisplay)o);
133e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
134e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
135ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang    /**
136ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * Returns true if the two displays have the same identity (address, name and alias).
137ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     * This method does not compare the current status of the displays.
138ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang     */
139e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public boolean equals(WifiDisplay other) {
140e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return other != null
141e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown                && mDeviceAddress.equals(other.mDeviceAddress)
14289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown                && mDeviceName.equals(other.mDeviceName)
143ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang                && Objects.equal(mDeviceAlias, other.mDeviceAlias);
144e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
145e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
14674da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown    /**
14774da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown     * Returns true if the other display is not null and has the same address as this one.
14874da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown     * Can be used to perform identity comparisons on displays ignoring properties
14974da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown     * that might change during a connection such as the name or alias.
15074da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown     */
15174da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown    public boolean hasSameAddress(WifiDisplay other) {
15274da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown        return other != null && mDeviceAddress.equals(other.mDeviceAddress);
15374da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown    }
15474da109102864f19b3dcdb30cd1d92c46fb12f2fJeff Brown
155e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
156e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public int hashCode() {
157e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        // The address on its own should be sufficiently unique for hashing purposes.
158e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return mDeviceAddress.hashCode();
159e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
160e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
161e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
162e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
163e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        dest.writeString(mDeviceAddress);
164e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        dest.writeString(mDeviceName);
16589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        dest.writeString(mDeviceAlias);
166ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        dest.writeInt(mIsAvailable ? 1 : 0);
16721f603996ed83c7a9a6c430582e8a5af5ac13c6cChong Zhang        dest.writeInt(mCanConnect ? 1 : 0);
168ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        dest.writeInt(mIsRemembered ? 1 : 0);
169e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
170e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
171e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
172e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public int describeContents() {
173e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown        return 0;
174e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
175e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown
176e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    // For debugging purposes only.
177e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    @Override
178e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    public String toString() {
17989d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        String result = mDeviceName + " (" + mDeviceAddress + ")";
18089d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        if (mDeviceAlias != null) {
18189d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown            result += ", alias " + mDeviceAlias;
18289d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        }
183ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang        result += ", isAvailable " + mIsAvailable + ", canConnect " + mCanConnect
184ab87a63997a7dc771acfd0dcd7efda990dc3d5feChong Zhang                + ", isRemembered " + mIsRemembered;
18589d5546d7fd3a3bb19820c42e8b4527013dd6545Jeff Brown        return result;
186e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown    }
187e08ae388d63c4db8f9d9a7ecd634f9a51f6e91b9Jeff Brown}
188