Refactoring sample plugin to use updated java interfaces.
diff --git a/samples/BrowserPlugin/AndroidManifest.xml b/samples/BrowserPlugin/AndroidManifest.xml
index ae6b5db..d926729 100644
--- a/samples/BrowserPlugin/AndroidManifest.xml
+++ b/samples/BrowserPlugin/AndroidManifest.xml
@@ -24,11 +24,12 @@
<uses-sdk android:minSdkVersion="3" />
<application android:icon="@drawable/sample_browser_plugin"
- android:label="@string/sample_browser_plugin">
- <service android:name="SamplePlugin">
+ android:label="@string/sample_browser_plugin">
+ <service android:name=".SamplePlugin">
<intent-filter>
<action android:name="android.webkit.PLUGIN" />
</intent-filter>
+ <meta-data android:name="type" android:value="native" />
</service>
</application>
diff --git a/samples/BrowserPlugin/README b/samples/BrowserPlugin/README
index 08b04a5..29797b2 100644
--- a/samples/BrowserPlugin/README
+++ b/samples/BrowserPlugin/README
@@ -57,10 +57,14 @@
shared libraries to include.
AndroidManifest.xml: similar to a standard android manifest file, except that it
- must contain the "uses-permission" and "intent-filter"
- elements that are plugin specific.
+ must contain the "uses-permission" and "service"
+ elements that are plugin specific. The "service" element
+ contains sub-elements that describe the java component of
+ the service.
-src/*: location of the java files which in our case is just an empty service
+src/*: location of the java source files. This contains the SamplePlugin.class
+ which is the java component of our plugin. The component must exist and
+ implement the required interfaces, though simply returning null is valid.
res/*: location of the static resources (e.g. an icon for the plugin)
diff --git a/samples/BrowserPlugin/jni/jni-bridge.cpp b/samples/BrowserPlugin/jni/jni-bridge.cpp
index 08e7f5a..bcca7d0 100644
--- a/samples/BrowserPlugin/jni/jni-bridge.cpp
+++ b/samples/BrowserPlugin/jni/jni-bridge.cpp
@@ -69,7 +69,7 @@
/*
* JNI registration.
*/
-static JNINativeMethod gJavaSamplePluginStubMethods[] = {
+static JNINativeMethod gJavaSamplePluginMethods[] = {
{ "nativeSurfaceCreated", "(ILandroid/view/View;)V", (void*) surfaceCreated },
{ "nativeSurfaceChanged", "(IIII)V", (void*) surfaceChanged },
{ "nativeSurfaceDestroyed", "(I)V", (void*) surfaceDestroyed },
@@ -86,8 +86,8 @@
return -1;
}
- jniRegisterNativeMethods(env, "com/android/sampleplugin/SamplePluginStub",
- gJavaSamplePluginStubMethods, NELEM(gJavaSamplePluginStubMethods));
+ jniRegisterNativeMethods(env, "com/android/sampleplugin/SamplePlugin",
+ gJavaSamplePluginMethods, NELEM(gJavaSamplePluginMethods));
return JNI_VERSION_1_4;
}
diff --git a/samples/BrowserPlugin/jni/main.cpp b/samples/BrowserPlugin/jni/main.cpp
index 4bc825e..af7a589 100644
--- a/samples/BrowserPlugin/jni/main.cpp
+++ b/samples/BrowserPlugin/jni/main.cpp
@@ -178,15 +178,6 @@
}
}
- // notify the plugin API of the location of the java interface
- char* className = "com.android.sampleplugin.SamplePluginStub";
- NPError npErr = browser->setvalue(instance, kSetPluginStubJavaClassName_ANPSetValue,
- reinterpret_cast<void*>(className));
- if (npErr) {
- gLogI.log(instance, kError_ANPLogType, "set class err %d", npErr);
- return npErr;
- }
-
// notify the plugin API of the drawing model we wish to use. This must be
// done prior to creating certain subPlugin objects (e.g. surfaceViews)
NPError err = browser->setvalue(instance, kRequestDrawingModel_ANPSetValue,
diff --git a/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java b/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java
index 9b8ce95..a9fad52 100644
--- a/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java
+++ b/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePlugin.java
@@ -1,15 +1,150 @@
+/*
+ * 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 com.android.sampleplugin;
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
+import com.android.sampleplugin.graphics.CubeRenderer;
-public class SamplePlugin extends Service {
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.opengl.GLSurfaceView;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.SurfaceHolder.Callback;
+import android.view.ViewGroup.LayoutParams;
+import android.webkit.plugin.NativePlugin;
+import android.webkit.plugin.SurfaceDrawingModel;
+import android.widget.FrameLayout;
+import android.widget.MediaController;
+import android.widget.VideoView;
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
+public class SamplePlugin implements NativePlugin {
+
+ static {
+ //needed for jni calls
+ System.loadLibrary("sampleplugin");
}
+ private int npp;
+ private Context context;
+
+ public void initializePlugin(int npp, Context context) {
+ this.npp = npp;
+ this.context = context;
+ }
+
+ public SurfaceDrawingModel getEmbeddedSurface() {
+ return new EmbeddedSurface();
+ }
+
+ public SurfaceDrawingModel getFullScreenSurface() {
+ return new FullScreenSurface();
+ }
+
+ private native void nativeSurfaceCreated(int npp, View surfaceView);
+ private native void nativeSurfaceChanged(int npp, int format, int width, int height);
+ private native void nativeSurfaceDestroyed(int npp);
+ private native int nativeGetSurfaceWidth(int npp);
+ private native int nativeGetSurfaceHeight(int npp);
+ private native boolean nativeIsFixedSurface(int npp);
+
+ private class EmbeddedSurface implements SurfaceDrawingModel {
+
+ public View getSurface() {
+ final SurfaceView view = new SurfaceView(context);
+
+ /* You can do all sorts of interesting operations on the surface view
+ * here. We illustrate a few of the important operations below.
+ */
+
+ //TODO get pixel format from the subplugin (via jni)
+ view.getHolder().setFormat(PixelFormat.RGBA_8888);
+ view.getHolder().addCallback(new Callback() {
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ nativeSurfaceChanged(npp, format, width, height);
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ nativeSurfaceCreated(npp, view);
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ nativeSurfaceDestroyed(npp);
+ }
+ });
+
+ // TODO provide way for native plugin code to reset the size
+ if (nativeIsFixedSurface(npp)) {
+ int width = nativeGetSurfaceWidth(npp);
+ int height = nativeGetSurfaceHeight(npp);
+ view.getHolder().setFixedSize(width, height);
+ }
+
+ return view;
+ }
+ }
+
+ private class FullScreenSurface implements SurfaceDrawingModel {
+
+ public View getSurface() {
+ /* TODO make this aware of the plugin instance and get the video file
+ * from the plugin.
+ */
+
+ FrameLayout layout = new FrameLayout(context);
+ LayoutParams fp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ layout.setLayoutParams(fp);
+
+ VideoView video = new VideoView(context);
+ LayoutParams vp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ layout.setLayoutParams(vp);
+
+ GLSurfaceView gl = new GLSurfaceView(context);
+ LayoutParams gp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ layout.setLayoutParams(gp);
+
+ layout.addView(video);
+ layout.addView(gl);
+
+ // We want an 8888 pixel format because that's required for a translucent
+ // window. And we want a depth buffer.
+ gl.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
+ // Tell the cube renderer that we want to render a translucent version
+ // of the cube:
+ gl.setRenderer(new CubeRenderer(true));
+ // Use a surface format with an Alpha channel:
+ gl.getHolder().setFormat(PixelFormat.TRANSLUCENT);
+ gl.setWindowType(WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY);
+
+ video.setVideoPath("/sdcard/test_video.3gp");
+ video.setMediaController(new MediaController(context));
+ video.requestFocus();
+
+ return layout;
+ }
+ }
}
diff --git a/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePluginStub.java b/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePluginStub.java
deleted file mode 100644
index 22b7b44..0000000
--- a/samples/BrowserPlugin/src/com/android/sampleplugin/SamplePluginStub.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2009 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.sampleplugin;
-
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.opengl.GLSurfaceView;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.SurfaceHolder.Callback;
-import android.view.ViewGroup.LayoutParams;
-import android.webkit.PluginStub;
-import android.widget.FrameLayout;
-import android.widget.MediaController;
-import android.widget.VideoView;
-import com.android.sampleplugin.graphics.CubeRenderer;
-
-public class SamplePluginStub implements PluginStub {
-
- static {
- //needed for jni calls
- System.loadLibrary("sampleplugin");
- }
-
- public View getEmbeddedView(final int npp, Context context) {
-
- final SurfaceView view = new SurfaceView(context);
-
- /* You can do all sorts of interesting operations on the surface view
- * here. We illustrate a few of the important operations below.
- */
-
- //TODO get pixel format from the subplugin (via jni)
- view.getHolder().setFormat(PixelFormat.RGBA_8888);
- view.getHolder().addCallback(new Callback() {
-
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- nativeSurfaceChanged(npp, format, width, height);
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- nativeSurfaceCreated(npp, view);
- }
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- nativeSurfaceDestroyed(npp);
- }
-
- });
-
- // TODO provide way for native plugin code to reset the size
- if (nativeIsFixedSurface(npp)) {
- int width = nativeGetSurfaceWidth(npp);
- int height = nativeGetSurfaceHeight(npp);
- view.getHolder().setFixedSize(width, height);
- }
-
- return view;
- }
-
- public View getFullScreenView(int npp, Context context) {
-
- /* TODO make this aware of the plugin instance and get the video file
- * from the plugin.
- */
-
- FrameLayout layout = new FrameLayout(context);
- LayoutParams fp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
- layout.setLayoutParams(fp);
-
- VideoView video = new VideoView(context);
- LayoutParams vp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
- layout.setLayoutParams(vp);
-
- GLSurfaceView gl = new GLSurfaceView(context);
- LayoutParams gp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
- layout.setLayoutParams(gp);
-
- layout.addView(video);
- layout.addView(gl);
-
- // We want an 8888 pixel format because that's required for a translucent
- // window. And we want a depth buffer.
- gl.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
- // Tell the cube renderer that we want to render a translucent version
- // of the cube:
- gl.setRenderer(new CubeRenderer(true));
- // Use a surface format with an Alpha channel:
- gl.getHolder().setFormat(PixelFormat.TRANSLUCENT);
- gl.setWindowType(WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY);
-
-
- video.setVideoPath("/sdcard/test_video.3gp");
- video.setMediaController(new MediaController(context));
- video.requestFocus();
-
- return layout;
- }
-
- private native void nativeSurfaceCreated(int npp, View surfaceView);
- private native void nativeSurfaceChanged(int npp, int format, int width, int height);
- private native void nativeSurfaceDestroyed(int npp);
- private native int nativeGetSurfaceWidth(int npp);
- private native int nativeGetSurfaceHeight(int npp);
- private native boolean nativeIsFixedSurface(int npp);
-}