From 08f3cdb3c87e56ac62f5ac3c573beade592b4b06 Mon Sep 17 00:00:00 2001 From: Dan Zivkovic Date: Fri, 20 Feb 2015 15:13:40 -0800 Subject: [PATCH] Hide app icon when keyboard is a system app. The objective is to show an app icon when the user installs the keyboard from the Play Store, but not show the icon when it comes from the system image. The latter rule applies to AOSP keyboards and to the Google Keyboard on a Nexus device. This change partially reverts ag/613096. Bug 19001197. Change-Id: Icb202deffe9f1ab2bde9b3c9d221347da6793a19 --- .../latin/DictionaryFacilitatorLruCache.java | 8 ++-- .../latin/SystemBroadcastReceiver.java | 45 ++++++++++++++----- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java index e9b26c688..b813af4c2 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java +++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorLruCache.java @@ -35,7 +35,7 @@ public class DictionaryFacilitatorLruCache { private final String mDictionaryNamePrefix; private final Object mLock = new Object(); private final DictionaryFacilitator mDictionaryFacilitator; - private boolean mUseContactsDictionary = false; + private boolean mUseContactsDictionary; private Locale mLocale; public DictionaryFacilitatorLruCache(final Context context, final String dictionaryNamePrefix) { @@ -71,13 +71,13 @@ public class DictionaryFacilitatorLruCache { mDictionaryNamePrefix, null /* listener */); } - public void setUseContactsDictionary(final boolean useContectsDictionary) { + public void setUseContactsDictionary(final boolean useContactsDictionary) { synchronized (mLock) { - if (mUseContactsDictionary == useContectsDictionary) { + if (mUseContactsDictionary == useContactsDictionary) { // The value has not been changed. return; } - mUseContactsDictionary = useContectsDictionary; + mUseContactsDictionary = useContactsDictionary; resetDictionariesForLocaleLocked(); waitForLoadingMainDictionary(mDictionaryFacilitator); } diff --git a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java index db5e632ae..5c3abd2db 100644 --- a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java +++ b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Process; import android.util.Log; @@ -35,6 +36,22 @@ import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils; * package has been replaced by a newer version of the same package. This class also detects * {@link Intent#ACTION_BOOT_COMPLETED} and {@link Intent#ACTION_USER_INITIALIZE} broadcast intent. * + * If this IME has already been installed in the system image and a new version of this IME has + * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received by this receiver and it + * will hide the setup wizard's icon. + * + * If this IME has already been installed in the data partition and a new version of this IME has + * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received by this receiver but it + * will not hide the setup wizard's icon, and the icon will appear on the launcher. + * + * If this IME hasn't been installed yet and has been newly installed, no + * {@link Intent#ACTION_MY_PACKAGE_REPLACED} will be sent and the setup wizard's icon will appear + * on the launcher. + * + * When the device has been booted, {@link Intent#ACTION_BOOT_COMPLETED} is received by this + * receiver and it checks whether the setup wizard's icon should be appeared or not on the launcher + * depending on which partition this IME is installed. + * * When the system locale has been changed, {@link Intent#ACTION_LOCALE_CHANGED} is received by * this receiver and the {@link KeyboardLayoutSet}'s cache is cleared. */ @@ -52,21 +69,22 @@ public final class SystemBroadcastReceiver extends BroadcastReceiver { final RichInputMethodManager richImm = RichInputMethodManager.getInstance(); final InputMethodSubtype[] additionalSubtypes = richImm.getAdditionalSubtypes(); richImm.setAdditionalInputMethodSubtypes(additionalSubtypes); - showAppIcon(context); + toggleAppIcon(context); } else if (Intent.ACTION_BOOT_COMPLETED.equals(intentAction)) { Log.i(TAG, "Boot has been completed"); - showAppIcon(context); + toggleAppIcon(context); } else if (Intent.ACTION_LOCALE_CHANGED.equals(intentAction)) { Log.i(TAG, "System locale changed"); KeyboardLayoutSet.onSystemLocaleChanged(); } // The process that hosts this broadcast receiver is invoked and remains alive even after - // 1) the package has been re-installed, 2) the device has just booted, + // 1) the package has been re-installed, + // 2) the device has just booted, // 3) a new user has been created. // There is no good reason to keep the process alive if this IME isn't a current IME. - final InputMethodManager imm = - (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); + final InputMethodManager imm = (InputMethodManager) + context.getSystemService(Context.INPUT_METHOD_SERVICE); // Called to check whether this IME has been triggered by the current user or not final boolean isInputMethodManagerValidForUserOfThisProcess = !imm.getInputMethodList().isEmpty(); @@ -79,12 +97,17 @@ public final class SystemBroadcastReceiver extends BroadcastReceiver { } } - private static void showAppIcon(final Context context) { - final ComponentName setupWizardActivity = new ComponentName(context, SetupActivity.class); - final PackageManager pm = context.getPackageManager(); - pm.setComponentEnabledSetting( - setupWizardActivity, - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + private static void toggleAppIcon(final Context context) { + final int appInfoFlags = context.getApplicationInfo().flags; + final boolean isSystemApp = (appInfoFlags & ApplicationInfo.FLAG_SYSTEM) > 0; + if (Log.isLoggable(TAG, Log.INFO)) { + Log.i(TAG, "toggleAppIcon() : FLAG_SYSTEM = " + isSystemApp); + } + context.getPackageManager().setComponentEnabledSetting( + new ComponentName(context, SetupActivity.class), + isSystemApp + ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED + : PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } }