Cache application info.

Bug: 6537051
Change-Id: Ieca891235df0d697bdeb0510651b703654fdef38
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 44aab33..c585494 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -667,9 +667,12 @@
             Log.w(TAG, "Use EditorInfo.IME_FLAG_FORCE_ASCII flag instead");
         }
 
-        mTargetApplicationInfo = null;
-        new TargetApplicationGetter(this /* context */, this /* listener */)
-                .execute(editorInfo.packageName);
+        mTargetApplicationInfo =
+                TargetApplicationGetter.getCachedApplicationInfo(editorInfo.packageName);
+        if (null == mTargetApplicationInfo) {
+            new TargetApplicationGetter(this /* context */, this /* listener */)
+                    .execute(editorInfo.packageName);
+        }
 
         LatinImeLogger.onStartInputView(editorInfo);
         // In landscape mode, this method gets called without the input view being created.
diff --git a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java
index 109f23f..46300b4 100644
--- a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java
+++ b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java
@@ -20,9 +20,19 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.AsyncTask;
+import android.util.LruCache;
 
 public class TargetApplicationGetter extends AsyncTask<String, Void, ApplicationInfo> {
 
+    private static final int MAX_CACHE_ENTRIES = 64; // arbitrary
+    private static LruCache<String, ApplicationInfo> sCache =
+            new LruCache<String, ApplicationInfo>(MAX_CACHE_ENTRIES);
+
+    public static ApplicationInfo getCachedApplicationInfo(final String packageName) {
+        return sCache.get(packageName);
+    }
+    // TODO: Wipe the cache when new packages are installed.
+
     public interface OnTargetApplicationKnownListener {
         public void onTargetApplicationKnown(final ApplicationInfo info);
     }
@@ -38,12 +48,12 @@
 
     @Override
     protected ApplicationInfo doInBackground(final String... packageName) {
-        // TODO: cache app info. Wipe the cache when new packages are installed.
         final PackageManager pm = mContext.getPackageManager();
         mContext = null; // Bazooka-powered anti-leak device
         try {
             final ApplicationInfo targetAppInfo =
                     pm.getApplicationInfo(packageName[0], 0 /* flags */);
+            sCache.put(packageName[0], targetAppInfo);
             return targetAppInfo;
         } catch (android.content.pm.PackageManager.NameNotFoundException e) {
             return null;