am 34df42d5: Merge "Make IMMS#mSettingsObserver multiuser-aware." into mnc-dev

* commit '34df42d59753e7721b346d1048c686d204a44da3':
  Make IMMS#mSettingsObserver multiuser-aware.
This commit is contained in:
Yohei Yukawa
2015-06-04 21:41:32 +00:00
committed by Android Git Automerger

View File

@@ -428,19 +428,39 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private final IPackageManager mIPackageManager;
class SettingsObserver extends ContentObserver {
int mUserId;
boolean mRegistered = false;
String mLastEnabled = "";
/**
* <em>This constructor must be called within the lock.</em>
*/
SettingsObserver(Handler handler) {
super(handler);
}
public void registerContentObserverLocked(int userId) {
if (mRegistered && mUserId == userId) {
return;
}
ContentResolver resolver = mContext.getContentResolver();
if (mRegistered) {
mContext.getContentResolver().unregisterContentObserver(this);
mRegistered = false;
}
if (mUserId != userId) {
mLastEnabled = "";
mUserId = userId;
}
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.DEFAULT_INPUT_METHOD), false, this);
Settings.Secure.DEFAULT_INPUT_METHOD), false, this, userId);
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ENABLED_INPUT_METHODS), false, this);
Settings.Secure.ENABLED_INPUT_METHODS), false, this, userId);
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, this);
Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, this, userId);
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD), false, this);
Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD), false, this, userId);
mRegistered = true;
}
@Override public void onChange(boolean selfChange, Uri uri) {
@@ -460,6 +480,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
}
@Override
public String toString() {
return "SettingsObserver{mUserId=" + mUserId + " mRegistered=" + mRegistered
+ " mLastEnabled=" + mLastEnabled + "}";
}
}
class ImmsBroadcastReceiver extends android.content.BroadcastReceiver {
@@ -756,6 +782,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mContext = context;
mRes = context.getResources();
mHandler = new Handler(this);
// Note: SettingsObserver doesn't register observers in its constructor.
mSettingsObserver = new SettingsObserver(mHandler);
mIWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getService(Context.WINDOW_SERVICE));
mCaller = new HandlerCaller(context, null, new HandlerCaller.Callback() {
@@ -860,8 +888,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
mSettingsObserver = new SettingsObserver(mHandler);
synchronized (mMethodMap) {
mSettingsObserver.registerContentObserverLocked(userId);
updateFromSettingsLocked(true);
}
@@ -963,6 +991,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (DEBUG) Slog.d(TAG, "Switching user stage 1/3. newUserId=" + newUserId
+ " currentUserId=" + mSettings.getCurrentUserId());
// ContentObserver should be registered again when the user is changed
mSettingsObserver.registerContentObserverLocked(newUserId);
mSettings.setCurrentUserId(newUserId);
updateCurrentProfileIds();
// InputMethodFileManager should be reset when the user is changed
@@ -3713,6 +3743,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
p.println(" mCurUserActionNotificationSequenceNumber="
+ mCurUserActionNotificationSequenceNumber);
p.println(" mSystemReady=" + mSystemReady + " mInteractive=" + mScreenOn);
p.println(" mSettingsObserver=" + mSettingsObserver);
p.println(" mSwitchingController:");
mSwitchingController.dump(p);
}