summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJin Cao <jinyan@google.com>2014-10-13 10:55:57 -0700
committerJin Cao <jinyan@google.com>2014-10-15 13:09:51 -0700
commitb70a428b7eaf5c5e04c67b5e087cb3a64ed8cdba (patch)
treeaac1dda7ed0d1a425ef7a2b7870fe33d7bfd3059 /src
parent637388117670a07794389950bd6405270f369829 (diff)
downloadandroid_packages_apps_UnifiedEmail-b70a428b7eaf5c5e04c67b5e087cb3a64ed8cdba.tar.gz
android_packages_apps_UnifiedEmail-b70a428b7eaf5c5e04c67b5e087cb3a64ed8cdba.tar.bz2
android_packages_apps_UnifiedEmail-b70a428b7eaf5c5e04c67b5e087cb3a64ed8cdba.zip
Allow dragging the drawer close from CV
When the drawer is open, tapping on the CV pane will auto close the drawer, and dragging on the CV has the same effect as dragging on the TL. b/17922832 Change-Id: Ib518ed58cee9752dd8c8713f2bdcb5c65f4afac0
Diffstat (limited to 'src')
-rw-r--r--src/com/android/mail/ui/ConversationViewFrame.java45
-rw-r--r--src/com/android/mail/ui/TwoPaneController.java11
-rw-r--r--src/com/android/mail/ui/TwoPaneLayout.java24
3 files changed, 62 insertions, 18 deletions
diff --git a/src/com/android/mail/ui/ConversationViewFrame.java b/src/com/android/mail/ui/ConversationViewFrame.java
index 73bbf459c..50da2eebe 100644
--- a/src/com/android/mail/ui/ConversationViewFrame.java
+++ b/src/com/android/mail/ui/ConversationViewFrame.java
@@ -17,8 +17,11 @@
package com.android.mail.ui;
import android.content.Context;
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
+import android.view.ViewConfiguration;
import android.widget.FrameLayout;
/**
@@ -26,18 +29,25 @@ import android.widget.FrameLayout;
*/
public class ConversationViewFrame extends FrameLayout {
+ private final ViewConfiguration mConfiguration;
+ private long mInterceptedTime;
+ private float mInterceptedXDown;
+ private float mInterceptedYDown;
+
public interface DownEventListener {
- boolean onInterceptCVDownEvent();
+ boolean shouldBlockTouchEvents();
+ void onConversationViewFrameTapped();
}
private DownEventListener mDownEventListener;
public ConversationViewFrame(Context c) {
- super(c, null);
+ this(c, null);
}
public ConversationViewFrame(Context c, AttributeSet attrs) {
super(c, attrs);
+ mConfiguration = ViewConfiguration.get(c);
}
public void setDownEventListener(DownEventListener l) {
@@ -46,13 +56,32 @@ public class ConversationViewFrame extends FrameLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- boolean steal = false;
- if (ev.getActionMasked() == MotionEvent.ACTION_DOWN && mDownEventListener != null) {
- steal = mDownEventListener.onInterceptCVDownEvent();
- // just drop the event stream that follows when we steal; we closed the drawer and
- // that's enough.
+ return mDownEventListener != null && mDownEventListener.shouldBlockTouchEvents();
+ }
+
+ @Override
+ public boolean onTouchEvent(@NonNull MotionEvent ev) {
+ if (mDownEventListener != null) {
+ switch (ev.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ mInterceptedTime = SystemClock.elapsedRealtime();
+ mInterceptedXDown = ev.getX();
+ mInterceptedYDown = ev.getY();
+ break;
+ case MotionEvent.ACTION_UP:
+ // Check for a tap
+ final long timeDelta = SystemClock.elapsedRealtime() - mInterceptedTime;
+ final float xDelta = ev.getX() - mInterceptedXDown;
+ final float yDelta = ev.getY() - mInterceptedYDown;
+ if (timeDelta < ViewConfiguration.getTapTimeout()
+ && xDelta < mConfiguration.getScaledTouchSlop()
+ && yDelta < mConfiguration.getScaledTouchSlop()) {
+ mDownEventListener.onConversationViewFrameTapped();
+ }
+ }
+ return true;
}
- return steal;
+ return false;
}
}
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index 9136da098..289590295 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -677,13 +677,16 @@ public final class TwoPaneController extends AbstractActivityController implemen
}
@Override
- public boolean onInterceptCVDownEvent() {
- // handle a down event on CV by closing the drawer if open
+ public boolean shouldBlockTouchEvents() {
+ return isDrawerOpen();
+ }
+
+ @Override
+ public void onConversationViewFrameTapped() {
+ // handle a tap on CV by closing the drawer if open
if (isDrawerOpen()) {
toggleDrawerState();
- return true;
}
- return false;
}
@Override
diff --git a/src/com/android/mail/ui/TwoPaneLayout.java b/src/com/android/mail/ui/TwoPaneLayout.java
index 72244a897..f222e6450 100644
--- a/src/com/android/mail/ui/TwoPaneLayout.java
+++ b/src/com/android/mail/ui/TwoPaneLayout.java
@@ -551,11 +551,24 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener,
if (drawerOpen) {
// Only start intercepting if the down event is inside the list pane or in
// landscape conv pane
- final float listX1 = mListLeft + mListView.getTranslationX();
- final float listX2 = listX1 + mListView.getWidth();
+ final float left;
+ final float right;
+ if (mShouldShowPreviewPanel) {
+ final boolean isAdMode = ViewMode.isAdMode(mCurrentMode);
+ left = mIsRtl ?
+ (isAdMode ? mMiscellaneousView.getX() : mConversationView.getX()) :
+ mListView.getX();
+ right = mIsRtl ? mListView.getX() + mListView.getWidth() :
+ isAdMode ?
+ mMiscellaneousView.getX() + mMiscellaneousView.getWidth() :
+ mConversationView.getX() + mConversationView.getWidth();
+ } else {
+ left = mListView.getX();
+ right = left + mListView.getWidth();
+ }
// Set the potential start drag states
- mShouldInterceptCurrentTouch = x >= listX1 && x <= listX2;
+ mShouldInterceptCurrentTouch = x >= left && x <= right;
mXThreshold = null;
if (mIsRtl) {
mCurrentDragMode = GmailDragHelper.CAPTURE_LEFT_TO_RIGHT;
@@ -564,9 +577,8 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener,
}
} else {
// Only capture within the mini drawer
- final float foldersX1 = mIsRtl ? mFoldersLeft +
- (mDrawerWidthOpen - mDrawerWidthMini) + mFoldersView.getTranslationX() :
- mFoldersLeft + mFoldersView.getTranslationX();
+ final float foldersX1 = mIsRtl ? mFoldersView.getX() + mDrawerWidthDelta :
+ mFoldersView.getX();
final float foldersX2 = foldersX1 + mDrawerWidthMini;
// Set the potential start drag states