diff options
Diffstat (limited to 'core/java/com')
5 files changed, 139 insertions, 21 deletions
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java index 424c19b..ab871fb 100644 --- a/core/java/com/android/internal/content/PackageMonitor.java +++ b/core/java/com/android/internal/content/PackageMonitor.java @@ -25,6 +25,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.UserHandle; +import com.android.internal.os.BackgroundThread; import java.util.HashSet; @@ -37,10 +38,6 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { static final IntentFilter sNonDataFilt = new IntentFilter(); static final IntentFilter sExternalFilt = new IntentFilter(); - static final Object sLock = new Object(); - static HandlerThread sBackgroundThread; - static Handler sBackgroundHandler; - static { sPackageFilt.addAction(Intent.ACTION_PACKAGE_ADDED); sPackageFilt.addAction(Intent.ACTION_PACKAGE_REMOVED); @@ -79,15 +76,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } mRegisteredContext = context; if (thread == null) { - synchronized (sLock) { - if (sBackgroundThread == null) { - sBackgroundThread = new HandlerThread("PackageMonitor", - android.os.Process.THREAD_PRIORITY_BACKGROUND); - sBackgroundThread.start(); - sBackgroundHandler = new Handler(sBackgroundThread.getLooper()); - } - mRegisteredHandler = sBackgroundHandler; - } + mRegisteredHandler = BackgroundThread.getHandler(); } else { mRegisteredHandler = new Handler(thread); } diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index 655d148..4e21324 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; @@ -28,6 +29,8 @@ import android.util.Pair; import android.util.Slog; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype; +import android.view.textservice.SpellCheckerInfo; +import android.view.textservice.TextServicesManager; import java.util.ArrayList; import java.util.HashMap; @@ -357,6 +360,78 @@ public class InputMethodUtils { return !subtype.isAuxiliary(); } + public static void setNonSelectedSystemImesDisabledUntilUsed( + PackageManager packageManager, List<InputMethodInfo> enabledImis) { + if (DEBUG) { + Slog.d(TAG, "setNonSelectedSystemImesDisabledUntilUsed"); + } + final String[] systemImesDisabledUntilUsed = Resources.getSystem().getStringArray( + com.android.internal.R.array.config_disabledUntilUsedPreinstalledImes); + if (systemImesDisabledUntilUsed == null || systemImesDisabledUntilUsed.length == 0) { + return; + } + // Only the current spell checker should be treated as an enabled one. + final SpellCheckerInfo currentSpellChecker = + TextServicesManager.getInstance().getCurrentSpellChecker(); + for (final String packageName : systemImesDisabledUntilUsed) { + if (DEBUG) { + Slog.d(TAG, "check " + packageName); + } + boolean enabledIme = false; + for (int j = 0; j < enabledImis.size(); ++j) { + final InputMethodInfo imi = enabledImis.get(j); + if (packageName.equals(imi.getPackageName())) { + enabledIme = true; + break; + } + } + if (enabledIme) { + // enabled ime. skip + continue; + } + if (currentSpellChecker != null + && packageName.equals(currentSpellChecker.getPackageName())) { + // enabled spell checker. skip + if (DEBUG) { + Slog.d(TAG, packageName + " is the current spell checker. skip"); + } + continue; + } + ApplicationInfo ai = null; + try { + ai = packageManager.getApplicationInfo(packageName, + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS); + } catch (NameNotFoundException e) { + Slog.w(TAG, "NameNotFoundException: " + packageName, e); + } + if (ai == null) { + // No app found for packageName + continue; + } + final boolean isSystemPackage = (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + if (!isSystemPackage) { + continue; + } + setDisabledUntilUsed(packageManager, packageName); + } + } + + private static void setDisabledUntilUsed(PackageManager packageManager, String packageName) { + final int state = packageManager.getApplicationEnabledSetting(packageName); + 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); + } else { + if (DEBUG) { + Slog.d(TAG, packageName + " is already DISABLED_UNTIL_USED"); + } + } + } + /** * Utility class for putting and getting settings for InputMethod * TODO: Move all putters and getters of settings to this class. @@ -405,8 +480,7 @@ public class InputMethodUtils { public void setCurrentUserId(int userId) { if (DEBUG) { - Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " - + userId + ", new ime = " + getSelectedInputMethod()); + Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " + userId); } // IMMS settings are kept per user, so keep track of current user mCurrentUserId = userId; diff --git a/core/java/com/android/internal/os/BackgroundThread.java b/core/java/com/android/internal/os/BackgroundThread.java new file mode 100644 index 0000000..d6f7b20 --- /dev/null +++ b/core/java/com/android/internal/os/BackgroundThread.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + +import android.os.Handler; +import android.os.HandlerThread; + +/** + * Shared singleton background thread for each process. + */ +public final class BackgroundThread extends HandlerThread { + private static BackgroundThread sInstance; + private static Handler sHandler; + + private BackgroundThread() { + super("android.bg", android.os.Process.THREAD_PRIORITY_BACKGROUND); + } + + private static void ensureThreadLocked() { + if (sInstance == null) { + sInstance = new BackgroundThread(); + sInstance.start(); + sHandler = new Handler(sInstance.getLooper()); + } + } + + public static BackgroundThread get() { + synchronized (BackgroundThread.class) { + ensureThreadLocked(); + return sInstance; + } + } + + public static Handler getHandler() { + synchronized (BackgroundThread.class) { + ensureThreadLocked(); + return sHandler; + } + } +} diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index fb22df7..9991f5b 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -479,7 +479,6 @@ public class ZygoteInit { OsConstants.CAP_NET_BIND_SERVICE, OsConstants.CAP_NET_BROADCAST, OsConstants.CAP_NET_RAW, - OsConstants.CAP_SYS_BOOT, OsConstants.CAP_SYS_MODULE, OsConstants.CAP_SYS_NICE, OsConstants.CAP_SYS_RESOURCE, diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java index 7189610..39078ca 100644 --- a/core/java/com/android/internal/view/menu/MenuItemImpl.java +++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java @@ -598,11 +598,13 @@ public final class MenuItemImpl implements MenuItem { mActionView = null; mActionProvider = actionProvider; mMenu.onItemsChanged(true); // Measurement can be changed - mActionProvider.setVisibilityListener(new ActionProvider.VisibilityListener() { - @Override public void onActionProviderVisibilityChanged(boolean isVisible) { - mMenu.onItemVisibleChanged(MenuItemImpl.this); - } - }); + if (mActionProvider != null) { + mActionProvider.setVisibilityListener(new ActionProvider.VisibilityListener() { + @Override public void onActionProviderVisibilityChanged(boolean isVisible) { + mMenu.onItemVisibleChanged(MenuItemImpl.this); + } + }); + } return this; } |
