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); setLayoutResource(R.layout.preference_access_point);
mFrictionSld = getFrictionStateListDrawable(); 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 = wifiEntry;
mWifiEntry.setListener(this); mWifiEntry.setListener(this);
mIconInjector = iconInjector;
refresh(); refresh();
} }
@@ -151,14 +160,9 @@ public class WifiEntryPreference extends RestrictedPreference implements
if (mWifiEntry instanceof HotspotNetworkEntry) { if (mWifiEntry instanceof HotspotNetworkEntry) {
updateHotspotIcon(((HotspotNetworkEntry) mWifiEntry).getDeviceType()); updateHotspotIcon(((HotspotNetworkEntry) mWifiEntry).getDeviceType());
} else { } else {
int level = mWifiEntry.getLevel(); mLevel = mWifiEntry.getLevel();
boolean showX = mWifiEntry.shouldShowXLevelIcon(); mShowX = mWifiEntry.shouldShowXLevelIcon();
updateIcon(mShowX, mLevel);
if (level != mLevel || showX != mShowX) {
mLevel = level;
mShowX = showX;
updateIcon(mShowX, mLevel);
}
} }
setSummary(mWifiEntry.getSummary(false /* concise */)); setSummary(mWifiEntry.getSummary(false /* concise */));

View File

