From b84a13c0603eeaab90f2cbb7e0a2ea70e589aab5 Mon Sep 17 00:00:00 2001 From: ruben Date: Mon, 6 Jun 2016 22:16:16 +0100 Subject: [PATCH 1/4] Fix peek persisting --- .../com/jakewharton/behavior/drawer/BehaviorDelegate.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java index 44a736f..4fa067e 100644 --- a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java +++ b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java @@ -264,9 +264,15 @@ private void updateDrawerState(int activeState, View activeDrawer) { if (activeDrawer != null && activeState == ViewDragHelper.STATE_IDLE) { if (onScreen == 0) { + // It's fully hidden dispatchOnDrawerClosed(activeDrawer); } else if (onScreen == 1) { + // It's fully open dispatchOnDrawerOpened(activeDrawer); + } else { + // It's partially open + closeDrawers(true); + dispatchOnDrawerClosed(activeDrawer); } } From abfd7d386e912899074c3ef14e6e488f42e63ce7 Mon Sep 17 00:00:00 2001 From: ruben Date: Mon, 6 Jun 2016 22:38:22 +0100 Subject: [PATCH 2/4] Don't call dispatchOnDrawerClosed since it'll be called later because of onScreen = 0 --- .../java/com/jakewharton/behavior/drawer/BehaviorDelegate.java | 1 - 1 file changed, 1 deletion(-) diff --git a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java index 4fa067e..6b49c1a 100644 --- a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java +++ b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java @@ -272,7 +272,6 @@ private void updateDrawerState(int activeState, View activeDrawer) { } else { // It's partially open closeDrawers(true); - dispatchOnDrawerClosed(activeDrawer); } } From e6255d54ef1c26486c2fb8b2803980a9c75a2641 Mon Sep 17 00:00:00 2001 From: ruben Date: Tue, 7 Jun 2016 11:06:19 +0100 Subject: [PATCH 3/4] Add utility method to retrieve a DrawerBehavior from a View --- .../behavior/drawer/BehaviorDelegate.java | 5 ----- .../jakewharton/behavior/drawer/DrawerBehavior.java | 13 +++++++++++++ .../behavior/drawer/DrawerBehaviorActivity.java | 5 +++++ sample/src/main/res/layout/drawer_behavior.xml | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java index 6b49c1a..44a736f 100644 --- a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java +++ b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java @@ -264,14 +264,9 @@ private void updateDrawerState(int activeState, View activeDrawer) { if (activeDrawer != null && activeState == ViewDragHelper.STATE_IDLE) { if (onScreen == 0) { - // It's fully hidden dispatchOnDrawerClosed(activeDrawer); } else if (onScreen == 1) { - // It's fully open dispatchOnDrawerOpened(activeDrawer); - } else { - // It's partially open - closeDrawers(true); } } diff --git a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java index f228d60..c29233a 100644 --- a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java +++ b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java @@ -25,6 +25,7 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; public final class DrawerBehavior extends CoordinatorLayout.Behavior { private static void validateGravity(int gravity) { @@ -80,4 +81,16 @@ public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, Motio @Override public boolean onTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) { return delegate(parent, child).onTouchEvent(ev); } + + public static DrawerBehavior from(View view) { + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (!(params instanceof CoordinatorLayout.LayoutParams)) { + throw new IllegalArgumentException("The view is not a child of CoordinatorLayout"); + } + CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) params).getBehavior(); + if (!(behavior instanceof DrawerBehavior)) { + throw new IllegalArgumentException("The view is not associated with DrawerBehavior"); + } + return (DrawerBehavior) behavior; + } } diff --git a/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java b/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java index 3283d43..d0af023 100644 --- a/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java +++ b/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java @@ -2,10 +2,15 @@ import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import com.jakewharton.behavior.drawer.DrawerBehavior; public final class DrawerBehaviorActivity extends AppCompatActivity { + + private DrawerBehavior drawerBehavior; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drawer_behavior); + drawerBehavior = DrawerBehavior.from(findViewById(R.id.drawerView)); } } diff --git a/sample/src/main/res/layout/drawer_behavior.xml b/sample/src/main/res/layout/drawer_behavior.xml index c8cb49c..123eb90 100644 --- a/sample/src/main/res/layout/drawer_behavior.xml +++ b/sample/src/main/res/layout/drawer_behavior.xml @@ -8,6 +8,7 @@ > Date: Tue, 7 Jun 2016 11:57:15 +0100 Subject: [PATCH 4/4] Add open, close and query methods --- .../behavior/drawer/BehaviorDelegate.java | 58 +++++++++++++++++-- .../behavior/drawer/DrawerBehavior.java | 22 +++++-- .../drawer/DrawerBehaviorActivity.java | 15 +++++ .../src/main/res/layout/drawer_behavior.xml | 21 ++++++- 4 files changed, 103 insertions(+), 13 deletions(-) diff --git a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java index 44a736f..faa01cd 100644 --- a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java +++ b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/BehaviorDelegate.java @@ -194,7 +194,7 @@ boolean onTouchEvent(MotionEvent ev) { final int slop = dragger.getTouchSlop(); if (dx * dx + dy * dy < slop * slop) { // Taps close a dimmed open drawer but only if it isn't locked open. - if ((openState & FLAG_IS_OPENED) == FLAG_IS_OPENED) { // TODO isDrawerOpen method? + if (isDrawerOpen()) { // TODO isDrawerOpen method? peekingOnly = false; } } @@ -276,7 +276,7 @@ private void updateDrawerState(int activeState, View activeDrawer) { } private void dispatchOnDrawerClosed(View drawerView) { - if ((openState & FLAG_IS_OPENED) == FLAG_IS_OPENED) { + if (isDrawerOpen()) { openState = 0; updateChildrenImportantForAccessibility(drawerView, false); @@ -294,7 +294,7 @@ private void dispatchOnDrawerClosed(View drawerView) { } private void dispatchOnDrawerOpened(View drawerView) { - if ((openState & FLAG_IS_OPENED) == 0) { + if (!isDrawerOpen()) { openState = FLAG_IS_OPENED; updateChildrenImportantForAccessibility(drawerView, true); @@ -325,8 +325,7 @@ private void updateChildrenImportantForAccessibility(View drawerView, boolean is } } - @Override - public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { + @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { int childWidth = changedView.getWidth(); // This reverses the positioning shown in onLayout. @@ -393,6 +392,55 @@ private void setDrawerViewOffset(float slideOffset) { return child.getTop(); } + public boolean isDrawerOpen() { + return (openState & FLAG_IS_OPENED) == FLAG_IS_OPENED; + } + + public boolean isDrawerOpening(){ + return (openState & FLAG_IS_OPENING) == FLAG_IS_OPENING; + } + + public boolean isDrawerClosing(){ + return (openState & FLAG_IS_CLOSING) == FLAG_IS_CLOSING; + } + + public void openDrawer() { + if (isDrawerOpen() || isDrawerOpening()) { + return; + } + + boolean needsSettle; + + if (isLeft) { + needsSettle = dragger.smoothSlideViewTo(child, 0, child.getTop()); + } else { + needsSettle = + dragger.smoothSlideViewTo(child, parent.getWidth() - child.getWidth(), child.getTop()); + } + + if (needsSettle) { + ViewCompat.postOnAnimation(parent, draggerSettle); + } + } + + public void closeDrawer() { + if (!isDrawerOpen() || isDrawerClosing()) { + return; + } + + boolean needsSettle; + + if (isLeft) { + needsSettle = dragger.smoothSlideViewTo(child, -child.getWidth(), child.getTop()); + } else { + needsSettle = dragger.smoothSlideViewTo(child, parent.getWidth(), child.getTop()); + } + + if (needsSettle) { + ViewCompat.postOnAnimation(parent, draggerSettle); + } + } + boolean onLayoutChild() { int width = parent.getMeasuredWidth(); int height = parent.getMeasuredHeight(); diff --git a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java index c29233a..956c3d3 100644 --- a/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java +++ b/drawer-behavior/src/main/java/com/jakewharton/behavior/drawer/DrawerBehavior.java @@ -19,7 +19,7 @@ import android.content.res.TypedArray; import android.support.annotation.Keep; import android.support.design.widget.CoordinatorLayout; -import android.support.v4.util.SimpleArrayMap; +import android.support.v4.util.ArrayMap; import android.support.v4.view.GravityCompat; import android.util.AttributeSet; import android.view.Gravity; @@ -37,7 +37,7 @@ private static void validateGravity(int gravity) { } } - private final SimpleArrayMap delegates = new SimpleArrayMap<>(); + private final ArrayMap delegates = new ArrayMap<>(); private final int gravity; @SuppressWarnings("unused") // Public API for programmatic instantiation. @@ -67,14 +67,12 @@ private BehaviorDelegate delegate(CoordinatorLayout parent, View child) { return delegate; } - @Override - public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) { + @Override public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) { return child.getVisibility() == View.GONE // || delegate(parent, child).onLayoutChild(); } - @Override - public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) { + @Override public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) { return delegate(parent, child).onInterceptTouchEvent(ev); } @@ -82,6 +80,18 @@ public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, Motio return delegate(parent, child).onTouchEvent(ev); } + public void open(){ + for(BehaviorDelegate delegate : delegates.values()){ + delegate.openDrawer(); + } + } + + public void close(){ + for(BehaviorDelegate delegate : delegates.values()){ + delegate.closeDrawer(); + } + } + public static DrawerBehavior from(View view) { ViewGroup.LayoutParams params = view.getLayoutParams(); if (!(params instanceof CoordinatorLayout.LayoutParams)) { diff --git a/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java b/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java index d0af023..75e645e 100644 --- a/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java +++ b/sample/src/main/java/com/example/behavior/drawer/DrawerBehaviorActivity.java @@ -2,6 +2,7 @@ import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.view.View; import com.jakewharton.behavior.drawer.DrawerBehavior; public final class DrawerBehaviorActivity extends AppCompatActivity { @@ -12,5 +13,19 @@ public final class DrawerBehaviorActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.drawer_behavior); drawerBehavior = DrawerBehavior.from(findViewById(R.id.drawerView)); + + //noinspection ConstantConditions + findViewById(R.id.openButton).setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { + drawerBehavior.open(); + } + }); + + //noinspection ConstantConditions + findViewById(R.id.closeButton).setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { + drawerBehavior.close(); + } + }); } } diff --git a/sample/src/main/res/layout/drawer_behavior.xml b/sample/src/main/res/layout/drawer_behavior.xml index 123eb90..5a8e148 100644 --- a/sample/src/main/res/layout/drawer_behavior.xml +++ b/sample/src/main/res/layout/drawer_behavior.xml @@ -6,12 +6,29 @@ android:layout_height="match_parent" android:background="#feee" > - +