package org.wikipedia.views; import android.annotation.SuppressLint; import android.content.Context; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.FixedDrawerLayout; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import org.wikipedia.util.log.L; import java.lang.reflect.Field; /** * A thin wrapper around {@link FixedDrawerLayout} with additional functionality: * <ul> * <li>Expose enable state.</li> * <li>Expose drag margin width state.</li> * </ul> */ public class WikiDrawerLayout extends FixedDrawerLayout { public WikiDrawerLayout(Context context) { this(context, null); } public WikiDrawerLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public WikiDrawerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public boolean getSlidingEnabled(int gravity) { return getDrawerLockMode(gravity) == DrawerLayout.LOCK_MODE_UNLOCKED; } public void setSlidingEnabled(boolean enable) { if (enable) { this.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); } else { this.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } } /** * Set the drag margin width. * @param width Width in pixels. */ public void setDragEdgeWidth(final int width) { this.post(new Runnable() { @Override public void run() { try { // Use a little bit of reflection to set a private member in DrawerLayout that extends the // "drag edge" from which the drawer can be pulled by the user. // A bit hacky, but what are you gonna do... View pullOutView = getChildAt(1); int absGravity = GravityCompat.getAbsoluteGravity(((LayoutParams)pullOutView.getLayoutParams()).gravity, ViewCompat.getLayoutDirection(pullOutView)); // Determine whether to modify the left or right dragger, based on RTL/LTR orientation @SuppressLint("RtlHardcoded") Field mDragger = (absGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.LEFT ? WikiDrawerLayout.this.getClass().getSuperclass().getSuperclass().getDeclaredField("mLeftDragger") : WikiDrawerLayout.this.getClass().getSuperclass().getSuperclass().getDeclaredField("mRightDragger"); mDragger.setAccessible(true); ViewDragHelper dragHelper = (ViewDragHelper) mDragger.get(WikiDrawerLayout.this); Field edgeWidth = dragHelper.getClass().getDeclaredField("mEdgeSize"); edgeWidth.setAccessible(true); edgeWidth.setInt(dragHelper, width); } catch (Exception e) { L.e("Setting the draggable zone for the drawer failed!", e); } } }); } }