public int compareTo(AccessPointState other) {
    // This ranks the states for displaying in the AP list, not for
    // connecting to (wpa_supplicant does that using the WifiConfiguration's
    // priority field).

    // Clarity > efficiency, of this logic:
    int comparison;

    // Primary
    comparison = (other.primary ? 1 : 0) - (primary ? 1 : 0);
    if (comparison != 0) return comparison;

    // Currently seen (similar to, but not always the same as within range)
    comparison = (other.seen ? 1 : 0) - (seen ? 1 : 0);
    if (comparison != 0) return comparison;

    // Configured
    comparison = (other.configured ? 1 : 0) - (configured ? 1 : 0);
    if (comparison != 0) return comparison;

    if (!configured) {
      // Neither are configured

      // Open network
      comparison = (hasSecurity() ? 1 : 0) - (other.hasSecurity() ? 1 : 0);
      if (comparison != 0) return comparison;
    }

    // Signal strength
    comparison = (int) (other.signalForSorting - signalForSorting);
    if (comparison != 0) return comparison;

    // Alphabetical
    return ssid.compareToIgnoreCase(other.ssid);
  }
 public AccessPointState createFromParcel(Parcel in) {
   AccessPointState state = new AccessPointState();
   state.bssid = in.readString();
   state.configured = in.readInt() == 1;
   state.ipAddress = in.readInt();
   state.linkSpeed = in.readInt();
   state.networkId = in.readInt();
   state.primary = in.readInt() == 1;
   state.priority = in.readInt();
   state.hiddenSsid = in.readInt() == 1;
   state.security = in.readString();
   state.seen = in.readInt() == 1;
   state.disabled = in.readInt() == 1;
   state.signal = in.readInt();
   state.ssid = in.readString();
   String statusStr = in.readString();
   if (statusStr != null) {
     state.status = NetworkInfo.DetailedState.valueOf(statusStr);
   }
   state.mPassword = in.readString();
   state.mConfigHadPassword = in.readInt() == 1;
   state.mWepPasswordType = in.readInt();
   return state;
 }