blob: da46e6a548e0242c1ee36c7e7ca0872767f0df7e [file] [log] [blame]
Mady Melloref044dd2015-06-02 15:35:07 -07001package com.android.launcher3;
2
3import com.android.launcher3.Utilities;
4
5import android.util.Log;
6import android.view.MotionEvent;
7import android.view.View;
8import android.view.ViewConfiguration;
9
10/**
11 * Helper for identifying when a stylus touches a view while the primary stylus button is pressed.
12 * This can occur in {@value MotionEvent#ACTION_DOWN} or {@value MotionEvent#ACTION_MOVE}. On a
13 * stylus button press this performs the view's {@link View#performLongClick()} method, if the view
14 * is long clickable.
15 */
16public class StylusEventHelper {
17 private boolean mIsButtonPressed;
18 private View mView;
19
20 public StylusEventHelper(View view) {
21 mView = view;
22 }
23
24 /**
25 * Call this in onTouchEvent method of a view to identify a stylus button press and perform a
26 * long click (if the view is long clickable).
27 *
28 * @param event The event to check for a stylus button press.
29 * @return Whether a stylus event occurred and was handled.
30 */
31 public boolean checkAndPerformStylusEvent(MotionEvent event) {
32 final float slop = ViewConfiguration.get(mView.getContext()).getScaledTouchSlop();
33
34 if (!mView.isLongClickable()) {
35 // We don't do anything unless the view is long clickable.
36 return false;
37 }
38
39 final boolean stylusButtonPressed = isStylusButtonPressed(event);
40 switch (event.getAction()) {
41 case MotionEvent.ACTION_DOWN:
42 mIsButtonPressed = false;
43 if (stylusButtonPressed && mView.performLongClick()) {
44 mIsButtonPressed = true;
45 return true;
46 }
47 break;
48 case MotionEvent.ACTION_MOVE:
49 if (Utilities.pointInView(mView, event.getX(), event.getY(), slop)) {
50 if (!mIsButtonPressed && stylusButtonPressed && mView.performLongClick()) {
51 mIsButtonPressed = true;
52 return true;
53 } else if (mIsButtonPressed && !stylusButtonPressed) {
54 mIsButtonPressed = false;
55 }
56 }
57 break;
58 case MotionEvent.ACTION_UP:
59 case MotionEvent.ACTION_CANCEL:
60 mIsButtonPressed = false;
61 break;
62 }
63 return false;
64 }
65
66 /**
67 * Whether a stylus button press is occurring.
68 */
69 public boolean inStylusButtonPressed() {
70 return mIsButtonPressed;
71 }
72
73 /**
74 * Identifies if the provided {@link MotionEvent} is a stylus with the primary stylus button
75 * pressed.
76 *
77 * @param event The event to check.
78 * @return Whether a stylus button press occurred.
79 */
80 public static boolean isStylusButtonPressed(MotionEvent event) {
81 return event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS
82 && event.isButtonPressed(MotionEvent.BUTTON_SECONDARY);
83 }
84}