Merge "[Wi-Fi] Refactor AddAppNetworksFragment to use WifiEntry but not AccessPoint." into rvc-dev am: 6f16992d3c am: a3368c723d am: cff829902d

Change-Id: I195c78382e551f15deb40c036e21aa5f202a9faa
This commit is contained in:
TreeHugger Robot
2020-03-26 15:46:27 +00:00
committed by Automerger Merge Worker
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.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<Integer> 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<AccessPoint> allAccessPoints) {
void updateScanResultsToUi(List<WifiEntry> 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<AccessPoint> matchedAccessPoint = allAccessPoints
.stream()
.filter(accesspoint -> accesspoint.matches(
uiConfigurationItem.mWifiNetworkSuggestion.getWifiConfiguration()))
if (allEntries != null) {
final Optional<WifiEntry> 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.
}
}

View File

@@ -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<Integer> 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) {