diff options
| author | Derek Sollenberger <djsollen@google.com> | 2009-11-09 14:45:58 -0500 |
|---|---|---|
| committer | Derek Sollenberger <djsollen@google.com> | 2009-11-09 14:45:58 -0500 |
| commit | 9e28c4ce666f1b8c5e5355d739e37480856ef509 (patch) | |
| tree | ba5b9139d7ed17941421255b5577835fb0371da8 /core/java/android/webkit | |
| parent | 0e983864fca215513de9664573dcc3bbadf41e79 (diff) | |
| download | frameworks_base-9e28c4ce666f1b8c5e5355d739e37480856ef509.zip frameworks_base-9e28c4ce666f1b8c5e5355d739e37480856ef509.tar.gz frameworks_base-9e28c4ce666f1b8c5e5355d739e37480856ef509.tar.bz2 | |
Allow plugins to load java classes from their apk.
Provide the functions to be called from native code that take
the plugin's location and desired class name and then load that
class from the plugin's apk if it is available.
see http://b/2215696
Diffstat (limited to 'core/java/android/webkit')
| -rw-r--r-- | core/java/android/webkit/PluginUtil.java | 20 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 27 |
2 files changed, 38 insertions, 9 deletions
diff --git a/core/java/android/webkit/PluginUtil.java b/core/java/android/webkit/PluginUtil.java index 8fdbd67..33ccf9d 100644 --- a/core/java/android/webkit/PluginUtil.java +++ b/core/java/android/webkit/PluginUtil.java @@ -19,9 +19,6 @@ import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - class PluginUtil { private static final String LOGTAG = "PluginUtil"; @@ -35,12 +32,7 @@ class PluginUtil { static PluginStub getPluginStub(Context context, String packageName, String className) { try { - Context pluginContext = context.createPackageContext(packageName, - Context.CONTEXT_INCLUDE_CODE | - Context.CONTEXT_IGNORE_SECURITY); - ClassLoader pluginCL = pluginContext.getClassLoader(); - - Class<?> stubClass = pluginCL.loadClass(className); + Class<?> stubClass = getPluginClass(context, packageName, className); Object stubObject = stubClass.newInstance(); if (stubObject instanceof PluginStub) { @@ -56,4 +48,14 @@ class PluginUtil { } return null; } + + /* package */ + static Class<?> getPluginClass(Context context, String packageName, + String className) throws NameNotFoundException, ClassNotFoundException { + Context pluginContext = context.createPackageContext(packageName, + Context.CONTEXT_INCLUDE_CODE | + Context.CONTEXT_IGNORE_SECURITY); + ClassLoader pluginCL = pluginContext.getClassLoader(); + return pluginCL.loadClass(className); + } } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index bfaa353..5460a47 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -18,6 +18,7 @@ package android.webkit; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager.NameNotFoundException; import android.database.Cursor; import android.graphics.Canvas; import android.graphics.DrawFilter; @@ -2167,6 +2168,32 @@ final class WebViewCore { } } + // called by JNI + private Class<?> getPluginClass(String libName, String clsName) { + + if (mWebView == null) { + return null; + } + + String pkgName = PluginManager.getInstance(null).getPluginsAPKName(libName); + if (pkgName == null) { + Log.w(LOGTAG, "Unable to resolve " + libName + " to a plugin APK"); + return null; + } + + Class<?> pluginClass = null; + try { + pluginClass = PluginUtil.getPluginClass(mWebView.getContext(), pkgName, clsName); + } catch (NameNotFoundException e) { + Log.e(LOGTAG, "Unable to find plugin classloader for the apk (" + pkgName + ")"); + } catch (ClassNotFoundException e) { + Log.e(LOGTAG, "Unable to find plugin class (" + clsName + + ") in the apk (" + pkgName + ")"); + } + + return pluginClass; + } + // called by JNI. PluginWidget function to launch an activity and overlays // the activity with the View provided by the plugin class. private void startFullScreenPluginActivity(String libName, String clsName, int npp) { |
