blob: b2cbc321281d3555260b2a8435cd6d549800f0d2 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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.android.apps.common.testing.ui.testapp;
import com.google.common.collect.Lists;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import java.util.List;
/**
* Displays a large touchable area and logs the events it receives.
*/
public class GestureActivity extends Activity {
private static final String TAG = GestureActivity.class.getSimpleName();
private View gestureArea;
private List<MotionEvent> downEvents = Lists.newArrayList();
private List<MotionEvent> scrollEvents = Lists.newArrayList();
private List<MotionEvent> longPressEvents = Lists.newArrayList();
private List<MotionEvent> showPresses = Lists.newArrayList();
private List<MotionEvent> singleTaps = Lists.newArrayList();
private List<MotionEvent> confirmedSingleTaps = Lists.newArrayList();
private List<MotionEvent> doubleTapEvents = Lists.newArrayList();
private List<MotionEvent> doubleTaps = Lists.newArrayList();
public void clearDownEvents() {
downEvents.clear();
}
public void clearScrollEvents() {
scrollEvents.clear();
}
public void clearLongPressEvents() {
longPressEvents.clear();
}
public void clearShowPresses() {
showPresses.clear();
}
public void clearSingleTaps() {
singleTaps.clear();
}
public void clearConfirmedSingleTaps() {
confirmedSingleTaps.clear();
}
public void clearDoubleTapEvents() {
doubleTapEvents.clear();
}
public void clearDoubleTaps() {
doubleTaps.clear();
}
public List<MotionEvent> getDownEvents() {
return Lists.newArrayList(downEvents);
}
public List<MotionEvent> getScrollEvents() {
return Lists.newArrayList(scrollEvents);
}
public List<MotionEvent> getLongPressEvents() {
return Lists.newArrayList(longPressEvents);
}
public List<MotionEvent> getShowPresses() {
return Lists.newArrayList(showPresses);
}
public List<MotionEvent> getSingleTaps() {
return Lists.newArrayList(singleTaps);
}
public List<MotionEvent> getConfirmedSingleTaps() {
return Lists.newArrayList(confirmedSingleTaps);
}
public List<MotionEvent> getDoubleTapEvents() {
return Lists.newArrayList(doubleTapEvents);
}
public List<MotionEvent> getDoubleTaps() {
return Lists.newArrayList(doubleTaps);
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.gesture_activity);
gestureArea = findViewById(R.id.gesture_area);
final GestureDetector simpleDetector = new GestureDetector(this, new GestureListener());
simpleDetector.setIsLongpressEnabled(true);
simpleDetector.setOnDoubleTapListener(new DoubleTapListener());
gestureArea.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent m) {
boolean res = simpleDetector.onTouchEvent(m);
if (-1 != touchDelay) {
Log.i(TAG, "sleeping for: " + touchDelay);
SystemClock.sleep(touchDelay);
}
return res;
}
});
}
private volatile long touchDelay = -1;
public void setTouchDelay(long touchDelay) {
this.touchDelay = touchDelay;
}
public void areaClicked(@SuppressWarnings("unused") View v) {
Log.v(TAG, "onClick called!");
}
private class DoubleTapListener implements GestureDetector.OnDoubleTapListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
doubleTaps.add(MotionEvent.obtain(e));
Log.v(TAG, "onDoubleTap: " + e);
setVisible(R.id.text_double_click);
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
doubleTapEvents.add(MotionEvent.obtain(e));
Log.v(TAG, "onDoubleTapEvent: " + e);
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
confirmedSingleTaps.add(MotionEvent.obtain(e));
Log.v(TAG, "onSingleTapConfirmed: " + e);
return false;
}
}
private class GestureListener implements GestureDetector.OnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
downEvents.add(MotionEvent.obtain(e));
Log.v(TAG, "Down: " + e);
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
singleTaps.add(MotionEvent.obtain(e));
Log.v(TAG, "on single tap: " + e);
setVisible(R.id.text_click);
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distX, float distY) {
scrollEvents.add(MotionEvent.obtain(e1));
scrollEvents.add(MotionEvent.obtain(e2));
Log.v(TAG, "Scroll: e1: " + e1 + " e2: " + e2 + " distX: " + distX + " distY: " + distY);
setVisible(R.id.text_swipe);
return false;
}
@Override
public void onShowPress(MotionEvent e) {
showPresses.add(MotionEvent.obtain(e));
Log.v(TAG, "ShowPress: " + e);
}
@Override
public void onLongPress(MotionEvent e) {
longPressEvents.add(MotionEvent.obtain(e));
Log.v(TAG, "LongPress: " + e);
setVisible(R.id.text_long_click);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float veloX, float veloY) {
Log.v(TAG, "Fling: e1: " + e1 + " e2: " + e2 + " veloX: " + veloX + " veloY: " + veloY);
return false;
}
}
private void setVisible(int id) {
hideAll();
findViewById(id).setVisibility(View.VISIBLE);
}
private void hideAll() {
findViewById(R.id.text_click).setVisibility(View.GONE);
findViewById(R.id.text_long_click).setVisibility(View.GONE);
findViewById(R.id.text_swipe).setVisibility(View.GONE);
findViewById(R.id.text_double_click).setVisibility(View.GONE);
}
}