11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)package org.chromium.mojo;
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import android.app.Activity;
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import android.content.Context;
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import android.view.MotionEvent;
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import android.view.Surface;
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import android.view.SurfaceHolder;
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import android.view.SurfaceView;
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import org.chromium.base.CalledByNative;
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import org.chromium.base.JNINamespace;
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Exposes SurfaceView to native code.
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)@JNINamespace("mojo")
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)public class PlatformViewportAndroid extends SurfaceView {
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    private long mNativeMojoViewport;
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    private final SurfaceHolder.Callback mSurfaceCallback;
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SuppressWarnings("unused")
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @CalledByNative
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    public static void createForActivity(Activity activity, long nativeViewport) {
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        activity.setContentView(new PlatformViewportAndroid(activity, nativeViewport));
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public PlatformViewportAndroid(Context context, long nativeViewport) {
330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        super(context);
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mNativeMojoViewport = nativeViewport;
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        assert mNativeMojoViewport != 0;
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        mSurfaceCallback = new SurfaceHolder.Callback() {
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            @Override
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                assert mNativeMojoViewport != 0;
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                nativeSurfaceSetSize(mNativeMojoViewport, width, height);
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            }
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            @Override
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            public void surfaceCreated(SurfaceHolder holder) {
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                assert mNativeMojoViewport != 0;
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                nativeSurfaceCreated(mNativeMojoViewport, holder.getSurface());
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            }
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            @Override
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            public void surfaceDestroyed(SurfaceHolder holder) {
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                assert mNativeMojoViewport != 0;
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                nativeSurfaceDestroyed(mNativeMojoViewport);
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            }
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        };
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        getHolder().addCallback(mSurfaceCallback);
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // TODO(abarth): Someone needs to call destroy at some point.
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    public void destroy() {
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        getHolder().removeCallback(mSurfaceCallback);
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        nativeDestroy(mNativeMojoViewport);
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        mNativeMojoViewport = 0;
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @Override
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public boolean onTouchEvent(MotionEvent event) {
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return nativeTouchEvent(mNativeMojoViewport,
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                event.getPointerId(0),
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                event.getAction(),
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                event.getX(), event.getY(),
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                event.getEventTime());
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static native void nativeDestroy(long nativePlatformViewportAndroid);
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private static native void nativeSurfaceCreated(
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        long nativePlatformViewportAndroid, Surface surface);
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private static native void nativeSurfaceDestroyed(
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        long nativePlatformViewportAndroid);
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private static native void nativeSurfaceSetSize(
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        long nativePlatformViewportAndroid,
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        int width, int height);
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private static native boolean nativeTouchEvent(
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        long nativePlatformViewportAndroid,
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        int pointerId,
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        int action,
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float x, float y,
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        long timeMs);
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
92