[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
This commit is contained in:
govenliu
2020-03-26 11:54:42 +08:00
parent 0747e57f25
commit 0fc956bc57
2 changed files with 83 additions and 48 deletions

View File

@@ -24,6 +24,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.KeyMgmt; import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@@ -31,7 +33,12 @@ import android.net.wifi.WifiNetworkSuggestion;
import android.net.wifi.hotspot2.PasspointConfiguration; import android.net.wifi.hotspot2.PasspointConfiguration;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Process;
import android.os.SimpleClock;
import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@@ -53,10 +60,11 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.InstrumentedFragment;
import com.android.settingslib.wifi.AccessPoint; import com.android.wifitrackerlib.WifiEntry;
import com.android.settingslib.wifi.WifiTracker; import com.android.wifitrackerlib.WifiPickerTracker;
import com.android.settingslib.wifi.WifiTrackerFactory;
import java.time.Clock;
import java.time.ZoneOffset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -66,7 +74,7 @@ import java.util.Optional;
* choose on either saving those networks or rejecting the request. * choose on either saving those networks or rejecting the request.
*/ */
public class AddAppNetworksFragment extends InstrumentedFragment implements public class AddAppNetworksFragment extends InstrumentedFragment implements
WifiTracker.WifiListener { WifiPickerTracker.WifiPickerTrackerCallback {
public static final String TAG = "AddAppNetworksFragment"; public static final String TAG = "AddAppNetworksFragment";
// Possible result values in each item of the returned result list, which is used // 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. // Signal level for the initial signal icon.
@VisibleForTesting @VisibleForTesting
static final int INITIAL_RSSI_SIGNAL_LEVEL = 0; 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; private static final int MAX_SPECIFIC_NETWORKS_COUNT = 5;
// Duration for showing different status message. // Duration for showing different status message.
private static final long SHOW_SAVING_INTERVAL_MILLIS = 500L; private static final long SHOW_SAVING_INTERVAL_MILLIS = 500L;
private static final long SHOW_SAVED_INTERVAL_MILLIS = 1000L; 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 @VisibleForTesting
FragmentActivity mActivity; FragmentActivity mActivity;
@VisibleForTesting @VisibleForTesting
@@ -110,7 +123,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
@VisibleForTesting @VisibleForTesting
List<Integer> mResultCodeArrayList; List<Integer> mResultCodeArrayList;
@VisibleForTesting @VisibleForTesting
WifiTracker mWifiTracker; WifiPickerTracker mWifiPickerTracker;
private boolean mIsSingleNetwork; private boolean mIsSingleNetwork;
private boolean mAnyNetworkSavedSuccess; private boolean mAnyNetworkSavedSuccess;
@@ -120,6 +133,8 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
private UiConfigurationItemAdapter mUiConfigurationItemAdapter; private UiConfigurationItemAdapter mUiConfigurationItemAdapter;
private WifiManager.ActionListener mSaveListener; private WifiManager.ActionListener mSaveListener;
private WifiManager mWifiManager; private WifiManager mWifiManager;
// Worker thread used for WifiPickerTracker work
private HandlerThread mWorkerThread;
private final Handler mHandler = new Handler() { private final Handler mHandler = new Handler() {
@Override @Override
@@ -164,9 +179,26 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
mActivity = getActivity(); mActivity = getActivity();
mWifiManager = mActivity.getSystemService(WifiManager.class); mWifiManager = mActivity.getSystemService(WifiManager.class);
mWifiTracker = WifiTrackerFactory.create(mActivity.getApplication(), this, mWorkerThread = new HandlerThread(
getSettingsLifecycle(), true /* includeSaved */, true /* includeScans */); 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); 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 @VisibleForTesting
void updateScanResultsToUi(List<AccessPoint> allAccessPoints) { void updateScanResultsToUi(List<WifiEntry> allEntries) {
if (mUiToRequestedList == null) { if (mUiToRequestedList == null) {
// Nothing need to be updated. // Nothing need to be updated.
return; return;
@@ -724,14 +748,15 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
// Update the signal level of the UI networks. // Update the signal level of the UI networks.
for (UiConfigurationItem uiConfigurationItem : mUiToRequestedList) { for (UiConfigurationItem uiConfigurationItem : mUiToRequestedList) {
uiConfigurationItem.mLevel = 0; uiConfigurationItem.mLevel = 0;
if (allAccessPoints != null) { if (allEntries != null) {
final Optional<AccessPoint> matchedAccessPoint = allAccessPoints final Optional<WifiEntry> matchedWifiEntry = allEntries.stream()
.stream() .filter(wifiEntry -> TextUtils.equals(
.filter(accesspoint -> accesspoint.matches( uiConfigurationItem.mWifiNetworkSuggestion.getSsid(),
uiConfigurationItem.mWifiNetworkSuggestion.getWifiConfiguration())) wifiEntry.getSsid()))
.filter(wifiEntry -> !wifiEntry.isSaved())
.findFirst(); .findFirst();
uiConfigurationItem.mLevel = 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 @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
onAccessPointsChanged(); onWifiEntriesChanged();
}
/** Called when the state of Wifi has changed. */
@Override
public void onWifiStateChanged() {
onWifiEntriesChanged();
} }
/** /**
* Update the results when data changes * Update the results when data changes
*/ */
@Override @Override
public void onAccessPointsChanged() { public void onWifiEntriesChanged() {
updateScanResultsToUi( 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.
} }
} }

View File

@@ -18,8 +18,6 @@ package com.android.settings.wifi.addappnetworks;
import static com.google.common.truth.Truth.assertThat; 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.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -36,9 +34,8 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.wifi.AccessPoint; import com.android.wifitrackerlib.WifiEntry;
import com.android.settingslib.wifi.WifiTracker; import com.android.wifitrackerlib.WifiPickerTracker;
import com.android.settingslib.wifi.WifiTrackerFactory;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -53,6 +50,7 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class AddAppNetworksFragmentTest { public class AddAppNetworksFragmentTest {
private static final String FAKE_APP_NAME = "fake_app_name"; 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_WPA_SSID = "fake_new_wpa_ssid";
private static final String FAKE_NEW_OPEN_SSID = "fake_new_open_ssid"; private static final String FAKE_NEW_OPEN_SSID = "fake_new_open_ssid";
@@ -73,10 +71,10 @@ public class AddAppNetworksFragmentTest {
private ArrayList<Integer> mFakedResultArrayList = new ArrayList<>(); private ArrayList<Integer> mFakedResultArrayList = new ArrayList<>();
@Mock @Mock
private AccessPoint mMockAccessPoint; private WifiEntry mMockWifiEntry;
@Mock @Mock
private WifiTracker mMockWifiTracker; private WifiPickerTracker mMockWifiPickerTracker;
@Mock @Mock
private WifiManager mMockWifiManager; private WifiManager mMockWifiManager;
@@ -91,12 +89,8 @@ public class AddAppNetworksFragmentTest {
WifiConfiguration.KeyMgmt.NONE, null); WifiConfiguration.KeyMgmt.NONE, null);
mSavedWpaConfigurationEntry = generateRegularWifiConfiguration(FAKE_NEW_SAVED_WPA_SSID, mSavedWpaConfigurationEntry = generateRegularWifiConfiguration(FAKE_NEW_SAVED_WPA_SSID,
WifiConfiguration.KeyMgmt.WPA_PSK, "\"1234567890\""); WifiConfiguration.KeyMgmt.WPA_PSK, "\"1234567890\"");
when(mMockWifiTracker.getManager()).thenReturn(mMockWifiManager);
when(mMockWifiManager.isWifiEnabled()).thenReturn(true); when(mMockWifiManager.isWifiEnabled()).thenReturn(true);
mAddAppNetworksFragment.mWifiPickerTracker = mMockWifiPickerTracker;
mAddAppNetworksFragment.mWifiTracker = mMockWifiTracker;
WifiTrackerFactory.setTestingWifiTracker(mMockWifiTracker);
setUpOneScannedNetworkWithScanedLevel4(); setUpOneScannedNetworkWithScanedLevel4();
} }
@@ -216,7 +210,7 @@ public class AddAppNetworksFragmentTest {
@Test @Test
public void withOneSuggestion_whenScanResultChanged_uiListShouldHaveNewLevel() { public void withOneSuggestion_whenScanResultChanged_uiListShouldHaveNewLevel() {
// Arrange // 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. // Setup a fake saved network list and assign to fragment.
addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry); addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry);
// Setup one specified networks and its results and assign to fragment. // Setup one specified networks and its results and assign to fragment.
@@ -226,7 +220,7 @@ public class AddAppNetworksFragmentTest {
mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList); mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList);
// Act // Act
mAddAppNetworksFragment.onAccessPointsChanged(); mAddAppNetworksFragment.onWifiEntriesChanged();
// Assert // Assert
assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo( assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo(
@@ -236,7 +230,7 @@ public class AddAppNetworksFragmentTest {
@Test @Test
public void withOneSuggestion_whenScanResultChangedButWifiOff_uiListShouldHaveZeroLevel() { public void withOneSuggestion_whenScanResultChangedButWifiOff_uiListShouldHaveZeroLevel() {
// Arrange // 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. // Setup a fake saved network list and assign to fragment.
addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry); addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry);
// Setup one specified networks and its results and assign to fragment. // Setup one specified networks and its results and assign to fragment.
@@ -246,7 +240,7 @@ public class AddAppNetworksFragmentTest {
mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList); mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList);
// Act // Act
mAddAppNetworksFragment.onAccessPointsChanged(); mAddAppNetworksFragment.onWifiEntriesChanged();
// Assert // Assert
assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo( assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo(
@@ -255,11 +249,10 @@ public class AddAppNetworksFragmentTest {
private void setUpOneScannedNetworkWithScanedLevel4() { private void setUpOneScannedNetworkWithScanedLevel4() {
final ArrayList list = new ArrayList<>(); final ArrayList list = new ArrayList<>();
list.add(mMockAccessPoint); list.add(mMockWifiEntry);
when(mMockWifiTracker.getAccessPoints()).thenReturn(list); when(mMockWifiPickerTracker.getWifiEntries()).thenReturn(list);
when(mMockAccessPoint.getSsidStr()).thenReturn(FAKE_NEW_OPEN_SSID); when(mMockWifiEntry.getSsid()).thenReturn(FAKE_NEW_OPEN_SSID);
when(mMockAccessPoint.matches(any(WifiConfiguration.class))).thenReturn(true); when(mMockWifiEntry.getLevel()).thenReturn(SCANED_LEVEL4);
when(mMockAccessPoint.getLevel()).thenReturn(SCANED_LEVEL4);
} }
private void addOneSavedNetworkConfiguration(@NonNull WifiConfiguration wifiConfiguration) { private void addOneSavedNetworkConfiguration(@NonNull WifiConfiguration wifiConfiguration) {