Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f76e31fe authored by menghanli's avatar menghanli Committed by Menghan Li
Browse files

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
parent 1436b66e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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());

+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −10
Original line number Diff line number Diff line
@@ -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
+11 −3
Original line number Diff line number Diff line
@@ -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);
    }

    /**
+1 −10
Original line number Diff line number Diff line
@@ -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