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