blob: 4587e91bfa49cf8af45a08995bae6ddff5662e9b [file] [log] [blame]
/*
* Copyright (C) 2017 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 com.android.networkrecommendation.util;
import static com.android.networkrecommendation.Constants.TAG;
import static com.android.networkrecommendation.util.SsidUtil.quoteSsid;
import android.net.NetworkKey;
import android.net.WifiKey;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.android.networkrecommendation.config.G;
/**
* Scan result utility for any {@link ScanResult} related operations. TODO(b/34125341): Delete this
* class once exposed as a SystemApi
*/
public class ScanResultUtil {
/**
* Helper method to check if the provided |scanResult| corresponds to a PSK network or not. This
* checks if the provided capabilities string contains PSK encryption type or not.
*/
public static boolean isScanResultForPskNetwork(ScanResult scanResult) {
return scanResult.capabilities.contains("PSK");
}
/**
* Helper method to check if the provided |scanResult| corresponds to a EAP network or not. This
* checks if the provided capabilities string contains EAP encryption type or not.
*/
public static boolean isScanResultForEapNetwork(ScanResult scanResult) {
return scanResult.capabilities.contains("EAP");
}
/**
* Helper method to check if the provided |scanResult| corresponds to a WEP network or not. This
* checks if the provided capabilities string contains WEP encryption type or not.
*/
public static boolean isScanResultForWepNetwork(ScanResult scanResult) {
return scanResult.capabilities.contains("WEP");
}
/**
* Helper method to check if the provided |scanResult| corresponds to an open network or not.
* This checks if the provided capabilities string does not contain either of WEP, PSK or EAP
* encryption types or not.
*/
public static boolean isScanResultForOpenNetwork(ScanResult scanResult) {
return !(isScanResultForWepNetwork(scanResult)
|| isScanResultForPskNetwork(scanResult)
|| isScanResultForEapNetwork(scanResult));
}
/** Create a {@link NetworkKey} from a ScanResult, properly quoting the SSID. */
@Nullable
public static final NetworkKey createNetworkKey(ScanResult scanResult) {
WifiKey wifiKey = createWifiKey(scanResult);
if (wifiKey == null) {
return null;
}
return new NetworkKey(wifiKey);
}
/**
* Helper method to quote the SSID in Scan result to use for comparing/filling SSID stored in
* WifiConfiguration object.
*/
@Nullable
public static WifiKey createWifiKey(ScanResult result) {
if (result == null) {
Blog.e(TAG, "Couldn't create WifiKey, provided scan result is null.");
return null;
}
try {
return new WifiKey(quoteSsid(result.SSID), result.BSSID);
} catch (IllegalArgumentException | NullPointerException e) {
// Expect IllegalArgumentException only in Android O.
Blog.e(
TAG,
e,
"Couldn't make a wifi key from %s/%s",
Blog.pii(result.SSID, G.Netrec.enableSensitiveLogging.get()),
Blog.pii(result.BSSID, G.Netrec.enableSensitiveLogging.get()));
return null;
}
}
/** @return {@code true} if the result is for a 2.4GHz network. */
public static boolean is24GHz(ScanResult result) {
return is24GHz(result.frequency);
}
/** @return {@code true} if the frequency is for a 2.4GHz network. */
public static boolean is24GHz(int freq) {
return freq > 2400 && freq < 2500;
}
/** @return {@code true} if the result is for a 5GHz network. */
public static boolean is5GHz(ScanResult result) {
return is5GHz(result.frequency);
}
/** @return {@code true} if the frequency is for a 5GHz network. */
public static boolean is5GHz(int freq) {
return freq > 4900 && freq < 5900;
}
/**
* Checks if the provided |scanResult| match with the provided |config|. Essentially checks if
* the network config and scan result have the same SSID and encryption type.
*/
public static boolean doesScanResultMatchWithNetwork(
ScanResult scanResult, WifiConfiguration config) {
// Add the double quotes to the scan result SSID for comparison with the network configs.
String configSSID = quoteSsid(scanResult.SSID);
if (TextUtils.equals(config.SSID, configSSID)) {
if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
&& WifiConfigurationUtil.isConfigForPskNetwork(config)) {
return true;
}
if (ScanResultUtil.isScanResultForEapNetwork(scanResult)
&& WifiConfigurationUtil.isConfigForEapNetwork(config)) {
return true;
}
if (ScanResultUtil.isScanResultForWepNetwork(scanResult)
&& WifiConfigurationUtil.isConfigForWepNetwork(config)) {
return true;
}
if (ScanResultUtil.isScanResultForOpenNetwork(scanResult)
&& WifiConfigurationUtil.isConfigForOpenNetwork(config)) {
return true;
}
}
return false;
}
}