1bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren/* 2bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * Copyright (C) 2013 The Android Open Source Project 3bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * 4bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * Licensed under the Apache License, Version 2.0 (the "License"); 5bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * you may not use this file except in compliance with the License. 6bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * You may obtain a copy of the License at 7bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * 8bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * http://www.apache.org/licenses/LICENSE-2.0 9bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * 10bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * Unless required by applicable law or agreed to in writing, software 11bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * distributed under the License is distributed on an "AS IS" BASIS, 12bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * See the License for the specific language governing permissions and 14bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * limitations under the License. 15bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren */ 16bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wrenpackage com.android.dreams.phototable; 17bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 18bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wrenimport android.content.Context; 19bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wrenimport android.content.res.Resources; 20bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wrenimport android.view.MotionEvent; 21bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 22bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren/** 23bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * Detect and dispatch edge events. 24bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren */ 25bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wrenpublic class EdgeSwipeDetector { 2688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren @SuppressWarnings("unused") 27bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren private static final String TAG = "EdgeSwipeDetector"; 28bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren private float mEdgeSwipeGutter; 29bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren private float mEdgeSwipeThreshold; 30bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren private boolean mEdgeSwipe; 31bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 32bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren private final PhotoTable mTable; 33bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 34bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren public EdgeSwipeDetector(Context context, PhotoTable table) { 35bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren mTable = table; 36bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren final Resources resources = context.getResources(); 37bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren mEdgeSwipeGutter = resources.getInteger(R.integer.table_edge_swipe_gutter) / 1000000f; 38bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren mEdgeSwipeThreshold = resources.getInteger(R.integer.table_edge_swipe_threshold) / 1000000f; 39bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 40bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 41bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren public boolean onTouchEvent(MotionEvent event) { 42bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren switch (event.getAction()) { 43bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren case MotionEvent.ACTION_DOWN: 44bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren float edgeGutter = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax() 45bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * mEdgeSwipeGutter; 46bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren if (event.getX() < edgeGutter) { 47bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren mEdgeSwipe = true; 48bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren return true; 49bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 50bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren break; 51bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 52bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren case MotionEvent.ACTION_MOVE: 53bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren if (mEdgeSwipe) { 54bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren return true; 55bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 56bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren break; 57bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren 58bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren case MotionEvent.ACTION_UP: 59bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren if (mEdgeSwipe) { 60bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren mEdgeSwipe = false; 61bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren float enough = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax() 62bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren * mEdgeSwipeThreshold; 63bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren if (event.getX() > enough) { 64bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren if (mTable.hasFocus()) { 6588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren mTable.fling(mTable.getFocus()); 66bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } else if (mTable.hasSelection()) { 67bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren mTable.clearSelection(); 68bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 69bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 70bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren return true; 71bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 72bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren break; 73bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 74bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren return false; 75bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren } 76bf44ca22d40dd60b4c30f6a979b80fbd2ffa0078Chris Wren} 77