Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c5bf466 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

consolidating to only use one surface per plugin. give plugin access to java context.

There is a companion commit in external webkit.
parent 04e0a101
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

class PluginFullScreenHolder extends Dialog {

@@ -37,6 +38,7 @@ class PluginFullScreenHolder extends Dialog {

    private final WebView mWebView;
    private final int mNpp;
    private View mContentView;
    private int mX;
    private int mY;
    private int mWidth;
@@ -63,6 +65,12 @@ class PluginFullScreenHolder extends Dialog {
        mHeight = height;
    }

    @Override
    public void setContentView(View contentView) {
        super.setContentView(contentView);
        mContentView = contentView;
    }

    @Override
    public void onBackPressed() {
        mWebView.mPrivateHandler.obtainMessage(WebView.HIDE_FULLSCREEN)
@@ -113,6 +121,11 @@ class PluginFullScreenHolder extends Dialog {
    @Override
    protected void onStop() {
        super.onStop();
        // manually remove the contentView's parent since the dialog does not
        if (mContentView != null && mContentView.getParent() != null) {
            ViewGroup vg = (ViewGroup) mContentView.getParent();
            vg.removeView(mContentView);
        }
        mWebView.getWebViewCore().sendMessage(
                WebViewCore.EventHub.HIDE_FULLSCREEN, mNpp, 0);
    }
+12 −64
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import java.util.List;

import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
@@ -31,8 +32,6 @@ import android.content.pm.Signature;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.SystemProperties;
import android.util.Log;
import android.webkit.plugin.NativePlugin;
import android.webkit.plugin.WebkitPlugin;

/**
 * Class for managing the relationship between the {@link WebView} and installed
@@ -43,12 +42,6 @@ import android.webkit.plugin.WebkitPlugin;
 */
public class PluginManager {

    private class PluginInfo {
        public PackageInfo packageInfo;
        public boolean isNative;
        public Class<? extends WebkitPlugin> pluginClass;
    }

    /**
     * Service Action: A plugin wishes to be loaded in the WebView must provide
     * {@link android.content.IntentFilter IntentFilter} that accepts this
@@ -75,7 +68,7 @@ public class PluginManager {

    private final Context mContext;

    private ArrayList<PluginInfo> mPluginInfoCache;
    private ArrayList<PackageInfo> mPackageInfoCache;

    // Only plugin matches one of the signatures in the list can be loaded
    // inside the WebView process
@@ -87,7 +80,7 @@ public class PluginManager {

    private PluginManager(Context context) {
        mContext = context;
        mPluginInfoCache = new ArrayList<PluginInfo>();
        mPackageInfoCache = new ArrayList<PackageInfo>();
    }

    public static synchronized PluginManager getInstance(Context context) {
@@ -122,10 +115,10 @@ public class PluginManager {
                PLUGIN_ACTION), PackageManager.GET_SERVICES
                | PackageManager.GET_META_DATA);

        synchronized(mPluginInfoCache) {
        synchronized(mPackageInfoCache) {

            // clear the list of existing packageInfo objects
            mPluginInfoCache.clear();
            mPackageInfoCache.clear();

            for (ResolveInfo info : plugins) {

@@ -192,9 +185,6 @@ public class PluginManager {
                    }
                }

                PluginInfo pluginInfo = new PluginInfo();
                pluginInfo.packageInfo = pkgInfo;

                // determine the type of plugin from the manifest
                if (serviceInfo.metaData == null) {
                    Log.e(LOGTAG, "The plugin '" + serviceInfo.name + "' has no type defined");
@@ -202,9 +192,7 @@ public class PluginManager {
                }

                String pluginType = serviceInfo.metaData.getString(PLUGIN_TYPE);
                if (TYPE_NATIVE.equals(pluginType)) {
                    pluginInfo.isNative = true;
                } else {
                if (!TYPE_NATIVE.equals(pluginType)) {
                    Log.e(LOGTAG, "Unrecognized plugin type: " + pluginType);
                    continue;
                }
@@ -212,17 +200,11 @@ public class PluginManager {
                try {
                    Class<?> cls = getPluginClass(serviceInfo.packageName, serviceInfo.name);

                    boolean classFound = false;
                    for(Class<?> implemented : cls.getInterfaces()) {
                        if (pluginInfo.isNative && implemented.equals(NativePlugin.class)) {
                            pluginInfo.pluginClass = cls.asSubclass(WebkitPlugin.class);
                            classFound = true;
                            break;
                        }
                    }
                    //TODO implement any requirements of the plugin class here!
                    boolean classFound = true;

                    if (!classFound) {
                        Log.e(LOGTAG, "The plugin's class'" + serviceInfo.name + "' does not extend the appropriate interface.");
                        Log.e(LOGTAG, "The plugin's class' " + serviceInfo.name + "' does not extend the appropriate class.");
                        continue;
                    }

@@ -235,7 +217,7 @@ public class PluginManager {
                }

                // if all checks have passed then make the plugin available
                mPluginInfoCache.add(pluginInfo);
                mPackageInfoCache.add(pkgInfo);
                directories.add(directory);
            }
        }
@@ -252,9 +234,8 @@ public class PluginManager {
        }

        // must be synchronized to ensure the consistency of the cache
        synchronized(mPluginInfoCache) {
            for (PluginInfo pluginInfo : mPluginInfoCache) {
                PackageInfo pkgInfo = pluginInfo.packageInfo;
        synchronized(mPackageInfoCache) {
            for (PackageInfo pkgInfo : mPackageInfoCache) {
                if (pluginLib.startsWith(pkgInfo.applicationInfo.dataDir)) {
                    return pkgInfo.packageName;
                }
@@ -269,39 +250,6 @@ public class PluginManager {
        return mContext.getDir("plugins", 0).getPath();
    }

    /* package */
    WebkitPlugin getPluginInstance(String pkgName, int npp) {

        // must be synchronized to ensure the consistency of the cache
        synchronized(mPluginInfoCache) {

            // lookup plugin based on pkgName and instantiate if possible.
            for (PluginInfo pluginInfo : mPluginInfoCache) {

                if (pluginInfo.packageInfo.packageName.equals(pkgName)) {

                    try {
                        WebkitPlugin webkitPlugin = pluginInfo.pluginClass.newInstance();

                        if (pluginInfo.isNative) {
                            NativePlugin nativePlugin = (NativePlugin) webkitPlugin;
                            nativePlugin.initializePlugin(npp, mContext);
                        }

                        return webkitPlugin;
                    } catch (Exception e) {
                        // Any number of things could have happened. Log the exception and
                        // return null. Careful not to use Log.e(LOGTAG, "String", e)
                        // because that reports the exception to the checkin service.
                        Log.e(LOGTAG, Log.getStackTraceString(e));
                    }
                    break;
                }
            }
        }
        return null;
    }

    /* package */
    Class<?> getPluginClass(String packageName, String className)
            throws NameNotFoundException, ClassNotFoundException {
+14 −34
Original line number Diff line number Diff line
@@ -2254,6 +2254,11 @@ final class WebViewCore {
        }
    }

    // called by JNI
    private Context getContext() {
        return mContext;
    }

    // called by JNI
    private Class<?> getPluginClass(String libName, String clsName) {
        
@@ -2281,40 +2286,17 @@ final class WebViewCore {
        return null;
    }

    private WebkitPlugin createPluginJavaInstance(String libName, int npp) {
        
        if (mWebView == null) {
            return null;
        }

        PluginManager pluginManager = PluginManager.getInstance(null);

        String pkgName = pluginManager.getPluginsAPKName(libName);
        if (pkgName == null) {
            Log.w(LOGTAG, "Unable to resolve " + libName + " to a plugin APK");
            return null;
        }

        return pluginManager.getPluginInstance(pkgName, npp);
    }

    // called by JNI. PluginWidget function to launch a full-screen view using a
    // View object provided by the plugin class.
    private void showFullScreenPlugin(WebkitPlugin webkitPlugin, final int npp,
            int x, int y, int width, int height) {
        if (mWebView == null) {
            return;
        }
    private void showFullScreenPlugin(ViewManager.ChildView childView,
            final int npp, int x, int y, int width, int height) {

        final SurfaceDrawingModel surface = webkitPlugin.getFullScreenSurface();
        if(surface == null) {
            Log.e(LOGTAG, "Attempted to create an full-screen surface with a " +
                    "null drawing model");
        if (mWebView == null) {
            return;
        }

        PluginFullScreenData data = new PluginFullScreenData();
        data.mView = surface.getSurface();
        data.mView = childView.mView;
        data.mNpp = npp;
        data.mDocX = x;
        data.mDocY = y;
@@ -2351,20 +2333,18 @@ final class WebViewCore {

    // called by JNI.  PluginWidget functions for creating an embedded View for
    // the surface drawing model.
    private ViewManager.ChildView createSurface(WebkitPlugin webkitPlugin,
            int x, int y, int width, int height) {
        
    private ViewManager.ChildView addSurface(View pluginView, int x, int y,
                                             int width, int height) {
        if (mWebView == null) {
            return null;
        }

        SurfaceDrawingModel embeddedSurface = webkitPlugin.getEmbeddedSurface();
        if(embeddedSurface == null) {
            Log.e(LOGTAG, "Attempted to create an embedded surface with a null drawing model");
        if (pluginView == null) {
            Log.e(LOGTAG, "Attempted to add an empty plugin view to the view hierarchy");
            return null;
        }

        View pluginView = embeddedSurface.getSurface();
        // ensures the view system knows the view can redraw itself
        pluginView.setWillNotDraw(false);

        ViewManager.ChildView view = mWebView.mViewManager.createView();
+0 −37
Original line number Diff line number Diff line
/*
 * Copyright 2009, The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package android.webkit.plugin;

import android.content.Context;

/**
 *
 * @hide pending API solidification
 */
public interface NativePlugin extends WebkitPlugin {

    void initializePlugin(int npp, Context context);

}
+0 −37
Original line number Diff line number Diff line
/*
 * Copyright 2009, The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package android.webkit.plugin;

import android.view.View;

/**
 *
 * @hide pending API solidification
 */
public interface SurfaceDrawingModel {

    public View getSurface();

}
Loading