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