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