Merge "Refersh saved Wi-Fi networks" into main

This commit is contained in:
Treehugger Robot
2023-08-08 02:29:39 +00:00
committed by Android (Google) Code Review
4 changed files with 113 additions and 76 deletions

View File

@@ -86,9 +86,18 @@ public class WifiEntryPreference extends RestrictedPreference implements
setLayoutResource(R.layout.preference_access_point);
mFrictionSld = getFrictionStateListDrawable();
mIconInjector = iconInjector;
setWifiEntry(wifiEntry);
}
/**
* Set updated {@link WifiEntry} to refresh the preference
*
* @param wifiEntry An instance of {@link WifiEntry}
*/
public void setWifiEntry(@NonNull WifiEntry wifiEntry) {
mWifiEntry = wifiEntry;
mWifiEntry.setListener(this);
mIconInjector = iconInjector;
refresh();
}
@@ -151,14 +160,9 @@ public class WifiEntryPreference extends RestrictedPreference implements
if (mWifiEntry instanceof HotspotNetworkEntry) {
updateHotspotIcon(((HotspotNetworkEntry) mWifiEntry).getDeviceType());
} else {
int level = mWifiEntry.getLevel();
boolean showX = mWifiEntry.shouldShowXLevelIcon();
if (level != mLevel || showX != mShowX) {
mLevel = level;
mShowX = showX;
updateIcon(mShowX, mLevel);
}
mLevel = mWifiEntry.getLevel();
mShowX = mWifiEntry.shouldShowXLevelIcon();
updateIcon(mShowX, mLevel);
}
setSummary(mWifiEntry.getSummary(false /* concise */));

View File

