From 71e14da93c8fea512fedf1b5226d28cd2c330238 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Sun, 16 Oct 2011 16:28:10 -0700 Subject: [PATCH] Fix issue #5445666: bunch of com.android.server.TextServicesManagerService crashes Only unbind once. Also protection from removing a SpellCheckerBindGroup from mSpellCheckerBindGroups if it is no longer the current entry there. Change-Id: Ic585295dfae77eae101a611afbf116bc681290ad --- .../server/TextServicesManagerService.java | 83 +++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java index ef48b9e2bc307..788ecda647c09 100644 --- a/services/java/com/android/server/TextServicesManagerService.java +++ b/services/java/com/android/server/TextServicesManagerService.java @@ -43,10 +43,13 @@ import android.util.Slog; import android.view.textservice.SpellCheckerInfo; import android.view.textservice.SpellCheckerSubtype; +import java.io.FileDescriptor; import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; public class TextServicesManagerService extends ITextServicesManager.Stub { private static final String TAG = TextServicesManagerService.class.getSimpleName(); @@ -480,6 +483,66 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + + pw.println("Permission Denial: can't dump TextServicesManagerService from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } + + synchronized(mSpellCheckerMap) { + pw.println("Current Text Services Manager state:"); + pw.println(" Spell Checker Map:"); + for (Map.Entry ent : mSpellCheckerMap.entrySet()) { + pw.print(" "); pw.print(ent.getKey()); pw.println(":"); + SpellCheckerInfo info = ent.getValue(); + pw.print(" "); pw.print("id="); pw.println(info.getId()); + pw.print(" "); pw.print("comp="); + pw.println(info.getComponent().toShortString()); + int NS = info.getSubtypeCount(); + for (int i=0; i ent + : mSpellCheckerBindGroups.entrySet()) { + SpellCheckerBindGroup grp = ent.getValue(); + pw.print(" "); pw.print(ent.getKey()); pw.print(" "); + pw.print(grp); pw.println(":"); + pw.print(" "); pw.print("mInternalConnection="); + pw.println(grp.mInternalConnection); + pw.print(" "); pw.print("mSpellChecker="); + pw.println(grp.mSpellChecker); + pw.print(" "); pw.print("mBound="); pw.print(grp.mBound); + pw.print(" mConnected="); pw.println(grp.mConnected); + int NL = grp.mListeners.size(); + for (int i=0; i