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
This commit is contained in:
jasonwshsu
2020-02-15 10:47:10 +08:00
parent a23ae818a6
commit 13b6850c52
4 changed files with 15 additions and 26 deletions

View File

@@ -48,7 +48,6 @@ import com.android.internal.content.PackageMonitor;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType; import com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType;
import com.android.settings.accessibility.AccessibilityUtil.State;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.display.DarkUIPreferenceController; import com.android.settings.display.DarkUIPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
@@ -75,6 +74,8 @@ public class AccessibilitySettings extends DashboardFragment {
// Index of the first preference in a preference category. // Index of the first preference in a preference category.
private static final int FIRST_PREFERENCE_IN_CATEGORY_INDEX = -1; private static final int FIRST_PREFERENCE_IN_CATEGORY_INDEX = -1;
private static final String EMPTY_STRING = "";
// Preference categories // Preference categories
private static final String CATEGORY_SCREEN_READER = "screen_reader_category"; private static final String CATEGORY_SCREEN_READER = "screen_reader_category";
private static final String CATEGORY_AUDIO_AND_CAPTIONS = "audio_and_captions_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, public static CharSequence getServiceSummary(Context context, AccessibilityServiceInfo info,
@State int state) { boolean serviceEnabled) {
final CharSequence serviceSummary = info.loadSummary(context.getPackageManager()); final CharSequence serviceSummary = info.loadSummary(context.getPackageManager());
if (state == State.UNKNOWN) { final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
return serviceSummary;
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_enabled)
: context.getString(R.string.accessibility_summary_state_disabled); : context.getString(R.string.accessibility_summary_state_disabled);
final String stateSummaryCombo = context.getString( final String stateSummaryCombo = context.getString(
R.string.preference_summary_default_combination, R.string.preference_summary_default_combination,
serviceState, serviceSummary); serviceState, serviceSummary);
return (TextUtils.isEmpty(serviceSummary)) return (TextUtils.isEmpty(serviceSummary)) ? serviceState : stateSummaryCombo;
? serviceState
: stateSummaryCombo;
} }
@@ -377,18 +378,13 @@ public class AccessibilitySettings extends DashboardFragment {
description = getString(R.string.accessibility_service_default_description); description = getString(R.string.accessibility_service_default_description);
} }
final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
if (serviceEnabled && info.crashed) { if (serviceEnabled && info.crashed) {
// Update the summaries for services that have crashed. // Update the summaries for services that have crashed.
preference.setSummary(R.string.accessibility_summary_state_stopped); preference.setSummary(R.string.accessibility_summary_state_stopped);
description = getString(R.string.accessibility_description_state_stopped); description = getString(R.string.accessibility_description_state_stopped);
} else { } else {
int serviceState = serviceEnabled ? State.ON : State.OFF;
if (fragmentType == AccessibilityServiceFragmentType.INVISIBLE) {
serviceState = State.UNKNOWN;
}
final CharSequence serviceSummary = getServiceSummary(getContext(), info, final CharSequence serviceSummary = getServiceSummary(getContext(), info,
serviceState); serviceEnabled);
preference.setSummary(serviceSummary); preference.setSummary(serviceSummary);
} }
@@ -408,6 +404,7 @@ public class AccessibilitySettings extends DashboardFragment {
preference.setEnabled(true); preference.setEnabled(true);
} }
final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
switch (fragmentType) { switch (fragmentType) {
case AccessibilityServiceFragmentType.LEGACY: case AccessibilityServiceFragmentType.LEGACY:
preference.setFragment( preference.setFragment(

View File

@@ -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.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON; import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.AccessibilityUtil.State.UNKNOWN;
import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName; import android.content.ComponentName;
@@ -27,7 +26,6 @@ import android.content.Context;
import android.provider.Settings; import android.provider.Settings;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.accessibility.AccessibilityUtils;
@@ -59,13 +57,9 @@ public class AccessibilitySlicePreferenceController extends TogglePreferenceCont
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
final AccessibilityServiceInfo serviceInfo = getAccessibilityServiceInfo(); final AccessibilityServiceInfo serviceInfo = getAccessibilityServiceInfo();
int serviceState = isChecked() ? ON : OFF;
if (AccessibilityUtil.getAccessibilityServiceFragmentType(serviceInfo)
== AccessibilityServiceFragmentType.INVISIBLE) {
serviceState = UNKNOWN;
}
return serviceInfo == null ? EMPTY_STRING : AccessibilitySettings.getServiceSummary( return serviceInfo == null ? EMPTY_STRING : AccessibilitySettings.getServiceSummary(
mContext, serviceInfo, serviceState); mContext, serviceInfo, isChecked());
} }
@Override @Override

View File

@@ -98,7 +98,6 @@ final class AccessibilityUtil {
/** Denotes the accessibility enabled status */ /** Denotes the accessibility enabled status */
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface State { public @interface State {
int UNKNOWN = -1;
int OFF = 0; int OFF = 0;
int ON = 1; int ON = 1;
} }

View File

@@ -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.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON; 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; import static com.google.common.truth.Truth.assertThat;
@@ -77,7 +76,7 @@ public class AccessibilityShortcutPreferenceControllerTest {
mController.setChecked(true); mController.setChecked(true);
assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(), 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); UserHandle.USER_CURRENT)).isEqualTo(ON);
} }
@@ -86,7 +85,7 @@ public class AccessibilityShortcutPreferenceControllerTest {
mController.setChecked(false); mController.setChecked(false);
assertThat(Settings.Secure.getIntForUser(mContext.getContentResolver(), 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); UserHandle.USER_CURRENT)).isEqualTo(OFF);
} }
} }