From 04b3e9a6c6cf43887e9551ea1da7681f071b8696 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Tue, 24 Nov 2009 14:50:55 -0500 Subject: [PATCH] Refactoring sample plugin to use updated java interfaces. --- samples/BrowserPlugin/AndroidManifest.xml | 5 +- samples/BrowserPlugin/README | 12 +- samples/BrowserPlugin/jni/jni-bridge.cpp | 6 +- samples/BrowserPlugin/jni/main.cpp | 9 -- .../src/com/android/sampleplugin/SamplePlugin.java | 151 +++++++++++++++++++-- .../com/android/sampleplugin/SamplePluginStub.java | 122 ----------------- 6 files changed, 157 insertions(+), 148 deletions(-) delete mode 100644 samples/BrowserPlugin/src/com/android/sampleplugin/SamplePluginStub.java diff --git a/samples/BrowserPlugin/AndroidManifest.xml b/samples/BrowserPlugin/AndroidManifest.xml index ae6b5dbe..d9267292 100644 --- a/samples/BrowserPlugin/AndroidManifest.xml +++ b/samples/BrowserPlugin/AndroidManifest.xml @@ -24,11 +24,12 @@ - + android:label="@string/sample_browser_plugin"> + + diff --git a/samples/BrowserPlugin/README b/samples/BrowserPlugin/README index 08b04a51..29797b28 100644 --- a/samples/BrowserPlugin/README +++ b/samples/BrowserPlugin/README @@ -57,10 +57,14 @@ Android.mk: specifies the name of the APK (SampleBrowserPlugin) as well as which 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. - -src/*: location of the java files which in our case is just an empty service + 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 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 08e7f5a0..bcca7d0d 100644 --- a/samples/BrowserPlugin/jni/jni-bridge.cpp +++ b/samples/BrowserPlugin/jni/jni-bridge.cpp @@ -69,7 +69,7 @@ static jboolean isFixedSurface(JNIEnv* env, jobject thiz, jint npp) { /* * 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 @@ EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { 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 4bc825e4..af7a5896 100644 --- a/samples/BrowserPlugin/jni/main.cpp +++ b/samples/BrowserPlugin/jni/main.cpp @@ -178,15 +178,6 @@ NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, } } - // 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(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 9b8ce955..a9fad52d 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 22b7b44b..00000000 --- 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); -} -- 2.11.0