blob: 3df222582073233f3d5ce076d1e77224c7561eaf [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chromoting;
import android.support.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* A state machine to indicate user input actions. It stores the start action (tap or long tap),
* finger count, detected action, etc.
*/
public class InputState {
/**
* A settable {@link InputState}.
*/
public static final class Settable extends InputState {
public void setFingerCount(int fingerCount) {
mFingerCount = fingerCount;
if (mFingerCount == 0) {
mStartAction = StartAction.UNDEFINED;
mDetectedAction = DetectedAction.UNDEFINED;
}
}
public void setStartAction(@StartAction int startAction) {
Preconditions.isTrue(startAction != StartAction.UNDEFINED);
mStartAction = startAction;
}
public void setDetectedAction(@DetectedAction int detectedAction) {
Preconditions.isTrue(detectedAction != DetectedAction.UNDEFINED);
mDetectedAction = detectedAction;
}
}
@IntDef({StartAction.UNDEFINED, StartAction.LONG_PRESS})
@Retention(RetentionPolicy.SOURCE)
public @interface StartAction {
int UNDEFINED = 0;
// The action started from a long press. Note, a tap won't need to impact InputState.
int LONG_PRESS = 1;
}
@IntDef({DetectedAction.UNDEFINED, DetectedAction.SCROLL, DetectedAction.SCROLL_FLING,
DetectedAction.AFTER_SCROLL_FLING, DetectedAction.FLING, DetectedAction.SCALE,
DetectedAction.SWIPE, DetectedAction.MOVE, DetectedAction.SCROLL_EDGE})
@Retention(RetentionPolicy.SOURCE)
public @interface DetectedAction {
int UNDEFINED = 0;
int SCROLL = 1;
int SCROLL_FLING = 2;
// AFTER_SCROLL_FLING is a fake action to indicate the state after a scroll fling has been
// performed.
int AFTER_SCROLL_FLING = 3;
int FLING = 4;
int SCALE = 5;
int SWIPE = 6;
int MOVE = 7;
int SCROLL_EDGE = 8;
}
protected int mFingerCount;
protected @StartAction int mStartAction;
protected @DetectedAction int mDetectedAction;
public InputState() {
mStartAction = StartAction.UNDEFINED;
mFingerCount = 0;
mDetectedAction = DetectedAction.UNDEFINED;
}
public int getFingerCount() {
return mFingerCount;
}
public @StartAction int getStartAction() {
return mStartAction;
}
public @DetectedAction int getDetectedAction() {
return mDetectedAction;
}
public boolean shouldSuppressCursorMovement() {
return mDetectedAction == DetectedAction.SWIPE
|| mDetectedAction == DetectedAction.SCROLL_FLING
|| mDetectedAction == DetectedAction.SCROLL_EDGE;
}
public boolean shouldSuppressFling() {
return mDetectedAction == DetectedAction.SWIPE
|| mStartAction == StartAction.LONG_PRESS;
}
public boolean isScrollFling() {
return mDetectedAction == DetectedAction.SCROLL_FLING;
}
public boolean swipeCompleted() {
return mDetectedAction == DetectedAction.SWIPE;
}
public boolean isDragging() {
return mStartAction == StartAction.LONG_PRESS;
}
}