diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java index 0f9a25b8ca680..e3af7e3777335 100644 --- a/services/core/java/com/android/server/TextServicesManagerService.java +++ b/services/core/java/com/android/server/TextServicesManagerService.java @@ -27,9 +27,9 @@ import com.android.internal.textservice.ITextServicesSessionListener; import org.xmlpull.v1.XmlPullParserException; +import android.annotation.UserIdInt; import android.app.ActivityManagerNative; import android.app.AppGlobals; -import android.app.SynchronousUserSwitchObserver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -81,9 +81,47 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { private final HashMap mSpellCheckerBindGroups = new HashMap<>(); private final TextServicesSettings mSettings; - public void systemRunning() { - if (!mSystemReady) { - mSystemReady = true; + public static final class Lifecycle extends SystemService { + private TextServicesManagerService mService; + + public Lifecycle(Context context) { + super(context); + mService = new TextServicesManagerService(context); + } + + @Override + public void onStart() { + publishBinderService(Context.TEXT_SERVICES_MANAGER_SERVICE, mService); + } + + @Override + public void onSwitchUser(@UserIdInt int userHandle) { + // Called on the system server's main looper thread. + // TODO: Dispatch this to a worker thread as needed. + mService.onSwitchUser(userHandle); + } + + @Override + public void onBootPhase(int phase) { + // Called on the system server's main looper thread. + // TODO: Dispatch this to a worker thread as needed. + if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { + mService.systemRunning(); + } + } + } + + void systemRunning() { + synchronized (mSpellCheckerMap) { + if (!mSystemReady) { + mSystemReady = true; + } + } + } + + void onSwitchUser(@UserIdInt int userId) { + synchronized (mSpellCheckerMap) { + switchUserLocked(userId); } } @@ -98,24 +136,6 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { int userId = UserHandle.USER_SYSTEM; try { - ActivityManagerNative.getDefault().registerUserSwitchObserver( - new SynchronousUserSwitchObserver() { - @Override - public void onUserSwitching(int newUserId) throws RemoteException { - synchronized(mSpellCheckerMap) { - switchUserLocked(newUserId); - } - } - - @Override - public void onUserSwitchComplete(int newUserId) throws RemoteException { - } - - @Override - public void onForegroundProfileSwitch(int newProfileId) { - // Ignore. - } - }); userId = ActivityManagerNative.getDefault().getCurrentUser().id; } catch (RemoteException e) { Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e); @@ -128,7 +148,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { switchUserLocked(userId); } - private void switchUserLocked(int userId) { + private void switchUserLocked(@UserIdInt int userId) { mSettings.setCurrentUserId(userId); updateCurrentProfileIds(); unbindServiceLocked(); @@ -1011,17 +1031,18 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { private static class TextServicesSettings { private final ContentResolver mResolver; + @UserIdInt private int mCurrentUserId; @GuardedBy("mLock") private int[] mCurrentProfileIds = new int[0]; private Object mLock = new Object(); - public TextServicesSettings(ContentResolver resolver, int userId) { + public TextServicesSettings(ContentResolver resolver, @UserIdInt int userId) { mResolver = resolver; mCurrentUserId = userId; } - public void setCurrentUserId(int userId) { + public void setCurrentUserId(@UserIdInt int userId) { if (DBG) { Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " + userId + ", new ime = " + getSelectedSpellChecker()); @@ -1036,7 +1057,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } - public boolean isCurrentProfile(int userId) { + public boolean isCurrentProfile(@UserIdInt int userId) { synchronized (mLock) { if (userId == mCurrentUserId) return true; for (int i = 0; i < mCurrentProfileIds.length; i++) { @@ -1046,6 +1067,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } } + @UserIdInt public int getCurrentUserId() { return mCurrentUserId; } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index b8c31e3f063ef..a2d5259b27586 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -635,7 +635,6 @@ public final class SystemServer { WallpaperManagerService wallpaper = null; LocationManagerService location = null; CountryDetectorService countryDetector = null; - TextServicesManagerService tsms = null; ILockSettings lockSettings = null; AssetAtlasService atlas = null; MediaRouterService mediaRouter = null; @@ -762,14 +761,7 @@ public final class SystemServer { } if (!disableNonCoreServices) { - traceBeginAndSlog("StartTextServicesManagerService"); - try { - tsms = new TextServicesManagerService(context); - ServiceManager.addService(Context.TEXT_SERVICES_MANAGER_SERVICE, tsms); - } catch (Throwable e) { - reportWtf("starting Text Service Manager Service", e); - } - Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class); } if (!disableNetwork) { @@ -1256,7 +1248,6 @@ public final class SystemServer { final CountryDetectorService countryDetectorF = countryDetector; final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater; final CommonTimeManagementService commonTimeMgmtServiceF = commonTimeMgmtService; - final TextServicesManagerService textServiceManagerServiceF = tsms; final StatusBarManagerService statusBarF = statusBar; final AssetAtlasService atlasF = atlas; final InputManagerService inputManagerF = inputManager; @@ -1371,12 +1362,6 @@ public final class SystemServer { } catch (Throwable e) { reportWtf("Notifying CommonTimeManagementService running", e); } - try { - if (textServiceManagerServiceF != null) - textServiceManagerServiceF.systemRunning(); - } catch (Throwable e) { - reportWtf("Notifying TextServicesManagerService running", e); - } try { if (atlasF != null) atlasF.systemRunning(); } catch (Throwable e) {