1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5package org.chromium.mojo; 6 7import android.app.Activity; 8import android.content.Context; 9import android.view.MotionEvent; 10import android.view.Surface; 11import android.view.SurfaceHolder; 12import android.view.SurfaceView; 13 14import org.chromium.base.CalledByNative; 15import org.chromium.base.JNINamespace; 16 17/** 18 * Exposes SurfaceView to native code. 19 */ 20@JNINamespace("mojo") 21public class PlatformViewportAndroid extends SurfaceView { 22 23 private long mNativeMojoViewport; 24 private final SurfaceHolder.Callback mSurfaceCallback; 25 26 @SuppressWarnings("unused") 27 @CalledByNative 28 public static void createForActivity(Activity activity, long nativeViewport) { 29 activity.setContentView(new PlatformViewportAndroid(activity, nativeViewport)); 30 } 31 32 public PlatformViewportAndroid(Context context, long nativeViewport) { 33 super(context); 34 35 mNativeMojoViewport = nativeViewport; 36 assert mNativeMojoViewport != 0; 37 38 mSurfaceCallback = new SurfaceHolder.Callback() { 39 @Override 40 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 41 assert mNativeMojoViewport != 0; 42 nativeSurfaceSetSize(mNativeMojoViewport, width, height); 43 } 44 45 @Override 46 public void surfaceCreated(SurfaceHolder holder) { 47 assert mNativeMojoViewport != 0; 48 nativeSurfaceCreated(mNativeMojoViewport, holder.getSurface()); 49 } 50 51 @Override 52 public void surfaceDestroyed(SurfaceHolder holder) { 53 assert mNativeMojoViewport != 0; 54 nativeSurfaceDestroyed(mNativeMojoViewport); 55 } 56 }; 57 getHolder().addCallback(mSurfaceCallback); 58 59 } 60 61 // TODO(abarth): Someone needs to call destroy at some point. 62 public void destroy() { 63 getHolder().removeCallback(mSurfaceCallback); 64 nativeDestroy(mNativeMojoViewport); 65 mNativeMojoViewport = 0; 66 } 67 68 @Override 69 public boolean onTouchEvent(MotionEvent event) { 70 return nativeTouchEvent(mNativeMojoViewport, 71 event.getPointerId(0), 72 event.getAction(), 73 event.getX(), event.getY(), 74 event.getEventTime()); 75 } 76 77 private static native void nativeDestroy(long nativePlatformViewportAndroid); 78 private static native void nativeSurfaceCreated( 79 long nativePlatformViewportAndroid, Surface surface); 80 private static native void nativeSurfaceDestroyed( 81 long nativePlatformViewportAndroid); 82 private static native void nativeSurfaceSetSize( 83 long nativePlatformViewportAndroid, 84 int width, int height); 85 private static native boolean nativeTouchEvent( 86 long nativePlatformViewportAndroid, 87 int pointerId, 88 int action, 89 float x, float y, 90 long timeMs); 91}; 92