content: /*
   * Copyright (C) 2012 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package android.hardware.display;
  
  import android.annotation.UnsupportedAppUsage;
  import android.os.Parcel;
  import android.os.Parcelable;
  
  import java.util.Objects;
  
  /**
   * Describes the properties of a Wifi display.
   * <p>
   * This object is immutable.
   * </p>
   *
   * @hide
   */
  public final class WifiDisplay implements Parcelable {
      private final String mDeviceAddress;
      private final String mDeviceName;
      private final String mDeviceAlias;
      private final boolean mIsAvailable;
      private final boolean mCanConnect;
      private final boolean mIsRemembered;
  
      public static final WifiDisplay[] EMPTY_ARRAY = new WifiDisplay[0];
  
      public static final @android.annotation.NonNull Creator<WifiDisplay> CREATOR = new Creator<WifiDisplay>() {
          public WifiDisplay createFromParcel(Parcel in) {
              String deviceAddress = in.readString();
              String deviceName = in.readString();
              String deviceAlias = in.readString();
              boolean isAvailable = (in.readInt() != 0);
              boolean canConnect = (in.readInt() != 0);
              boolean isRemembered = (in.readInt() != 0);
              return new WifiDisplay(deviceAddress, deviceName, deviceAlias,
                      isAvailable, canConnect, isRemembered);
          }
  
          public WifiDisplay[] newArray(int size) {
              return size == 0 ? EMPTY_ARRAY : new WifiDisplay[size];
          }
      };
  
      public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias,
              boolean available, boolean canConnect, boolean remembered) {
          if (deviceAddress == null) {
              throw new IllegalArgumentException("deviceAddress must not be null");
          }
          if (deviceName == null) {
              throw new IllegalArgumentException("deviceName must not be null");
          }
  
          mDeviceAddress = deviceAddress;
          mDeviceName = deviceName;
          mDeviceAlias = deviceAlias;
          mIsAvailable = available;
          mCanConnect = canConnect;
          mIsRemembered = remembered;
      }
  
      /**
       * Gets the MAC address of the Wifi display device.
       */
      @UnsupportedAppUsage
      public String getDeviceAddress() {
          return mDeviceAddress;
      }
  
      /**
       * Gets the name of the Wifi display device.
       */
      @UnsupportedAppUsage
      public String getDeviceName() {
          return mDeviceName;
      }
  
      /**
       * Gets the user-specified alias of the Wifi display device, or null if none.
       * <p>
       * The alias should be used in the UI whenever available.  It is the value
       * provided by the user when renaming the device.
       * </p>
       */
      @UnsupportedAppUsage
      public String getDeviceAlias() {
          return mDeviceAlias;
      }
  
      /**
       * Returns true if device is available, false otherwise.
       */
      @UnsupportedAppUsage
      public boolean isAvailable() {
          return mIsAvailable;
      }
  
      /**
       * Returns true if device can be connected to (not in use), false otherwise.
       */
      @UnsupportedAppUsage
      public boolean canConnect() {
          return mCanConnect;
      }
  
      /**
       * Returns true if device has been remembered, false otherwise.
       */
      @UnsupportedAppUsage
      public boolean isRemembered() {
          return mIsRemembered;
      }
  
      /**
       * Gets the name to show in the UI.
       * Uses the device alias if available, otherwise uses the device name.
       */
      public String getFriendlyDisplayName() {
          return mDeviceAlias != null ? mDeviceAlias : mDeviceName;
      }
  
      @Override
      public boolean equals(Object o) {
          return o instanceof WifiDisplay && equals((WifiDisplay)o);
      }
  
      /**
       * Returns true if the two displays have the same identity (address, name and alias).
       * This method does not compare the current status of the displays.
       */
      @UnsupportedAppUsage
      public boolean equals(WifiDisplay other) {
          return other != null
                  && mDeviceAddress.equals(other.mDeviceAddress)
                  && mDeviceName.equals(other.mDeviceName)
                  && Objects.equals(mDeviceAlias, other.mDeviceAlias);
      }
  
      /**
       * Returns true if the other display is not null and has the same address as this one.
       * Can be used to perform identity comparisons on displays ignoring properties
       * that might change during a connection such as the name or alias.
       */
      public boolean hasSameAddress(WifiDisplay other) {
          return other != null && mDeviceAddress.equals(other.mDeviceAddress);
      }
  
      @Override
      public int hashCode() {
          // The address on its own should be sufficiently unique for hashing purposes.
          return mDeviceAddress.hashCode();
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          dest.writeString(mDeviceAddress);
          dest.writeString(mDeviceName);
          dest.writeString(mDeviceAlias);
          dest.writeInt(mIsAvailable ? 1 : 0);
          dest.writeInt(mCanConnect ? 1 : 0);
          dest.writeInt(mIsRemembered ? 1 : 0);
      }
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      // For debugging purposes only.
      @Override
      public String toString() {
          String result = mDeviceName + " (" + mDeviceAddress + ")";
          if (mDeviceAlias != null) {
              result += ", alias " + mDeviceAlias;
          }
          result += ", isAvailable " + mIsAvailable + ", canConnect " + mCanConnect
                  + ", isRemembered " + mIsRemembered;
          return result;
      }
  }
  