Refactoring sample plugin to use updated java interfaces.

This commit is contained in:
Derek Sollenberger
2009-11-24 14:50:55 -05:00
parent 2171d57cfc
commit 04b3e9a6c6
6 changed files with 156 additions and 147 deletions

View File

@@ -25,10 +25,11 @@
<application android:icon="@drawable/sample_browser_plugin"
android:label="@string/sample_browser_plugin">
<service android:name="SamplePlugin">
<service android:name=".SamplePlugin">
<intent-filter>
<action android:name="android.webkit.PLUGIN" />
</intent-filter>
<meta-data android:name="type" android:value="native" />
</service>
</application>

View File

@@ -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.
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)

View File

@@ -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;
}

View File

@@ -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<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,

View File

@@ -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;
}
}
}

View File

@@ -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);
}