From 811818bfa82b7633ffa66b31eadbf5ed4d9565bd Mon Sep 17 00:00:00 2001 From: Quang Luong Date: Thu, 19 Dec 2019 15:34:10 -0800 Subject: Fix StandardWifiEntry connect success callback trigger Listeners on StandardWifiEntry would be notified for connection success when the call to WifiManager.connect() returned success. However, the success signal from WifiManager indicates that the call succeeded but not that the actual network was connected to. This resulted in Settings showing a toast "Connected to " immediately after the connect button was pressed. This change modifies the success callback to run after the connection is completed. Bug: 70983952 Test: manual - tap on Connect in the Network Details Page and verify the "Connected to " toast appears only after the network is connected to. Change-Id: If825d33cdfad50950e18186c6027d4fea0ddc035 --- .../StandardNetworkDetailsTracker.java | 13 +++++++ .../android/wifitrackerlib/StandardWifiEntry.java | 40 ++++++++++++++++++++-- .../src/com/android/wifitrackerlib/WifiEntry.java | 26 +------------- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java index 574d33cdb..3f0870dad 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardNetworkDetailsTracker.java @@ -26,8 +26,10 @@ import static java.util.stream.Collectors.toList; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.NetworkScoreManager; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.text.TextUtils; @@ -66,6 +68,9 @@ class StandardNetworkDetailsTracker extends NetworkDetailsTracker { cacheNewScanResults(); conditionallyUpdateScanResults(true /* lastScanSucceeded */); conditionallyUpdateConfig(); + final WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); + final NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo(); + mChosenEntry.updateConnectionInfo(wifiInfo, networkInfo); } @AnyThread @@ -110,6 +115,14 @@ class StandardNetworkDetailsTracker extends NetworkDetailsTracker { } } + @WorkerThread + @Override + protected void handleNetworkStateChangedAction(@NonNull Intent intent) { + checkNotNull(intent, "Intent cannot be null!"); + mChosenEntry.updateConnectionInfo(mWifiManager.getConnectionInfo(), + (NetworkInfo) intent.getExtra(WifiManager.EXTRA_NETWORK_INFO)); + } + /** * Updates the tracked entry's scan results up to the max scan age (or more, if the last scan * was unsuccessful). If Wifi is disabled, the tracked entry's level will be cleared. diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java index e988bd163..0586f1c5b 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java @@ -56,6 +56,7 @@ class StandardWifiEntry extends WifiEntry { private final @Security int mSecurity; @Nullable private WifiConfiguration mWifiConfig; @Nullable private NetworkInfo mNetworkInfo; + private boolean mCalledConnect = false; private int mLevel = WIFI_LEVEL_UNREACHABLE; @@ -208,8 +209,8 @@ class StandardWifiEntry extends WifiEntry { @Override public boolean canConnect() { - // TODO(b/70983952): Fill this method in - return false; + return mLevel != WIFI_LEVEL_UNREACHABLE + && getConnectedState() == CONNECTED_STATE_DISCONNECTED; } @Override @@ -435,6 +436,10 @@ class StandardWifiEntry extends WifiEntry { if (wifiInfoRssi != INVALID_RSSI) { mLevel = mWifiManager.calculateSignalLevel(wifiInfoRssi); } + if (mCalledConnect && getConnectedState() == CONNECTED_STATE_CONNECTED) { + mCalledConnect = false; + notifyOnConnectResult(WifiEntryCallback.CONNECT_STATUS_SUCCESS); + } } else { mNetworkInfo = null; } @@ -454,4 +459,35 @@ class StandardWifiEntry extends WifiEntry { return KEY_PREFIX + removeDoubleQuotes(config.SSID) + "," + getSecurityFromWifiConfiguration(config); } + + class ConnectListener implements WifiManager.ActionListener { + @Override + public void onSuccess() { + mCalledConnect = true; + // If we aren't connected to the network after 10 seconds, trigger the failure callback + mCallbackHandler.postDelayed(() -> { + if (mCalledConnect && getConnectedState() == CONNECTED_STATE_DISCONNECTED) { + notifyOnConnectResult(WifiEntryCallback.CONNECT_STATUS_FAILURE_UNKNOWN); + mCalledConnect = false; + } + }, 10_000 /* delayMillis */); + } + + @Override + public void onFailure(int i) { + notifyOnConnectResult(WifiEntryCallback.CONNECT_STATUS_FAILURE_UNKNOWN); + } + } + + class ForgetListener implements WifiManager.ActionListener { + @Override + public void onSuccess() { + notifyOnForgetResult(WifiEntryCallback.FORGET_STATUS_SUCCESS); + } + + @Override + public void onFailure(int i) { + notifyOnForgetResult(WifiEntryCallback.FORGET_STATUS_FAILURE_UNKNOWN); + } + } } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java index 4caa312c3..7bf94b5c5 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java @@ -133,7 +133,7 @@ public abstract class WifiEntry implements Comparable { // Callback associated with this WifiEntry. Subclasses should call its methods appropriately. private WifiEntryCallback mListener; - private Handler mCallbackHandler; + protected Handler mCallbackHandler; WifiEntry(@NonNull Handler callbackHandler, boolean forSavedNetworksPage, @NonNull WifiManager wifiManager) throws IllegalArgumentException { @@ -451,28 +451,4 @@ public abstract class WifiEntry implements Comparable { mCallbackHandler.post(() -> mListener.onSignInResult(status)); } } - - class ConnectListener implements WifiManager.ActionListener { - @Override - public void onSuccess() { - notifyOnConnectResult(WifiEntryCallback.CONNECT_STATUS_SUCCESS); - } - - @Override - public void onFailure(int i) { - notifyOnConnectResult(WifiEntryCallback.CONNECT_STATUS_FAILURE_UNKNOWN); - } - } - - class ForgetListener implements WifiManager.ActionListener { - @Override - public void onSuccess() { - notifyOnForgetResult(WifiEntryCallback.FORGET_STATUS_SUCCESS); - } - - @Override - public void onFailure(int i) { - notifyOnForgetResult(WifiEntryCallback.FORGET_STATUS_FAILURE_UNKNOWN); - } - } } -- cgit v1.2.3 From 50f5b40b2affd4e41a03bf6d6a06b33453263821 Mon Sep 17 00:00:00 2001 From: Quang Luong Date: Thu, 19 Dec 2019 16:12:06 -0800 Subject: Implement StandardWifiEntry.setAutoJoinEnabled() Filled out StandardWifiEntry methods related to set autojoin enabled Bug: 70983952 Test: atest WifiTrackerLibTests Change-Id: Iba86202c25a1abaf87dc0440c19b2a3528bd3670 --- .../src/com/android/wifitrackerlib/StandardWifiEntry.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java index 0586f1c5b..4f0ee9fb7 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java @@ -352,19 +352,21 @@ class StandardWifiEntry extends WifiEntry { @Override public boolean isAutoJoinEnabled() { - // TODO(b/70983952): Fill this method in - return true; + if (mWifiConfig == null) { + return false; + } + + return mWifiConfig.allowAutojoin; } @Override public boolean canSetAutoJoinEnabled() { - // TODO(b/70983952): Fill this method in - return false; + return isSaved(); } @Override public void setAutoJoinEnabled(boolean enabled) { - // TODO(b/70983952): Fill this method in + mWifiManager.allowAutojoin(mWifiConfig.networkId, enabled); } @WorkerThread -- cgit v1.2.3 From 2b1b0b1a60bf206f8d04031ee3cec25b0b7bfa07 Mon Sep 17 00:00:00 2001 From: Quang Luong Date: Thu, 19 Dec 2019 17:03:31 -0800 Subject: Handle unsaved secure StandardWifiEntry.connect() Calling StandardWifiEntry.connect() for unsaved secure networks should result in the listener receiving CONNECT_STATUS_FAILURE_NO_CONFIG. The client should should then go through the appropriate flow for adding a new network. Bug: 70983952 Test: atest StandardWifiEntryTest Change-Id: Iad6467bd7efa0d2794136d9da29248f279647759 --- .../com/android/wifitrackerlib/StandardWifiEntry.java | 3 +-- .../android/wifitrackerlib/StandardWifiEntryTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java index 4f0ee9fb7..eefae5485 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java @@ -236,8 +236,7 @@ class StandardWifiEntry extends WifiEntry { mWifiManager.connect(connectConfig, new ConnectListener()); } else { // Secure network - // TODO(b/70983952): Add support for unsaved secure networks - // Return bad password failure to prompt user to enter password. + notifyOnConnectResult(WifiEntryCallback.CONNECT_STATUS_FAILURE_NO_CONFIG); } } else { // Saved network diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java index 7b9d100e4..e4ddaa364 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java @@ -369,6 +369,22 @@ public class StandardWifiEntryTest { verify(mMockWifiManager, times(1)).connect(any(), any()); } + @Test + public void testConnect_unsavedSecureNetwork_returnsNoConfigFailure() { + final ScanResult secureScan = buildScanResult("ssid", "bssid0", 0, GOOD_RSSI); + secureScan.capabilities = "PSK"; + final StandardWifiEntry entry = new StandardWifiEntry(mTestHandler, + Arrays.asList(secureScan), + mMockWifiManager); + entry.setListener(mMockListener); + + entry.connect(); + mTestLooper.dispatchAll(); + + verify(mMockListener, times(1)) + .onConnectResult(WifiEntry.WifiEntryCallback.CONNECT_STATUS_FAILURE_NO_CONFIG); + } + @Test public void testGetMacAddress_randomizationOn_usesRandomizedValue() { final String randomizedMac = "01:23:45:67:89:ab"; -- cgit v1.2.3