package com.jjoe64.graphview.compatible;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
/**
* Copyright (C) 2011 Jonas Gehring
* Licensed under the GNU Lesser General Public License (LGPL)
* http://www.gnu.org/licenses/lgpl.html
*/
public class ScaleGestureDetector {
public interface SimpleOnScaleGestureListener {
boolean onScale(ScaleGestureDetector detector);
}
private Object realScaleGestureDetector;
private Method method_getScaleFactor;
private Method method_isInProgress;
private Method method_onTouchEvent;
/**
* @param context
* @param simpleOnScaleGestureListener
*/
public ScaleGestureDetector(Context context, SimpleOnScaleGestureListener simpleOnScaleGestureListener) {
try {
// check if class is available
Class.forName("android.view.ScaleGestureDetector");
// load class and methods
Class<?> classRealScaleGestureDetector = Class.forName("com.jjoe64.graphview.compatible.RealScaleGestureDetector");
method_getScaleFactor = classRealScaleGestureDetector.getMethod("getScaleFactor");
method_isInProgress = classRealScaleGestureDetector.getMethod("isInProgress");
method_onTouchEvent = classRealScaleGestureDetector.getMethod("onTouchEvent", MotionEvent.class);
// create real ScaleGestureDetector
Constructor<?> constructor = classRealScaleGestureDetector.getConstructor(Context.class, getClass(), SimpleOnScaleGestureListener.class);
realScaleGestureDetector = constructor.newInstance(context, this, simpleOnScaleGestureListener);
} catch (Exception e) {
// not available
Log.w("com.jjoe64.graphview", "*** WARNING *** No scaling available for graphs. Exception:");
e.printStackTrace();
}
}
public double getScaleFactor() {
if (method_getScaleFactor != null) {
try {
return (Float) method_getScaleFactor.invoke(realScaleGestureDetector);
} catch (Exception e) {
e.printStackTrace();
return 1.0;
}
}
return 1.0;
}
public boolean isInProgress() {
if (method_getScaleFactor != null) {
try {
return (Boolean) method_isInProgress.invoke(realScaleGestureDetector);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return false;
}
public void onTouchEvent(MotionEvent event) {
if (method_onTouchEvent != null) {
try {
method_onTouchEvent.invoke(realScaleGestureDetector, event);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}