summaryrefslogtreecommitdiff
path: root/core/java/android/webkit/PluginManager.java
diff options
context:
space:
mode:
authorDerek Sollenberger <djsollen@google.com>2009-09-22 14:08:09 -0400
committerDerek Sollenberger <djsollen@google.com>2009-09-22 16:29:17 -0400
commitc0b8a96d28c55cb51e4f9e1f85c8d3ecf1ff13bf (patch)
tree8a8dd9d14d1ad56cad4daa501a7d6b1a807bde66 /core/java/android/webkit/PluginManager.java
parent34ca22d25303633c855a738409ea2f8e3f79a713 (diff)
launching plugin activity when a plugin requests to go full screen.
Change-Id: Ib42bb08d01a75ca3a9c02085ee185396bb7b7378
Diffstat (limited to 'core/java/android/webkit/PluginManager.java')
-rw-r--r--core/java/android/webkit/PluginManager.java126
1 files changed, 79 insertions, 47 deletions
diff --git a/core/java/android/webkit/PluginManager.java b/core/java/android/webkit/PluginManager.java
index 32eea5fcc95a..766bd75852ce 100644
--- a/core/java/android/webkit/PluginManager.java
+++ b/core/java/android/webkit/PluginManager.java
@@ -63,8 +63,11 @@ public class PluginManager {
private final Context mContext;
+ private ArrayList<PackageInfo> mPackageInfoCache;
+
private PluginManager(Context context) {
mContext = context;
+ mPackageInfoCache = new ArrayList<PackageInfo>();
}
public static synchronized PluginManager getInstance(Context context) {
@@ -92,65 +95,94 @@ public class PluginManager {
}
String[] getPluginDirectories() {
+
ArrayList<String> directories = new ArrayList<String>();
PackageManager pm = mContext.getPackageManager();
List<ResolveInfo> plugins = pm.queryIntentServices(new Intent(
PLUGIN_ACTION), PackageManager.GET_SERVICES);
- for (ResolveInfo info : plugins) {
- ServiceInfo serviceInfo = info.serviceInfo;
- if (serviceInfo == null) {
- Log.w(LOGTAG, "Ignore bad plugin");
- continue;
- }
- PackageInfo pkgInfo;
- try {
- pkgInfo = pm.getPackageInfo(serviceInfo.packageName,
- PackageManager.GET_PERMISSIONS
- | PackageManager.GET_SIGNATURES);
- } catch (NameNotFoundException e) {
- Log.w(LOGTAG, "Cant find plugin: " + serviceInfo.packageName);
- continue;
- }
- if (pkgInfo == null) {
- continue;
- }
- String directory = pkgInfo.applicationInfo.dataDir + "/lib";
- if (directories.contains(directory)) {
- continue;
- }
- String permissions[] = pkgInfo.requestedPermissions;
- if (permissions == null) {
- continue;
- }
- boolean permissionOk = false;
- for (String permit : permissions) {
- if (PLUGIN_PERMISSION.equals(permit)) {
- permissionOk = true;
+
+ synchronized(mPackageInfoCache) {
+
+ // clear the list of existing packageInfo objects
+ mPackageInfoCache.clear();
+
+ for (ResolveInfo info : plugins) {
+ ServiceInfo serviceInfo = info.serviceInfo;
+ if (serviceInfo == null) {
+ Log.w(LOGTAG, "Ignore bad plugin");
+ continue;
+ }
+ PackageInfo pkgInfo;
+ try {
+ pkgInfo = pm.getPackageInfo(serviceInfo.packageName,
+ PackageManager.GET_PERMISSIONS
+ | PackageManager.GET_SIGNATURES);
+ } catch (NameNotFoundException e) {
+ Log.w(LOGTAG, "Cant find plugin: " + serviceInfo.packageName);
+ continue;
+ }
+ if (pkgInfo == null) {
+ continue;
+ }
+ String directory = pkgInfo.applicationInfo.dataDir + "/lib";
+ if (directories.contains(directory)) {
+ continue;
+ }
+ String permissions[] = pkgInfo.requestedPermissions;
+ if (permissions == null) {
+ continue;
+ }
+ boolean permissionOk = false;
+ for (String permit : permissions) {
+ if (PLUGIN_PERMISSION.equals(permit)) {
+ permissionOk = true;
+ break;
+ }
+ }
+ if (!permissionOk) {
+ continue;
+ }
+ Signature signatures[] = pkgInfo.signatures;
+ if (signatures == null) {
+ continue;
+ }
+ boolean signatureMatch = false;
+ for (Signature signature : signatures) {
+ // TODO: check signature against Google provided one
+ signatureMatch = true;
break;
}
+ if (!signatureMatch) {
+ continue;
+ }
+ mPackageInfoCache.add(pkgInfo);
+ directories.add(directory);
}
- if (!permissionOk) {
- continue;
- }
- Signature signatures[] = pkgInfo.signatures;
- if (signatures == null) {
- continue;
- }
- boolean signatureMatch = false;
- for (Signature signature : signatures) {
- // TODO: check signature against Google provided one
- signatureMatch = true;
- break;
- }
- if (!signatureMatch) {
- continue;
- }
- directories.add(directory);
}
return directories.toArray(new String[directories.size()]);
}
+ String getPluginsAPKName(String pluginLib) {
+
+ // basic error checking on input params
+ if (pluginLib == null || pluginLib.length() == 0) {
+ return null;
+ }
+
+ // must be synchronized to ensure the consistency of the cache
+ synchronized(mPackageInfoCache) {
+ for (PackageInfo pkgInfo : mPackageInfoCache) {
+ if (pluginLib.startsWith(pkgInfo.applicationInfo.dataDir)) {
+ return pkgInfo.packageName;
+ }
+ }
+ }
+
+ // if no apk was found then return null
+ return null;
+ }
+
String getPluginSharedDataDirectory() {
return mContext.getDir("plugins", 0).getPath();
}