diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-10-02 04:19:16 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-10-02 04:19:16 +0000 |
commit | c6cfddcea894b34b54b07baa8caee1a608d6ecaa (patch) | |
tree | 235d8a92ee4185576a2d4d46eeb4e5e76dc19d1b | |
parent | a11ca4e24b6d40d4e8266757d2352e0b54ee1160 (diff) | |
parent | 9d7cf1434fc63dec2d63d5a9c7330c2fa37aefc5 (diff) | |
download | android_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
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("\"", """), openNetwork.SSID.replaceAll("\"", """), - openNetwork.shared, openNetwork.creatorUid); + openNetwork.shared, openNetwork.creatorUid, openNetwork.creatorName); String eapNetworkXml = String.format(SINGLE_EAP_NETWORK_DATA_XML_STRING_FORMAT, eapNetwork.configKey().replaceAll("\"", """), eapNetwork.SSID.replaceAll("\"", """), - 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("\"", """), - 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("\"", """), + openNetwork.SSID.replaceAll("\"", """), + 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("\"", """), + openNetwork.SSID.replaceAll("\"", """), + 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("\"", """), + openNetwork.SSID.replaceAll("\"", """), + 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("\"", """), + openNetwork.SSID.replaceAll("\"", """), + 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("\"", """), openNetwork.SSID.replaceAll("\"", """), - 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("\"", """), openNetwork.SSID.replaceAll("\"", """), - 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()); } /** |