From 13b6850c5246ef438e57958bc711f2dd815e6007 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Sat, 15 Feb 2020 10:47:10 +0800 Subject: [PATCH] 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 --- .../accessibility/AccessibilitySettings.java | 25 ++++++++----------- ...ccessibilitySlicePreferenceController.java | 10 ++------ .../accessibility/AccessibilityUtil.java | 1 - ...ilityShortcutPreferenceControllerTest.java | 5 ++-- 4 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 38177304a71..94e73fafef5 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -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( diff --git a/src/com/android/settings/accessibility/AccessibilitySlicePreferenceController.java b/src/com/android/settings/accessibility/AccessibilitySlicePreferenceController.java index 17c6016dffd..ca3befa2a09 100644 --- a/src/com/android/settings/accessibility/AccessibilitySlicePreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilitySlicePreferenceController.java @@ -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 diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 6159f9243f2..8da6fbb920d 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -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; } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java index 6d0d9645750..53f6cc099e9 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceControllerTest.java @@ -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); } }