summaryrefslogtreecommitdiffstats
path: root/service/java/com
diff options
context:
space:
mode:
authorDavid Su <dysu@google.com>2019-03-26 23:54:03 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-03-26 23:54:03 +0000
commit8b12f17bdc9ff7dcf0c9b2455b0d02ed93c1e665 (patch)
tree767493ce0a6cd7e32fce103161c7a918e295bc5c /service/java/com
parent4a1a9a7adea99ef396e58f241e6f630afec5b465 (diff)
parent8046ecc97e403fd8ca355fce983f03e4e6c037c9 (diff)
downloadandroid_frameworks_opt_net_wifi-8b12f17bdc9ff7dcf0c9b2455b0d02ed93c1e665.tar.gz
android_frameworks_opt_net_wifi-8b12f17bdc9ff7dcf0c9b2455b0d02ed93c1e665.tar.bz2
android_frameworks_opt_net_wifi-8b12f17bdc9ff7dcf0c9b2455b0d02ed93c1e665.zip
Merge "Record Nominator ID for all possible nominators"
Diffstat (limited to 'service/java/com')
-rw-r--r--service/java/com/android/server/wifi/AvailableNetworkNotifier.java29
-rw-r--r--service/java/com/android/server/wifi/CarrierNetworkNotifier.java8
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java7
-rw-r--r--service/java/com/android/server/wifi/OpenNetworkNotifier.java5
-rw-r--r--service/java/com/android/server/wifi/WifiMetrics.java47
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkFactory.java4
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkSelector.java23
7 files changed, 89 insertions, 34 deletions
diff --git a/service/java/com/android/server/wifi/AvailableNetworkNotifier.java b/service/java/com/android/server/wifi/AvailableNetworkNotifier.java
index c28d52195..7def2f37a 100644
--- a/service/java/com/android/server/wifi/AvailableNetworkNotifier.java
+++ b/service/java/com/android/server/wifi/AvailableNetworkNotifier.java
@@ -38,6 +38,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
+import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -140,11 +141,18 @@ public class AvailableNetworkNotifier {
/** System wide identifier for notification in Notification Manager */
private final int mSystemMessageNotificationId;
+ /**
+ * The nominator id for this class, from
+ * {@link com.android.server.wifi.nano.WifiMetricsProto.ConnectionEvent.ConnectionNominator}
+ */
+ private final int mNominatorId;
+
public AvailableNetworkNotifier(
String tag,
String storeDataIdentifier,
String toggleSettingsName,
int notificationIdentifier,
+ int nominatorId,
Context context,
Looper looper,
FrameworkFacade framework,
@@ -158,6 +166,7 @@ public class AvailableNetworkNotifier {
mStoreDataIdentifier = storeDataIdentifier;
mToggleSettingsName = toggleSettingsName;
mSystemMessageNotificationId = notificationIdentifier;
+ mNominatorId = nominatorId;
mContext = context;
mHandler = new Handler(looper);
mFrameworkFacade = framework;
@@ -425,13 +434,19 @@ public class AvailableNetworkNotifier {
"User initiated connection to recommended network: "
+ "\"" + mRecommendedNetwork.SSID + "\"");
WifiConfiguration network = createRecommendedNetworkConfig(mRecommendedNetwork);
- Message msg = Message.obtain();
- msg.what = WifiManager.CONNECT_NETWORK;
- msg.arg1 = WifiConfiguration.INVALID_NETWORK_ID;
- msg.obj = network;
- msg.replyTo = mSrcMessenger;
- mClientModeImpl.sendMessage(msg);
- addNetworkToBlacklist(mRecommendedNetwork.SSID);
+
+ NetworkUpdateResult result = mConfigManager.addOrUpdateNetwork(network, Process.WIFI_UID);
+ if (result.isSuccess()) {
+ mWifiMetrics.setNominatorForNetwork(result.netId, mNominatorId);
+
+ Message msg = Message.obtain();
+ msg.what = WifiManager.CONNECT_NETWORK;
+ msg.arg1 = result.netId;
+ msg.obj = null;
+ msg.replyTo = mSrcMessenger;
+ mClientModeImpl.sendMessage(msg);
+ addNetworkToBlacklist(mRecommendedNetwork.SSID);
+ }
mState = STATE_CONNECTING_IN_NOTIFICATION;
mHandler.postDelayed(
diff --git a/service/java/com/android/server/wifi/CarrierNetworkNotifier.java b/service/java/com/android/server/wifi/CarrierNetworkNotifier.java
index 747cf0760..5af400181 100644
--- a/service/java/com/android/server/wifi/CarrierNetworkNotifier.java
+++ b/service/java/com/android/server/wifi/CarrierNetworkNotifier.java
@@ -26,7 +26,7 @@ import android.os.Looper;
import android.provider.Settings;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.server.wifi.util.ScanResultUtil;
+import com.android.server.wifi.nano.WifiMetricsProto;
/**
* This class handles the "carrier wi-fi network available" notification
@@ -50,14 +50,16 @@ public class CarrierNetworkNotifier extends AvailableNetworkNotifier {
ClientModeImpl clientModeImpl,
ConnectToNetworkNotificationBuilder connectToNetworkNotificationBuilder) {
super(TAG, STORE_DATA_IDENTIFIER, TOGGLE_SETTINGS_NAME,
- SystemMessage.NOTE_CARRIER_NETWORK_AVAILABLE, context, looper, framework, clock,
+ SystemMessage.NOTE_CARRIER_NETWORK_AVAILABLE,
+ WifiMetricsProto.ConnectionEvent.NOMINATOR_CARRIER,
+ context, looper, framework, clock,
wifiMetrics, wifiConfigManager, wifiConfigStore, clientModeImpl,
connectToNetworkNotificationBuilder);
}
@Override
WifiConfiguration createRecommendedNetworkConfig(ScanResult recommendedNetwork) {
- WifiConfiguration network = ScanResultUtil.createNetworkFromScanResult(recommendedNetwork);
+ WifiConfiguration network = super.createRecommendedNetworkConfig(recommendedNetwork);
int eapMethod = recommendedNetwork.carrierApEapType;
if (eapMethod == Eap.SIM || eapMethod == Eap.AKA || eapMethod == Eap.AKA_PRIME) {
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index 64f800571..dcc22ff2b 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -1172,7 +1172,8 @@ public class ClientModeImpl extends StateMachine {
private boolean connectToUserSelectNetwork(int netId, int uid, boolean forceReconnect) {
logd("connectToUserSelectNetwork netId " + netId + ", uid " + uid
+ ", forceReconnect = " + forceReconnect);
- if (mWifiConfigManager.getConfiguredNetwork(netId) == null) {
+ WifiConfiguration config = mWifiConfigManager.getConfiguredNetwork(netId);
+ if (config == null) {
loge("connectToUserSelectNetwork Invalid network Id=" + netId);
return false;
}
@@ -1191,6 +1192,10 @@ public class ClientModeImpl extends StateMachine {
logi("connectToUserSelectNetwork already connecting/connected=" + netId);
} else {
mWifiConnectivityManager.prepareForForcedConnection(netId);
+ if (uid == Process.SYSTEM_UID) {
+ mWifiMetrics.setNominatorForNetwork(config.networkId,
+ WifiMetricsProto.ConnectionEvent.NOMINATOR_MANUAL);
+ }
startConnectToNetwork(netId, uid, SUPPLICANT_BSSID_ANY);
}
return true;
diff --git a/service/java/com/android/server/wifi/OpenNetworkNotifier.java b/service/java/com/android/server/wifi/OpenNetworkNotifier.java
index 7f61ed9e4..97f390f39 100644
--- a/service/java/com/android/server/wifi/OpenNetworkNotifier.java
+++ b/service/java/com/android/server/wifi/OpenNetworkNotifier.java
@@ -21,6 +21,7 @@ import android.os.Looper;
import android.provider.Settings;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.server.wifi.nano.WifiMetricsProto;
/**
* This class handles the "open wi-fi network available" notification
@@ -44,7 +45,9 @@ public class OpenNetworkNotifier extends AvailableNetworkNotifier {
ClientModeImpl clientModeImpl,
ConnectToNetworkNotificationBuilder connectToNetworkNotificationBuilder) {
super(TAG, STORE_DATA_IDENTIFIER, TOGGLE_SETTINGS_NAME,
- SystemMessage.NOTE_NETWORK_AVAILABLE, context, looper, framework, clock,
+ SystemMessage.NOTE_NETWORK_AVAILABLE,
+ WifiMetricsProto.ConnectionEvent.NOMINATOR_OPEN_NETWORK_AVAILABLE,
+ context, looper, framework, clock,
wifiMetrics, wifiConfigManager, wifiConfigStore, clientModeImpl,
connectToNetworkNotificationBuilder);
}
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java
index ccfdbc029..f3a3d1f94 100644
--- a/service/java/com/android/server/wifi/WifiMetrics.java
+++ b/service/java/com/android/server/wifi/WifiMetrics.java
@@ -373,6 +373,12 @@ public class WifiMetrics {
private final CellularLinkLayerStatsCollector mCellularLinkLayerStatsCollector;
+ /**
+ * Tracks the nominator for each network (i.e. which entity made the suggestion to connect).
+ * This object should not be cleared.
+ */
+ private final SparseIntArray mNetworkIdToNominatorId = new SparseIntArray();
+
@VisibleForTesting
static class NetworkSelectionExperimentResults {
public static final int MAX_CHOICES = 10;
@@ -644,8 +650,8 @@ public class WifiMetrics {
case WifiMetricsProto.ConnectionEvent.NOMINATOR_EXTERNAL_SCORED:
sb.append("NOMINATOR_EXTERNAL_SCORED");
break;
- case WifiMetricsProto.ConnectionEvent.NOMINATOR_NETREC:
- sb.append("NOMINATOR_NETREC");
+ case WifiMetricsProto.ConnectionEvent.NOMINATOR_SPECIFIER:
+ sb.append("NOMINATOR_SPECIFIER");
break;
case WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED_USER_CONNECT_CHOICE:
sb.append("NOMINATOR_SAVED_USER_CONNECT_CHOICE");
@@ -988,26 +994,9 @@ public class WifiMetrics {
mCurrentConnectionEvent.mConnectionEvent.useRandomizedMac =
config.macRandomizationSetting
== WifiConfiguration.RANDOMIZATION_PERSISTENT;
- if (config.fromWifiNetworkSpecifier) {
- mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
- WifiMetricsProto.ConnectionEvent.NOMINATOR_NETREC;
- } else if (config.fromWifiNetworkSuggestion) {
- mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
- WifiMetricsProto.ConnectionEvent.NOMINATOR_SUGGESTION;
- } else if (config.isPasspoint()) {
- mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
- WifiMetricsProto.ConnectionEvent.NOMINATOR_PASSPOINT;
- } else if (!config.trusted) {
- mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
- WifiMetricsProto.ConnectionEvent.NOMINATOR_EXTERNAL_SCORED;
- } else if (!config.ephemeral) {
- mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
- WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED;
- } else {
- // TODO(b/127452844): populate other nominator fields
- mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
- WifiMetricsProto.ConnectionEvent.NOMINATOR_UNKNOWN;
- }
+ mCurrentConnectionEvent.mConnectionEvent.connectionNominator =
+ mNetworkIdToNominatorId.get(config.networkId,
+ WifiMetricsProto.ConnectionEvent.NOMINATOR_UNKNOWN);
ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
if (candidate != null) {
// Cache the RSSI of the candidate, as the connection event level is updated
@@ -2728,6 +2717,7 @@ public class WifiMetrics {
pw.println("mWifiNetworkSuggestionApiLog:\n" + mWifiNetworkSuggestionApiLog);
pw.println("mWifiNetworkSuggestionApiMatchSizeHistogram:\n"
+ mWifiNetworkRequestApiMatchSizeHistogram);
+ pw.println("mNetworkIdToNominatorId:\n" + mNetworkIdToNominatorId);
}
}
}
@@ -4712,4 +4702,17 @@ public class WifiMetrics {
}
}
}
+
+ /**
+ * Sets the nominator for a network (i.e. which entity made the suggestion to connect)
+ * @param networkId the ID of the network, from its {@link WifiConfiguration}
+ * @param nominatorId the entity that made the suggestion to connect to this network,
+ * from {@link WifiMetricsProto.ConnectionEvent.ConnectionNominator}
+ */
+ public void setNominatorForNetwork(int networkId, int nominatorId) {
+ synchronized (mLock) {
+ if (networkId == WifiConfiguration.INVALID_NETWORK_ID) return;
+ mNetworkIdToNominatorId.put(networkId, nominatorId);
+ }
+ }
}
diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java
index a8e554f2d..c1b7dc347 100644
--- a/service/java/com/android/server/wifi/WifiNetworkFactory.java
+++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java
@@ -56,6 +56,7 @@ import android.util.Log;
import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.wifi.nano.WifiMetricsProto;
import com.android.server.wifi.util.ExternalCallbackTracker;
import com.android.server.wifi.util.ScanResultUtil;
import com.android.server.wifi.util.WifiPermissionsUtil;
@@ -712,6 +713,9 @@ public class WifiNetworkFactory extends NetworkFactory {
// necessary checks when processing CONNECT_NETWORK.
int networkId = addNetworkToWifiConfigManager(network);
+ mWifiMetrics.setNominatorForNetwork(networkId,
+ WifiMetricsProto.ConnectionEvent.NOMINATOR_SPECIFIER);
+
// Send the connect request to ClientModeImpl.
// TODO(b/117601161): Refactor this.
Message msg = Message.obtain();
diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java
index 79176fd0b..0cb4dc055 100644
--- a/service/java/com/android/server/wifi/WifiNetworkSelector.java
+++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java
@@ -37,6 +37,7 @@ import android.util.Pair;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
+import com.android.server.wifi.nano.WifiMetricsProto;
import com.android.server.wifi.util.ScanResultUtil;
import java.lang.annotation.Retention;
@@ -598,6 +599,8 @@ public class WifiNetworkSelector {
localLog("After user selection adjustment, the final candidate is:"
+ WifiNetworkSelector.toNetworkString(candidate) + " : "
+ scanResultCandidate.BSSID);
+ mWifiMetrics.setNominatorForNetwork(candidate.networkId,
+ WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED_USER_CONNECT_CHOICE);
}
return candidate;
}
@@ -673,6 +676,8 @@ public class WifiNetworkSelector {
wifiCandidates.add(scanDetail, config,
registeredEvaluator.getId(), score);
}
+ mWifiMetrics.setNominatorForNetwork(config.networkId,
+ evaluatorIdToNominatorId(registeredEvaluator.getId()));
}
});
if (selectedNetwork == null && choice != null) {
@@ -773,6 +778,24 @@ public class WifiNetworkSelector {
return selectedNetwork;
}
+ private static int evaluatorIdToNominatorId(@NetworkEvaluator.EvaluatorId int evaluatorId) {
+ switch (evaluatorId) {
+ case NetworkEvaluator.EVALUATOR_ID_SAVED:
+ return WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED;
+ case NetworkEvaluator.EVALUATOR_ID_SUGGESTION:
+ return WifiMetricsProto.ConnectionEvent.NOMINATOR_SUGGESTION;
+ case NetworkEvaluator.EVALUATOR_ID_PASSPOINT:
+ return WifiMetricsProto.ConnectionEvent.NOMINATOR_PASSPOINT;
+ case NetworkEvaluator.EVALUATOR_ID_CARRIER:
+ return WifiMetricsProto.ConnectionEvent.NOMINATOR_CARRIER;
+ case NetworkEvaluator.EVALUATOR_ID_SCORED:
+ return WifiMetricsProto.ConnectionEvent.NOMINATOR_EXTERNAL_SCORED;
+ default:
+ Log.e(TAG, "UnrecognizedEvaluatorId" + evaluatorId);
+ return WifiMetricsProto.ConnectionEvent.NOMINATOR_UNKNOWN;
+ }
+ }
+
private static boolean isSameNetworkSelection(WifiConfiguration c1, WifiConfiguration c2) {
if (c1 == null && c2 == null) {
return true;