From 2175f1b1b7af80b7e6d45621cde417796adb4397 Mon Sep 17 00:00:00 2001 From: ziadb Date: Fri, 27 Jul 2018 11:51:34 -0400 Subject: SkAR Java: minor refactoring to TapHelper (now GestureHelper) Bug: skia: Change-Id: I1983c6cb1727e86fec91a0c9a5706f26070b1b49 Reviewed-on: https://skia-review.googlesource.com/144021 Reviewed-by: Mike Reed --- .../src/main/java/com/google/skar/PaintUtil.java | 2 + .../helloskar/app/CanvasARSurfaceView.java | 3 +- .../examples/helloskar/app/FingerPainting.java | 7 +- .../skar/examples/helloskar/app/HelloCanvasAR.java | 10 +- .../examples/helloskar/helpers/GestureHelper.java | 121 +++++++++++++++++++++ .../skar/examples/helloskar/helpers/TapHelper.java | 111 ------------------- 6 files changed, 131 insertions(+), 123 deletions(-) create mode 100644 platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/GestureHelper.java delete mode 100644 platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/TapHelper.java (limited to 'platform_tools') diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/PaintUtil.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/PaintUtil.java index b9aaa01730..7665d365ba 100644 --- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/PaintUtil.java +++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/PaintUtil.java @@ -35,9 +35,11 @@ public class PaintUtil { */ public static ColorFilter createLightCorrectionColorFilter(float[] colorCorr) { float[] colorCorrCopy = Arrays.copyOf(colorCorr, 4); + for (int i = 0; i < 3; i++) { colorCorrCopy[i] *= colorCorrCopy[3] / MIDDLE_GRAY_GAMMA; } + ColorMatrix m = new ColorMatrix(); m.setScale(colorCorrCopy[0], colorCorrCopy[1], colorCorrCopy[2], 1); return new ColorMatrixColorFilter(m); diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/CanvasARSurfaceView.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/CanvasARSurfaceView.java index 40c789d0a2..efe8acfa1d 100644 --- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/CanvasARSurfaceView.java +++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/CanvasARSurfaceView.java @@ -57,6 +57,5 @@ public class CanvasARSurfaceView extends SurfaceView implements SurfaceHolder.Ca } @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - } + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} } diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/FingerPainting.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/FingerPainting.java index e4aaf5784b..ac97dfbf77 100644 --- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/FingerPainting.java +++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/FingerPainting.java @@ -19,17 +19,14 @@ package com.google.skar.examples.helloskar.app; import android.graphics.Color; import android.graphics.Path; import android.graphics.PointF; -import android.util.Log; -import com.google.skar.examples.helloskar.helpers.TapHelper; +import com.google.skar.examples.helloskar.helpers.GestureHelper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.ArrayList; - public class FingerPainting { public static class BuiltPath { public Path path; @@ -87,7 +84,7 @@ public class FingerPainting { * @param holdTap ScrollEvent associated with the hit test that calls this function * @return true if point was computed and added. False otherwise. */ - public boolean computeNextPoint(float[] hitLocation, TapHelper.ScrollEvent holdTap) { + public boolean computeNextPoint(float[] hitLocation, GestureHelper.ScrollEvent holdTap) { if (isEmpty()) { // If finger painting is empty, then first point is origin. Model matrix // of the finger painting is the model matrix of the first point diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/HelloCanvasAR.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/HelloCanvasAR.java index d883c693a2..78791fae93 100644 --- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/HelloCanvasAR.java +++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/app/HelloCanvasAR.java @@ -57,8 +57,8 @@ import com.google.ar.core.examples.java.helloskar.R; import com.google.skar.examples.helloskar.helpers.CameraPermissionHelper; import com.google.skar.examples.helloskar.helpers.DisplayRotationHelper; import com.google.skar.examples.helloskar.helpers.FullScreenHelper; +import com.google.skar.examples.helloskar.helpers.GestureHelper; import com.google.skar.examples.helloskar.helpers.SnackbarHelper; -import com.google.skar.examples.helloskar.helpers.TapHelper; import com.google.skar.examples.helloskar.rendering.BackgroundRenderer; import com.google.skar.examples.helloskar.rendering.DrawManager; @@ -105,7 +105,7 @@ public class HelloCanvasAR extends AppCompatActivity implements GLSurfaceView.Re private boolean installRequested; private final SnackbarHelper messageSnackbarHelper = new SnackbarHelper(); private DisplayRotationHelper displayRotationHelper; - private TapHelper tapHelper; + private GestureHelper tapHelper; // Temporary matrix allocated here to reduce number of allocations for each frame. private final float[] anchorMatrix = new float[16]; @@ -138,7 +138,7 @@ public class HelloCanvasAR extends AppCompatActivity implements GLSurfaceView.Re holder = arSurfaceView.getHolder(); // Set up tap listener. - tapHelper = new TapHelper(this); + tapHelper = new GestureHelper(this); glSurfaceView.setOnTouchListener(tapHelper); // Set up renderer. @@ -439,9 +439,9 @@ public class HelloCanvasAR extends AppCompatActivity implements GLSurfaceView.Re */ private void handleHoldTaps(Frame frame, Camera camera) { // Building finger painting - TapHelper.ScrollEvent holdTap = tapHelper.holdPoll(); + GestureHelper.ScrollEvent holdTap = tapHelper.holdPoll(); if (holdTap != null && camera.getTrackingState() == TrackingState.TRACKING) { - for (HitResult hit : frame.hitTest(holdTap.e)) { + for (HitResult hit : frame.hitTest(holdTap.event)) { // Check if any plane was hit, and if it was hit inside the plane polygon Trackable trackable = hit.getTrackable(); // Creates an anchor if a plane or an oriented point was hit. diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/GestureHelper.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/GestureHelper.java new file mode 100644 index 0000000000..2cd195fdb1 --- /dev/null +++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/GestureHelper.java @@ -0,0 +1,121 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * 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.google.skar.examples.helloskar.helpers; + +import android.content.Context; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +/** + * Helper to detect gestures using Android GestureDetector, and pass the taps between UI thread and + * render thread. + */ + +public final class GestureHelper implements OnTouchListener { + private final GestureDetector gestureDetector; + private final BlockingQueue queuedSingleTaps = new ArrayBlockingQueue<>(16); + private final BlockingQueue queuedFingerHold = new ArrayBlockingQueue<>(16); + private boolean isScrolling = false; + private boolean previousScroll = true; + + // Struct holding a MotionEvent obtained from onScroll() callbacks, and a boolean evaluating to + // true if the MotionEven was the start of the scrolling motion + public static class ScrollEvent { + public MotionEvent event; + public boolean isStartOfScroll; + + public ScrollEvent(MotionEvent e, boolean isStartOfScroll) { + this.event = e; + this.isStartOfScroll = isStartOfScroll; + } + } + + /** + * Creates the gesture helper. + * + * @param context the application's context. + */ + public GestureHelper(Context context) { + gestureDetector = + new GestureDetector( + context, + new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapUp(MotionEvent e) { + // Queue tap if there is space. Tap is lost if queue is full. + queuedSingleTaps.offer(e); + return true; + } + + @Override + public boolean onScroll (MotionEvent e1, MotionEvent e2, + float distanceX, float distanceY) { + // Queue motion events when scrolling + if (e2.getPointerCount() == 1 && e1.getPointerCount() == 1) { + previousScroll = isScrolling; + isScrolling = true; + + queuedFingerHold.offer(new ScrollEvent(e2, + isStartedScrolling())); + + return true; + } + return false; + } + + + @Override + public boolean onDown(MotionEvent e) { + return true; + } + }); + } + + /** + * Polls for a tap. + * + * @return if a tap was queued, a MotionEvent for the tap. Otherwise null if no taps are queued. + */ + public MotionEvent poll() { + return queuedSingleTaps.poll(); + } + + /** + * Polls for a scrolling motion. + * + * @return if a scrolling event was queued, a ScrollEvent for the gesture. Otherwise null + */ + public ScrollEvent holdPoll() { return queuedFingerHold.poll(); } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + boolean val = gestureDetector.onTouchEvent(motionEvent); + + // If finger is up + is scrolling: don't scroll anymore, and empty touch hold queue + if (motionEvent.getAction() == MotionEvent.ACTION_UP && isScrolling) { + previousScroll = true; + isScrolling = false; + queuedFingerHold.clear(); + } + return val; + } + private boolean isStartedScrolling() { return isScrolling && !previousScroll; } +} diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/TapHelper.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/TapHelper.java deleted file mode 100644 index 6dcfd8fb13..0000000000 --- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/examples/helloskar/helpers/TapHelper.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2018 Google LLC All Rights Reserved. - * - * 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.google.skar.examples.helloskar.helpers; - -import android.content.Context; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnTouchListener; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -/** - * Helper to detect taps using Android GestureDetector, and pass the taps between UI thread and - * render thread. - */ -public final class TapHelper implements OnTouchListener { - private final GestureDetector gestureDetector; - private final BlockingQueue queuedSingleTaps = new ArrayBlockingQueue<>(16); - private final BlockingQueue queuedFingerHold = new ArrayBlockingQueue<>(16); - private boolean isScrolling = false; - private boolean previousScroll = true; - - public static class ScrollEvent { - public MotionEvent e; - public boolean isStartOfScroll; - - public ScrollEvent(MotionEvent e, boolean isStartOfScroll) { - this.e = e; - this.isStartOfScroll = isStartOfScroll; - } - } - - /** - * Creates the tap helper. - * - * @param context the application's context. - */ - public TapHelper(Context context) { - gestureDetector = - new GestureDetector( - context, - new GestureDetector.SimpleOnGestureListener() { - @Override - public boolean onSingleTapUp(MotionEvent e) { - // Queue tap if there is space. Tap is lost if queue is full. - queuedSingleTaps.offer(e); - return true; - } - - @Override - public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - // Queue motion events when scrolling - if (e2.getPointerCount() == 1 && e1.getPointerCount() == 1) { - previousScroll = isScrolling; - isScrolling = true; - - queuedFingerHold.offer(new ScrollEvent(e2, isStartedScrolling())); - - return true; - } - return false; - } - - - @Override - public boolean onDown(MotionEvent e) { - return true; - } - }); - } - - /** - * Polls for a tap. - * - * @return if a tap was queued, a MotionEvent for the tap. Otherwise null if no taps are queued. - */ - public MotionEvent poll() { - return queuedSingleTaps.poll(); - } - - public ScrollEvent holdPoll() { return queuedFingerHold.poll(); } - - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - boolean val = gestureDetector.onTouchEvent(motionEvent); - - // If finger is up + is scrolling: don't scroll anymore, and empty Touch Hold queue - if (motionEvent.getAction() == MotionEvent.ACTION_UP && isScrolling) { - previousScroll = true; - isScrolling = false; - queuedFingerHold.clear(); - } - return val; - } - private boolean isStartedScrolling() { return isScrolling && !previousScroll; } -} -- cgit v1.2.3