public long getSeen() {
    long seen = 0;
    for (ScanResult result : mScanResultCache.snapshot().values()) {
      if (result.timestamp > seen) {
        seen = result.timestamp;
      }
    }

    return seen;
  }
  public int getRssi() {
    int rssi = Integer.MIN_VALUE;
    for (ScanResult result : mScanResultCache.snapshot().values()) {
      if (result.level > rssi) {
        rssi = result.level;
      }
    }

    return rssi;
  }
 public void saveWifiState(Bundle savedState) {
   if (ssid != null) savedState.putString(KEY_SSID, getSsidStr());
   savedState.putInt(KEY_SECURITY, security);
   savedState.putInt(KEY_PSKTYPE, pskType);
   if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig);
   savedState.putParcelable(KEY_WIFIINFO, mInfo);
   savedState.putParcelableArrayList(
       KEY_SCANRESULTCACHE, new ArrayList<ScanResult>(mScanResultCache.snapshot().values()));
   if (mNetworkInfo != null) {
     savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo);
   }
 }
 protected Map<String, Cursor> getSnapshot() {
   return mLruCache.snapshot();
 }
  /**
   * Returns the visibility status of the WifiConfiguration.
   *
   * @return autojoin debugging information TODO: use a string formatter ["rssi 5Ghz", "num results
   *     on 5GHz" / "rssi 5Ghz", "num results on 5GHz"] For instance [-40,5/-30,2]
   */
  private String getVisibilityStatus() {
    StringBuilder visibility = new StringBuilder();
    StringBuilder scans24GHz = null;
    StringBuilder scans5GHz = null;
    String bssid = null;

    long now = System.currentTimeMillis();

    if (mInfo != null) {
      bssid = mInfo.getBSSID();
      if (bssid != null) {
        visibility.append(" ").append(bssid);
      }
      visibility.append(" rssi=").append(mInfo.getRssi());
      visibility.append(" ");
      visibility.append(" score=").append(mInfo.score);
      visibility.append(String.format(" tx=%.1f,", mInfo.txSuccessRate));
      visibility.append(String.format("%.1f,", mInfo.txRetriesRate));
      visibility.append(String.format("%.1f ", mInfo.txBadRate));
      visibility.append(String.format("rx=%.1f", mInfo.rxSuccessRate));
    }

    int rssi5 = WifiConfiguration.INVALID_RSSI;
    int rssi24 = WifiConfiguration.INVALID_RSSI;
    int num5 = 0;
    int num24 = 0;
    int numBlackListed = 0;
    int n24 = 0; // Number scan results we included in the string
    int n5 = 0; // Number scan results we included in the string
    Map<String, ScanResult> list = mScanResultCache.snapshot();
    // TODO: sort list by RSSI or age
    for (ScanResult result : list.values()) {
      if (result.seen == 0) continue;

      if (result.autoJoinStatus != ScanResult.ENABLED) numBlackListed++;

      if (result.frequency >= LOWER_FREQ_5GHZ && result.frequency <= HIGHER_FREQ_5GHZ) {
        // Strictly speaking: [4915, 5825]
        // number of known BSSID on 5GHz band
        num5 = num5 + 1;
      } else if (result.frequency >= LOWER_FREQ_24GHZ && result.frequency <= HIGHER_FREQ_24GHZ) {
        // Strictly speaking: [2412, 2482]
        // number of known BSSID on 2.4Ghz band
        num24 = num24 + 1;
      }

      // Ignore results seen, older than 20 seconds
      if (now - result.seen > VISIBILITY_OUTDATED_AGE_IN_MILLI) continue;

      if (result.frequency >= LOWER_FREQ_5GHZ && result.frequency <= HIGHER_FREQ_5GHZ) {
        if (result.level > rssi5) {
          rssi5 = result.level;
        }
        if (n5 < 4) {
          if (scans5GHz == null) scans5GHz = new StringBuilder();
          scans5GHz.append(" \n{").append(result.BSSID);
          if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*");
          scans5GHz.append("=").append(result.frequency);
          scans5GHz.append(",").append(result.level);
          if (result.autoJoinStatus != 0) {
            scans5GHz.append(",st=").append(result.autoJoinStatus);
          }
          if (result.numIpConfigFailures != 0) {
            scans5GHz.append(",ipf=").append(result.numIpConfigFailures);
          }
          scans5GHz.append("}");
          n5++;
        }
      } else if (result.frequency >= LOWER_FREQ_24GHZ && result.frequency <= HIGHER_FREQ_24GHZ) {
        if (result.level > rssi24) {
          rssi24 = result.level;
        }
        if (n24 < 4) {
          if (scans24GHz == null) scans24GHz = new StringBuilder();
          scans24GHz.append(" \n{").append(result.BSSID);
          if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*");
          scans24GHz.append("=").append(result.frequency);
          scans24GHz.append(",").append(result.level);
          if (result.autoJoinStatus != 0) {
            scans24GHz.append(",st=").append(result.autoJoinStatus);
          }
          if (result.numIpConfigFailures != 0) {
            scans24GHz.append(",ipf=").append(result.numIpConfigFailures);
          }
          scans24GHz.append("}");
          n24++;
        }
      }
    }
    visibility.append(" [");
    if (num24 > 0) {
      visibility.append("(").append(num24).append(")");
      if (n24 <= 4) {
        if (scans24GHz != null) {
          visibility.append(scans24GHz.toString());
        }
      } else {
        visibility.append("max=").append(rssi24);
        if (scans24GHz != null) {
          visibility.append(",").append(scans24GHz.toString());
        }
      }
    }
    visibility.append(";");
    if (num5 > 0) {
      visibility.append("(").append(num5).append(")");
      if (n5 <= 4) {
        if (scans5GHz != null) {
          visibility.append(scans5GHz.toString());
        }
      } else {
        visibility.append("max=").append(rssi5);
        if (scans5GHz != null) {
          visibility.append(",").append(scans5GHz.toString());
        }
      }
    }
    if (numBlackListed > 0) visibility.append("!").append(numBlackListed);
    visibility.append("]");

    return visibility.toString();
  }