summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wren <cwren@android.com>2013-03-27 17:13:14 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-03-27 17:13:14 -0700
commitcca14e1a8cdf90e7a849e92c28b1d7ee6f427b07 (patch)
treedcdf37cfdfe525432db772af9d1b10f77a3f3fa1
parent1706bde6eb359c96330ef8b460d8aa842d016599 (diff)
parentb2b6ef497aef97833ea3d20ee8db1519303825be (diff)
downloadandroid_packages_screensavers_PhotoTable-cca14e1a8cdf90e7a849e92c28b1d7ee6f427b07.tar.gz
android_packages_screensavers_PhotoTable-cca14e1a8cdf90e7a849e92c28b1d7ee6f427b07.tar.bz2
android_packages_screensavers_PhotoTable-cca14e1a8cdf90e7a849e92c28b1d7ee6f427b07.zip
am b2b6ef49: am bf44ca22: add swipe-away gesture, and fix focus blink.
* commit 'b2b6ef497aef97833ea3d20ee8db1519303825be': add swipe-away gesture, and fix focus blink.
-rw-r--r--res/values/config.xml9
-rw-r--r--src/com/android/dreams/phototable/EdgeSwipeDetector.java75
-rw-r--r--src/com/android/dreams/phototable/PhotoTable.java13
3 files changed, 94 insertions, 3 deletions
diff --git a/res/values/config.xml b/res/values/config.xml
index 36835c9..b871820 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -85,5 +85,14 @@
<!-- Number of images to pre-load. -->
<integer name="num_images_to_preload">5</integer>
+
+ <!-- distance from edge to start a valid edge swipe as a fraction of
+ touch area width, in parts per million from 0 to 1. -->
+ <integer name="table_edge_swipe_gutter">50000</integer>
+
+ <!-- minimum length of a valid edge swipe as a fraction of
+ touch area width, in parts per million from 0 to 1. -->
+ <integer name="table_edge_swipe_threshold">100000</integer>
+
</resources>
diff --git a/src/com/android/dreams/phototable/EdgeSwipeDetector.java b/src/com/android/dreams/phototable/EdgeSwipeDetector.java
new file mode 100644
index 0000000..98ad6c6
--- /dev/null
+++ b/src/com/android/dreams/phototable/EdgeSwipeDetector.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2013 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.android.dreams.phototable;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.MotionEvent;
+
+/**
+ * Detect and dispatch edge events.
+ */
+public class EdgeSwipeDetector {
+ private static final String TAG = "EdgeSwipeDetector";
+ private float mEdgeSwipeGutter;
+ private float mEdgeSwipeThreshold;
+ private boolean mEdgeSwipe;
+
+ private final PhotoTable mTable;
+
+ public EdgeSwipeDetector(Context context, PhotoTable table) {
+ mTable = table;
+ final Resources resources = context.getResources();
+ mEdgeSwipeGutter = resources.getInteger(R.integer.table_edge_swipe_gutter) / 1000000f;
+ mEdgeSwipeThreshold = resources.getInteger(R.integer.table_edge_swipe_threshold) / 1000000f;
+ }
+
+ public boolean onTouchEvent(MotionEvent event) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ float edgeGutter = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax()
+ * mEdgeSwipeGutter;
+ if (event.getX() < edgeGutter) {
+ mEdgeSwipe = true;
+ return true;
+ }
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+ if (mEdgeSwipe) {
+ return true;
+ }
+ break;
+
+ case MotionEvent.ACTION_UP:
+ if (mEdgeSwipe) {
+ mEdgeSwipe = false;
+ float enough = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax()
+ * mEdgeSwipeThreshold;
+ if (event.getX() > enough) {
+ if (mTable.hasFocus()) {
+ mTable.fling(mTable.getFocused());
+ } else if (mTable.hasSelection()) {
+ mTable.clearSelection();
+ }
+ }
+ return true;
+ }
+ break;
+ }
+ return false;
+ }
+}
diff --git a/src/com/android/dreams/phototable/PhotoTable.java b/src/com/android/dreams/phototable/PhotoTable.java
index e5eb007..a6d5bd7 100644
--- a/src/com/android/dreams/phototable/PhotoTable.java
+++ b/src/com/android/dreams/phototable/PhotoTable.java
@@ -67,6 +67,8 @@ public class PhotoTable extends FrameLayout {
private static final int MAX_SELECTION_TIME = 10000;
private static final int MAX_FOCUS_TIME = 5000;
+ private static final float EDGE_SWIPE_GUTTER = 0.05f;
+ private static final float EDGE_SWIPE_THRESHOLD = 0.25f;
private static Random sRNG = new Random();
private final Launcher mLauncher;
@@ -101,6 +103,7 @@ public class PhotoTable extends FrameLayout {
private View mFocused;
private long mFocusedTime;
private int mHighlightColor;
+ private EdgeSwipeDetector mEdgeSwipeDetector;
public PhotoTable(Context context, AttributeSet as) {
super(context, as);
@@ -128,6 +131,7 @@ public class PhotoTable extends FrameLayout {
getContext().getSharedPreferences(PhotoTableDreamSettings.PREFS_NAME, 0));
mLauncher = new Launcher();
mFocusReaper = new FocusReaper();
+ mEdgeSwipeDetector = new EdgeSwipeDetector(context, this);
mStarted = false;
}
@@ -284,8 +288,6 @@ public class PhotoTable extends FrameLayout {
if (bestFocus == null) {
if (angle < 180f) {
return moveFocus(focus, direction, 180f);
- } else {
- clearFocus();
}
} else {
setFocus(bestFocus);
@@ -362,6 +364,11 @@ public class PhotoTable extends FrameLayout {
}
@Override
+ public boolean onGenericMotionEvent(MotionEvent event) {
+ return mEdgeSwipeDetector.onTouchEvent(event);
+ }
+
+ @Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
if (hasSelection()) {
@@ -554,7 +561,7 @@ public class PhotoTable extends FrameLayout {
final float dist = (float) Math.hypot(delta[0], delta[1]);
final int duration = (int) (1000f * dist / mThrowSpeed);
- fling (photo, delta[0], delta[1], duration, true, true);
+ fling(photo, delta[0], delta[1], duration, true, true);
}
public void fling(final View photo, float dx, float dy, int duration,