[Wi-Fi] Apply cache in WifiTracker to update the signal icon immediatelly.

issue: Signal icon on the add wifi network feature need to wait for the scan result.
Solution: Apply the cache in the WifiTracker to update signal icon for
shortening the waiting time of new scan result.

Bug: 146842198
Test: Add following unit test cases to test signal level has been updated correctly:
      1. withOneSuggestion_whenScanResultChangedButWifiOff_uiListShouldHaveZeroLevel.

Change-Id: Id72e2b43e020f2cafa2af4af5ffb1c28529002bd
This commit is contained in:
govenliu
2020-02-03 11:25:41 +08:00
parent d737601a66
commit e88f5efeb9
2 changed files with 56 additions and 14 deletions

View File

@@ -715,7 +715,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
}
@VisibleForTesting
void updateScanResults(List<AccessPoint> allAccessPoints) {
void updateScanResultsToUi(List<AccessPoint> allAccessPoints) {
if (mUiToRequestedList == null) {
// Nothing need to be updated.
return;
@@ -723,13 +723,16 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
// Update the signal level of the UI networks.
for (UiConfigurationItem uiConfigurationItem : mUiToRequestedList) {
final Optional<AccessPoint> matchedAccessPoint = allAccessPoints
.stream()
.filter(accesspoint -> accesspoint.matches(
uiConfigurationItem.mWifiNetworkSuggestion.getWifiConfiguration()))
.findFirst();
uiConfigurationItem.mLevel =
matchedAccessPoint.isPresent() ? matchedAccessPoint.get().getLevel() : 0;
uiConfigurationItem.mLevel = 0;
if (allAccessPoints != null) {
final Optional<AccessPoint> matchedAccessPoint = allAccessPoints
.stream()
.filter(accesspoint -> accesspoint.matches(
uiConfigurationItem.mWifiNetworkSuggestion.getWifiConfiguration()))
.findFirst();
uiConfigurationItem.mLevel =
matchedAccessPoint.isPresent() ? matchedAccessPoint.get().getLevel() : 0;
}
}
if (mIsSingleNetwork) {
@@ -741,8 +744,18 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
}
}
@Override
public void onResume() {
super.onResume();
onAccessPointsChanged();
}
/**
* Update the results when data changes
*/
@Override
public void onAccessPointsChanged() {
updateScanResults(mWifiTracker.getAccessPoints());
updateScanResultsToUi(
mWifiTracker.getManager().isWifiEnabled() ? mWifiTracker.getAccessPoints() : null);
}
}

View File

@@ -26,6 +26,7 @@ import static org.mockito.Mockito.when;
import android.app.settings.SettingsEnums;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkSuggestion;
import android.os.Bundle;
import android.os.Parcelable;
@@ -59,7 +60,8 @@ public class AddAppNetworksFragmentTest {
private static final String FAKE_NEW_SAVED_WPA_SSID = "\"fake_new_wpa_ssid\"";
private static final String KEY_SSID = "key_ssid";
private static final String KEY_SECURITY = "key_security";
private static final int SCANED_LEVEL = 4;
private static final int SCANED_LEVEL0 = 0;
private static final int SCANED_LEVEL4 = 4;
private AddAppNetworksFragment mAddAppNetworksFragment;
private List<WifiNetworkSuggestion> mFakedSpecifiedNetworksList;
@@ -76,6 +78,9 @@ public class AddAppNetworksFragmentTest {
@Mock
private WifiTracker mMockWifiTracker;
@Mock
private WifiManager mMockWifiManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -86,10 +91,13 @@ 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);
setUpOneScannedNetworkWithScanedLevel();
setUpOneScannedNetworkWithScanedLevel4();
}
@Test
@@ -208,6 +216,7 @@ public class AddAppNetworksFragmentTest {
@Test
public void withOneSuggestion_whenScanResultChanged_uiListShouldHaveNewLevel() {
// Arrange
when(mAddAppNetworksFragment.mWifiTracker.getManager().isWifiEnabled()).thenReturn(true);
// Setup a fake saved network list and assign to fragment.
addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry);
// Setup one specified networks and its results and assign to fragment.
@@ -221,16 +230,36 @@ public class AddAppNetworksFragmentTest {
// Assert
assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo(
SCANED_LEVEL);
SCANED_LEVEL4);
}
private void setUpOneScannedNetworkWithScanedLevel() {
@Test
public void withOneSuggestion_whenScanResultChangedButWifiOff_uiListShouldHaveZeroLevel() {
// Arrange
when(mAddAppNetworksFragment.mWifiTracker.getManager().isWifiEnabled()).thenReturn(false);
// Setup a fake saved network list and assign to fragment.
addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry);
// Setup one specified networks and its results and assign to fragment.
addOneSpecifiedRegularNetworkSuggestion(mNewOpenSuggestionEntry);
mAddAppNetworksFragment.mAllSpecifiedNetworksList = mFakedSpecifiedNetworksList;
// Call filterSavedNetworks to generate necessary objects.
mAddAppNetworksFragment.filterSavedNetworks(mFakeSavedNetworksList);
// Act
mAddAppNetworksFragment.onAccessPointsChanged();
// Assert
assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(0).mLevel).isEqualTo(
SCANED_LEVEL0);
}
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_LEVEL);
when(mMockAccessPoint.getLevel()).thenReturn(SCANED_LEVEL4);
}
private void addOneSavedNetworkConfiguration(@NonNull WifiConfiguration wifiConfiguration) {