diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java index 3b735fa7214..1d1c80193cf 100644 --- a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java +++ b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2.java @@ -17,6 +17,7 @@ package com.android.settings.wifi.savedaccesspoints2; import android.content.Context; +import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -83,14 +84,35 @@ public class SavedAccessPointsPreferenceController2 extends BasePreferenceContro return false; } + /** + * mPreferenceGroup is not in a RecyclerView. To keep TalkBack focus, this method should not + * mPreferenceGroup.removeAll() then mPreferenceGroup.addPreference for mWifiEntries. + */ private void updatePreference() { - mPreferenceGroup.removeAll(); - for (WifiEntry wifiEntry : mWifiEntries) { - final WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry); - preference.setKey(wifiEntry.getKey()); - preference.setOnPreferenceClickListener(this); + // Remove the Preference of removed WifiEntry. + final List removedPreferenceKeys = new ArrayList<>(); + final 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); + } + } + for (String removedPreferenceKey : removedPreferenceKeys) { + mPreferenceGroup.removePreference( + mPreferenceGroup.findPreference(removedPreferenceKey)); + } - mPreferenceGroup.addPreference(preference); + // Add the Preference of new added WifiEntry. + for (WifiEntry wifiEntry : mWifiEntries) { + if (mPreferenceGroup.findPreference(wifiEntry.getKey()) == null) { + final 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/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java index f50021ba33e..acc6543f8c3 100644 --- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsPreferenceController2Test.java @@ -103,4 +103,20 @@ public class SavedAccessPointsPreferenceController2Test { assertThat(prefs.size()).isEqualTo(1); assertThat(prefs.get(0).getTitle()).isEqualTo(title); } + + @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); + + mController.displayPreference(mPreferenceScreen, new ArrayList<>()); + + assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0); + } }