summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-10-02 04:19:16 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-10-02 04:19:16 +0000
commitc6cfddcea894b34b54b07baa8caee1a608d6ecaa (patch)
tree235d8a92ee4185576a2d4d46eeb4e5e76dc19d1b
parenta11ca4e24b6d40d4e8266757d2352e0b54ee1160 (diff)
parent9d7cf1434fc63dec2d63d5a9c7330c2fa37aefc5 (diff)
downloadandroid_frameworks_opt_net_wifi-c6cfddcea894b34b54b07baa8caee1a608d6ecaa.tar.gz
android_frameworks_opt_net_wifi-c6cfddcea894b34b54b07baa8caee1a608d6ecaa.tar.bz2
android_frameworks_opt_net_wifi-c6cfddcea894b34b54b07baa8caee1a608d6ecaa.zip
release-request-53526352-7b51-4ab1-a661-632ffc55dd7c-for-git_oc-mr1-release-4371241 snap-temp-L10900000107789672
Change-Id: I69ee67c044892913b3aa5dc6766f5c683a91733b
-rw-r--r--service/java/com/android/server/wifi/NetworkListStoreData.java21
-rw-r--r--service/java/com/android/server/wifi/OpenNetworkNotifier.java55
-rw-r--r--service/java/com/android/server/wifi/WifiConfigManager.java5
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java4
-rw-r--r--service/java/com/android/server/wifi/WifiMetrics.java127
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java75
-rw-r--r--tests/wifitests/src/com/android/server/wifi/NetworkListStoreDataTest.java119
-rw-r--r--tests/wifitests/src/com/android/server/wifi/OpenNetworkNotifierTest.java162
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java39
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java17
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java100
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java137
12 files changed, 784 insertions, 77 deletions
diff --git a/service/java/com/android/server/wifi/NetworkListStoreData.java b/service/java/com/android/server/wifi/NetworkListStoreData.java
index 5ddfd4dfb..f287d4b98 100644
--- a/service/java/com/android/server/wifi/NetworkListStoreData.java
+++ b/service/java/com/android/server/wifi/NetworkListStoreData.java
@@ -16,10 +16,12 @@
package com.android.server.wifi;
+import android.content.Context;
import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
import android.net.wifi.WifiEnterpriseConfig;
+import android.os.Process;
import android.util.Log;
import android.util.Pair;
@@ -52,6 +54,8 @@ public class NetworkListStoreData implements WifiConfigStore.StoreData {
private static final String XML_TAG_SECTION_HEADER_WIFI_ENTERPRISE_CONFIGURATION =
"WifiEnterpriseConfiguration";
+ private final Context mContext;
+
/**
* List of saved shared networks visible to all the users to be stored in the shared store file.
*/
@@ -62,7 +66,9 @@ public class NetworkListStoreData implements WifiConfigStore.StoreData {
*/
private List<WifiConfiguration> mUserConfigurations;
- NetworkListStoreData() {}
+ NetworkListStoreData(Context context) {
+ mContext = context;
+ }
@Override
public void serializeData(XmlSerializer out, boolean shared)
@@ -282,6 +288,19 @@ public class NetworkListStoreData implements WifiConfigStore.StoreData {
"Configuration key does not match. Retrieved: " + configKeyParsed
+ ", Calculated: " + configKeyCalculated);
}
+ // Set creatorUid/creatorName for networks which don't have it set to valid value.
+ String creatorName = mContext.getPackageManager().getNameForUid(configuration.creatorUid);
+ if (creatorName == null) {
+ Log.e(TAG, "Invalid creatorUid for saved network " + configuration.configKey()
+ + ", creatorUid=" + configuration.creatorUid);
+ configuration.creatorUid = Process.SYSTEM_UID;
+ configuration.creatorName = creatorName;
+ } else if (!creatorName.equals(configuration.creatorName)) {
+ Log.w(TAG, "Invalid creatorName for saved network " + configuration.configKey()
+ + ", creatorUid=" + configuration.creatorUid
+ + ", creatorName=" + configuration.creatorName);
+ configuration.creatorName = creatorName;
+ }
configuration.setNetworkSelectionStatus(status);
configuration.setIpConfiguration(ipConfiguration);
diff --git a/service/java/com/android/server/wifi/OpenNetworkNotifier.java b/service/java/com/android/server/wifi/OpenNetworkNotifier.java
index 31ff44b72..eee4ac53c 100644
--- a/service/java/com/android/server/wifi/OpenNetworkNotifier.java
+++ b/service/java/com/android/server/wifi/OpenNetworkNotifier.java
@@ -40,11 +40,13 @@ import android.os.Messenger;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount;
import com.android.server.wifi.util.ScanResultUtil;
import java.io.FileDescriptor;
@@ -124,6 +126,7 @@ public class OpenNetworkNotifier {
private final Context mContext;
private final Handler mHandler;
private final FrameworkFacade mFrameworkFacade;
+ private final WifiMetrics mWifiMetrics;
private final Clock mClock;
private final WifiConfigManager mConfigManager;
private final WifiStateMachine mWifiStateMachine;
@@ -138,6 +141,7 @@ public class OpenNetworkNotifier {
Looper looper,
FrameworkFacade framework,
Clock clock,
+ WifiMetrics wifiMetrics,
WifiConfigManager wifiConfigManager,
WifiConfigStore wifiConfigStore,
WifiStateMachine wifiStateMachine,
@@ -146,6 +150,7 @@ public class OpenNetworkNotifier {
mContext = context;
mHandler = new Handler(looper);
mFrameworkFacade = framework;
+ mWifiMetrics = wifiMetrics;
mClock = clock;
mConfigManager = wifiConfigManager;
mWifiStateMachine = wifiStateMachine;
@@ -206,7 +211,7 @@ public class OpenNetworkNotifier {
case WifiManager.CONNECT_NETWORK_SUCCEEDED:
break;
case WifiManager.CONNECT_NETWORK_FAILED:
- handleConnectionFailure();
+ handleConnectionAttemptFailedToSend();
break;
default:
Log.e(TAG, "Unknown message " + msg.what);
@@ -226,6 +231,13 @@ public class OpenNetworkNotifier {
if (mState != STATE_NO_NOTIFICATION) {
getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_AVAILABLE);
+
+ if (mRecommendedNetwork != null) {
+ Log.d(TAG, "Notification with state="
+ + mState
+ + " was cleared for recommended network: "
+ + mRecommendedNetwork.SSID);
+ }
mState = STATE_NO_NOTIFICATION;
mRecommendedNetwork = null;
}
@@ -295,6 +307,10 @@ public class OpenNetworkNotifier {
postNotification(mNotificationBuilder.createNetworkConnectedNotification(
mRecommendedNetwork));
+
+ Log.d(TAG, "User connected to recommended network: " + mRecommendedNetwork.SSID);
+ mWifiMetrics.incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTED_TO_NETWORK);
mState = STATE_CONNECTED_NOTIFICATION;
mHandler.postDelayed(
() -> {
@@ -313,6 +329,10 @@ public class OpenNetworkNotifier {
return;
}
postNotification(mNotificationBuilder.createNetworkFailedNotification());
+
+ Log.d(TAG, "User failed to connect to recommended network: " + mRecommendedNetwork.SSID);
+ mWifiMetrics.incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_FAILED_TO_CONNECT);
mState = STATE_CONNECT_FAILED_NOTIFICATION;
mHandler.postDelayed(
() -> {
@@ -328,8 +348,18 @@ public class OpenNetworkNotifier {
}
private void postInitialNotification(ScanResult recommendedNetwork) {
+ if (mRecommendedNetwork != null
+ && TextUtils.equals(mRecommendedNetwork.SSID, recommendedNetwork.SSID)) {
+ return;
+ }
postNotification(mNotificationBuilder.createConnectToNetworkNotification(
recommendedNetwork));
+ if (mState == STATE_NO_NOTIFICATION) {
+ mWifiMetrics.incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
+ } else {
+ mWifiMetrics.incrementNumOpenNetworkRecommendationUpdates();
+ }
mState = STATE_SHOWING_RECOMMENDATION_NOTIFICATION;
mRecommendedNetwork = recommendedNetwork;
mNotificationRepeatTime = mClock.getWallClockMillis() + mNotificationRepeatDelay;
@@ -340,11 +370,15 @@ public class OpenNetworkNotifier {
}
private void handleConnectToNetworkAction() {
+ mWifiMetrics.incrementConnectToNetworkNotificationAction(mState,
+ ConnectToNetworkNotificationAndActionCount.ACTION_CONNECT_TO_NETWORK);
if (mState != STATE_SHOWING_RECOMMENDATION_NOTIFICATION) {
return;
}
postNotification(mNotificationBuilder.createNetworkConnectingNotification(
mRecommendedNetwork));
+ mWifiMetrics.incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTING_TO_NETWORK);
Log.d(TAG, "User initiated connection to recommended network: " + mRecommendedNetwork.SSID);
WifiConfiguration network = ScanResultUtil.createNetworkFromScanResult(mRecommendedNetwork);
@@ -366,6 +400,8 @@ public class OpenNetworkNotifier {
}
private void handleSeeAllNetworksAction() {
+ mWifiMetrics.incrementConnectToNetworkNotificationAction(mState,
+ ConnectToNetworkNotificationAndActionCount.ACTION_PICK_WIFI_NETWORK);
startWifiSettings();
}
@@ -378,14 +414,26 @@ public class OpenNetworkNotifier {
clearPendingNotification(false /* resetRepeatTime */);
}
+ private void handleConnectionAttemptFailedToSend() {
+ handleConnectionFailure();
+ mWifiMetrics.incrementNumOpenNetworkConnectMessageFailedToSend();
+ }
+
private void handlePickWifiNetworkAfterConnectFailure() {
+ mWifiMetrics.incrementConnectToNetworkNotificationAction(mState,
+ ConnectToNetworkNotificationAndActionCount
+ .ACTION_PICK_WIFI_NETWORK_AFTER_CONNECT_FAILURE);
startWifiSettings();
}
private void handleUserDismissedAction() {
+ Log.d(TAG, "User dismissed notification with state=" + mState);
+ mWifiMetrics.incrementConnectToNetworkNotificationAction(mState,
+ ConnectToNetworkNotificationAndActionCount.ACTION_USER_DISMISSED_NOTIFICATION);
if (mState == STATE_SHOWING_RECOMMENDATION_NOTIFICATION) {
// blacklist dismissed network
mBlacklistedSsids.add(mRecommendedNetwork.SSID);
+ mWifiMetrics.setOpenNetworkRecommenderBlacklistSize(mBlacklistedSsids.size());
mConfigManager.saveToStore(false /* forceWrite */);
Log.d(TAG, "Network is added to the open network notification blacklist: "
+ mRecommendedNetwork.SSID);
@@ -418,6 +466,7 @@ public class OpenNetworkNotifier {
@Override
public void setSsids(Set<String> ssidList) {
mBlacklistedSsids.addAll(ssidList);
+ mWifiMetrics.setOpenNetworkRecommenderBlacklistSize(mBlacklistedSsids.size());
}
}
@@ -440,8 +489,10 @@ public class OpenNetworkNotifier {
}
private boolean getValue() {
- return mFrameworkFacade.getIntegerSetting(mContext,
+ boolean enabled = mFrameworkFacade.getIntegerSetting(mContext,
Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 1) == 1;
+ mWifiMetrics.setIsWifiNetworksAvailableNotificationEnabled(enabled);
+ return enabled;
}
}
}
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index 75b39b261..06b53be85 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -2330,12 +2330,13 @@ public class WifiConfigManager {
public List<WifiScanner.PnoSettings.PnoNetwork> retrievePnoNetworkList() {
List<WifiScanner.PnoSettings.PnoNetwork> pnoList = new ArrayList<>();
List<WifiConfiguration> networks = new ArrayList<>(getInternalConfiguredNetworks());
- // Remove any permanently disabled networks.
+ // Remove any permanently or temporarily disabled networks.
Iterator<WifiConfiguration> iter = networks.iterator();
while (iter.hasNext()) {
WifiConfiguration config = iter.next();
if (config.ephemeral || config.isPasspoint()
- || config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()) {
+ || config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()
+ || config.getNetworkSelectionStatus().isNetworkTemporaryDisabled()) {
iter.remove();
}
}
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index fc3af83e5..4b8e6829e 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -197,7 +197,7 @@ public class WifiInjector {
mWifiConfigManager = new WifiConfigManager(mContext, mClock,
UserManager.get(mContext), TelephonyManager.from(mContext),
mWifiKeyStore, mWifiConfigStore, mWifiPermissionsUtil,
- mWifiPermissionsWrapper, new NetworkListStoreData(),
+ mWifiPermissionsWrapper, new NetworkListStoreData(mContext),
new DeletedEphemeralSsidsStoreData());
mWifiMetrics.setWifiConfigManager(mWifiConfigManager);
mWifiConnectivityHelper = new WifiConnectivityHelper(mWifiNative);
@@ -225,7 +225,7 @@ public class WifiInjector {
new WrongPasswordNotifier(mContext, mFrameworkFacade));
mCertManager = new WifiCertManager(mContext);
mOpenNetworkNotifier = new OpenNetworkNotifier(mContext,
- mWifiStateMachineHandlerThread.getLooper(), mFrameworkFacade, mClock,
+ mWifiStateMachineHandlerThread.getLooper(), mFrameworkFacade, mClock, mWifiMetrics,
mWifiConfigManager, mWifiConfigStore, mWifiStateMachine,
new OpenNetworkRecommender(),
new ConnectToNetworkNotificationBuilder(mContext, mFrameworkFacade));
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java
index 5db5ee67b..071b4f883 100644
--- a/service/java/com/android/server/wifi/WifiMetrics.java
+++ b/service/java/com/android/server/wifi/WifiMetrics.java
@@ -37,6 +37,7 @@ import com.android.server.wifi.hotspot2.PasspointManager;
import com.android.server.wifi.hotspot2.PasspointMatch;
import com.android.server.wifi.hotspot2.PasspointProvider;
import com.android.server.wifi.nano.WifiMetricsProto;
+import com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount;
import com.android.server.wifi.nano.WifiMetricsProto.PnoScanMetrics;
import com.android.server.wifi.nano.WifiMetricsProto.StaEvent;
import com.android.server.wifi.nano.WifiMetricsProto.StaEvent.ConfigInfo;
@@ -83,6 +84,7 @@ public class WifiMetrics {
public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50;
public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100;
public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250;
+ private static final int CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER = 1000;
private Clock mClock;
private boolean mScreenOn;
private int mWifiState;
@@ -150,6 +152,15 @@ public class WifiMetrics {
private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram =
new SparseIntArray();
+ /** Mapping of "Connect to Network" notifications to counts. */
+ private final SparseIntArray mConnectToNetworkNotificationCount = new SparseIntArray();
+ /** Mapping of "Connect to Network" notification user actions to counts. */
+ private final SparseIntArray mConnectToNetworkNotificationActionCount = new SparseIntArray();
+ private int mOpenNetworkRecommenderBlacklistSize = 0;
+ private boolean mIsWifiNetworksAvailableNotificationOn = false;
+ private int mNumOpenNetworkConnectMessageFailedToSend = 0;
+ private int mNumOpenNetworkRecommendationUpdates = 0;
+
class RouterFingerPrint {
private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
RouterFingerPrint() {
@@ -1237,6 +1248,55 @@ public class WifiMetrics {
}
}
+ /** Increments the occurence of a "Connect to Network" notification. */
+ public void incrementConnectToNetworkNotification(int notificationType) {
+ synchronized (mLock) {
+ int count = mConnectToNetworkNotificationCount.get(notificationType);
+ mConnectToNetworkNotificationCount.put(notificationType, count + 1);
+ }
+ }
+
+ /** Increments the occurence of an "Connect to Network" notification user action. */
+ public void incrementConnectToNetworkNotificationAction(int notificationType, int actionType) {
+ synchronized (mLock) {
+ int key = notificationType * CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER
+ + actionType;
+ int count = mConnectToNetworkNotificationActionCount.get(key);
+ mConnectToNetworkNotificationActionCount.put(key, count + 1);
+ }
+ }
+
+ /**
+ * Sets the number of SSIDs blacklisted from recommendation by the open network notification
+ * recommender.
+ */
+ public void setOpenNetworkRecommenderBlacklistSize(int size) {
+ synchronized (mLock) {
+ mOpenNetworkRecommenderBlacklistSize = size;
+ }
+ }
+
+ /** Sets if the available network notification feature is enabled. */
+ public void setIsWifiNetworksAvailableNotificationEnabled(boolean enabled) {
+ synchronized (mLock) {
+ mIsWifiNetworksAvailableNotificationOn = enabled;
+ }
+ }
+
+ /** Increments the occurence of connection attempts that were initiated unsuccessfully */
+ public void incrementNumOpenNetworkRecommendationUpdates() {
+ synchronized (mLock) {
+ mNumOpenNetworkRecommendationUpdates++;
+ }
+ }
+
+ /** Increments the occurence of connection attempts that were initiated unsuccessfully */
+ public void incrementNumOpenNetworkConnectMessageFailedToSend() {
+ synchronized (mLock) {
+ mNumOpenNetworkConnectMessageFailedToSend++;
+ }
+ }
+
public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
public static final String CLEAN_DUMP_ARG = "clean";
@@ -1488,6 +1548,19 @@ public class WifiMetrics {
+ mPnoScanMetrics.numPnoScanFailedOverOffload);
pw.println("mPnoScanMetrics.numPnoFoundNetworkEvents="
+ mPnoScanMetrics.numPnoFoundNetworkEvents);
+
+ pw.println("mWifiLogProto.connectToNetworkNotificationCount="
+ + mConnectToNetworkNotificationCount.toString());
+ pw.println("mWifiLogProto.connectToNetworkNotificationActionCount="
+ + mConnectToNetworkNotificationActionCount.toString());
+ pw.println("mWifiLogProto.openNetworkRecommenderBlacklistSize="
+ + mOpenNetworkRecommenderBlacklistSize);
+ pw.println("mWifiLogProto.isWifiNetworksAvailableNotificationOn="
+ + mIsWifiNetworksAvailableNotificationOn);
+ pw.println("mWifiLogProto.numOpenNetworkRecommendationUpdates="
+ + mNumOpenNetworkRecommendationUpdates);
+ pw.println("mWifiLogProto.numOpenNetworkConnectMessageFailedToSend="
+ + mNumOpenNetworkConnectMessageFailedToSend);
}
}
}
@@ -1698,6 +1771,53 @@ public class WifiMetrics {
mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto();
mWifiLogProto.pnoScanMetrics = mPnoScanMetrics;
+
+ /**
+ * Convert the SparseIntArray of "Connect to Network" notification types and counts to
+ * proto's repeated IntKeyVal array.
+ */
+ ConnectToNetworkNotificationAndActionCount[] notificationCountArray =
+ new ConnectToNetworkNotificationAndActionCount[
+ mConnectToNetworkNotificationCount.size()];
+ for (int i = 0; i < mConnectToNetworkNotificationCount.size(); i++) {
+ ConnectToNetworkNotificationAndActionCount keyVal =
+ new ConnectToNetworkNotificationAndActionCount();
+ keyVal.notification = mConnectToNetworkNotificationCount.keyAt(i);
+ keyVal.recommender =
+ ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
+ keyVal.count = mConnectToNetworkNotificationCount.valueAt(i);
+ notificationCountArray[i] = keyVal;
+ }
+ mWifiLogProto.connectToNetworkNotificationCount = notificationCountArray;
+
+ /**
+ * Convert the SparseIntArray of "Connect to Network" notification types and counts to
+ * proto's repeated IntKeyVal array.
+ */
+ ConnectToNetworkNotificationAndActionCount[] notificationActionCountArray =
+ new ConnectToNetworkNotificationAndActionCount[
+ mConnectToNetworkNotificationActionCount.size()];
+ for (int i = 0; i < mConnectToNetworkNotificationActionCount.size(); i++) {
+ ConnectToNetworkNotificationAndActionCount keyVal =
+ new ConnectToNetworkNotificationAndActionCount();
+ int key = mConnectToNetworkNotificationActionCount.keyAt(i);
+ keyVal.notification = key / CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
+ keyVal.action = key % CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
+ keyVal.recommender =
+ ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
+ keyVal.count = mConnectToNetworkNotificationActionCount.valueAt(i);
+ notificationActionCountArray[i] = keyVal;
+ }
+ mWifiLogProto.connectToNetworkNotificationActionCount = notificationActionCountArray;
+
+ mWifiLogProto.openNetworkRecommenderBlacklistSize =
+ mOpenNetworkRecommenderBlacklistSize;
+ mWifiLogProto.isWifiNetworksAvailableNotificationOn =
+ mIsWifiNetworksAvailableNotificationOn;
+ mWifiLogProto.numOpenNetworkRecommendationUpdates =
+ mNumOpenNetworkRecommendationUpdates;
+ mWifiLogProto.numOpenNetworkConnectMessageFailedToSend =
+ mNumOpenNetworkConnectMessageFailedToSend;
}
}
@@ -1716,7 +1836,8 @@ public class WifiMetrics {
}
/**
- * Clear all WifiMetrics, except for currentConnectionEvent.
+ * Clear all WifiMetrics, except for currentConnectionEvent and Open Network Notification
+ * feature enabled state, blacklist size.
*/
private void clear() {
synchronized (mLock) {
@@ -1747,6 +1868,10 @@ public class WifiMetrics {
mAvailableSavedPasspointProviderProfilesInScanHistogram.clear();
mAvailableSavedPasspointProviderBssidsInScanHistogram.clear();
mPnoScanMetrics.clear();
+ mConnectToNetworkNotificationCount.clear();
+ mConnectToNetworkNotificationActionCount.clear();
+ mNumOpenNetworkRecommendationUpdates = 0;
+ mNumOpenNetworkConnectMessageFailedToSend = 0;
}
}
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index e96c15dad..a3054c92b 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -3980,9 +3980,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
deleteNetworkConfigAndSendReply(message, true);
break;
case WifiManager.SAVE_NETWORK:
- messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
- replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED,
- WifiManager.BUSY);
+ saveNetworkConfigAndSendReply(message);
break;
case WifiManager.START_WPS:
replyToMessage(message, WifiManager.WPS_FAILED,
@@ -5270,36 +5268,12 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
replyToMessage(message, WifiManager.CONNECT_NETWORK_SUCCEEDED);
break;
case WifiManager.SAVE_NETWORK:
- config = (WifiConfiguration) message.obj;
- mWifiConnectionStatistics.numWifiManagerJoinAttempt++;
- if (config == null) {
- loge("SAVE_NETWORK with null configuration"
- + mSupplicantStateTracker.getSupplicantStateName()
- + " my state " + getCurrentState().getName());
- messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
- replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED,
- WifiManager.ERROR);
- break;
- }
- result = mWifiConfigManager.addOrUpdateNetwork(config, message.sendingUid);
- if (!result.isSuccess()) {
- loge("SAVE_NETWORK adding/updating config=" + config + " failed");
- messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
- replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED,
- WifiManager.ERROR);
- break;
- }
- if (!mWifiConfigManager.enableNetwork(
- result.getNetworkId(), false, message.sendingUid)) {
- loge("SAVE_NETWORK enabling config=" + config + " failed");
- messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
- replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED,
- WifiManager.ERROR);
- break;
- }
+ result = saveNetworkConfigAndSendReply(message);
netId = result.getNetworkId();
- if (mWifiInfo.getNetworkId() == netId) {
+ if (result.isSuccess() && mWifiInfo.getNetworkId() == netId) {
+ mWifiConnectionStatistics.numWifiManagerJoinAttempt++;
if (result.hasCredentialChanged()) {
+ config = (WifiConfiguration) message.obj;
// The network credentials changed and we're connected to this network,
// start a new connection with the updated credentials.
logi("SAVE_NETWORK credential changed for config=" + config.configKey()
@@ -5322,8 +5296,6 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
}
}
}
- broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_SAVED, config);
- replyToMessage(message, WifiManager.SAVE_NETWORK_SUCCEEDED);
break;
case WifiManager.FORGET_NETWORK:
if (!deleteNetworkConfigAndSendReply(message, true)) {
@@ -7217,6 +7189,43 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
}
}
+ /**
+ * Private method to handle calling WifiConfigManager to add & enable network configs and reply
+ * to the message from the sender of the outcome.
+ *
+ * @return NetworkUpdateResult with networkId of the added/updated configuration. Will return
+ * {@link WifiConfiguration#INVALID_NETWORK_ID} in case of error.
+ */
+ private NetworkUpdateResult saveNetworkConfigAndSendReply(Message message) {
+ WifiConfiguration config = (WifiConfiguration) message.obj;
+ if (config == null) {
+ loge("SAVE_NETWORK with null configuration "
+ + mSupplicantStateTracker.getSupplicantStateName()
+ + " my state " + getCurrentState().getName());
+ messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
+ replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED, WifiManager.ERROR);
+ return new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID);
+ }
+ NetworkUpdateResult result =
+ mWifiConfigManager.addOrUpdateNetwork(config, message.sendingUid);
+ if (!result.isSuccess()) {
+ loge("SAVE_NETWORK adding/updating config=" + config + " failed");
+ messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
+ replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED, WifiManager.ERROR);
+ return result;
+ }
+ if (!mWifiConfigManager.enableNetwork(
+ result.getNetworkId(), false, message.sendingUid)) {
+ loge("SAVE_NETWORK enabling config=" + config + " failed");
+ messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
+ replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED, WifiManager.ERROR);
+ return new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID);
+ }
+ broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_SAVED, config);
+ replyToMessage(message, WifiManager.SAVE_NETWORK_SUCCEEDED);
+ return result;
+ }
+
private static String getLinkPropertiesSummary(LinkProperties lp) {
List<String> attributes = new ArrayList<>(6);
if (lp.hasIPv4Address()) {
diff --git a/tests/wifitests/src/com/android/server/wifi/NetworkListStoreDataTest.java b/tests/wifitests/src/com/android/server/wifi/NetworkListStoreDataTest.java
index cbad3bbec..19a92b8e4 100644
--- a/tests/wifitests/src/com/android/server/wifi/NetworkListStoreDataTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/NetworkListStoreDataTest.java
@@ -16,9 +16,13 @@
package com.android.server.wifi;
+import static android.os.Process.SYSTEM_UID;
+
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.test.suitebuilder.annotation.SmallTest;
@@ -29,6 +33,8 @@ import com.android.server.wifi.util.XmlUtilTest;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -49,6 +55,7 @@ public class NetworkListStoreDataTest {
private static final String TEST_SSID = "WifiConfigStoreDataSSID_";
private static final String TEST_CONNECT_CHOICE = "XmlUtilConnectChoice";
private static final long TEST_CONNECT_CHOICE_TIMESTAMP = 0x4566;
+ private static final String TEST_CREATOR_NAME = "CreatorName";
private static final String SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT =
"<Network>\n"
+ "<WifiConfiguration>\n"
@@ -79,7 +86,7 @@ public class NetworkListStoreDataTest {
+ "<boolean name=\"UseExternalScores\" value=\"false\" />\n"
+ "<int name=\"NumAssociation\" value=\"0\" />\n"
+ "<int name=\"CreatorUid\" value=\"%d\" />\n"
- + "<null name=\"CreatorName\" />\n"
+ + "<string name=\"CreatorName\">%s</string>\n"
+ "<null name=\"CreationTime\" />\n"
+ "<int name=\"LastUpdateUid\" value=\"-1\" />\n"
+ "<null name=\"LastUpdateName\" />\n"
@@ -130,7 +137,7 @@ public class NetworkListStoreDataTest {
+ "<boolean name=\"UseExternalScores\" value=\"false\" />\n"
+ "<int name=\"NumAssociation\" value=\"0\" />\n"
+ "<int name=\"CreatorUid\" value=\"%d\" />\n"
- + "<null name=\"CreatorName\" />\n"
+ + "<string name=\"CreatorName\">%s</string>\n"
+ "<null name=\"CreationTime\" />\n"
+ "<int name=\"LastUpdateUid\" value=\"-1\" />\n"
+ "<null name=\"LastUpdateName\" />\n"
@@ -170,10 +177,15 @@ public class NetworkListStoreDataTest {
+ "</Network>\n";
private NetworkListStoreData mNetworkListStoreData;
+ @Mock private Context mContext;
+ @Mock private PackageManager mPackageManager;
@Before
public void setUp() throws Exception {
- mNetworkListStoreData = new NetworkListStoreData();
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManager.getNameForUid(anyInt())).thenReturn(TEST_CREATOR_NAME);
+ mNetworkListStoreData = new NetworkListStoreData(mContext);
}
/**
@@ -221,11 +233,13 @@ public class NetworkListStoreDataTest {
*/
private List<WifiConfiguration> getTestNetworksConfig(boolean shared) {
WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorName = TEST_CREATOR_NAME;
openNetwork.shared = shared;
openNetwork.setIpConfiguration(
WifiConfigurationTestUtil.createDHCPIpConfigurationWithNoProxy());
WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
eapNetwork.shared = shared;
+ eapNetwork.creatorName = TEST_CREATOR_NAME;
eapNetwork.setIpConfiguration(
WifiConfigurationTestUtil.createDHCPIpConfigurationWithNoProxy());
List<WifiConfiguration> networkList = new ArrayList<>();
@@ -247,11 +261,11 @@ public class NetworkListStoreDataTest {
String openNetworkXml = String.format(SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT,
openNetwork.configKey().replaceAll("\"", "&quot;"),
openNetwork.SSID.replaceAll("\"", "&quot;"),
- openNetwork.shared, openNetwork.creatorUid);
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName);
String eapNetworkXml = String.format(SINGLE_EAP_NETWORK_DATA_XML_STRING_FORMAT,
eapNetwork.configKey().replaceAll("\"", "&quot;"),
eapNetwork.SSID.replaceAll("\"", "&quot;"),
- eapNetwork.shared, eapNetwork.creatorUid);
+ eapNetwork.shared, eapNetwork.creatorUid, openNetwork.creatorName);
return (openNetworkXml + eapNetworkXml).getBytes(StandardCharsets.UTF_8);
}
@@ -420,7 +434,8 @@ public class NetworkListStoreDataTest {
byte[] xmlData = String.format(SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT,
"InvalidConfigKey",
openNetwork.SSID.replaceAll("\"", "&quot;"),
- openNetwork.shared, openNetwork.creatorUid).getBytes(StandardCharsets.UTF_8);
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName)
+ .getBytes(StandardCharsets.UTF_8);
deserializeData(xmlData, true);
}
@@ -448,4 +463,96 @@ public class NetworkListStoreDataTest {
assertNotEquals(eapNetwork.SSID, network.SSID);
}
}
+
+ /**
+ * Verify that a saved network config with invalid creatorUid resets it to
+ * {@link android.os.Process#SYSTEM_UID}.
+ */
+ public void parseNetworkWithInvalidCreatorUidResetsToSystem() throws Exception {
+ WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorUid = -1;
+ // Return null for invalid uid.
+ when(mPackageManager.getNameForUid(eq(openNetwork.creatorUid))).thenReturn(null);
+
+ byte[] xmlData = String.format(SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT,
+ openNetwork.configKey().replaceAll("\"", "&quot;"),
+ openNetwork.SSID.replaceAll("\"", "&quot;"),
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName)
+ .getBytes(StandardCharsets.UTF_8);
+ List<WifiConfiguration> deserializedNetworks = deserializeData(xmlData, true);
+ assertEquals(1, deserializedNetworks.size());
+ assertEquals(openNetwork.configKey(), deserializedNetworks.get(0).configKey());
+ assertEquals(SYSTEM_UID, deserializedNetworks.get(0).creatorUid);
+ assertEquals(TEST_CREATOR_NAME, deserializedNetworks.get(0).creatorName);
+ }
+
+ /**
+ * Verify that a saved network config with invalid creatorName resets it to the package name
+ * provided {@link PackageManager} for the creatorUid.
+ */
+ public void parseNetworkWithInvalidCreatorNameResetsToPackageNameForCreatorUid()
+ throws Exception {
+ String badCreatorName = "bad";
+ String correctCreatorName = "correct";
+ WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorUid = 1324422;
+ openNetwork.creatorName = badCreatorName;
+ when(mPackageManager.getNameForUid(eq(openNetwork.creatorUid)))
+ .thenReturn(correctCreatorName);
+
+ byte[] xmlData = String.format(SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT,
+ openNetwork.configKey().replaceAll("\"", "&quot;"),
+ openNetwork.SSID.replaceAll("\"", "&quot;"),
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName)
+ .getBytes(StandardCharsets.UTF_8);
+ List<WifiConfiguration> deserializedNetworks = deserializeData(xmlData, true);
+ assertEquals(1, deserializedNetworks.size());
+ assertEquals(openNetwork.configKey(), deserializedNetworks.get(0).configKey());
+ assertEquals(openNetwork.creatorUid, deserializedNetworks.get(0).creatorUid);
+ assertEquals(correctCreatorName, deserializedNetworks.get(0).creatorName);
+ }
+
+ /**
+ * Verify that a saved network config with invalid creatorName resets it to the package name
+ * provided {@link PackageManager} for the creatorUid.
+ */
+ public void parseNetworkWithNullCreatorNameResetsToPackageNameForCreatorUid()
+ throws Exception {
+ String correctCreatorName = "correct";
+ WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorUid = 1324422;
+ openNetwork.creatorName = null;
+ when(mPackageManager.getNameForUid(eq(openNetwork.creatorUid)))
+ .thenReturn(correctCreatorName);
+
+ byte[] xmlData = String.format(SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT,
+ openNetwork.configKey().replaceAll("\"", "&quot;"),
+ openNetwork.SSID.replaceAll("\"", "&quot;"),
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName)
+ .getBytes(StandardCharsets.UTF_8);
+ List<WifiConfiguration> deserializedNetworks = deserializeData(xmlData, true);
+ assertEquals(1, deserializedNetworks.size());
+ assertEquals(openNetwork.configKey(), deserializedNetworks.get(0).configKey());
+ assertEquals(openNetwork.creatorUid, deserializedNetworks.get(0).creatorUid);
+ assertEquals(correctCreatorName, deserializedNetworks.get(0).creatorName);
+ }
+
+ /**
+ * Verify that a saved network config with valid creatorUid is preserved.
+ */
+ public void parseNetworkWithValidCreatorUid() throws Exception {
+ WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorUid = 1324422;
+
+ byte[] xmlData = String.format(SINGLE_OPEN_NETWORK_DATA_XML_STRING_FORMAT,
+ openNetwork.configKey().replaceAll("\"", "&quot;"),
+ openNetwork.SSID.replaceAll("\"", "&quot;"),
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName)
+ .getBytes(StandardCharsets.UTF_8);
+ List<WifiConfiguration> deserializedNetworks = deserializeData(xmlData, true);
+ assertEquals(1, deserializedNetworks.size());
+ assertEquals(openNetwork.configKey(), deserializedNetworks.get(0).configKey());
+ assertEquals(openNetwork.creatorUid, deserializedNetworks.get(0).creatorUid);
+ assertEquals(TEST_CREATOR_NAME, deserializedNetworks.get(0).creatorName);
+ }
}
diff --git a/tests/wifitests/src/com/android/server/wifi/OpenNetworkNotifierTest.java b/tests/wifitests/src/com/android/server/wifi/OpenNetworkNotifierTest.java
index 46ec1597e..5a0b011f2 100644
--- a/tests/wifitests/src/com/android/server/wifi/OpenNetworkNotifierTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/OpenNetworkNotifierTest.java
@@ -20,6 +20,7 @@ import static com.android.server.wifi.OpenNetworkNotifier.DEFAULT_REPEAT_DELAY_S
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -31,6 +32,8 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.net.Uri;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Message;
@@ -41,6 +44,8 @@ import android.os.test.TestLooper;
import android.provider.Settings;
import android.util.ArraySet;
+import com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount;
+
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -57,11 +62,13 @@ import java.util.Set;
public class OpenNetworkNotifierTest {
private static final String TEST_SSID_1 = "Test SSID 1";
+ private static final String TEST_SSID_2 = "Test SSID 2";
private static final int MIN_RSSI_LEVEL = -127;
@Mock private Context mContext;
@Mock private Resources mResources;
@Mock private FrameworkFacade mFrameworkFacade;
+ @Mock private WifiMetrics mWifiMetrics;
@Mock private Clock mClock;
@Mock private WifiConfigStore mWifiConfigStore;
@Mock private WifiConfigManager mWifiConfigManager;
@@ -73,6 +80,7 @@ public class OpenNetworkNotifierTest {
private OpenNetworkNotifier mNotificationController;
private TestLooper mLooper;
private BroadcastReceiver mBroadcastReceiver;
+ private ContentObserver mContentObserver;
private ScanResult mDummyNetwork;
private List<ScanDetail> mOpenNetworks;
private Set<String> mBlacklistedSsids;
@@ -103,16 +111,42 @@ public class OpenNetworkNotifierTest {
mLooper = new TestLooper();
mNotificationController = new OpenNetworkNotifier(
- mContext, mLooper.getLooper(), mFrameworkFacade, mClock, mWifiConfigManager,
- mWifiConfigStore, mWifiStateMachine, mOpenNetworkRecommender, mNotificationBuilder);
+ mContext, mLooper.getLooper(), mFrameworkFacade, mClock, mWifiMetrics,
+ mWifiConfigManager, mWifiConfigStore, mWifiStateMachine, mOpenNetworkRecommender,
+ mNotificationBuilder);
ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor =
ArgumentCaptor.forClass(BroadcastReceiver.class);
verify(mContext).registerReceiver(broadcastReceiverCaptor.capture(), any(), any(), any());
mBroadcastReceiver = broadcastReceiverCaptor.getValue();
+ ArgumentCaptor<ContentObserver> observerCaptor =
+ ArgumentCaptor.forClass(ContentObserver.class);
+ verify(mFrameworkFacade).registerContentObserver(eq(mContext), any(Uri.class), eq(true),
+ observerCaptor.capture());
+ mContentObserver = observerCaptor.getValue();
mNotificationController.handleScreenStateChanged(true);
}
/**
+ * On {@link OpenNetworkNotifier} construction, WifiMetrics should track setting state.
+ */
+ @Test
+ public void onCreate_setWifiNetworksAvailableNotificationSettingState() {
+ verify(mWifiMetrics).setIsWifiNetworksAvailableNotificationEnabled(true);
+ }
+
+ /**
+ * When feature setting is toggled, WifiMetrics should track the disabled setting state.
+ */
+ @Test
+ public void onFeatureDisable_setWifiNetworksAvailableNotificationSettingDisabled() {
+ when(mFrameworkFacade.getIntegerSetting(mContext,
+ Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 1)).thenReturn(0);
+ mContentObserver.onChange(false);
+
+ verify(mWifiMetrics).setIsWifiNetworksAvailableNotificationEnabled(false);
+ }
+
+ /**
* When scan results with open networks are handled, a notification is posted.
*/
@Test
@@ -121,6 +155,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
}
@@ -136,6 +172,20 @@ public class OpenNetworkNotifierTest {
}
/**
+ * When the feature is disabled, no notifications are posted.
+ */
+ @Test
+ public void handleScanResults_featureDisabled_notificationNotDisplayed() {
+ when(mFrameworkFacade.getIntegerSetting(mContext,
+ Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 1)).thenReturn(0);
+ mContentObserver.onChange(false);
+ mNotificationController.handleScanResults(new ArrayList<>());
+
+ verify(mOpenNetworkRecommender, never()).recommendNetwork(any(), any());
+ verify(mNotificationManager, never()).notify(anyInt(), any());
+ }
+
+ /**
* When a notification is showing and scan results with no open networks are handled, the
* notification is cleared.
*/
@@ -145,6 +195,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.handleScanResults(new ArrayList<>());
@@ -162,6 +214,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
when(mOpenNetworkRecommender.recommendNetwork(any(), any())).thenReturn(null);
@@ -180,6 +234,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.handleScreenStateChanged(false);
@@ -198,6 +254,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.clearPendingNotification(true);
@@ -239,15 +297,25 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
+ ScanResult newNetwork = new ScanResult();
+ newNetwork.SSID = TEST_SSID_2;
+ mDummyNetwork.capabilities = "[ESS]";
+ mDummyNetwork.level = MIN_RSSI_LEVEL;
+ mOpenNetworks.add(new ScanDetail(newNetwork, null /* networkDetail */));
+ when(mOpenNetworkRecommender.recommendNetwork(any(), any())).thenReturn(newNetwork);
+
mNotificationController.handleScreenStateChanged(false);
mNotificationController.handleScanResults(mOpenNetworks);
- // Recommendation made twice
+ // Recommendation changed
verify(mOpenNetworkRecommender, times(2)).recommendNetwork(
mOpenNetworks, mBlacklistedSsids);
- verify(mNotificationBuilder, times(2)).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mNotificationBuilder).createConnectToNetworkNotification(newNetwork);
+ verify(mWifiMetrics).incrementNumOpenNetworkRecommendationUpdates();
verify(mNotificationManager, times(2)).notify(anyInt(), any());
}
@@ -261,6 +329,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.clearPendingNotification(false);
@@ -283,6 +353,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.clearPendingNotification(true);
@@ -292,6 +364,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender, times(2)).recommendNetwork(
mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder, times(2)).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics, times(2)).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager, times(2)).notify(anyInt(), any());
}
@@ -305,6 +379,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mBroadcastReceiver.onReceive(
@@ -320,6 +396,7 @@ public class OpenNetworkNotifierTest {
Set<String> expectedBlacklist = new ArraySet<>();
expectedBlacklist.add(mDummyNetwork.SSID);
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, expectedBlacklist);
+ verify(mWifiMetrics).setOpenNetworkRecommenderBlacklistSize(expectedBlacklist.size());
}
/**
@@ -332,6 +409,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.clearPendingNotification(false);
@@ -344,6 +423,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender, times(2)).recommendNetwork(
mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder, times(2)).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics, times(2)).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager, times(2)).notify(anyInt(), any());
}
@@ -366,6 +447,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
when(mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, UserHandle.CURRENT))
@@ -399,6 +482,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
// Initial Notification
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mBroadcastReceiver.onReceive(mContext,
@@ -407,10 +492,41 @@ public class OpenNetworkNotifierTest {
verify(mWifiStateMachine).sendMessage(any(Message.class));
// Connecting Notification
verify(mNotificationBuilder).createNetworkConnectingNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTING_TO_NETWORK);
+ verify(mWifiMetrics).incrementConnectToNetworkNotificationAction(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK,
+ ConnectToNetworkNotificationAndActionCount.ACTION_CONNECT_TO_NETWORK);
verify(mNotificationManager, times(2)).notify(anyInt(), any());
}
/**
+ * {@link ConnectToNetworkNotificationBuilder#ACTION_PICK_WIFI_NETWORK} opens Wi-Fi settings
+ * if the recommendation notification is showing.
+ */
+ @Test
+ public void actionPickWifiNetwork_currentRecommendationExists_opensWifiSettings() {
+ mNotificationController.handleScanResults(mOpenNetworks);
+
+ verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
+ // Initial Notification
+ verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
+ verify(mNotificationManager).notify(anyInt(), any());
+
+ mBroadcastReceiver.onReceive(mContext,
+ new Intent(ConnectToNetworkNotificationBuilder.ACTION_PICK_WIFI_NETWORK));
+
+ ArgumentCaptor<Intent> pickerIntentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mContext).startActivity(pickerIntentCaptor.capture());
+ assertEquals(pickerIntentCaptor.getValue().getAction(), Settings.ACTION_WIFI_SETTINGS);
+ verify(mWifiMetrics).incrementConnectToNetworkNotificationAction(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK,
+ ConnectToNetworkNotificationAndActionCount.ACTION_PICK_WIFI_NETWORK);
+ }
+
+ /**
* {@link OpenNetworkNotifier#handleWifiConnected()} does not post connected notification if
* the connecting notification is not showing
*/
@@ -419,6 +535,8 @@ public class OpenNetworkNotifierTest {
mNotificationController.handleWifiConnected();
verify(mNotificationManager, never()).notify(anyInt(), any());
+ verify(mWifiMetrics, never()).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTED_TO_NETWORK);
}
/**
@@ -431,6 +549,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
// Initial Notification
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mNotificationController.handleWifiConnected();
@@ -449,6 +569,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
// Initial Notification
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mBroadcastReceiver.onReceive(mContext,
@@ -456,12 +578,19 @@ public class OpenNetworkNotifierTest {
// Connecting Notification
verify(mNotificationBuilder).createNetworkConnectingNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTING_TO_NETWORK);
+ verify(mWifiMetrics).incrementConnectToNetworkNotificationAction(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK,
+ ConnectToNetworkNotificationAndActionCount.ACTION_CONNECT_TO_NETWORK);
verify(mNotificationManager, times(2)).notify(anyInt(), any());
mNotificationController.handleWifiConnected();
// Connected Notification
verify(mNotificationBuilder).createNetworkConnectedNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTED_TO_NETWORK);
verify(mNotificationManager, times(3)).notify(anyInt(), any());
}
@@ -474,6 +603,8 @@ public class OpenNetworkNotifierTest {
mNotificationController.handleConnectionFailure();
verify(mNotificationManager, never()).notify(anyInt(), any());
+ verify(mWifiMetrics, never()).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_FAILED_TO_CONNECT);
}
/**
@@ -487,6 +618,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
// Initial Notification
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mBroadcastReceiver.onReceive(mContext,
@@ -494,12 +627,19 @@ public class OpenNetworkNotifierTest {
// Connecting Notification
verify(mNotificationBuilder).createNetworkConnectingNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTING_TO_NETWORK);
+ verify(mWifiMetrics).incrementConnectToNetworkNotificationAction(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK,
+ ConnectToNetworkNotificationAndActionCount.ACTION_CONNECT_TO_NETWORK);
verify(mNotificationManager, times(2)).notify(anyInt(), any());
mNotificationController.handleConnectionFailure();
// Failed to Connect Notification
verify(mNotificationBuilder).createNetworkFailedNotification();
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_FAILED_TO_CONNECT);
verify(mNotificationManager, times(3)).notify(anyInt(), any());
}
@@ -515,6 +655,8 @@ public class OpenNetworkNotifierTest {
verify(mOpenNetworkRecommender).recommendNetwork(mOpenNetworks, mBlacklistedSsids);
// Initial Notification
verify(mNotificationBuilder).createConnectToNetworkNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK);
verify(mNotificationManager).notify(anyInt(), any());
mBroadcastReceiver.onReceive(mContext,
@@ -526,6 +668,11 @@ public class OpenNetworkNotifierTest {
// Connecting Notification
verify(mNotificationBuilder).createNetworkConnectingNotification(mDummyNetwork);
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_CONNECTING_TO_NETWORK);
+ verify(mWifiMetrics).incrementConnectToNetworkNotificationAction(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_RECOMMEND_NETWORK,
+ ConnectToNetworkNotificationAndActionCount.ACTION_CONNECT_TO_NETWORK);
verify(mNotificationManager, times(2)).notify(anyInt(), any());
Message connectFailedMsg = Message.obtain();
@@ -535,6 +682,9 @@ public class OpenNetworkNotifierTest {
// Failed to Connect Notification
verify(mNotificationBuilder).createNetworkFailedNotification();
+ verify(mWifiMetrics).incrementConnectToNetworkNotification(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_FAILED_TO_CONNECT);
+ verify(mWifiMetrics).incrementNumOpenNetworkConnectMessageFailedToSend();
verify(mNotificationManager, times(3)).notify(anyInt(), any());
mBroadcastReceiver.onReceive(mContext,
@@ -544,5 +694,9 @@ public class OpenNetworkNotifierTest {
ArgumentCaptor<Intent> pickerIntentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(pickerIntentCaptor.capture());
assertEquals(pickerIntentCaptor.getValue().getAction(), Settings.ACTION_WIFI_SETTINGS);
+ verify(mWifiMetrics).incrementConnectToNetworkNotificationAction(
+ ConnectToNetworkNotificationAndActionCount.NOTIFICATION_FAILED_TO_CONNECT,
+ ConnectToNetworkNotificationAndActionCount
+ .ACTION_PICK_WIFI_NETWORK_AFTER_CONNECT_FAILURE);
}
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
index d14c8fc9f..7ce53629b 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -1519,6 +1519,45 @@ public class WifiConfigManagerTest {
}
/**
+ * Verifies that the list of PNO networks does not contain any permanently or temporarily
+ * disabled networks.
+ * {@link WifiConfigManager#retrievePnoNetworkList()}.
+ */
+ @Test
+ public void testRetrievePnoListDoesNotContainDisabledNetworks() throws Exception {
+ // Create and add 2 networks.
+ WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork();
+ WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
+
+ NetworkUpdateResult result1 = verifyAddNetworkToWifiConfigManager(network1);
+ NetworkUpdateResult result2 = verifyAddNetworkToWifiConfigManager(network2);
+
+ // Enable all of them.
+ verifyUpdateNetworkSelectionStatus(
+ result1.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
+ verifyUpdateNetworkSelectionStatus(
+ result2.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
+
+ // Set network1 to temporarily disabled. The threshold for association rejection is 5, so
+ // disable it 5 times to actually mark it temporarily disabled.
+ int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
+ int assocRejectThreshold =
+ WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
+ for (int i = 1; i <= assocRejectThreshold; i++) {
+ verifyUpdateNetworkSelectionStatus(result1.getNetworkId(), assocRejectReason, i);
+ }
+
+ // Set network 2 to permanently disabled.
+ verifyUpdateNetworkSelectionStatus(
+ result2.getNetworkId(), NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER, 0);
+
+ // Retrieve the Pno network list & verify both networks are not included.
+ List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
+ mWifiConfigManager.retrievePnoNetworkList();
+ assertEquals(0, pnoNetworks.size());
+ }
+
+ /**
* Verifies the linking of networks when they have the same default GW Mac address in
* {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
*/
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java
index 86d6e11e7..0958fea61 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigStoreTest.java
@@ -21,6 +21,7 @@ import static org.mockito.Mockito.*;
import android.app.test.TestAlarmManager;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.wifi.WifiConfiguration;
import android.os.test.TestLooper;
import android.test.suitebuilder.annotation.SmallTest;
@@ -60,6 +61,7 @@ public class WifiConfigStoreTest {
private static final String TEST_USER_DATA = "UserData";
private static final String TEST_SHARE_DATA = "ShareData";
+ private static final String TEST_CREATOR_NAME = "CreatorName";
private static final String TEST_DATA_XML_STRING_FORMAT =
"<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
@@ -95,7 +97,7 @@ public class WifiConfigStoreTest {
+ "<boolean name=\"UseExternalScores\" value=\"false\" />\n"
+ "<int name=\"NumAssociation\" value=\"0\" />\n"
+ "<int name=\"CreatorUid\" value=\"%d\" />\n"
- + "<null name=\"CreatorName\" />\n"
+ + "<string name=\"CreatorName\">%s</string>\n"
+ "<null name=\"CreationTime\" />\n"
+ "<int name=\"LastUpdateUid\" value=\"-1\" />\n"
+ "<null name=\"LastUpdateName\" />\n"
@@ -125,6 +127,7 @@ public class WifiConfigStoreTest {
// Test mocks
@Mock private Context mContext;
+ @Mock private PackageManager mPackageManager;
private TestAlarmManager mAlarmManager;
private TestLooper mLooper;
@Mock private Clock mClock;
@@ -146,6 +149,8 @@ public class WifiConfigStoreTest {
mLooper = new TestLooper();
when(mContext.getSystemService(Context.ALARM_SERVICE))
.thenReturn(mAlarmManager.getAlarmManager());
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManager.getNameForUid(anyInt())).thenReturn(TEST_CREATOR_NAME);
mUserStore = new MockStoreFile();
mSharedStore = new MockStoreFile();
mStoreData = new MockStoreData();
@@ -364,9 +369,10 @@ public class WifiConfigStoreTest {
@Test
public void testReadWifiConfigStoreData() throws Exception {
// Setup network list.
- NetworkListStoreData networkList = new NetworkListStoreData();
+ NetworkListStoreData networkList = new NetworkListStoreData(mContext);
mWifiConfigStore.registerStoreData(networkList);
WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorName = TEST_CREATOR_NAME;
openNetwork.setIpConfiguration(
WifiConfigurationTestUtil.createDHCPIpConfigurationWithNoProxy());
List<WifiConfiguration> userConfigs = new ArrayList<>();
@@ -384,7 +390,7 @@ public class WifiConfigStoreTest {
String xmlString = String.format(TEST_DATA_XML_STRING_FORMAT,
openNetwork.configKey().replaceAll("\"", "&quot;"),
openNetwork.SSID.replaceAll("\"", "&quot;"),
- openNetwork.shared, openNetwork.creatorUid, testSsid);
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName, testSsid);
byte[] xmlBytes = xmlString.getBytes(StandardCharsets.UTF_8);
mUserStore.storeRawDataToWrite(xmlBytes);
@@ -406,9 +412,10 @@ public class WifiConfigStoreTest {
mWifiConfigStore.switchUserStoreAndRead(mUserStore);
// Setup network list store data.
- NetworkListStoreData networkList = new NetworkListStoreData();
+ NetworkListStoreData networkList = new NetworkListStoreData(mContext);
mWifiConfigStore.registerStoreData(networkList);
WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
+ openNetwork.creatorName = TEST_CREATOR_NAME;
openNetwork.setIpConfiguration(
WifiConfigurationTestUtil.createDHCPIpConfigurationWithNoProxy());
List<WifiConfiguration> userConfigs = new ArrayList<>();
@@ -428,7 +435,7 @@ public class WifiConfigStoreTest {
String xmlString = String.format(TEST_DATA_XML_STRING_FORMAT,
openNetwork.configKey().replaceAll("\"", "&quot;"),
openNetwork.SSID.replaceAll("\"", "&quot;"),
- openNetwork.shared, openNetwork.creatorUid, testSsid);
+ openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName, testSsid);
byte[] xmlBytes = xmlString.getBytes(StandardCharsets.UTF_8);
mWifiConfigStore.write(true);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
index 10ad3c620..65427beb2 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
@@ -38,6 +38,7 @@ import com.android.server.wifi.hotspot2.PasspointManager;
import com.android.server.wifi.hotspot2.PasspointMatch;
import com.android.server.wifi.hotspot2.PasspointProvider;
import com.android.server.wifi.nano.WifiMetricsProto;
+import com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount;
import com.android.server.wifi.nano.WifiMetricsProto.PnoScanMetrics;
import com.android.server.wifi.nano.WifiMetricsProto.StaEvent;
@@ -259,6 +260,19 @@ public class WifiMetricsTest {
private static final int NUM_PNO_SCAN_STARTED_OVER_OFFLOAD = 17;
private static final int NUM_PNO_SCAN_FAILED_OVER_OFFLOAD = 8;
private static final int NUM_PNO_FOUND_NETWORK_EVENTS = 10;
+ /** Number of notifications per "Connect to Network" notification type. */
+ private static final int[] NUM_CONNECT_TO_NETWORK_NOTIFICATIONS = {0, 10, 20, 30, 40};
+ /** Number of notifications per "Connect to Network notification type and action type. */
+ private static final int[][] NUM_CONNECT_TO_NETWORK_NOTIFICATION_ACTIONS = {
+ {0, 1, 2, 3, 4},
+ {10, 11, 12, 13, 14},
+ {20, 21, 22, 23, 24},
+ {30, 31, 32, 33, 34},
+ {40, 41, 42, 43, 44}};
+ private static final int SIZE_OPEN_NETWORK_RECOMMENDER_BLACKLIST = 10;
+ private static final boolean IS_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = true;
+ private static final int NUM_OPEN_NETWORK_CONNECT_MESSAGE_FAILED_TO_SEND = 5;
+ private static final int NUM_OPEN_NETWORK_RECOMMENDATION_UPDATES = 8;
private ScanDetail buildMockScanDetail(boolean hidden, NetworkDetail.HSRelease hSRelease,
String capabilities) {
@@ -498,6 +512,33 @@ public class WifiMetricsTest {
for (int i = 0; i < NUM_PNO_FOUND_NETWORK_EVENTS; i++) {
mWifiMetrics.incrementPnoFoundNetworkEventCount();
}
+
+ // set and increment "connect to network" notification metrics
+ for (int i = 0; i < NUM_CONNECT_TO_NETWORK_NOTIFICATIONS.length; i++) {
+ int count = NUM_CONNECT_TO_NETWORK_NOTIFICATIONS[i];
+ for (int j = 0; j < count; j++) {
+ mWifiMetrics.incrementConnectToNetworkNotification(i);
+ }
+ }
+ for (int i = 0; i < NUM_CONNECT_TO_NETWORK_NOTIFICATION_ACTIONS.length; i++) {
+ int[] actions = NUM_CONNECT_TO_NETWORK_NOTIFICATION_ACTIONS[i];
+ for (int j = 0; j < actions.length; j++) {
+ int count = actions[j];
+ for (int k = 0; k < count; k++) {
+ mWifiMetrics.incrementConnectToNetworkNotificationAction(i, j);
+ }
+ }
+ }
+ mWifiMetrics.setOpenNetworkRecommenderBlacklistSize(
+ SIZE_OPEN_NETWORK_RECOMMENDER_BLACKLIST);
+ mWifiMetrics.setIsWifiNetworksAvailableNotificationEnabled(
+ IS_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON);
+ for (int i = 0; i < NUM_OPEN_NETWORK_RECOMMENDATION_UPDATES; i++) {
+ mWifiMetrics.incrementNumOpenNetworkRecommendationUpdates();
+ }
+ for (int i = 0; i < NUM_OPEN_NETWORK_CONNECT_MESSAGE_FAILED_TO_SEND; i++) {
+ mWifiMetrics.incrementNumOpenNetworkConnectMessageFailedToSend();
+ }
}
/**
@@ -650,6 +691,32 @@ public class WifiMetricsTest {
assertEquals(NUM_PNO_SCAN_STARTED_OVER_OFFLOAD, pno_metrics.numPnoScanStartedOverOffload);
assertEquals(NUM_PNO_SCAN_FAILED_OVER_OFFLOAD, pno_metrics.numPnoScanFailedOverOffload);
assertEquals(NUM_PNO_FOUND_NETWORK_EVENTS, pno_metrics.numPnoFoundNetworkEvents);
+
+ for (ConnectToNetworkNotificationAndActionCount notificationCount
+ : mDecodedProto.connectToNetworkNotificationCount) {
+ assertEquals(NUM_CONNECT_TO_NETWORK_NOTIFICATIONS[notificationCount.notification],
+ notificationCount.count);
+ assertEquals(ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN,
+ notificationCount.recommender);
+ }
+ for (ConnectToNetworkNotificationAndActionCount notificationActionCount
+ : mDecodedProto.connectToNetworkNotificationActionCount) {
+ assertEquals(NUM_CONNECT_TO_NETWORK_NOTIFICATION_ACTIONS
+ [notificationActionCount.notification]
+ [notificationActionCount.action],
+ notificationActionCount.count);
+ assertEquals(ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN,
+ notificationActionCount.recommender);
+ }
+
+ assertEquals(SIZE_OPEN_NETWORK_RECOMMENDER_BLACKLIST,
+ mDecodedProto.openNetworkRecommenderBlacklistSize);
+ assertEquals(IS_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+ mDecodedProto.isWifiNetworksAvailableNotificationOn);
+ assertEquals(NUM_OPEN_NETWORK_RECOMMENDATION_UPDATES,
+ mDecodedProto.numOpenNetworkRecommendationUpdates);
+ assertEquals(NUM_OPEN_NETWORK_CONNECT_MESSAGE_FAILED_TO_SEND,
+ mDecodedProto.numOpenNetworkConnectMessageFailedToSend);
}
/**
@@ -1203,6 +1270,39 @@ public class WifiMetricsTest {
a(WifiMetrics.MAX_CONNECTABLE_BSSID_NETWORK_BUCKET), a(1));
}
+ /**
+ * Test Open Network Notification blacklist size and feature state are not cleared when proto
+ * is dumped.
+ */
+ public void testOpenNetworkNotificationBlacklistSizeAndFeatureStateNotCleared()
+ throws Exception {
+ mWifiMetrics.setOpenNetworkRecommenderBlacklistSize(
+ SIZE_OPEN_NETWORK_RECOMMENDER_BLACKLIST);
+ mWifiMetrics.setIsWifiNetworksAvailableNotificationEnabled(
+ IS_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON);
+ for (int i = 0; i < NUM_OPEN_NETWORK_RECOMMENDATION_UPDATES; i++) {
+ mWifiMetrics.incrementNumOpenNetworkRecommendationUpdates();
+ }
+
+ // This should clear most metrics in mWifiMetrics
+ dumpProtoAndDeserialize();
+ assertEquals(SIZE_OPEN_NETWORK_RECOMMENDER_BLACKLIST,
+ mDecodedProto.openNetworkRecommenderBlacklistSize);
+ assertEquals(IS_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+ mDecodedProto.isWifiNetworksAvailableNotificationOn);
+ assertEquals(NUM_OPEN_NETWORK_RECOMMENDATION_UPDATES,
+ mDecodedProto.numOpenNetworkRecommendationUpdates);
+
+ // Check that blacklist size and feature state persist on next dump but
+ // others do not.
+ dumpProtoAndDeserialize();
+ assertEquals(SIZE_OPEN_NETWORK_RECOMMENDER_BLACKLIST,
+ mDecodedProto.openNetworkRecommenderBlacklistSize);
+ assertEquals(IS_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+ mDecodedProto.isWifiNetworksAvailableNotificationOn);
+ assertEquals(0, mDecodedProto.numOpenNetworkRecommendationUpdates);
+ }
+
/** short hand for instantiating an anonymous int array, instead of 'new int[]{a1, a2, ...}' */
private int[] a(int... element) {
return element;
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java
index 177261632..5b0f59685 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java
@@ -139,6 +139,7 @@ public class WifiStateMachineTest {
: WifiStateMachine.NUM_LOG_RECS_VERBOSE);
private static final int FRAMEWORK_NETWORK_ID = 7;
private static final int TEST_RSSI = -54;
+ private static final int TEST_NETWORK_ID = 54;
private static final int WPS_SUPPLICANT_NETWORK_ID = 5;
private static final int WPS_FRAMEWORK_NETWORK_ID = 10;
private static final String DEFAULT_TEST_SSID = "\"GoogleGuest\"";
@@ -750,18 +751,15 @@ public class WifiStateMachineTest {
(Intent) argThat(new WifiEnablingStateIntentMatcher()), any());
}
- /**
- * Verifies that configs can be removed when in client mode.
- */
- @Test
- public void canRemoveNetworkConfigInClientMode() throws Exception {
+ private void canRemoveNetwork() {
boolean result;
when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
- initializeAndAddNetworkAndVerifySuccess();
mLooper.startAutoDispatch();
result = mWsm.syncRemoveNetwork(mWsmAsyncChannel, 0);
mLooper.stopAutoDispatch();
+
assertTrue(result);
+ verify(mWifiConfigManager).removeNetwork(anyInt(), anyInt());
}
/**
@@ -769,23 +767,21 @@ public class WifiStateMachineTest {
*/
@Test
public void canRemoveNetworkConfigWhenWifiDisabled() {
- boolean result;
- when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
- mLooper.startAutoDispatch();
- result = mWsm.syncRemoveNetwork(mWsmAsyncChannel, 0);
- mLooper.stopAutoDispatch();
-
- assertTrue(result);
- verify(mWifiConfigManager).removeNetwork(anyInt(), anyInt());
+ canRemoveNetwork();
}
+
/**
- * Verifies that configs can be forgotten when in client mode.
+ * Verifies that configs can be removed when in client mode.
*/
@Test
- public void canForgetNetworkConfigInClientMode() throws Exception {
- when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
+ public void canRemoveNetworkConfigInClientMode() throws Exception {
initializeAndAddNetworkAndVerifySuccess();
+ canRemoveNetwork();
+ }
+
+ private void canForgetNetwork() {
+ when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
mWsm.sendMessage(WifiManager.FORGET_NETWORK, 0, MANAGED_PROFILE_UID);
mLooper.dispatchAll();
verify(mWifiConfigManager).removeNetwork(anyInt(), anyInt());
@@ -796,10 +792,109 @@ public class WifiStateMachineTest {
*/
@Test
public void canForgetNetworkConfigWhenWifiDisabled() throws Exception {
- when(mWifiConfigManager.removeNetwork(eq(0), anyInt())).thenReturn(true);
- mWsm.sendMessage(WifiManager.FORGET_NETWORK, 0, MANAGED_PROFILE_UID);
- mLooper.dispatchAll();
- verify(mWifiConfigManager).removeNetwork(anyInt(), anyInt());
+ canForgetNetwork();
+ }
+
+ /**
+ * Verifies that configs can be forgotten when in client mode.
+ */
+ @Test
+ public void canForgetNetworkConfigInClientMode() throws Exception {
+ initializeAndAddNetworkAndVerifySuccess();
+ canForgetNetwork();
+ }
+
+ private void canSaveNetworkConfig() {
+ WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
+
+ int networkId = TEST_NETWORK_ID;
+ when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(new NetworkUpdateResult(networkId));
+ when(mWifiConfigManager.enableNetwork(eq(networkId), eq(false), anyInt()))
+ .thenReturn(true);
+
+ mLooper.startAutoDispatch();
+ Message reply = mWsmAsyncChannel.sendMessageSynchronously(WifiManager.SAVE_NETWORK, config);
+ mLooper.stopAutoDispatch();
+ assertEquals(WifiManager.SAVE_NETWORK_SUCCEEDED, reply.what);
+
+ verify(mWifiConfigManager).addOrUpdateNetwork(any(WifiConfiguration.class), anyInt());
+ verify(mWifiConfigManager).enableNetwork(eq(networkId), eq(false), anyInt());
+ }
+
+ /**
+ * Verifies that configs can be saved when not in client mode.
+ */
+ @Test
+ public void canSaveNetworkConfigWhenWifiDisabled() throws Exception {
+ canSaveNetworkConfig();
+ }
+
+ /**
+ * Verifies that configs can be saved when in client mode.
+ */
+ @Test
+ public void canSaveNetworkConfigInClientMode() throws Exception {
+ loadComponentsInStaMode();
+ canSaveNetworkConfig();
+ }
+
+ /**
+ * Verifies that null configs are rejected in SAVE_NETWORK message.
+ */
+ @Test
+ public void saveNetworkConfigFailsWithNullConfig() throws Exception {
+ mLooper.startAutoDispatch();
+ Message reply = mWsmAsyncChannel.sendMessageSynchronously(WifiManager.SAVE_NETWORK, null);
+ mLooper.stopAutoDispatch();
+ assertEquals(WifiManager.SAVE_NETWORK_FAILED, reply.what);
+
+ verify(mWifiConfigManager, never())
+ .addOrUpdateNetwork(any(WifiConfiguration.class), anyInt());
+ verify(mWifiConfigManager, never())
+ .enableNetwork(anyInt(), anyBoolean(), anyInt());
+ }
+
+ /**
+ * Verifies that configs save fails when the addition of network fails.
+ */
+ @Test
+ public void saveNetworkConfigFailsWithConfigAddFailure() throws Exception {
+ WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
+
+ when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID));
+
+ mLooper.startAutoDispatch();
+ Message reply = mWsmAsyncChannel.sendMessageSynchronously(WifiManager.SAVE_NETWORK, config);
+ mLooper.stopAutoDispatch();
+ assertEquals(WifiManager.SAVE_NETWORK_FAILED, reply.what);
+
+ verify(mWifiConfigManager).addOrUpdateNetwork(any(WifiConfiguration.class), anyInt());
+ verify(mWifiConfigManager, never())
+ .enableNetwork(anyInt(), anyBoolean(), anyInt());
+ }
+
+ /**
+ * Verifies that configs save fails when the enable of network fails.
+ */
+ @Test
+ public void saveNetworkConfigFailsWithConfigEnableFailure() throws Exception {
+ WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
+
+ int networkId = 5;
+ when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(new NetworkUpdateResult(networkId));
+ when(mWifiConfigManager.enableNetwork(eq(networkId), eq(false), anyInt()))
+ .thenReturn(false);
+
+ mLooper.startAutoDispatch();
+ Message reply = mWsmAsyncChannel.sendMessageSynchronously(WifiManager.SAVE_NETWORK, config);
+ mLooper.stopAutoDispatch();
+ assertEquals(WifiManager.SAVE_NETWORK_FAILED, reply.what);
+
+ verify(mWifiConfigManager).addOrUpdateNetwork(any(WifiConfiguration.class), anyInt());
+ verify(mWifiConfigManager).enableNetwork(eq(networkId), eq(false), anyInt());
}
/**