@@ -66,6 +66,7 @@ public class SavedAccessPointsPreferenceController2 extends BasePreferenceContro
super.displayPreference(screen);
}
@VisibleForTesting
void displayPreference(PreferenceScreen screen, List<WifiEntry> wifiEntries) {
if (wifiEntries == null || wifiEntries.isEmpty()) {
mWifiEntries.clear();
@@ -89,28 +90,32 @@ public class SavedAccessPointsPreferenceController2 extends BasePreferenceContro
* mPreferenceGroup.removeAll() then mPreferenceGroup.addPreference for mWifiEntries.
*/
private void updatePreference() {
// Remove the Preference of removed WifiEntry.
final List<String> removedPreferenceKeys = new ArrayList<>();
final int preferenceCount = mPreferenceGroup.getPreferenceCount();
// Update WifiEntry to existing preference and find out which WifiEntry was removed by key.
List<String> removedKeys = new ArrayList<>();
int preferenceCount = mPreferenceGroup.getPreferenceCount();
for (int i = 0; i < preferenceCount; i++) {
final String key = mPreferenceGroup.getPreference(i).getKey();
if (mWifiEntries.stream().filter(wifiEntry ->
TextUtils.equals(key, wifiEntry.getKey())).count() == 0) {
removedPreferenceKeys.add(key);
WifiEntryPreference pref = (WifiEntryPreference) mPreferenceGroup.getPreference(i);
WifiEntry wifiEntry = mWifiEntries.stream()
.filter(entry -> TextUtils.equals(pref.getKey(), entry.getKey()))
.findFirst()
.orElse(null);
if (wifiEntry != null) {
pref.setWifiEntry(wifiEntry);
} else {
removedKeys.add(pref.getKey());
}
}
for (String removedPreferenceKey : removedPreferenceKeys) {
mPreferenceGroup.removePreference(
mPreferenceGroup.findPreference(removedPreferenceKey));
// Remove preference by WifiEntry's key.
for (String removedKey : removedKeys) {
mPreferenceGroup.removePreference(mPreferenceGroup.findPreference(removedKey));
}
// Add the Preference of new added WifiEntry.
for (WifiEntry wifiEntry : mWifiEntries) {
if (mPreferenceGroup.findPreference(wifiEntry.getKey()) == null) {
final WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry);
WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry);
preference.setKey(wifiEntry.getKey());
preference.setOnPreferenceClickListener(this);
mPreferenceGroup.addPreference(preference);
}
}

View File

@@ -19,7 +19,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -97,6 +99,9 @@ public class WifiEntryPreferenceTest {
when(mMockWifiEntry.getTitle()).thenReturn(MOCK_TITLE);
when(mMockWifiEntry.getSummary(false /* concise */)).thenReturn(MOCK_SUMMARY);
when(mMockWifiEntry.getLevel()).thenReturn(0);
when(mMockWifiEntry.shouldShowXLevelIcon()).thenReturn(false);
when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
when(mMockIconInjector.getIcon(false /* showX */, 0)).thenReturn(mMockDrawable0);
when(mMockIconInjector.getIcon(false /* showX */, 1)).thenReturn(mMockDrawable1);
@@ -115,7 +120,7 @@ public class WifiEntryPreferenceTest {
when(mMockIconInjector.getIcon(true /* showX */, 4))
.thenReturn(mMockShowXDrawable4);
mPref = new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector);
mPref = spy(new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector));
}
@Test
@@ -137,6 +142,27 @@ public class WifiEntryPreferenceTest {
assertThat(pref.getIcon()).isEqualTo(mMockDrawable0);
}
@Test
public void setWifiEntry_connectedStateChanged_setIconAndSummary() {
when(mMockWifiEntry.getLevel()).thenReturn(4);
when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
mPref.setWifiEntry(mMockWifiEntry);
verify(mPref).setIcon(any());
verify(mPref).setSummary(anyString());
// Only the connection state changes.
when(mMockWifiEntry.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED);
reset(mPref);
mPref.setWifiEntry(mMockWifiEntry);
// The icon and summary should be set in case.
verify(mPref).setIcon(any());
verify(mPref).setSummary(anyString());
}
@Test
public void titleChanged_refresh_shouldUpdateTitle() {
final String updatedTitle = "updated title";
@@ -254,6 +280,8 @@ public class WifiEntryPreferenceTest {
@Test
public void updateIcon_shouldSetTintListForDrawable() {
reset(mMockDrawable4);
mPref.updateIcon(false /* showX */, 4 /* level */);
verify(mMockDrawable4).setTintList(any());

View File

@@ -24,29 +24,29 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.wifi.WifiEntryPreference;
import com.android.wifitrackerlib.WifiEntry;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.Arrays;
@@ -55,26 +55,38 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class SavedAccessPointsPreferenceController2Test {
private static final String PREFERENCE_KEY = "preference_key";
private static final String TEST_KEY = "key";
private static final String TEST_TITLE = "ssid_title";
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Spy
private Context mContext = ApplicationProvider.getApplicationContext();
@Mock
private PreferenceScreen mPreferenceScreen;
@Mock
private PreferenceCategory mPreferenceCategory;
private PreferenceGroup mPreferenceGroup;
@Mock
private WifiEntryPreference mWifiEntryPreference;
@Mock
private WifiEntry mWifiEntry;
private Context mContext;
private SavedAccessPointsWifiSettings2 mSettings;
private SavedAccessPointsPreferenceController2 mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mSettings = spy(new SavedAccessPointsWifiSettings2());
mController = spy(new SavedAccessPointsPreferenceController2(mContext, "test_key"));
mController.setHost(mSettings);
when(mPreferenceScreen.findPreference(PREFERENCE_KEY)).thenReturn(mPreferenceGroup);
when(mPreferenceGroup.getContext()).thenReturn(mContext);
when(mWifiEntryPreference.getKey()).thenReturn(TEST_KEY);
when(mWifiEntryPreference.getTitle()).thenReturn(TEST_TITLE);
when(mWifiEntry.getKey()).thenReturn(TEST_KEY);
when(mWifiEntry.getTitle()).thenReturn(TEST_TITLE);
when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
.thenReturn(mPreferenceCategory);
when(mPreferenceCategory.getContext()).thenReturn(mContext);
mSettings = spy(new SavedAccessPointsWifiSettings2());
mController = spy(new SavedAccessPointsPreferenceController2(mContext, PREFERENCE_KEY));
mController.setHost(mSettings);
}
@Test
@@ -86,64 +98,52 @@ public class SavedAccessPointsPreferenceController2Test {
@Test
public void getAvailability_oneSavedAccessPoint_shouldAvailable() {
final WifiEntry mockWifiEntry = mock(WifiEntry.class);
mController.mWifiEntries = Arrays.asList(mockWifiEntry);
mController.mWifiEntries = Arrays.asList(mWifiEntry);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Ignore
@Test
public void displayPreference_oneAccessPoint_shouldListIt() {
final String title = "ssid_title";
final WifiEntry mockWifiEntry = mock(WifiEntry.class);
when(mockWifiEntry.getTitle()).thenReturn(title);
final ArgumentCaptor<WifiEntryPreference> captor =
public void displayPreference_newWifiEntry_addPreference() {
when(mPreferenceGroup.getPreferenceCount()).thenReturn(0);
mController.displayPreference(mPreferenceScreen, Arrays.asList(mWifiEntry));
ArgumentCaptor<WifiEntryPreference> captor =
ArgumentCaptor.forClass(WifiEntryPreference.class);
mController.displayPreference(mPreferenceScreen, Arrays.asList(mockWifiEntry));
verify(mPreferenceCategory).addPreference(captor.capture());
final List<WifiEntryPreference> prefs = captor.getAllValues();
verify(mPreferenceGroup).addPreference(captor.capture());
List<WifiEntryPreference> prefs = captor.getAllValues();
assertThat(prefs.size()).isEqualTo(1);
assertThat(prefs.get(0).getTitle()).isEqualTo(title);
assertThat(prefs.get(0).getTitle()).isEqualTo(TEST_TITLE);
}
@Ignore
@Test
public void displayPreference_noAccessPoint_shouldRemoveIt() {
final String title = "ssid_title";
final String key = "key";
final WifiEntry mockWifiEntry = mock(WifiEntry.class);
when(mockWifiEntry.getTitle()).thenReturn(title);
when(mockWifiEntry.getKey()).thenReturn(key);
final WifiEntryPreference preference = new WifiEntryPreference(mContext, mockWifiEntry);
preference.setKey(key);
mPreferenceCategory.addPreference(preference);
public void displayPreference_sameWifiEntry_preferenceSetWifiEntry() {
when(mPreferenceGroup.getPreferenceCount()).thenReturn(1);
when(mPreferenceGroup.getPreference(0)).thenReturn(mWifiEntryPreference);
mController.displayPreference(mPreferenceScreen, Arrays.asList(mWifiEntry));
verify(mWifiEntryPreference).setWifiEntry(mWifiEntry);
}
@Test
public void displayPreference_removedWifiEntry_removePreference() {
when(mPreferenceGroup.getPreferenceCount()).thenReturn(1);
when(mPreferenceGroup.getPreference(0)).thenReturn(mWifiEntryPreference);
mController.displayPreference(mPreferenceScreen, new ArrayList<>());
assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0);
verify(mPreferenceGroup).removePreference(any());
}
@Ignore
@Test
public void onPreferenceClick_shouldCallShowWifiPage() {
mContext = spy(RuntimeEnvironment.application);
doNothing().when(mContext).startActivity(any());
doReturn(mContext).when(mSettings).getContext();
final String title = "ssid_title";
final String key = "key";
final WifiEntry mockWifiEntry = mock(WifiEntry.class);
when(mockWifiEntry.getTitle()).thenReturn(title);
when(mockWifiEntry.getKey()).thenReturn(key);
final WifiEntryPreference preference = new WifiEntryPreference(mContext, mockWifiEntry);
preference.setKey(key);
mController.onPreferenceClick(mWifiEntryPreference);
mController.onPreferenceClick(preference);
verify(mSettings, times(1)).showWifiPage(key, title);
verify(mSettings).showWifiPage(TEST_KEY, TEST_TITLE);
}
}