summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYohei Yukawa <yukawa@google.com>2015-06-20 00:41:31 -0700
committerYohei Yukawa <yukawa@google.com>2015-06-20 00:41:31 -0700
commit094c71fd5c0b6b7ce4cd71d097d226a6a1acfc90 (patch)
tree08538fb32f7719838fc57bb78037d6b2af1bf49f
parent93297d20865b1548d4405c22bf0c7f94140b43c9 (diff)
downloadframeworks_base-094c71fd5c0b6b7ce4cd71d097d226a6a1acfc90.zip
frameworks_base-094c71fd5c0b6b7ce4cd71d097d226a6a1acfc90.tar.gz
frameworks_base-094c71fd5c0b6b7ce4cd71d097d226a6a1acfc90.tar.bz2
Set DISABLED_UNTIL_USED for the correct user in IMMS.
This CL makes If8ff1b2b95c36d33148def2ab87bd006aa520cc0 multi-user aware. It turns out that DISABLED_UNTIL_USED has not been correctly set to IMEs seen from secondary users because we have used IMMS#mContext.getPackageManager(), which always returns the PackageManager with the primary users' context, when specifying COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED. We should use IPackageManager instead as we have already done in many places of IMMS since Ib23849d352db33f0747aa9d5a178f00. Bug: 8148605 Bug: 8365223 Bug: 21953608 Change-Id: I4b9d6510bf965204bb1f68c8b527d1a4df23fac4
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java39
-rw-r--r--services/core/java/com/android/server/InputMethodManagerService.java11
2 files changed, 35 insertions, 15 deletions
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 042db71..ac17cbe 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -22,9 +22,10 @@ import android.app.AppOpsManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
+import android.os.RemoteException;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils;
@@ -646,7 +647,8 @@ public class InputMethodUtils {
}
public static void setNonSelectedSystemImesDisabledUntilUsed(
- PackageManager packageManager, List<InputMethodInfo> enabledImis) {
+ IPackageManager packageManager, List<InputMethodInfo> enabledImis,
+ int userId, String callingPackage) {
if (DEBUG) {
Slog.d(TAG, "setNonSelectedSystemImesDisabledUntilUsed");
}
@@ -685,9 +687,11 @@ public class InputMethodUtils {
ApplicationInfo ai = null;
try {
ai = packageManager.getApplicationInfo(packageName,
- PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
- } catch (NameNotFoundException e) {
- Slog.w(TAG, "NameNotFoundException: " + packageName, e);
+ PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, userId);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "getApplicationInfo failed. packageName=" + packageName
+ + " userId=" + userId, e);
+ continue;
}
if (ai == null) {
// No app found for packageName
@@ -697,19 +701,34 @@ public class InputMethodUtils {
if (!isSystemPackage) {
continue;
}
- setDisabledUntilUsed(packageManager, packageName);
+ setDisabledUntilUsed(packageManager, packageName, userId, callingPackage);
}
}
- private static void setDisabledUntilUsed(PackageManager packageManager, String packageName) {
- final int state = packageManager.getApplicationEnabledSetting(packageName);
+ private static void setDisabledUntilUsed(IPackageManager packageManager, String packageName,
+ int userId, String callingPackage) {
+ final int state;
+ try {
+ state = packageManager.getApplicationEnabledSetting(packageName, userId);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "getApplicationEnabledSetting failed. packageName=" + packageName
+ + " userId=" + userId, e);
+ return;
+ }
if (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
|| state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
if (DEBUG) {
Slog.d(TAG, "Update state(" + packageName + "): DISABLED_UNTIL_USED");
}
- packageManager.setApplicationEnabledSetting(packageName,
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0);
+ try {
+ packageManager.setApplicationEnabledSetting(packageName,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED,
+ 0 /* newState */, userId, callingPackage);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "setApplicationEnabledSetting failed. packageName=" + packageName
+ + " userId=" + userId + " callingPackage=" + callingPackage, e);
+ return;
+ }
} else {
if (DEBUG) {
Slog.d(TAG, packageName + " is already DISABLED_UNTIL_USED");
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 2f153a0..0216f2f 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -1009,8 +1009,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
resetAllInternalStateLocked(false /* updateOnlyWhenLocaleChanged */,
initialUserSwitch /* needsToResetDefaultIme */);
if (initialUserSwitch) {
- InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mContext.getPackageManager(),
- mSettings.getEnabledInputMethodListLocked());
+ InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager,
+ mSettings.getEnabledInputMethodListLocked(), newUserId,
+ mContext.getBasePackageName());
}
if (DEBUG) Slog.d(TAG, "Switching user stage 3/3. newUserId=" + newUserId
@@ -1067,9 +1068,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (!mImeSelectedOnBoot) {
Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here.");
resetStateIfCurrentLocaleChangedLocked();
- InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
- mContext.getPackageManager(),
- mSettings.getEnabledInputMethodListLocked());
+ InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager,
+ mSettings.getEnabledInputMethodListLocked(),
+ mSettings.getCurrentUserId(), mContext.getBasePackageName());
}
mLastSystemLocale = mRes.getConfiguration().locale;
try {