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:
@@ -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(
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user