com.richtodd.android.pegboard.PegboardViewTouchController.java Source code

Java tutorial

Introduction

Here is the source code for com.richtodd.android.pegboard.PegboardViewTouchController.java

Source

/* Copyright (c) 2013 Richard G. Todd.
 * Licensed under the terms of the GNU General Public License (GPL) Version 3.0.
 */

package com.richtodd.android.pegboard;

import junit.framework.Assert;
import android.support.v4.view.GestureDetectorCompat;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

class PegboardViewTouchController {
    // private static final String TAG = "PegboardTouchController";

    //
    // Fields
    //

    private enum Operations {
        NONE, DRAG_PEG
    }

    private Operations m_operation = Operations.NONE;

    private PegboardView m_view;
    private GestureDetectorCompat m_gestureDetector;

    //
    // Constructors
    //

    PegboardViewTouchController() {
    }

    //
    // Package-Private Methods
    //

    PegboardView getView() {
        return m_view;
    }

    void setView(PegboardView view) {
        m_view = view;

        m_gestureDetector = new GestureDetectorCompat(m_view.getContext(), new GestureDetector.OnGestureListener() {

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                // Log.i(TAG, "m_gestureDetector/onSingleTapUp");
                if (onTap((int) e.getX(), (int) e.getY())) {
                    return true;
                }

                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                // Log.i(TAG, "m_gestureDetector/onScroll");

                if (!isOperationActive()) {
                    if (onTouchDown((int) e1.getX(), (int) e1.getY())) {
                        return true;
                    }
                }
                if (isOperationActive()) {
                    if (onTouchMove((int) e2.getX(), (int) e2.getY())) {
                        return true;
                    }
                }
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }

            @Override
            public boolean onDown(MotionEvent e) {
                return true;
            }
        });

        m_view.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (m_gestureDetector.onTouchEvent(event)) {
                    return true;
                }

                int action = event.getAction();

                switch (action) {
                case MotionEvent.ACTION_UP:
                    if (onTouchUp((int) event.getX(), (int) event.getY())) {
                        return true;
                    }
                }

                return false;
            }
        });
    }

    //
    // Touch Primitives
    //

    private boolean onTap(int x, int y) {
        if (m_view.selectPeg(x, y)) {
            return true;
        }

        return false;
    }

    private boolean onTouchDown(int x, int y) {
        // Log.i(TAG, "onTouchDown(" + x + "," + y + ")");

        cancelAnyActiveOperation();

        if (beginDragPeg(x, y)) {
            return true;
        }

        return false;
    }

    private boolean onTouchMove(int x, int y) {
        // Log.i(TAG, "onTouchMove(" + x + "," + y + ")");

        if (m_operation == Operations.DRAG_PEG) {
            dragPeg(x, y);
            return true;
        }

        return false;
    }

    private boolean onTouchUp(int x, int y) {
        // Log.i(TAG, "onTouchUp(" + x + "," + y + ")");

        if (m_operation == Operations.DRAG_PEG) {
            completeDragPeg(x, y);
            return true;
        }

        return false;
    }

    private void cancelAnyActiveOperation() {
        if (m_operation == Operations.DRAG_PEG) {
            cancelDragPeg();
        }
    }

    private boolean isOperationActive() {
        return m_operation != Operations.NONE;
    }

    //
    // Private Methods
    //

    private boolean beginDragPeg(int x, int y) {
        // Log.i(TAG, "beginDragPeg(" + x + "," + y + ")");
        Assert.assertTrue(m_operation == Operations.NONE);

        if (m_view.beginDragPeg(x, y)) {
            m_operation = Operations.DRAG_PEG;
            return true;
        }

        return false;
    }

    private void dragPeg(int x, int y) {
        // Log.i(TAG, "dragPeg(" + x + "," + y + ")");
        Assert.assertTrue(m_operation == Operations.DRAG_PEG);

        m_view.dragPeg(x, y);
    }

    private void completeDragPeg(int x, int y) {
        // Log.i(TAG, "completeDragPeg(" + x + "," + y + ")");
        Assert.assertTrue(m_operation == Operations.DRAG_PEG);

        m_view.dragPeg(x, y);
        m_view.dropPeg();

        m_operation = Operations.NONE;
    }

    private void cancelDragPeg() {
        // Log.i(TAG, "cancelPegDragDrop");
        Assert.assertTrue(m_operation == Operations.DRAG_PEG);

        m_view.abandonPeg();

        m_operation = Operations.NONE;
    }
}