From 83a7330bbe8ee1e8fcaa88ba2fb5e4cb3154c790 Mon Sep 17 00:00:00 2001 From: Guliz Tuncay Date: Thu, 17 Aug 2017 15:25:38 -0700 Subject: [PATCH] Update Settings properly when no Spell Checker is available. Currently, Settings is not being updated properly when the current spell checker service is removed or disabled and there is no other spell checker service available. The correct behavior is that Secure.Settings should be updated with empty string to indicate there is no selected spell checker service. Fixes: 64812014 Test: Manually as follows: 0. Make sure AOSP keyboard is installed. 1. adb shell settings put --user 0 secure selected_spell_checker com.android.inputmethod.latin/.spellcheck.AndroidSpellCheckerService 2. tapas SampleSpellCheckerService 3. make -j 4. adb install --user 0 -r out/target/product/generic/system/app/SampleSpellCheckerService/SampleSpellCheckerService.apk 5. adb shell pm disable com.android.inputmethod.latin 6. adb shell settings get --user 0 secure selected_spell_checker -> com.example.android.samplespellcheckerservice/.SampleSpellCheckerService 7. adb uninstall com.example.android.samplespellcheckerservice 8. adb shell settings get --user 0 secure selected_spell_checker -> empty 9. adb root 10. adb shell settings get --user 0 secure selected_spell_checker -> empty 11. adb shell pm enable com.android.inputmethod.latin 12. adb shell settings get --user 0 secure selected_spell_checker Change-Id: I30902a3d94f2ddef33f4a8067799e98322ae3a03 --- .../server/TextServicesManagerService.java | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java index 3fa8cb68c75c5..7cd34065c427f 100644 --- a/services/core/java/com/android/server/TextServicesManagerService.java +++ b/services/core/java/com/android/server/TextServicesManagerService.java @@ -122,13 +122,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } private void putSelectedSpellChecker(@Nullable String sciId) { - if (TextUtils.isEmpty(sciId)) { - // OK to coalesce to null, since getSelectedSpellChecker() can take care of the - // empty data scenario. - putString(Settings.Secure.SELECTED_SPELL_CHECKER, null); - } else { - putString(Settings.Secure.SELECTED_SPELL_CHECKER, sciId); - } + putString(Settings.Secure.SELECTED_SPELL_CHECKER, sciId); } private void putSelectedSpellCheckerSubtype(int hashCode) { @@ -157,8 +151,12 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { return mSpellCheckerMap.get(curSpellCheckerId); } - public void setCurrentSpellChecker(SpellCheckerInfo sci) { - putSelectedSpellChecker(sci.getId()); + public void setCurrentSpellChecker(@Nullable SpellCheckerInfo sci) { + if (sci != null) { + putSelectedSpellChecker(sci.getId()); + } else { + putSelectedSpellChecker(""); + } putSelectedSpellCheckerSubtype(SpellCheckerSubtype.SUBTYPE_ID_NONE); } @@ -331,12 +329,10 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { SpellCheckerInfo sci = tsd.getCurrentSpellChecker(); if (sci == null) { sci = findAvailSystemSpellCheckerLocked(null, tsd); - if (sci != null) { - // Set the current spell checker if there is one or more spell checkers - // available. In this case, "sci" is the first one in the available spell - // checkers. - setCurrentSpellCheckerLocked(sci, tsd); - } + // Set the current spell checker if there is one or more system spell checkers + // available. In this case, "sci" is the first one in the available spell + // checkers. + setCurrentSpellCheckerLocked(sci, tsd); } } @@ -355,20 +351,31 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { // TODO: Update for each locale SpellCheckerInfo sci = tsd.getCurrentSpellChecker(); tsd.initializeTextServicesData(); - // If no spell checker is enabled, just return. The user should explicitly + // If spell checker is disabled, just return. The user should explicitly // enable the spell checker. - if (sci == null) return; - final String packageName = sci.getPackageName(); - final int change = isPackageDisappearing(packageName); - if (DBG) Slog.d(TAG, "Changing package name: " + packageName); - if (// Package disappearing - change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE - // Package modified - || isPackageModified(packageName)) { - SpellCheckerInfo availSci = findAvailSystemSpellCheckerLocked(packageName, tsd); - // Set the spell checker settings if different than before - if (availSci != null && !availSci.getId().equals(sci.getId())) { - setCurrentSpellCheckerLocked(availSci, tsd); + if (!tsd.isSpellCheckerEnabled()) return; + + if (sci == null) { + sci = findAvailSystemSpellCheckerLocked(null, tsd); + // Set the current spell checker if there is one or more system spell checkers + // available. In this case, "sci" is the first one in the available spell + // checkers. + setCurrentSpellCheckerLocked(sci, tsd); + } else { + final String packageName = sci.getPackageName(); + final int change = isPackageDisappearing(packageName); + if (DBG) Slog.d(TAG, "Changing package name: " + packageName); + if (// Package disappearing + change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE + // Package modified + || isPackageModified(packageName)) { + SpellCheckerInfo availSci = + findAvailSystemSpellCheckerLocked(packageName, tsd); + // Set the spell checker settings if different than before + if (availSci == null + || (availSci != null && !availSci.getId().equals(sci.getId()))) { + setCurrentSpellCheckerLocked(availSci, tsd); + } } } } @@ -677,8 +684,8 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } - private void setCurrentSpellCheckerLocked(SpellCheckerInfo sci, TextServicesData tsd) { - final String sciId = sci.getId(); + private void setCurrentSpellCheckerLocked(@Nullable SpellCheckerInfo sci, TextServicesData tsd) { + final String sciId = (sci != null) ? sci.getId() : ""; if (DBG) { Slog.w(TAG, "setCurrentSpellChecker: " + sciId); }