From b224b60c94d85f30de93f66685adf06e662618c0 Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Fri, 25 May 2012 18:07:52 +0900 Subject: Get information about the target application. Bug: 6537051 Change-Id: I9fe7a07b5ddf2a423d5764840753ea70544206f1 --- .../inputmethod/latin/TargetApplicationGetter.java | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 java/src/com/android/inputmethod/latin/TargetApplicationGetter.java (limited to 'java/src/com/android/inputmethod/latin/TargetApplicationGetter.java') diff --git a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java new file mode 100644 index 000000000..109f23f4c --- /dev/null +++ b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2012 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.inputmethod.latin; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.os.AsyncTask; + +public class TargetApplicationGetter extends AsyncTask { + + public interface OnTargetApplicationKnownListener { + public void onTargetApplicationKnown(final ApplicationInfo info); + } + + private Context mContext; + private final OnTargetApplicationKnownListener mListener; + + public TargetApplicationGetter(final Context context, + final OnTargetApplicationKnownListener listener) { + mContext = context; + mListener = listener; + } + + @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 */); + return targetAppInfo; + } catch (android.content.pm.PackageManager.NameNotFoundException e) { + return null; + } + } + + @Override + protected void onPostExecute(final ApplicationInfo info) { + mListener.onTargetApplicationKnown(info); + } +} -- cgit v1.2.3-83-g751a From 1b1243d61fd682d804e61de6a1eccbf0e8ba78b2 Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Fri, 25 May 2012 18:19:19 +0900 Subject: Cache application info. Bug: 6537051 Change-Id: Ieca891235df0d697bdeb0510651b703654fdef38 --- java/src/com/android/inputmethod/latin/LatinIME.java | 9 ++++++--- .../android/inputmethod/latin/TargetApplicationGetter.java | 12 +++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'java/src/com/android/inputmethod/latin/TargetApplicationGetter.java') diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 44aab3395..c58549497 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -667,9 +667,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen 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 109f23f4c..46300b479 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.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; +import android.util.LruCache; public class TargetApplicationGetter extends AsyncTask { + private static final int MAX_CACHE_ENTRIES = 64; // arbitrary + private static LruCache sCache = + new LruCache(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 @@ public class TargetApplicationGetter extends AsyncTask Date: Fri, 25 May 2012 18:39:27 +0900 Subject: Wipe the application cache selectively Bug: 6537051 Change-Id: I839d0a98c729f3604582946d70c0140a5cff7dcf --- .../inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java | 2 ++ java/src/com/android/inputmethod/latin/TargetApplicationGetter.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'java/src/com/android/inputmethod/latin/TargetApplicationGetter.java') diff --git a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java index 9d30af84b..9c37d7673 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java +++ b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java @@ -51,6 +51,8 @@ public class DictionaryPackInstallBroadcastReceiver extends BroadcastReceiver { if (null == packageUri) return; // No package name : we can't do anything final String packageName = packageUri.getSchemeSpecificPart(); if (null == packageName) return; + // TODO: do this in a more appropriate place + TargetApplicationGetter.removeApplicationInfoCache(packageName); final PackageInfo packageInfo; try { packageInfo = manager.getPackageInfo(packageName, PackageManager.GET_PROVIDERS); diff --git a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java index 46300b479..4fb2e9704 100644 --- a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java +++ b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java @@ -31,7 +31,9 @@ public class TargetApplicationGetter extends AsyncTask Date: Thu, 31 May 2012 19:33:39 +0900 Subject: Fix a possible NPE. This NPE's at least in unit tests. Change-Id: I255ac5fec9502e4e5bd18cba1211cdf46c6cafc8 --- java/src/com/android/inputmethod/latin/TargetApplicationGetter.java | 1 + 1 file changed, 1 insertion(+) (limited to 'java/src/com/android/inputmethod/latin/TargetApplicationGetter.java') diff --git a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java index 4fb2e9704..4265309e5 100644 --- a/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java +++ b/java/src/com/android/inputmethod/latin/TargetApplicationGetter.java @@ -29,6 +29,7 @@ public class TargetApplicationGetter extends AsyncTask(MAX_CACHE_ENTRIES); public static ApplicationInfo getCachedApplicationInfo(final String packageName) { + if (null == packageName) return null; return sCache.get(packageName); } public static void removeApplicationInfoCache(final String packageName) { -- cgit v1.2.3-83-g751a