/* * Copyright (C) 2016 Google Inc. * * 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.googlecode.android_scripting; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.View.OnTouchListener; import com.googlecode.android_scripting.activity.InterpreterManager; import com.googlecode.android_scripting.activity.LogcatViewer; import com.googlecode.android_scripting.activity.ScriptManager; import com.googlecode.android_scripting.activity.TriggerManager; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class ActivityFlinger { private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 100; private static final int SWIPE_THRESHOLD_VELOCITY = 200; private static class ActivityTransition { Class<? extends Activity> mLeft; Class<? extends Activity> mRight; public ActivityTransition(Class<? extends Activity> left, Class<? extends Activity> right) { mLeft = left; mRight = right; } } private static Map<Class<?>, ActivityTransition> mActivityTransitions = new HashMap<Class<?>, ActivityTransition>(); private ActivityFlinger() { // Utility class. } static { List<Class<? extends Activity>> entries = new ArrayList<Class<? extends Activity>>(); entries.add(ScriptManager.class); entries.add(InterpreterManager.class); entries.add(TriggerManager.class); entries.add(LogcatViewer.class); Class<? extends Activity> left = null; Class<? extends Activity> current = null; Class<? extends Activity> right = null; for (Iterator<Class<? extends Activity>> it = entries.iterator(); it.hasNext() || current != null;) { if (current == null) { current = it.next(); } if (it.hasNext()) { right = it.next(); } else { right = null; } mActivityTransitions.put(current, new ActivityTransition(left, right)); left = current; current = right; } } public static void attachView(View view, Context context) { final LeftRightFlingListener mListener = new LeftRightFlingListener(); final GestureDetector mGestureDetector = new GestureDetector(mListener); ActivityTransition transition = mActivityTransitions.get(context.getClass()); if (transition.mLeft != null) { mListener.mLeftRunnable = new StartActivityRunnable(context, transition.mLeft); } if (transition.mRight != null) { mListener.mRightRunnable = new StartActivityRunnable(context, transition.mRight); } view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mGestureDetector.onTouchEvent(event); } }); } private static class StartActivityRunnable implements Runnable { private final Context mContext; private final Class<?> mActivityClass; private StartActivityRunnable(Context context, Class<?> activity) { mContext = context; mActivityClass = activity; } @Override public void run() { Intent intent = new Intent(mContext, mActivityClass); mContext.startActivity(intent); } } private static class LeftRightFlingListener extends SimpleOnGestureListener { Runnable mLeftRunnable; Runnable mRightRunnable; @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { if (Math.abs(event1.getY() - event2.getY()) > SWIPE_MAX_OFF_PATH) { return false; } if (event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { if (mRightRunnable != null) { mRightRunnable.run(); } } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { if (mLeftRunnable != null) { mLeftRunnable.run(); } } else { return super.onFling(event1, event2, velocityX, velocityY); } return true; } } }