From 067757f8d9be00dde2896ae94e4708591e270271 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Wed, 8 Apr 2020 11:19:37 +0800 Subject: [PATCH] [Wi-Fi] Fix TalkBack focus lost in SavedAccessPointsWifiSettings2 PreferenceGroup in a controller is not in a RecyclerView, TalkBack loses focus after PreferenceGroup#removeAll. To fix it, only add/remove the preference if it's necessary. Bug: 153278854 Test: make RunSettingsRoboTests ROBOTEST_FILTER=SavedAccessPointsPreferenceController2Test Change-Id: Ie9ad5481c33865dce2b7db04d0f969b1f49b80e1 --- ...avedAccessPointsPreferenceController2.java | 34 +++++++++++++++---- ...AccessPointsPreferenceController2Test.java | 16 +++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) 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); + } }