summaryrefslogtreecommitdiffstats
path: root/service/java/com/android/server/wifi/WifiNetworkFactory.java
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2018-12-11 08:26:57 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-12-11 08:26:57 +0000
commitdd5ac175c733c7be1dd6dddf1452d34502cdac1d (patch)
tree017fcb845307c3e042eda16509055b4dc6363d75 /service/java/com/android/server/wifi/WifiNetworkFactory.java
parentd3a4ffb3002798ed3cca0dc6c5430223f2220c95 (diff)
parentc7607bb29a35d3b04d300235905317ee8ef5f6d8 (diff)
downloadandroid_frameworks_opt_net_wifi-dd5ac175c733c7be1dd6dddf1452d34502cdac1d.tar.gz
android_frameworks_opt_net_wifi-dd5ac175c733c7be1dd6dddf1452d34502cdac1d.tar.bz2
android_frameworks_opt_net_wifi-dd5ac175c733c7be1dd6dddf1452d34502cdac1d.zip
Merge "WifiNetworkFactory: Defer disconnecting from connected request"
Diffstat (limited to 'service/java/com/android/server/wifi/WifiNetworkFactory.java')
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkFactory.java149
1 files changed, 100 insertions, 49 deletions
diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java
index ea16cd20f..ba3407b5f 100644
--- a/service/java/com/android/server/wifi/WifiNetworkFactory.java
+++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java
@@ -95,8 +95,14 @@ public class WifiNetworkFactory extends NetworkFactory {
private WifiScanner mWifiScanner;
private int mGenericConnectionReqCount = 0;
+ // Request that is being actively processed. All new requests start out as an "active" request
+ // because we're processing it & handling all the user interactions associated with it. Once we
+ // successfully connect to the network, we transition that request to "connected".
private NetworkRequest mActiveSpecificNetworkRequest;
private WifiNetworkSpecifier mActiveSpecificNetworkRequestSpecifier;
+ // Request corresponding to the the network that the device is currently connected to.
+ private NetworkRequest mConnectedSpecificNetworkRequest;
+ private WifiNetworkSpecifier mConnectedSpecificNetworkRequestSpecifier;
private WifiConfiguration mUserSelectedNetwork;
private int mUserSelectedNetworkConnectRetryCount;
private List<ScanResult> mActiveMatchedScanResults;
@@ -104,7 +110,6 @@ public class WifiNetworkFactory extends NetworkFactory {
private boolean mVerboseLoggingEnabled = false;
private boolean mPeriodicScanTimerSet = false;
private boolean mConnectionTimeoutSet = false;
- private boolean mIsConnectedToUserSelectedNetwork = false;
private boolean mIsPeriodicScanPaused = false;
private boolean mWifiEnabled = false;
@@ -302,6 +307,23 @@ public class WifiNetworkFactory extends NetworkFactory {
}
}
+ private boolean canNewRequestOverrideExistingRequest(
+ WifiNetworkSpecifier newRequest, WifiNetworkSpecifier existingRequest) {
+ if (existingRequest == null) return true;
+ // Request from app with NETWORK_SETTINGS can override any existing requests.
+ if (mWifiPermissionsUtil.checkNetworkSettingsPermission(newRequest.requestorUid)) {
+ return true;
+ }
+ // Request from fg app can override any existing requests.
+ if (isRequestFromForegroundApp(newRequest.requestorUid)) return true;
+ // Request from fg service can override only if the existing request is not from a fg app.
+ if (!isRequestFromForegroundApp(existingRequest.requestorUid)) return true;
+ Log.e(TAG, "Already processing request from a foreground app "
+ + existingRequest.requestorUid + ". Rejecting request from "
+ + newRequest.requestorUid);
+ return false;
+ }
+
/**
* Check whether to accept the new network connection request.
*
@@ -337,20 +359,17 @@ public class WifiNetworkFactory extends NetworkFactory {
+ " Rejecting request from " + wns.requestorUid);
return false;
}
- // If there is a pending request, only proceed if the new request is from a foreground
+ // If there is an active request, only proceed if the new request is from a foreground
// app.
- if (mActiveSpecificNetworkRequest != null
- && !mWifiPermissionsUtil.checkNetworkSettingsPermission(wns.requestorUid)
- && !isRequestFromForegroundApp(wns.requestorUid)) {
- WifiNetworkSpecifier aWns =
- (WifiNetworkSpecifier) mActiveSpecificNetworkRequest
- .networkCapabilities
- .getNetworkSpecifier();
- if (isRequestFromForegroundApp(aWns.requestorUid)) {
- Log.e(TAG, "Already processing active request from a foreground app "
- + aWns.requestorUid + ". Rejecting request from " + wns.requestorUid);
- return false;
- }
+ if (!canNewRequestOverrideExistingRequest(
+ wns, mActiveSpecificNetworkRequestSpecifier)) {
+ return false;
+ }
+ // If there is a connected request, only proceed if the new request is from a foreground
+ // app.
+ if (!canNewRequestOverrideExistingRequest(
+ wns, mConnectedSpecificNetworkRequestSpecifier)) {
+ return false;
}
if (mVerboseLoggingEnabled) {
Log.v(TAG, "Accepted network request with specifier from fg "
@@ -389,7 +408,7 @@ public class WifiNetworkFactory extends NetworkFactory {
}
retrieveWifiScanner();
// Reset state from any previous request.
- resetStateForActiveRequestStart();
+ setupForActiveRequest();
// Store the active network request.
mActiveSpecificNetworkRequest = new NetworkRequest(networkRequest);
@@ -427,16 +446,23 @@ public class WifiNetworkFactory extends NetworkFactory {
Log.e(TAG, "Wifi off. Ignoring");
return;
}
- if (mActiveSpecificNetworkRequest == null) {
- Log.e(TAG, "Network release received with no active request. Ignoring");
+ if (mActiveSpecificNetworkRequest == null && mConnectedSpecificNetworkRequest == null) {
+ Log.e(TAG, "Network release received with no active/connected request."
+ + " Ignoring");
return;
}
- if (!mActiveSpecificNetworkRequest.equals(networkRequest)) {
- Log.e(TAG, "Network specifier does not match the active request. Ignoring");
- return;
+ if (Objects.equals(mActiveSpecificNetworkRequest, networkRequest)) {
+ Log.i(TAG, "App released request, cancelling "
+ + mActiveSpecificNetworkRequest);
+ teardownForActiveRequest();
+ } else if (Objects.equals(mConnectedSpecificNetworkRequest, networkRequest)) {
+ Log.i(TAG, "App released request, cancelling "
+ + mConnectedSpecificNetworkRequest);
+ teardownForConnectedNetwork();
+ } else {
+ Log.e(TAG, "Network specifier does not match the active/connected request."
+ + " Ignoring");
}
- Log.w(TAG, "App released request, cancelling " + mActiveSpecificNetworkRequest);
- resetStateForActiveRequestEnd();
}
}
@@ -448,10 +474,11 @@ public class WifiNetworkFactory extends NetworkFactory {
}
/**
- * Check if there is at-least one connection request.
+ * Check if there is at least one connection request.
*/
public boolean hasConnectionRequests() {
- return mGenericConnectionReqCount > 0 || mActiveSpecificNetworkRequest != null;
+ return mGenericConnectionReqCount > 0 || mActiveSpecificNetworkRequest != null
+ || mConnectedSpecificNetworkRequest != null;
}
/**
@@ -534,7 +561,7 @@ public class WifiNetworkFactory extends NetworkFactory {
private void handleRejectUserSelection() {
Log.w(TAG, "User dismissed notification, cancelling " + mActiveSpecificNetworkRequest);
- resetStateForActiveRequestEnd();
+ teardownForActiveRequest();
}
private boolean isUserSelectedNetwork(WifiConfiguration config) {
@@ -578,10 +605,8 @@ public class WifiNetworkFactory extends NetworkFactory {
+ callback, e);
}
}
- // Cancel connection timeout alarm.
- cancelConnectionTimeout();
- // Set the connection status.
- mIsConnectedToUserSelectedNetwork = true;
+ // transition the request from "active" to "connected".
+ setupForConnectedRequest();
}
/**
@@ -609,7 +634,7 @@ public class WifiNetworkFactory extends NetworkFactory {
+ callback, e);
}
}
- resetStateForActiveRequestEnd();
+ teardownForActiveRequest();
}
/**
@@ -642,18 +667,19 @@ public class WifiNetworkFactory extends NetworkFactory {
} else {
if (mActiveSpecificNetworkRequest != null) {
Log.w(TAG, "Wifi off, cancelling " + mActiveSpecificNetworkRequest);
- resetStateForActiveRequestEnd();
+ teardownForActiveRequest();
+ }
+ if (mConnectedSpecificNetworkRequest != null) {
+ Log.w(TAG, "Wifi off, cancelling " + mConnectedSpecificNetworkRequest);
+ teardownForConnectedNetwork();
}
}
mWifiEnabled = enabled;
}
- private void resetState() {
- if (mIsConnectedToUserSelectedNetwork) {
- Log.i(TAG, "Disconnecting from network on reset");
- mWifiInjector.getClientModeImpl().disconnectCommand();
- }
- // Send the abort to the UI.
+ // Common helper method for start/end of active request processing.
+ private void cleanupActiveRequest() {
+ // Send the abort to the UI for the current active request.
for (INetworkRequestMatchCallback callback : mRegisteredCallbacks.getCallbacks()) {
try {
callback.onAbort();
@@ -666,8 +692,8 @@ public class WifiNetworkFactory extends NetworkFactory {
mActiveSpecificNetworkRequestSpecifier = null;
mUserSelectedNetwork = null;
mUserSelectedNetworkConnectRetryCount = 0;
- mIsConnectedToUserSelectedNetwork = false;
mIsPeriodicScanPaused = false;
+ // Cancel periodic scan, connection timeout alarm.
cancelPeriodicScans();
cancelConnectionTimeout();
// Remove any callbacks registered for the request.
@@ -676,15 +702,42 @@ public class WifiNetworkFactory extends NetworkFactory {
// attempt failed.
}
- // Invoked at the termination of previous active request processing.
- private void resetStateForActiveRequestEnd() {
- resetState();
- mWifiConnectivityManager.setSpecificNetworkRequestInProgress(false);
+ // Invoked at the start of new active request processing.
+ private void setupForActiveRequest() {
+ if (mActiveSpecificNetworkRequest != null) {
+ cleanupActiveRequest();
+ }
+ }
+
+ // Invoked at the termination of current active request processing.
+ private void teardownForActiveRequest() {
+ cleanupActiveRequest();
+ // ensure there is no connected request in progress.
+ if (mConnectedSpecificNetworkRequest == null) {
+ mWifiConnectivityManager.setSpecificNetworkRequestInProgress(false);
+ }
}
- // Invoked at the start of new active request processing.
- private void resetStateForActiveRequestStart() {
- resetState();
+ // Invoked at the start of new connected request processing.
+ private void setupForConnectedRequest() {
+ mConnectedSpecificNetworkRequest = mActiveSpecificNetworkRequest;
+ mConnectedSpecificNetworkRequestSpecifier = mActiveSpecificNetworkRequestSpecifier;
+ mActiveSpecificNetworkRequest = null;
+ mActiveSpecificNetworkRequestSpecifier = null;
+ // Cancel connection timeout alarm.
+ cancelConnectionTimeout();
+ }
+
+ // Invoked at the termination of current connected request processing.
+ private void teardownForConnectedNetwork() {
+ Log.i(TAG, "Disconnecting from network on reset");
+ mWifiInjector.getClientModeImpl().disconnectCommand();
+ mConnectedSpecificNetworkRequest = null;
+ mConnectedSpecificNetworkRequestSpecifier = null;
+ // ensure there is no active request in progress.
+ if (mActiveSpecificNetworkRequest == null) {
+ mWifiConnectivityManager.setSpecificNetworkRequestInProgress(false);
+ }
}
/**
@@ -798,14 +851,12 @@ public class WifiNetworkFactory extends NetworkFactory {
// request.
private List<ScanResult> getNetworksMatchingActiveNetworkRequest(
ScanResult[] scanResults) {
- if (mActiveSpecificNetworkRequest == null) {
+ if (mActiveSpecificNetworkRequestSpecifier == null) {
Log.e(TAG, "Scan results received with no active network request. Ignoring...");
return new ArrayList<>();
}
List<ScanResult> matchedScanResults = new ArrayList<>();
- WifiNetworkSpecifier wns = (WifiNetworkSpecifier)
- mActiveSpecificNetworkRequest.networkCapabilities.getNetworkSpecifier();
- checkNotNull(wns);
+ WifiNetworkSpecifier wns = mActiveSpecificNetworkRequestSpecifier;
for (ScanResult scanResult : scanResults) {
if (doesScanResultMatchWifiNetworkSpecifier(wns, scanResult)) {