@@ -66,6 +66,7 @@ public class SavedAccessPointsPreferenceController2 extends BasePreferenceContro
super.displayPreference(screen); super.displayPreference(screen);
} }
@VisibleForTesting
void displayPreference(PreferenceScreen screen, List<WifiEntry> wifiEntries) { void displayPreference(PreferenceScreen screen, List<WifiEntry> wifiEntries) {
if (wifiEntries == null || wifiEntries.isEmpty()) { if (wifiEntries == null || wifiEntries.isEmpty()) {
mWifiEntries.clear(); mWifiEntries.clear();
@@ -89,28 +90,32 @@ public class SavedAccessPointsPreferenceController2 extends BasePreferenceContro
* mPreferenceGroup.removeAll() then mPreferenceGroup.addPreference for mWifiEntries. * mPreferenceGroup.removeAll() then mPreferenceGroup.addPreference for mWifiEntries.
*/ */
private void updatePreference() { private void updatePreference() {
// Remove the Preference of removed WifiEntry. // Update WifiEntry to existing preference and find out which WifiEntry was removed by key.
final List<String> removedPreferenceKeys = new ArrayList<>(); List<String> removedKeys = new ArrayList<>();
final int preferenceCount = mPreferenceGroup.getPreferenceCount(); int preferenceCount = mPreferenceGroup.getPreferenceCount();
for (int i = 0; i < preferenceCount; i++) { for (int i = 0; i < preferenceCount; i++) {
final String key = mPreferenceGroup.getPreference(i).getKey(); WifiEntryPreference pref = (WifiEntryPreference) mPreferenceGroup.getPreference(i);
if (mWifiEntries.stream().filter(wifiEntry -> WifiEntry wifiEntry = mWifiEntries.stream()
TextUtils.equals(key, wifiEntry.getKey())).count() == 0) { .filter(entry -> TextUtils.equals(pref.getKey(), entry.getKey()))
removedPreferenceKeys.add(key); .findFirst()
.orElse(null);
if (wifiEntry != null) {
pref.setWifiEntry(wifiEntry);
} else {
removedKeys.add(pref.getKey());
} }
} }
for (String removedPreferenceKey : removedPreferenceKeys) { // Remove preference by WifiEntry's key.
mPreferenceGroup.removePreference( for (String removedKey : removedKeys) {
mPreferenceGroup.findPreference(removedPreferenceKey)); mPreferenceGroup.removePreference(mPreferenceGroup.findPreference(removedKey));
} }
// Add the Preference of new added WifiEntry. // Add the Preference of new added WifiEntry.
for (WifiEntry wifiEntry : mWifiEntries) { for (WifiEntry wifiEntry : mWifiEntries) {
if (mPreferenceGroup.findPreference(wifiEntry.getKey()) == null) { if (mPreferenceGroup.findPreference(wifiEntry.getKey()) == null) {
final WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry); WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry);
preference.setKey(wifiEntry.getKey()); preference.setKey(wifiEntry.getKey());
preference.setOnPreferenceClickListener(this); preference.setOnPreferenceClickListener(this);
mPreferenceGroup.addPreference(preference); 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.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -97,6 +99,9 @@ public class WifiEntryPreferenceTest {
when(mMockWifiEntry.getTitle()).thenReturn(MOCK_TITLE); when(mMockWifiEntry.getTitle()).thenReturn(MOCK_TITLE);
when(mMockWifiEntry.getSummary(false /* concise */)).thenReturn(MOCK_SUMMARY); 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 */, 0)).thenReturn(mMockDrawable0);
when(mMockIconInjector.getIcon(false /* showX */, 1)).thenReturn(mMockDrawable1); when(mMockIconInjector.getIcon(false /* showX */, 1)).thenReturn(mMockDrawable1);
@@ -115,7 +120,7 @@ public class WifiEntryPreferenceTest {
when(mMockIconInjector.getIcon(true /* showX */, 4)) when(mMockIconInjector.getIcon(true /* showX */, 4))
.thenReturn(mMockShowXDrawable4); .thenReturn(mMockShowXDrawable4);
mPref = new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector); mPref = spy(new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector));
} }
@Test @Test
@@ -137,6 +142,27 @@ public class WifiEntryPreferenceTest {
assertThat(pref.getIcon()).isEqualTo(mMockDrawable0); 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 @Test
public void titleChanged_refresh_shouldUpdateTitle() { public void titleChanged_refresh_shouldUpdateTitle() {
final String updatedTitle = "updated title"; final String updatedTitle = "updated title";
@@ -254,6 +280,8 @@ public class WifiEntryPreferenceTest {
@Test @Test
public void updateIcon_shouldSetTintListForDrawable() { public void updateIcon_shouldSetTintListForDrawable() {
reset(mMockDrawable4);
mPref.updateIcon(false /* showX */, 4 /* level */); mPref.updateIcon(false /* showX */, 4 /* level */);
verify(mMockDrawable4).setTintList(any()); 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.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.wifi.WifiEntryPreference; import com.android.settings.wifi.WifiEntryPreference;
import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; 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.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -55,26 +55,38 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class SavedAccessPointsPreferenceController2Test { 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 @Mock
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
@Mock @Mock
private PreferenceCategory mPreferenceCategory; private PreferenceGroup mPreferenceGroup;
@Mock
private WifiEntryPreference mWifiEntryPreference;
@Mock
private WifiEntry mWifiEntry;
private Context mContext;
private SavedAccessPointsWifiSettings2 mSettings; private SavedAccessPointsWifiSettings2 mSettings;
private SavedAccessPointsPreferenceController2 mController; private SavedAccessPointsPreferenceController2 mController;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); when(mPreferenceScreen.findPreference(PREFERENCE_KEY)).thenReturn(mPreferenceGroup);
mContext = RuntimeEnvironment.application; when(mPreferenceGroup.getContext()).thenReturn(mContext);
mSettings = spy(new SavedAccessPointsWifiSettings2()); when(mWifiEntryPreference.getKey()).thenReturn(TEST_KEY);
mController = spy(new SavedAccessPointsPreferenceController2(mContext, "test_key")); when(mWifiEntryPreference.getTitle()).thenReturn(TEST_TITLE);
mController.setHost(mSettings); when(mWifiEntry.getKey()).thenReturn(TEST_KEY);
when(mWifiEntry.getTitle()).thenReturn(TEST_TITLE);
when(mPreferenceScreen.findPreference(mController.getPreferenceKey())) mSettings = spy(new SavedAccessPointsWifiSettings2());
.thenReturn(mPreferenceCategory); mController = spy(new SavedAccessPointsPreferenceController2(mContext, PREFERENCE_KEY));
when(mPreferenceCategory.getContext()).thenReturn(mContext); mController.setHost(mSettings);
} }
@Test @Test
@@ -86,64 +98,52 @@ public class SavedAccessPointsPreferenceController2Test {
@Test @Test
public void getAvailability_oneSavedAccessPoint_shouldAvailable() { public void getAvailability_oneSavedAccessPoint_shouldAvailable() {
final WifiEntry mockWifiEntry = mock(WifiEntry.class); mController.mWifiEntries = Arrays.asList(mWifiEntry);
mController.mWifiEntries = Arrays.asList(mockWifiEntry);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
} }
@Ignore
@Test @Test
public void displayPreference_oneAccessPoint_shouldListIt() { public void displayPreference_newWifiEntry_addPreference() {
final String title = "ssid_title"; when(mPreferenceGroup.getPreferenceCount()).thenReturn(0);
final WifiEntry mockWifiEntry = mock(WifiEntry.class);
when(mockWifiEntry.getTitle()).thenReturn(title); mController.displayPreference(mPreferenceScreen, Arrays.asList(mWifiEntry));
final ArgumentCaptor<WifiEntryPreference> captor =
ArgumentCaptor<WifiEntryPreference> captor =
ArgumentCaptor.forClass(WifiEntryPreference.class); ArgumentCaptor.forClass(WifiEntryPreference.class);
verify(mPreferenceGroup).addPreference(captor.capture());
mController.displayPreference(mPreferenceScreen, Arrays.asList(mockWifiEntry)); List<WifiEntryPreference> prefs = captor.getAllValues();
verify(mPreferenceCategory).addPreference(captor.capture());
final List<WifiEntryPreference> prefs = captor.getAllValues();
assertThat(prefs.size()).isEqualTo(1); assertThat(prefs.size()).isEqualTo(1);
assertThat(prefs.get(0).getTitle()).isEqualTo(title); assertThat(prefs.get(0).getTitle()).isEqualTo(TEST_TITLE);
} }
@Ignore
@Test @Test
public void displayPreference_noAccessPoint_shouldRemoveIt() { public void displayPreference_sameWifiEntry_preferenceSetWifiEntry() {
final String title = "ssid_title"; when(mPreferenceGroup.getPreferenceCount()).thenReturn(1);
final String key = "key"; when(mPreferenceGroup.getPreference(0)).thenReturn(mWifiEntryPreference);
final WifiEntry mockWifiEntry = mock(WifiEntry.class);
when(mockWifiEntry.getTitle()).thenReturn(title); mController.displayPreference(mPreferenceScreen, Arrays.asList(mWifiEntry));
when(mockWifiEntry.getKey()).thenReturn(key);
final WifiEntryPreference preference = new WifiEntryPreference(mContext, mockWifiEntry); verify(mWifiEntryPreference).setWifiEntry(mWifiEntry);
preference.setKey(key); }
mPreferenceCategory.addPreference(preference);
@Test
public void displayPreference_removedWifiEntry_removePreference() {
when(mPreferenceGroup.getPreferenceCount()).thenReturn(1);
when(mPreferenceGroup.getPreference(0)).thenReturn(mWifiEntryPreference);
mController.displayPreference(mPreferenceScreen, new ArrayList<>()); mController.displayPreference(mPreferenceScreen, new ArrayList<>());
assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0); verify(mPreferenceGroup).removePreference(any());
} }
@Ignore
@Test @Test
public void onPreferenceClick_shouldCallShowWifiPage() { public void onPreferenceClick_shouldCallShowWifiPage() {
mContext = spy(RuntimeEnvironment.application);
doNothing().when(mContext).startActivity(any()); doNothing().when(mContext).startActivity(any());
doReturn(mContext).when(mSettings).getContext(); doReturn(mContext).when(mSettings).getContext();
final String title = "ssid_title"; mController.onPreferenceClick(mWifiEntryPreference);
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(preference); verify(mSettings).showWifiPage(TEST_KEY, TEST_TITLE);
verify(mSettings, times(1)).showWifiPage(key, title);
} }
} }