Fix memory leak on Accessibility screen

The root cause is that androidx.preference.Preference does not implement
equals and hashCode methods, but it is used as Map key (see bug comment2
for more details). Given that Preference.getParent() can find the
category, we can simplify the data structure from Map to List.

Bug: 388696327
Flag: EXEMPT bugfix
Test: Resume/Pause Accessibility screen 100 times
Change-Id: Ib70acbf2147048730f8a4e8fd66731f9efdadecf
This commit is contained in:
Jacky Wang
2025-01-09 18:22:19 +08:00
parent 291e62ffd1
commit 2ac3cdfb22
2 changed files with 7 additions and 13 deletions

View File

@@ -148,9 +148,7 @@ public class AccessibilitySettings extends DashboardFragment implements
private final Map<String, PreferenceCategory> mCategoryToPrefCategoryMap =
new ArrayMap<>();
@VisibleForTesting
final Map<Preference, PreferenceCategory> mServicePreferenceToPreferenceCategoryMap =
new ArrayMap<>();
private final List<Preference> mServicePreferences = new ArrayList<>();
private final Map<ComponentName, PreferenceCategory> mPreBundledServiceComponentToCategoryMap =
new ArrayMap<>();
@@ -372,13 +370,10 @@ public class AccessibilitySettings extends DashboardFragment implements
// Since services category is auto generated we have to do a pass
// to generate it since services can come and go and then based on
// the global accessibility state to decided whether it is enabled.
final ArrayList<Preference> servicePreferences =
new ArrayList<>(mServicePreferenceToPreferenceCategoryMap.keySet());
for (int i = 0; i < servicePreferences.size(); i++) {
Preference service = servicePreferences.get(i);
PreferenceCategory category = mServicePreferenceToPreferenceCategoryMap.get(service);
category.removePreference(service);
for (Preference service : mServicePreferences) {
service.getParent().removePreference(service);
}
mServicePreferences.clear();
initializePreBundledServicesMapFromArray(CATEGORY_SCREEN_READER,
R.array.config_preinstalled_screen_reader_services);
@@ -423,7 +418,7 @@ public class AccessibilitySettings extends DashboardFragment implements
prefCategory = mPreBundledServiceComponentToCategoryMap.get(componentName);
}
prefCategory.addPreference(preference);
mServicePreferenceToPreferenceCategoryMap.put(preference, prefCategory);
mServicePreferences.add(preference);
}
// Update the order of all the category according to the order defined in xml file.

View File

@@ -503,9 +503,8 @@ public class AccessibilitySettingsTest {
}
private String getPreferenceCategory(ComponentName componentName) {
return mFragment.mServicePreferenceToPreferenceCategoryMap.get(
mFragment.getPreferenceScreen().findPreference(
componentName.flattenToString())).getKey();
return mFragment.getPreferenceScreen().findPreference(
componentName.flattenToString()).getParent().getKey();
}
private AccessibilityServiceInfo getMockAccessibilityServiceInfo(ComponentName componentName) {