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

Commit 13b6850c authored by jasonwshsu's avatar jasonwshsu
Browse files

Fix the NPE error when get the service summary.

* Check NPE for AccessibilityInfo.loadSummary()
* Remove the state argument that could get from info argument

Bug: 148837311
Test: Manual test
Change-Id: Ic6906fdbdd7f1c241776d1045be33f89468670b6
parent a23ae818
Loading
Loading
Loading
Loading
+11 −14
Original line number Diff line number Diff line
@@ -48,7 +48,6 @@ import com.android.internal.content.PackageMonitor;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType;
import com.android.settings.accessibility.AccessibilityUtil.State;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.display.DarkUIPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -75,6 +74,8 @@ public class AccessibilitySettings extends DashboardFragment {
    // Index of the first preference in a preference category.
    private static final int FIRST_PREFERENCE_IN_CATEGORY_INDEX = -1;

    private static final String EMPTY_STRING = "";

    // Preference categories
    private static final String CATEGORY_SCREEN_READER = "screen_reader_category";
    private static final String CATEGORY_AUDIO_AND_CAPTIONS = "audio_and_captions_category";
@@ -255,22 +256,22 @@ public class AccessibilitySettings extends DashboardFragment {
    }

    public static CharSequence getServiceSummary(Context context, AccessibilityServiceInfo info,
            @State int state) {
            boolean serviceEnabled) {
        final CharSequence serviceSummary = info.loadSummary(context.getPackageManager());
        if (state == State.UNKNOWN) {
            return serviceSummary;
        final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);

        if (fragmentType == AccessibilityServiceFragmentType.INVISIBLE) {
            return TextUtils.isEmpty(serviceSummary) ? EMPTY_STRING : serviceSummary;
        }

        final String serviceState = (state == State.ON)
        final String serviceState = serviceEnabled
                ? context.getString(R.string.accessibility_summary_state_enabled)
                : context.getString(R.string.accessibility_summary_state_disabled);
        final String stateSummaryCombo = context.getString(
                R.string.preference_summary_default_combination,
                serviceState, serviceSummary);

        return (TextUtils.isEmpty(serviceSummary))
                ? serviceState
                : stateSummaryCombo;
        return (TextUtils.isEmpty(serviceSummary)) ? serviceState : stateSummaryCombo;

    }

@@ -377,18 +378,13 @@ public class AccessibilitySettings extends DashboardFragment {
                description = getString(R.string.accessibility_service_default_description);
            }

            final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
            if (serviceEnabled && info.crashed) {
                // Update the summaries for services that have crashed.
                preference.setSummary(R.string.accessibility_summary_state_stopped);
                description = getString(R.string.accessibility_description_state_stopped);
            } else {
                int serviceState = serviceEnabled ? State.ON : State.OFF;
                if (fragmentType == AccessibilityServiceFragmentType.INVISIBLE) {
                    serviceState = State.UNKNOWN;
                }
                final CharSequence serviceSummary = getServiceSummary(getContext(), info,
                        serviceState);
                        serviceEnabled);
                preference.setSummary(serviceSummary);
            }

@@ -408,6 +404,7 @@ public class AccessibilitySettings extends DashboardFragment {
                preference.setEnabled(true);
            }

            final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
            switch (fragmentType) {
                case AccessibilityServiceFragmentType.LEGACY:
                    preference.setFragment(
+2 −8
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.settings.accessibility;

import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.AccessibilityUtil.State.UNKNOWN;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
@@ -27,7 +26,6 @@ import android.content.Context;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;

import com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.accessibility.AccessibilityUtils;

@@ -59,13 +57,9 @@ public class AccessibilitySlicePreferenceController extends TogglePreferenceCont
    @Override
    public CharSequence getSummary() {
        final AccessibilityServiceInfo serviceInfo = getAccessibilityServiceInfo();
        int serviceState = isChecked() ? ON : OFF;
        if (AccessibilityUtil.getAccessibilityServiceFragmentType(serviceInfo)
                == AccessibilityServiceFragmentType.INVISIBLE) {
            serviceState = UNKNOWN;
        }

        return serviceInfo == null ? EMPTY_STRING : AccessibilitySettings.getServiceSummary(
                mContext, serviceInfo, serviceState);
                mContext, serviceInfo, isChecked());
    }

    @Override
+0 −1
Original line number Diff line number Diff line
@@ -98,7 +98,6 @@ final class AccessibilityUtil {
    /** Denotes the accessibility enabled status */
    @Retention(RetentionPolicy.SOURCE)
    public @interface State {
        int UNKNOWN = -1;
        int OFF = 0;
        int ON = 1;
    }
+2 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.settings.accessibility;

import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.AccessibilityUtil.State.UNKNOWN;

import static com.google.common.truth.Truth.assertThat;

@@ -77,7 +76,7 @@ public class AccessibilityShortcutPreferenceControllerTest {
        mController.setChecked(true);

        assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(),
                Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, UNKNOWN,
                Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, OFF,
                UserHandle.USER_CURRENT)).isEqualTo(ON);
    }

@@ -86,7 +85,7 @@ public class AccessibilityShortcutPreferenceControllerTest {
        mController.setChecked(false);

        assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(),
                Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, UNKNOWN,
                Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, ON,
                UserHandle.USER_CURRENT)).isEqualTo(OFF);
    }
}