diff options
Diffstat (limited to 'core/java/android')
3 files changed, 54 insertions, 22 deletions
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 3adafd725a10..2dc225af6482 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -439,10 +439,11 @@ final class SystemServiceRegistry { }}); registerService(Context.TEXT_SERVICES_MANAGER_SERVICE, TextServicesManager.class, - new StaticServiceFetcher<TextServicesManager>() { + new CachedServiceFetcher<TextServicesManager>() { @Override - public TextServicesManager createService() { - return TextServicesManager.getInstance(); + public TextServicesManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + return TextServicesManager.createInstance(ctx); }}); registerService(Context.KEYGUARD_SERVICE, KeyguardManager.class, diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java index 9733701ee0f0..f553ca512881 100644 --- a/core/java/android/view/textservice/SpellCheckerSession.java +++ b/core/java/android/view/textservice/SpellCheckerSession.java @@ -27,7 +27,6 @@ import android.util.Log; import com.android.internal.textservice.ISpellCheckerSession; import com.android.internal.textservice.ISpellCheckerSessionListener; -import com.android.internal.textservice.ITextServicesManager; import com.android.internal.textservice.ITextServicesSessionListener; import dalvik.system.CloseGuard; @@ -96,7 +95,7 @@ public class SpellCheckerSession { private static final int MSG_ON_GET_SUGGESTION_MULTIPLE_FOR_SENTENCE = 2; private final InternalListener mInternalListener; - private final ITextServicesManager mTextServicesManager; + private final TextServicesManager mTextServicesManager; private final SpellCheckerInfo mSpellCheckerInfo; @UnsupportedAppUsage private final SpellCheckerSessionListener mSpellCheckerSessionListener; @@ -124,7 +123,7 @@ public class SpellCheckerSession { * @hide */ public SpellCheckerSession( - SpellCheckerInfo info, ITextServicesManager tsm, SpellCheckerSessionListener listener) { + SpellCheckerInfo info, TextServicesManager tsm, SpellCheckerSessionListener listener) { if (info == null || listener == null || tsm == null) { throw new NullPointerException(); } @@ -166,12 +165,8 @@ public class SpellCheckerSession { */ public void close() { mGuard.close(); - try { - mSpellCheckerSessionListenerImpl.close(); - mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl); - } catch (RemoteException e) { - // do nothing - } + mSpellCheckerSessionListenerImpl.close(); + mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl); } /** diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java index 5dc8b19444b0..9ff64d9b268a 100644 --- a/core/java/android/view/textservice/TextServicesManager.java +++ b/core/java/android/view/textservice/TextServicesManager.java @@ -16,16 +16,20 @@ package android.view.textservice; +import android.annotation.NonNull; import android.annotation.SystemService; import android.annotation.UnsupportedAppUsage; +import android.annotation.UserIdInt; import android.content.Context; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; +import android.os.UserHandle; import android.util.Log; import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener; +import com.android.internal.textservice.ISpellCheckerSessionListener; import com.android.internal.textservice.ITextServicesManager; import java.util.Locale; @@ -67,17 +71,41 @@ public final class TextServicesManager { private static final String TAG = TextServicesManager.class.getSimpleName(); private static final boolean DBG = false; + /** + * @deprecated Do not use. Just kept because of {@link UnsupportedAppUsage} in + * {@link #getInstance()}. + */ + @Deprecated private static TextServicesManager sInstance; private final ITextServicesManager mService; - private TextServicesManager() throws ServiceNotFoundException { + @UserIdInt + private final int mUserId; + + private TextServicesManager(@UserIdInt int userId) throws ServiceNotFoundException { mService = ITextServicesManager.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.TEXT_SERVICES_MANAGER_SERVICE)); + mUserId = userId; + } + + /** + * The factory method of {@link TextServicesManager}. + * + * @param context {@link Context} from which {@link TextServicesManager} should be instantiated. + * @return {@link TextServicesManager} that is associated with {@link Context#getUserId()}. + * @throws ServiceNotFoundException When {@link TextServicesManager} is not available. + * @hide + */ + @NonNull + public static TextServicesManager createInstance(@NonNull Context context) + throws ServiceNotFoundException { + return new TextServicesManager(context.getUserId()); } /** - * Retrieve the global TextServicesManager instance, creating it if it doesn't already exist. + * @deprecated Do not use. Just kept because of {@link UnsupportedAppUsage} in + * {@link #getInstance()}. * @hide */ @UnsupportedAppUsage @@ -85,7 +113,7 @@ public final class TextServicesManager { synchronized (TextServicesManager.class) { if (sInstance == null) { try { - sInstance = new TextServicesManager(); + sInstance = new TextServicesManager(UserHandle.myUserId()); } catch (ServiceNotFoundException e) { throw new IllegalStateException(e); } @@ -136,7 +164,7 @@ public final class TextServicesManager { final SpellCheckerInfo sci; try { - sci = mService.getCurrentSpellChecker(null); + sci = mService.getCurrentSpellChecker(mUserId, null); } catch (RemoteException e) { return null; } @@ -174,9 +202,9 @@ public final class TextServicesManager { if (subtypeInUse == null) { return null; } - final SpellCheckerSession session = new SpellCheckerSession(sci, mService, listener); + final SpellCheckerSession session = new SpellCheckerSession(sci, this, listener); try { - mService.getSpellCheckerService(sci.getId(), subtypeInUse.getLocale(), + mService.getSpellCheckerService(mUserId, sci.getId(), subtypeInUse.getLocale(), session.getTextServicesSessionListener(), session.getSpellCheckerSessionListener(), bundle); } catch (RemoteException e) { @@ -191,7 +219,7 @@ public final class TextServicesManager { @UnsupportedAppUsage public SpellCheckerInfo[] getEnabledSpellCheckers() { try { - final SpellCheckerInfo[] retval = mService.getEnabledSpellCheckers(); + final SpellCheckerInfo[] retval = mService.getEnabledSpellCheckers(mUserId); if (DBG) { Log.d(TAG, "getEnabledSpellCheckers: " + (retval != null ? retval.length : "null")); } @@ -208,7 +236,7 @@ public final class TextServicesManager { public SpellCheckerInfo getCurrentSpellChecker() { try { // Passing null as a locale for ICS - return mService.getCurrentSpellChecker(null); + return mService.getCurrentSpellChecker(mUserId, null); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -221,7 +249,7 @@ public final class TextServicesManager { public SpellCheckerSubtype getCurrentSpellCheckerSubtype( boolean allowImplicitlySelectedSubtype) { try { - return mService.getCurrentSpellCheckerSubtype(allowImplicitlySelectedSubtype); + return mService.getCurrentSpellCheckerSubtype(mUserId, allowImplicitlySelectedSubtype); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -233,7 +261,15 @@ public final class TextServicesManager { @UnsupportedAppUsage public boolean isSpellCheckerEnabled() { try { - return mService.isSpellCheckerEnabled(); + return mService.isSpellCheckerEnabled(mUserId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + void finishSpellCheckerService(ISpellCheckerSessionListener listener) { + try { + mService.finishSpellCheckerService(mUserId, listener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } |
