diff options
| author | Derek Sollenberger <djsollen@google.com> | 2009-09-22 14:08:09 -0400 |
|---|---|---|
| committer | Derek Sollenberger <djsollen@google.com> | 2009-09-22 16:29:17 -0400 |
| commit | c0b8a96d28c55cb51e4f9e1f85c8d3ecf1ff13bf (patch) | |
| tree | 8a8dd9d14d1ad56cad4daa501a7d6b1a807bde66 /core/java/android/webkit/PluginManager.java | |
| parent | 34ca22d25303633c855a738409ea2f8e3f79a713 (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.java | 126 |
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(); } |
