[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
This commit is contained in:
Arc Wang
2020-04-08 11:19:37 +08:00
parent 68084f39d0
commit 067757f8d9
2 changed files with 44 additions and 6 deletions

View File

@@ -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<String> 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);
}
}
}
}

View File

@@ -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);
}
}