From b84a13c0603eeaab90f2cbb7e0a2ea70e589aab5 Mon Sep 17 00:00:00 2001 From: ruben Date: Mon, 6 Jun 2016 22:16:16 +0100 Subject: [PATCH 1/5] 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/5] 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 d17a0544e3449bfa00ed29a2088fbab0ff1e1b57 Mon Sep 17 00:00:00 2001 From: ruben Date: Tue, 7 Jun 2016 10:50:39 +0100 Subject: [PATCH 3/5] Add save/restore state --- .../behavior/drawer/BehaviorDelegate.java | 38 +++++++++++++++---- .../behavior/drawer/DrawerBehavior.java | 10 +++++ 2 files changed, 41 insertions(+), 7 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..25d44bb 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 @@ -17,6 +17,8 @@ package com.jakewharton.behavior.drawer; import android.os.Build; +import android.os.Bundle; +import android.os.Parcelable; import android.os.SystemClock; import android.support.design.widget.CoordinatorLayout; import android.support.v4.view.GravityCompat; @@ -26,6 +28,7 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import static android.view.View.INVISIBLE; @@ -38,6 +41,7 @@ final class BehaviorDelegate extends ViewDragHelper.Callback { private static final int FLAG_IS_OPENING = 0x2; private static final int FLAG_IS_CLOSING = 0x4; private static final int DEFAULT_SCRIM_COLOR = 0x99000000; + private static final String BEHAVIOR_STATE = "behavior_state"; private final CoordinatorLayout parent; private final View child; @@ -264,14 +268,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); } } @@ -330,8 +329,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. @@ -461,4 +459,30 @@ boolean onLayoutChild() { } return true; } + + public Parcelable onSaveInstanceState() { + Bundle outState = new Bundle(); + outState.putInt(BEHAVIOR_STATE, openState); + return outState; + } + + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof Bundle) { + Bundle savedState = (Bundle) state; + openState = savedState.getInt(BEHAVIOR_STATE); + // Check if the drawer was open according to the previous state - call isDrawerOpen() + child.getViewTreeObserver() + .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override public void onGlobalLayout() { + // call openDrawer() here + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + child.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + //noinspection deprecation + child.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + } + }); + } + } } 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..e6bff3d 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 @@ -17,6 +17,7 @@ import android.content.Context; import android.content.res.TypedArray; +import android.os.Parcelable; import android.support.annotation.Keep; import android.support.design.widget.CoordinatorLayout; import android.support.v4.util.SimpleArrayMap; @@ -80,4 +81,13 @@ public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, Motio @Override public boolean onTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) { return delegate(parent, child).onTouchEvent(ev); } + + @Override public Parcelable onSaveInstanceState(CoordinatorLayout parent, View child) { + return delegate(parent, child).onSaveInstanceState(); + } + + @Override + public void onRestoreInstanceState(CoordinatorLayout parent, View child, Parcelable state) { + delegate(parent,child).onRestoreInstanceState(state); + } } From 6ddc656c7a2e5028486929accab7ef1f2ffcd4d9 Mon Sep 17 00:00:00 2001 From: ruben Date: Tue, 7 Jun 2016 10:51:37 +0100 Subject: [PATCH 4/5] Add view ids to enable save/restore state --- sample/src/main/res/layout/drawer_behavior.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sample/src/main/res/layout/drawer_behavior.xml b/sample/src/main/res/layout/drawer_behavior.xml index c8cb49c..c80747e 100644 --- a/sample/src/main/res/layout/drawer_behavior.xml +++ b/sample/src/main/res/layout/drawer_behavior.xml @@ -2,11 +2,13 @@ Date: Tue, 7 Jun 2016 15:55:15 +0100 Subject: [PATCH 5/5] Add TODOs and update gradle plugin --- build.gradle | 2 +- .../com/jakewharton/behavior/drawer/BehaviorDelegate.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 6588cd8..bcaf9fa 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,6 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' } } 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 25d44bb..0ddda81 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 @@ -470,11 +470,12 @@ public void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { Bundle savedState = (Bundle) state; openState = savedState.getInt(BEHAVIOR_STATE); - // Check if the drawer was open according to the previous state - call isDrawerOpen() + // Check if the drawer was open according to the previous state - + // TODO call isDrawerOpen() and reset openState after child.getViewTreeObserver() .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { - // call openDrawer() here + //TODO call openDrawer() here if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { child.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else {