/*
* Copyright (c) 2013 Menny Even-Danan
*
* 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.anysoftkeyboard.devicespecific;
import android.annotation.TargetApi;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.MotionEventCompat;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import com.anysoftkeyboard.utils.Log;
@TargetApi(8)
public class AskV8GestureDetector extends GestureDetector {
private static final String TAG = "AskV8GestureDetector";
private static final int NOT_A_POINTER_ID = -1;
protected final ScaleGestureDetector mScaleGestureDetector;
private final AskOnGestureListener mListener;
private int mSingleFingerEventPointerId = NOT_A_POINTER_ID;
public AskV8GestureDetector(Context context, AskOnGestureListener listener) {
super(context, listener, null, true/*ignore multi-touch*/);
mListener = listener;
mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScale(ScaleGestureDetector detector) {
final float factor = detector.getScaleFactor();
Log.d(TAG, "onScale factor " + factor);
if (factor > 1.1)
return mListener.onSeparate(factor);
else if (factor < 0.9)
return mListener.onPinch(factor);
return false;
}
});
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent ev) {
int singleFingerEventPointerId = mSingleFingerEventPointerId;
//I want to keep track on the first finger (https://github.com/AnySoftKeyboard/AnySoftKeyboard/issues/300)
switch (MotionEventCompat.getActionMasked(ev)){
case MotionEvent.ACTION_DOWN:
if (ev.getPointerCount() == 1) {
mSingleFingerEventPointerId = ev.getPointerId(0);
singleFingerEventPointerId = mSingleFingerEventPointerId;
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (ev.getPointerCount() == 1)
mSingleFingerEventPointerId = NOT_A_POINTER_ID;
}
try {
//https://github.com/AnySoftKeyboard/AnySoftKeyboard/issues/26
mScaleGestureDetector.onTouchEvent(ev);
} catch (IllegalArgumentException e) {
//I have nothing I can do here.
} catch (ArrayIndexOutOfBoundsException e) {
//I have nothing I can do here.
}
//I'm going to pass the event to the super, only if it is a single touch, and the event is for the first finger
//https://github.com/AnySoftKeyboard/AnySoftKeyboard/issues/300
if (ev.getPointerCount() == 1 && ev.getPointerId(0) == singleFingerEventPointerId)
return super.onTouchEvent(ev);
else
return false;
}
}