From f76e31fe481c4e4061b98af36287a61156437cc6 Mon Sep 17 00:00:00 2001 From: menghanli Date: Thu, 17 Nov 2022 20:39:37 +0800 Subject: [PATCH] Fix unbundled accessibility features settings crash when launched Root cause: The ag/19938064 introduces Settings Core change preference value changed metrics log format. It tries to lookupMetricsCategory() at Fragment#instantiate() stage. It has not onAttach() to activity by FragmentManager#add() or #replace(). The features were added by ag/15824482. Solution: PutInt new MATRICS_CATEGORY extra in previous class to avoid giving context for FeatureFactory.getFactory to custom 1P accessibility services for SettingsGoogle overlay. Bug: 259355675 Test: manual test Change-Id: Ic37d41be6a54fe388f211c1c397d0b9b87b5fb56 --- .../AccessibilityDetailsSettingsFragment.java | 5 +++++ .../accessibility/AccessibilitySettings.java | 1 + ...nchAccessibilityActivityPreferenceFragment.java | 11 +---------- .../accessibility/RestrictedPreferenceHelper.java | 14 +++++++++++--- ...ggleAccessibilityServicePreferenceFragment.java | 11 +---------- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java index c3359e43aef..04db8253b03 100644 --- a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java @@ -41,6 +41,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.SubSettingLauncher; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.accessibility.AccessibilityUtils; import java.util.List; @@ -230,6 +231,10 @@ public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment { new ComponentName(packageName, tileServiceClassName).flattenToString()); } + final int metricsCategory = FeatureFactory.getFactory(getActivity().getApplicationContext()) + .getAccessibilityMetricsFeatureProvider() + .getDownloadedFeatureMetricsCategory(componentName); + extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory); extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName); extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes()); diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 10081835714..23f8fd338a1 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -87,6 +87,7 @@ public class AccessibilitySettings extends DashboardFragment { static final String EXTRA_ANIMATED_IMAGE_RES = "animated_image_res"; static final String EXTRA_HTML_DESCRIPTION = "html_description"; static final String EXTRA_TIME_FOR_LOGGING = "start_time_to_log_a11y_tool"; + static final String EXTRA_METRICS_CATEGORY = "metrics_category"; // Timeout before we update the services if packages are added/removed // since the AccessibilityManagerService has to do that processing first diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index 1f8374dbbbd..80d1ce0cdd0 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -42,7 +42,6 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; -import com.android.settings.overlay.FeatureFactory; import java.util.ArrayList; import java.util.List; @@ -58,15 +57,7 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature @Override public int getMetricsCategory() { - // Retrieve from getArguments() directly because this function will be executed from - // onAttach(), but variable mComponentName only available after onProcessArguments() - // which comes from onCreateView(). - final ComponentName componentName = getArguments().getParcelable( - AccessibilitySettings.EXTRA_COMPONENT_NAME); - - return FeatureFactory.getFactory(getActivity().getApplicationContext()) - .getAccessibilityMetricsFeatureProvider() - .getDownloadedFeatureMetricsCategory(componentName); + return getArguments().getInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY); } @Override diff --git a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java index 4344accbfec..00339a1a9aa 100644 --- a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java +++ b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java @@ -37,6 +37,7 @@ import androidx.core.content.ContextCompat; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedPreference; @@ -118,9 +119,12 @@ public class RestrictedPreferenceHelper { final String htmlDescription = info.loadHtmlDescription(mPm); final String settingsClassName = info.getSettingsActivityName(); final String tileServiceClassName = info.getTileServiceName(); + final int metricsCategory = FeatureFactory.getFactory(mContext) + .getAccessibilityMetricsFeatureProvider() + .getDownloadedFeatureMetricsCategory(componentName); putBasicExtras(preference, prefKey, title, intro, description, imageRes, - htmlDescription, componentName); + htmlDescription, componentName, metricsCategory); putServiceExtras(preference, resolveInfo, serviceEnabled); putSettingsExtras(preference, packageName, settingsClassName); putTileServiceExtras(preference, packageName, tileServiceClassName); @@ -178,9 +182,12 @@ public class RestrictedPreferenceHelper { final String htmlDescription = info.loadHtmlDescription(mPm); final String settingsClassName = info.getSettingsActivityName(); final String tileServiceClassName = info.getTileServiceName(); + final int metricsCategory = FeatureFactory.getFactory(mContext) + .getAccessibilityMetricsFeatureProvider() + .getDownloadedFeatureMetricsCategory(componentName); putBasicExtras(preference, prefKey, title, intro, description, imageRes, - htmlDescription, componentName); + htmlDescription, componentName, metricsCategory); putSettingsExtras(preference, componentName.getPackageName(), settingsClassName); putTileServiceExtras(preference, componentName.getPackageName(), tileServiceClassName); @@ -265,7 +272,7 @@ public class RestrictedPreferenceHelper { /** Puts the basic extras into {@link RestrictedPreference}'s getExtras(). */ private void putBasicExtras(RestrictedPreference preference, String prefKey, CharSequence title, CharSequence intro, CharSequence summary, int imageRes, - String htmlDescription, ComponentName componentName) { + String htmlDescription, ComponentName componentName, int metricsCategory) { final Bundle extras = preference.getExtras(); extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY, prefKey); extras.putCharSequence(AccessibilitySettings.EXTRA_TITLE, title); @@ -274,6 +281,7 @@ public class RestrictedPreferenceHelper { extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName); extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, imageRes); extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription); + extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory); } /** diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index f1c0202538d..594117013a2 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -49,7 +49,6 @@ import androidx.annotation.Nullable; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType; -import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.accessibility.AccessibilityUtils; import java.util.List; @@ -71,15 +70,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public int getMetricsCategory() { - // Retrieve from getArguments() directly because this function will be executed from - // onAttach(), but variable mComponentName only available after onProcessArguments() - // which comes from onCreateView(). - final ComponentName componentName = getArguments().getParcelable( - AccessibilitySettings.EXTRA_COMPONENT_NAME); - - return FeatureFactory.getFactory(getActivity().getApplicationContext()) - .getAccessibilityMetricsFeatureProvider() - .getDownloadedFeatureMetricsCategory(componentName); + return getArguments().getInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY); } @Override