Updating samplePlugin to use java surface views.

Change-Id: I1b925ce3a6aeb0bd5464a7d5711449029944d7de
diff --git a/samples/BrowserPlugin/jni/paint/PaintPlugin.cpp b/samples/BrowserPlugin/jni/paint/PaintPlugin.cpp
index a34870f..5b00dba 100644
--- a/samples/BrowserPlugin/jni/paint/PaintPlugin.cpp
+++ b/samples/BrowserPlugin/jni/paint/PaintPlugin.cpp
@@ -39,7 +39,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-PaintPlugin::PaintPlugin(NPP inst) : SubPlugin(inst) {
+PaintPlugin::PaintPlugin(NPP inst) : SurfaceSubPlugin(inst) {
 
     m_isTouchActive = false;
     m_isTouchCurrentInput = true;
@@ -51,10 +51,8 @@
     memset(&m_clearSurface,  0, sizeof(m_clearSurface));
 
     // initialize the drawing surface
-    m_surfaceReady = false;
-    m_surface = gSurfaceI.newRasterSurface(inst, kRGBA_8888_ANPBitmapFormat, true);
-    if(!m_surface)
-        gLogI.log(inst, kError_ANPLogType, "----%p Unable to create RGBA surface", inst);
+    m_surface = NULL;
+    m_vm = NULL;
 
     // initialize the path
     m_touchPath = gPathI.newPath();
@@ -85,10 +83,10 @@
 }
 
 PaintPlugin::~PaintPlugin() {
-    gSurfaceI.deleteSurface(m_surface);
     gPathI.deletePath(m_touchPath);
     gPaintI.deletePaint(m_paintSurface);
     gPaintI.deletePaint(m_paintButton);
+    surfaceDestroyed();
 }
 
 bool PaintPlugin::supportsDrawingModel(ANPDrawingModel model) {
@@ -98,8 +96,11 @@
 ANPCanvas* PaintPlugin::getCanvas(ANPRectI* dirtyRect) {
 
     ANPBitmap bitmap;
-    if (!m_surfaceReady || !gSurfaceI.lock(m_surface, &bitmap, dirtyRect))
-        return NULL;
+    JNIEnv* env = NULL;
+    if (!m_surface || m_vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK ||
+        !gSurfaceI.lock(env, m_surface, &bitmap, dirtyRect)) {
+            return NULL;
+        }
 
     ANPCanvas* canvas = gCanvasI.newCanvas(&bitmap);
 
@@ -130,7 +131,10 @@
 }
 
 void PaintPlugin::releaseCanvas(ANPCanvas* canvas) {
-    gSurfaceI.unlock(m_surface);
+    JNIEnv* env = NULL;
+    if (m_surface && m_vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) {
+        gSurfaceI.unlock(env, m_surface);
+    }
     gCanvasI.deleteCanvas(canvas);
 }
 
@@ -208,33 +212,37 @@
         return "Red";
 }
 
+bool PaintPlugin::isFixedSurface() {
+    return true;
+}
+
+void PaintPlugin::surfaceCreated(JNIEnv* env, jobject surface) {
+    env->GetJavaVM(&m_vm);
+    m_surface = env->NewGlobalRef(surface);
+    drawCleanPlugin();
+}
+
+void PaintPlugin::surfaceChanged(int format, int width, int height) {
+    // get the plugin's dimensions according to the DOM
+    PluginObject *obj = (PluginObject*) inst()->pdata;
+    const int pW = obj->window->width;
+    const int pH = obj->window->height;
+    // compare to the plugin's surface dimensions
+    if (pW != width || pH != height)
+        gLogI.log(inst(), kError_ANPLogType,
+                  "----%p Invalid Surface Dimensions (%d,%d):(%d,%d)",
+                  inst(), pW, pH, width, height);
+}
+void PaintPlugin::surfaceDestroyed() {
+    JNIEnv* env = NULL;
+    if (m_surface && m_vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) {
+        env->DeleteGlobalRef(m_surface);
+        m_surface = NULL;
+    }
+}
+
 int16 PaintPlugin::handleEvent(const ANPEvent* evt) {
     switch (evt->eventType) {
-        case kSurface_ANPEventType:
-            switch (evt->data.surface.action) {
-                case kCreated_ANPSurfaceAction:
-                    m_surfaceReady = true;
-                    drawCleanPlugin();
-                    return 1;
-                case kDestroyed_ANPSurfaceAction:
-                    m_surfaceReady = false;
-                    return 1;
-                case kChanged_ANPSurfaceAction:
-                    // get the plugin's dimensions according to the DOM
-                    PluginObject *obj = (PluginObject*) inst()->pdata;
-                    const int pW = obj->window->width;
-                    const int pH = obj->window->height;
-                    // get the plugin's surface dimensions
-                    const int sW = evt->data.surface.data.changed.width;
-                    const int sH = evt->data.surface.data.changed.height;
-                    if (pW != sW || pH != sH)
-                        gLogI.log(inst(), kError_ANPLogType,
-                                  "----%p Invalid Surface Dimensions (%d,%d):(%d,%d)",
-                                  inst(), pW, pH, sW, sH);
-                    return 1;
-            }
-            break;
-
         case kTouch_ANPEventType: {
             float x = (float) evt->data.touch.x;
             float y = (float) evt->data.touch.y;