diff options
author | Jin Cao <jinyan@google.com> | 2014-10-13 10:55:57 -0700 |
---|---|---|
committer | Jin Cao <jinyan@google.com> | 2014-10-15 13:09:51 -0700 |
commit | b70a428b7eaf5c5e04c67b5e087cb3a64ed8cdba (patch) | |
tree | aac1dda7ed0d1a425ef7a2b7870fe33d7bfd3059 /src | |
parent | 637388117670a07794389950bd6405270f369829 (diff) | |
download | android_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.java | 45 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneController.java | 11 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneLayout.java | 24 |
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 |