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
This commit is contained in:
menghanli
2022-11-17 20:39:37 +08:00
committed by Menghan Li
parent 1436b66e14
commit f76e31fe48
5 changed files with 19 additions and 23 deletions

View File

@@ -41,6 +41,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.InstrumentedFragment;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.accessibility.AccessibilityUtils;
import java.util.List; import java.util.List;
@@ -230,6 +231,10 @@ public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment {
new ComponentName(packageName, tileServiceClassName).flattenToString()); 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.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes()); extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes());

View File

@@ -87,6 +87,7 @@ public class AccessibilitySettings extends DashboardFragment {
static final String EXTRA_ANIMATED_IMAGE_RES = "animated_image_res"; static final String EXTRA_ANIMATED_IMAGE_RES = "animated_image_res";
static final String EXTRA_HTML_DESCRIPTION = "html_description"; 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_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 // Timeout before we update the services if packages are added/removed
// since the AccessibilityManagerService has to do that processing first // since the AccessibilityManagerService has to do that processing first

View File

@@ -42,7 +42,6 @@ import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
import com.android.settings.overlay.FeatureFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -58,15 +57,7 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
// Retrieve from getArguments() directly because this function will be executed from return getArguments().getInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY);
// 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);
} }
@Override @Override

View File

@@ -37,6 +37,7 @@ import androidx.core.content.ContextCompat;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedPreference;
@@ -118,9 +119,12 @@ public class RestrictedPreferenceHelper {
final String htmlDescription = info.loadHtmlDescription(mPm); final String htmlDescription = info.loadHtmlDescription(mPm);
final String settingsClassName = info.getSettingsActivityName(); final String settingsClassName = info.getSettingsActivityName();
final String tileServiceClassName = info.getTileServiceName(); final String tileServiceClassName = info.getTileServiceName();
final int metricsCategory = FeatureFactory.getFactory(mContext)
.getAccessibilityMetricsFeatureProvider()
.getDownloadedFeatureMetricsCategory(componentName);
putBasicExtras(preference, prefKey, title, intro, description, imageRes, putBasicExtras(preference, prefKey, title, intro, description, imageRes,
htmlDescription, componentName); htmlDescription, componentName, metricsCategory);
putServiceExtras(preference, resolveInfo, serviceEnabled); putServiceExtras(preference, resolveInfo, serviceEnabled);
putSettingsExtras(preference, packageName, settingsClassName); putSettingsExtras(preference, packageName, settingsClassName);
putTileServiceExtras(preference, packageName, tileServiceClassName); putTileServiceExtras(preference, packageName, tileServiceClassName);
@@ -178,9 +182,12 @@ public class RestrictedPreferenceHelper {
final String htmlDescription = info.loadHtmlDescription(mPm); final String htmlDescription = info.loadHtmlDescription(mPm);
final String settingsClassName = info.getSettingsActivityName(); final String settingsClassName = info.getSettingsActivityName();
final String tileServiceClassName = info.getTileServiceName(); final String tileServiceClassName = info.getTileServiceName();
final int metricsCategory = FeatureFactory.getFactory(mContext)
.getAccessibilityMetricsFeatureProvider()
.getDownloadedFeatureMetricsCategory(componentName);
putBasicExtras(preference, prefKey, title, intro, description, imageRes, putBasicExtras(preference, prefKey, title, intro, description, imageRes,
htmlDescription, componentName); htmlDescription, componentName, metricsCategory);
putSettingsExtras(preference, componentName.getPackageName(), settingsClassName); putSettingsExtras(preference, componentName.getPackageName(), settingsClassName);
putTileServiceExtras(preference, componentName.getPackageName(), putTileServiceExtras(preference, componentName.getPackageName(),
tileServiceClassName); tileServiceClassName);
@@ -265,7 +272,7 @@ public class RestrictedPreferenceHelper {
/** Puts the basic extras into {@link RestrictedPreference}'s getExtras(). */ /** Puts the basic extras into {@link RestrictedPreference}'s getExtras(). */
private void putBasicExtras(RestrictedPreference preference, String prefKey, private void putBasicExtras(RestrictedPreference preference, String prefKey,
CharSequence title, CharSequence intro, CharSequence summary, int imageRes, CharSequence title, CharSequence intro, CharSequence summary, int imageRes,
String htmlDescription, ComponentName componentName) { String htmlDescription, ComponentName componentName, int metricsCategory) {
final Bundle extras = preference.getExtras(); final Bundle extras = preference.getExtras();
extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY, prefKey); extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY, prefKey);
extras.putCharSequence(AccessibilitySettings.EXTRA_TITLE, title); extras.putCharSequence(AccessibilitySettings.EXTRA_TITLE, title);
@@ -274,6 +281,7 @@ public class RestrictedPreferenceHelper {
extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName); extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, imageRes); extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, imageRes);
extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription); extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription);
extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory);
} }
/** /**

View File

@@ -49,7 +49,6 @@ import androidx.annotation.Nullable;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType; import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.accessibility.AccessibilityUtils;
import java.util.List; import java.util.List;
@@ -71,15 +70,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
// Retrieve from getArguments() directly because this function will be executed from return getArguments().getInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY);
// 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);
} }
@Override @Override