From 0fc956bc57467ab81ab14be5c88d0c52b8ae4b8f Mon Sep 17 00:00:00 2001 From: govenliu Date: Thu, 26 Mar 2020 11:54:42 +0800 Subject: [PATCH] [Wi-Fi] Refactor AddAppNetworksFragment to use WifiEntry but not AccessPoint. Because WifiTracker2 refactoring in framework side is done, Settings App need to refactor AddAppNetworksFragment to use WifiEntry but not AccessPoint. Bug: 152454787 Test: make RunSettingsRoboTests ROBOTEST_FILTER=AddAppNetworksFragmentTest Change-Id: Ica2fb7e7fcac112140e5d64f3e4193222c974352 --- .../AddAppNetworksFragment.java | 96 +++++++++++++------ .../AddAppNetworksFragmentTest.java | 35 +++---- 2 files changed, 83 insertions(+), 48 deletions(-) diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java index 7a5677f2c53..008df248eb0 100644 --- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java +++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java @@ -24,6 +24,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; +import android.net.ConnectivityManager; +import android.net.NetworkScoreManager; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration.KeyMgmt; import android.net.wifi.WifiManager; @@ -31,7 +33,12 @@ import android.net.wifi.WifiNetworkSuggestion; import android.net.wifi.hotspot2.PasspointConfiguration; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; import android.os.Message; +import android.os.Process; +import android.os.SimpleClock; +import android.os.SystemClock; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -53,10 +60,11 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.InstrumentedFragment; -import com.android.settingslib.wifi.AccessPoint; -import com.android.settingslib.wifi.WifiTracker; -import com.android.settingslib.wifi.WifiTrackerFactory; +import com.android.wifitrackerlib.WifiEntry; +import com.android.wifitrackerlib.WifiPickerTracker; +import java.time.Clock; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -66,7 +74,7 @@ import java.util.Optional; * choose on either saving those networks or rejecting the request. */ public class AddAppNetworksFragment extends InstrumentedFragment implements - WifiTracker.WifiListener { + WifiPickerTracker.WifiPickerTrackerCallback { public static final String TAG = "AddAppNetworksFragment"; // Possible result values in each item of the returned result list, which is used @@ -86,13 +94,18 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements // Signal level for the initial signal icon. @VisibleForTesting static final int INITIAL_RSSI_SIGNAL_LEVEL = 0; - // Max networks count within one request + // Max networks count within one request. private static final int MAX_SPECIFIC_NETWORKS_COUNT = 5; // Duration for showing different status message. private static final long SHOW_SAVING_INTERVAL_MILLIS = 500L; private static final long SHOW_SAVED_INTERVAL_MILLIS = 1000L; + // Max age of tracked WifiEntries. + private static final long MAX_SCAN_AGE_MILLIS = 15_000; + // Interval between initiating WifiPickerTracker scans. + private static final long SCAN_INTERVAL_MILLIS = 10_000; + @VisibleForTesting FragmentActivity mActivity; @VisibleForTesting @@ -110,7 +123,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements @VisibleForTesting List mResultCodeArrayList; @VisibleForTesting - WifiTracker mWifiTracker; + WifiPickerTracker mWifiPickerTracker; private boolean mIsSingleNetwork; private boolean mAnyNetworkSavedSuccess; @@ -120,6 +133,8 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements private UiConfigurationItemAdapter mUiConfigurationItemAdapter; private WifiManager.ActionListener mSaveListener; private WifiManager mWifiManager; + // Worker thread used for WifiPickerTracker work + private HandlerThread mWorkerThread; private final Handler mHandler = new Handler() { @Override @@ -164,9 +179,26 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements @Nullable Bundle savedInstanceState) { mActivity = getActivity(); mWifiManager = mActivity.getSystemService(WifiManager.class); - mWifiTracker = WifiTrackerFactory.create(mActivity.getApplication(), this, - getSettingsLifecycle(), true /* includeSaved */, true /* includeScans */); - + mWorkerThread = new HandlerThread( + TAG + "{" + Integer.toHexString(System.identityHashCode(this)) + "}", + Process.THREAD_PRIORITY_BACKGROUND); + mWorkerThread.start(); + final Clock elapsedRealtimeClock = new SimpleClock(ZoneOffset.UTC) { + @Override + public long millis() { + return SystemClock.elapsedRealtime(); + } + }; + mWifiPickerTracker = new WifiPickerTracker(getSettingsLifecycle(), mActivity, + mActivity.getSystemService(WifiManager.class), + mActivity.getSystemService(ConnectivityManager.class), + mActivity.getSystemService(NetworkScoreManager.class), + new Handler(Looper.getMainLooper()), + mWorkerThread.getThreadHandler(), + elapsedRealtimeClock, + MAX_SCAN_AGE_MILLIS, + SCAN_INTERVAL_MILLIS, + this); return inflater.inflate(R.layout.wifi_add_app_networks, container, false); } @@ -704,18 +736,10 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements } } - @Override - public void onWifiStateChanged(int state) { - // Do nothing - } - @Override - public void onConnectedChanged() { - // Do nothing - } @VisibleForTesting - void updateScanResultsToUi(List allAccessPoints) { + void updateScanResultsToUi(List allEntries) { if (mUiToRequestedList == null) { // Nothing need to be updated. return; @@ -724,14 +748,15 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements // Update the signal level of the UI networks. for (UiConfigurationItem uiConfigurationItem : mUiToRequestedList) { uiConfigurationItem.mLevel = 0; - if (allAccessPoints != null) { - final Optional matchedAccessPoint = allAccessPoints - .stream() - .filter(accesspoint -> accesspoint.matches( - uiConfigurationItem.mWifiNetworkSuggestion.getWifiConfiguration())) + if (allEntries != null) { + final Optional matchedWifiEntry = allEntries.stream() + .filter(wifiEntry -> TextUtils.equals( + uiConfigurationItem.mWifiNetworkSuggestion.getSsid(), + wifiEntry.getSsid())) + .filter(wifiEntry -> !wifiEntry.isSaved()) .findFirst(); uiConfigurationItem.mLevel = - matchedAccessPoint.isPresent() ? matchedAccessPoint.get().getLevel() : 0; + matchedWifiEntry.isPresent() ? matchedWifiEntry.get().getLevel() : 0; } } @@ -747,15 +772,32 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements @Override public void onResume() { super.onResume(); - onAccessPointsChanged(); + onWifiEntriesChanged(); + } + + /** Called when the state of Wifi has changed. */ + @Override + public void onWifiStateChanged() { + onWifiEntriesChanged(); } /** * Update the results when data changes */ @Override - public void onAccessPointsChanged() { + public void onWifiEntriesChanged() { updateScanResultsToUi( - mWifiTracker.getManager().isWifiEnabled() ? mWifiTracker.getAccessPoints() : null); + (mWifiPickerTracker.getWifiState() == WifiManager.WIFI_STATE_ENABLED) + ? mWifiPickerTracker.getWifiEntries() : null); + } + + @Override + public void onNumSavedSubscriptionsChanged() { + // Do nothing. + } + + @Override + public void onNumSavedNetworksChanged() { + // Do nothing. } } diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java index 955b721634b..ac25689da4f 100644 --- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java @@ -18,8 +18,6 @@ package com.android.settings.wifi.addappnetworks; import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -36,9 +34,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import com.android.settings.R; -import com.android.settingslib.wifi.AccessPoint; -import com.android.settingslib.wifi.WifiTracker; -import com.android.settingslib.wifi.WifiTrackerFactory; +import com.android.wifitrackerlib.WifiEntry; +import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; import org.junit.Test; @@ -53,6 +50,7 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class AddAppNetworksFragmentTest { + private static final String FAKE_APP_NAME = "fake_app_name"; private static final String FAKE_NEW_WPA_SSID = "fake_new_wpa_ssid"; private static final String FAKE_NEW_OPEN_SSID = "fake_new_open_ssid"; @@ -73,10 +71,10 @@ public class AddAppNetworksFragmentTest { private ArrayList mFakedResultArrayList = new ArrayList<>(); @Mock - private AccessPoint mMockAccessPoint; + private WifiEntry mMockWifiEntry; @Mock - private WifiTracker mMockWifiTracker; + private WifiPickerTracker mMockWifiPickerTracker; @Mock private WifiManager mMockWifiManager; @@ -91,12 +89,8 @@ public class AddAppNetworksFragmentTest { WifiConfiguration.KeyMgmt.NONE, null); mSavedWpaConfigurationEntry = generateRegularWifiConfiguration(FAKE_NEW_SAVED_WPA_SSID, WifiConfiguration.KeyMgmt.WPA_PSK, "\"1234567890\""); - when(mMockWifiTracker.getManager()).thenReturn(mMockWifiManager); when(mMockWifiManager.isWifiEnabled()).thenReturn(true); - - mAddAppNetworksFragment.mWifiTracker = mMockWifiTracker; - WifiTrackerFactory.setTestingWifiTracker(mMockWifiTracker); - + mAddAppNetworksFragment.mWifiPickerTracker = mMockWifiPickerTracker; setUpOneScannedNetworkWithScanedLevel4(); } @@ -216,7 +210,7 @@ public class AddAppNetworksFragmentTest { @Test public void withOneSuggestion_whenScanResultChanged_uiListShouldHaveNewLevel() { // Arrange - when(mAddAppNetworksFragment.mWifiTracker.getManager().isWifiEnabled()).thenReturn(true); + when(mMockWifiPickerTracker.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED); // Setup a fake saved network list and assign to fragment. addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry); // Setup one specified networks and its results and assign to fragment. @@ -226,7 +220,7 @@ public class AddAppNetworksFragmentTest { mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList); // Act - mAddAppNetworksFragment.onAccessPointsChanged(); + mAddAppNetworksFragment.onWifiEntriesChanged(); // Assert assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo( @@ -236,7 +230,7 @@ public class AddAppNetworksFragmentTest { @Test public void withOneSuggestion_whenScanResultChangedButWifiOff_uiListShouldHaveZeroLevel() { // Arrange - when(mAddAppNetworksFragment.mWifiTracker.getManager().isWifiEnabled()).thenReturn(false); + when(mMockWifiPickerTracker.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); // Setup a fake saved network list and assign to fragment. addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry); // Setup one specified networks and its results and assign to fragment. @@ -246,7 +240,7 @@ public class AddAppNetworksFragmentTest { mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList); // Act - mAddAppNetworksFragment.onAccessPointsChanged(); + mAddAppNetworksFragment.onWifiEntriesChanged(); // Assert assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo( @@ -255,11 +249,10 @@ public class AddAppNetworksFragmentTest { private void setUpOneScannedNetworkWithScanedLevel4() { final ArrayList list = new ArrayList<>(); - list.add(mMockAccessPoint); - when(mMockWifiTracker.getAccessPoints()).thenReturn(list); - when(mMockAccessPoint.getSsidStr()).thenReturn(FAKE_NEW_OPEN_SSID); - when(mMockAccessPoint.matches(any(WifiConfiguration.class))).thenReturn(true); - when(mMockAccessPoint.getLevel()).thenReturn(SCANED_LEVEL4); + list.add(mMockWifiEntry); + when(mMockWifiPickerTracker.getWifiEntries()).thenReturn(list); + when(mMockWifiEntry.getSsid()).thenReturn(FAKE_NEW_OPEN_SSID); + when(mMockWifiEntry.getLevel()).thenReturn(SCANED_LEVEL4); } private void addOneSavedNetworkConfiguration(@NonNull WifiConfiguration wifiConfiguration) {