DoubleTapDetector.java

/**
 * Copyright (c) 2012-2013 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example.amaze.gestures;


/**
 * Helper class for detecting double taps.
 */
public class DoubleTapDetector {
    // Constants
    private static final int DOUBLE_TAP_TIMEOUT = 400; // Milliseconds
    private static final int JITTER_THRESHOLD = 20; 
    
    // Members
    private final Listener _listener;
    private long _lastTapTime = 0;
    private int[] _lastTapCoordinate = new int[2];
    
    /**
     * Constructor.
     * @param listener The listener.
     */
    public DoubleTapDetector(Listener listener) {    
         _listener = listener;
         _lastTapCoordinate[0] = -1;
         _lastTapCoordinate[1] = -1;
    }
    
    /**
     * Checks if a double tap has occured. If not, then saves the details of
     * this tap.
     * @param x X coordinate of the tap event.
     * @param y Y coordinate of the tap event.
     * @return True if the double tap was detected, false otherwise.
     */
    public boolean onTapped(int x, int y) {
        long currentTime = System.currentTimeMillis();
        
        if (currentTime - _lastTapTime < DOUBLE_TAP_TIMEOUT
                && Math.abs(_lastTapCoordinate[0] - x) < JITTER_THRESHOLD
                && Math.abs(_lastTapCoordinate[1] - y) < JITTER_THRESHOLD)
        {
            // Double tap!
            if (_listener != null) {
                // Notify the listener
                _listener.onDoubleTapDetected();
            }
            
             _lastTapCoordinate[0] = -1;
             _lastTapCoordinate[1] = -1;
             return true;
        }

        // Store the current time and tap coordinates
        _lastTapTime = currentTime;
        _lastTapCoordinate[0] = x;
        _lastTapCoordinate[1] = y;
        return false;
    }
    
    /**
     * Interface for the listener. 
     */
    public interface Listener {
        void onDoubleTapDetected();
    }
}