Skip to content
This repository was archived by the owner on Jan 22, 2021. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.android.tools.build:gradle:3.0.1'
}
}

allprojects {
repositories {
mavenCentral()
google()
}
}

ext {
androidBuildTool = '27.0.1'
androidTargetSdk = 27
androidSupportLib = '27.0.1'
androidMinSdk = 14
}
9 changes: 5 additions & 4 deletions drawer-behavior/build.gradle
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
apply plugin: 'com.android.library'

android {
compileSdkVersion 23
buildToolsVersion '23.0.3'
compileSdkVersion androidTargetSdk
buildToolsVersion androidBuildTool

defaultConfig {
minSdkVersion 7
minSdkVersion androidMinSdk
}

}

dependencies {
compile 'com.android.support:design:23.4.0'
implementation 'com.android.support:design:' + androidSupportLib
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,33 @@

import android.os.Build;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;

import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static com.jakewharton.behavior.drawer.DrawerBehavior.DrawerListener;
import static com.jakewharton.behavior.drawer.DrawerBehavior.State;

final class BehaviorDelegate extends ViewDragHelper.Callback {
private static final boolean DEBUG = true;
private static final int PEEK_DELAY = 160; // ms
private static final int MIN_FLING_VELOCITY = 400; // dips per second
private static final int FLAG_IS_OPENED = 0x1;
private static final int FLAG_IS_OPENING = 0x2;
private static final int FLAG_IS_CLOSING = 0x4;
static final int FLAG_IS_OPENED = 0x1;
@SuppressWarnings("WeakerAccess")
static final int FLAG_IS_OPENING = 0x2;
@SuppressWarnings("unused")
static final int FLAG_IS_CLOSING = 0x4;
static final int FLAG_IS_CLOSED = 0x0;
private static final int DEFAULT_SCRIM_COLOR = 0x99000000;

private final CoordinatorLayout parent;
Expand All @@ -45,14 +53,19 @@ final class BehaviorDelegate extends ViewDragHelper.Callback {
private final ContentScrimDrawer scrimDrawer;
private final ViewDragHelper dragger;

private DrawerListener listener;

private float initialMotionX;
private float initialMotionY;
private boolean childrenCanceledTouch;
private int openState;
private boolean isPeeking;
private float onScreen;

@State
private int drawerState;

@SuppressWarnings("FieldCanBeLocal")
private int scrimColor = DEFAULT_SCRIM_COLOR;

private final Runnable peekRunnable = new Runnable() {
Expand Down Expand Up @@ -134,10 +147,22 @@ private void cancelChildViewTouch() {
}
}

boolean isDrawerOpen() {
return openState == FLAG_IS_OPENED || openState == FLAG_IS_OPENING;
}

void setDrawerState(int openState) {
this.openState = openState;
}

void setDrawListener(DrawerListener listener) {
this.listener = listener;
}

boolean onInterceptTouchEvent(MotionEvent ev) {
boolean interceptForDrag = dragger.shouldInterceptTouchEvent(ev);
boolean interceptForTap = false;
switch (MotionEventCompat.getActionMasked(ev)) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
float x = ev.getX();
float y = ev.getY();
Expand Down Expand Up @@ -175,7 +200,7 @@ boolean onInterceptTouchEvent(MotionEvent ev) {
boolean onTouchEvent(MotionEvent ev) {
dragger.processTouchEvent(ev);

switch (MotionEventCompat.getActionMasked(ev)) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
initialMotionX = ev.getX();
initialMotionY = ev.getY();
Expand All @@ -194,7 +219,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 ((openState & FLAG_IS_OPENED) == FLAG_IS_OPENED) {
peekingOnly = false;
}
}
Expand All @@ -218,6 +243,8 @@ private void closeDrawers(boolean peekingOnly) {
return;
}

removeCallbacks();

boolean needsSettle;
if (isLeft) {
needsSettle = dragger.smoothSlideViewTo(child, -child.getWidth(), child.getTop());
Expand All @@ -226,18 +253,16 @@ private void closeDrawers(boolean peekingOnly) {
}
isPeeking = false;

removeCallbacks();

if (needsSettle) {
ViewCompat.postOnAnimation(parent, draggerSettle);
}
}

@Override public void onViewCaptured(View capturedChild, int activePointerId) {
@Override public void onViewCaptured(@NonNull View capturedChild, int activePointerId) {
isPeeking = false;
}

@Override public void onViewReleased(View releasedChild, float xvel, float yvel) {
@Override public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {
// Offset is how open the drawer is, therefore left/right values
// are reversed from one another.
float offset = onScreen;
Expand All @@ -259,9 +284,17 @@ private void closeDrawers(boolean peekingOnly) {
updateDrawerState(state, dragger.getCapturedView());
}

private void updateDrawerState(int activeState, View activeDrawer) {
final int state = dragger.getViewDragState();

private void updateDrawerState(int activeState,@Nullable View activeDrawer) {
@State final int state = dragger.getViewDragState();
if (DEBUG) {
if (activeDrawer != null)
Log.d("updateDrawerState","activeState: "
+ activeState + "activeDrawer position: "
+ activeDrawer.getLeft() + ":" + activeDrawer.getRight());
else
Log.d("updateDrawerState", "activeState: "
+ "activeDrawer is null");
}
if (activeDrawer != null && activeState == ViewDragHelper.STATE_IDLE) {
if (onScreen == 0) {
dispatchOnDrawerClosed(activeDrawer);
Expand All @@ -273,6 +306,8 @@ private void updateDrawerState(int activeState, View activeDrawer) {
if (state != drawerState) {
drawerState = state;
}
if (listener != null)
listener.onDrawerStateChanged(activeDrawer,drawerState);
}

private void dispatchOnDrawerClosed(View drawerView) {
Expand All @@ -290,6 +325,8 @@ private void dispatchOnDrawerClosed(View drawerView) {
rootView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
}
if (listener != null)
listener.onDrawerClosed(drawerView);
}
}

Expand All @@ -305,6 +342,8 @@ private void dispatchOnDrawerOpened(View drawerView) {
}

drawerView.requestFocus();
if (listener != null)
listener.onDrawerOpened(drawerView);
}
}

Expand All @@ -326,9 +365,9 @@ private void updateChildrenImportantForAccessibility(View drawerView, boolean is
}

@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
public void onViewPositionChanged(@NonNull View changedView, int left, int top, int dx, int dy) {
int childWidth = changedView.getWidth();

Log.d("onViewPositionChanged",left +":" +top+ ":"+dx+":"+dy);
// This reverses the positioning shown in onLayout.
float offset;
if (isLeft) {
Expand All @@ -346,26 +385,28 @@ public void onViewPositionChanged(View changedView, int left, int top, int dx, i
int color = imag << 24 | (scrimColor & 0xffffff);
scrimDrawer.setColor(color);

setDrawerViewOffset(offset);
setDrawerViewOffset(changedView,offset);
boolean gone = offset == 0;
changedView.setVisibility(gone ? INVISIBLE : VISIBLE);
scrimDrawer.setVisible(!gone);
parent.invalidate();
}

private void setDrawerViewOffset(float slideOffset) {
private void setDrawerViewOffset(View drawerView,float slideOffset) {
if (slideOffset == onScreen) {
return;
}

onScreen = slideOffset;
if (listener != null)
listener.onDrawerSlide(drawerView,slideOffset);
}

@Override public void onEdgeTouched(int edgeFlags, int pointerId) {
parent.postDelayed(peekRunnable, PEEK_DELAY);
}

@Override public boolean tryCaptureView(View child, int pointerId) {
@Override public boolean tryCaptureView(@NonNull View child, int pointerId) {
return isDrawerView(child);
}

Expand All @@ -376,11 +417,11 @@ private void setDrawerViewOffset(float slideOffset) {
}
}

@Override public int getViewHorizontalDragRange(View child) {
@Override public int getViewHorizontalDragRange(@NonNull View child) {
return isDrawerView(child) ? child.getWidth() : 0;
}

@Override public int clampViewPositionHorizontal(View child, int left, int dx) {
@Override public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
if (isLeft) {
return Math.max(-child.getWidth(), Math.min(left, 0));
} else {
Expand All @@ -389,7 +430,8 @@ private void setDrawerViewOffset(float slideOffset) {
}
}

@Override public int clampViewPositionVertical(View child, int top, int dy) {
@Override public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
Log.d("ViewPositionVertical", "" + child.getTop());
return child.getTop();
}

Expand Down Expand Up @@ -447,7 +489,7 @@ boolean onLayoutChild() {
}

if (changeOffset) {
setDrawerViewOffset(newOffset);
setDrawerViewOffset(child,newOffset);
}

int newVisibility = onScreen > 0 ? VISIBLE : INVISIBLE;
Expand Down
Loading