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