diff --git a/src/com/android/settings/wifi/WifiEntryPreference.java b/src/com/android/settings/wifi/WifiEntryPreference.java index 7206666b576..21cc5f09314 100644 --- a/src/com/android/settings/wifi/WifiEntryPreference.java +++ b/src/com/android/settings/wifi/WifiEntryPreference.java @@ -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 */)); diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java index f0841f49869..a038e1dcc9e 100644 --- a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java +++ b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java @@ -66,6 +66,7 @@ public class SavedAccessPointsPreferenceController2 extends BasePreferenceContro super.displayPreference(screen); } + @VisibleForTesting void displayPreference(PreferenceScreen screen, List 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 removedPreferenceKeys = new ArrayList<>(); - final int preferenceCount = mPreferenceGroup.getPreferenceCount(); + // Update WifiEntry to existing preference and find out which WifiEntry was removed by key. + List 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); } } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java index 316beb37f70..f96570c180f 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java @@ -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()); diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java index 800e2e46b46..d9bc0b439f9 100644 --- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java @@ -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 captor = + public void displayPreference_newWifiEntry_addPreference() { + when(mPreferenceGroup.getPreferenceCount()).thenReturn(0); + + mController.displayPreference(mPreferenceScreen, Arrays.asList(mWifiEntry)); + + ArgumentCaptor captor = ArgumentCaptor.forClass(WifiEntryPreference.class); - - mController.displayPreference(mPreferenceScreen, Arrays.asList(mockWifiEntry)); - - verify(mPreferenceCategory).addPreference(captor.capture()); - - final List prefs = captor.getAllValues(); + verify(mPreferenceGroup).addPreference(captor.capture()); + List 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); } }