// Signature format: 3.0
package androidx.customview.view {

  public abstract class AbsSavedState implements android.os.Parcelable {
    ctor protected AbsSavedState(android.os.Parcelable);
    ctor protected AbsSavedState(android.os.Parcel);
    ctor protected AbsSavedState(android.os.Parcel, ClassLoader?);
    method public int describeContents();
    method public final android.os.Parcelable? getSuperState();
    method public void writeToParcel(android.os.Parcel!, int);
    field public static final android.os.Parcelable.Creator<androidx.customview.view.AbsSavedState!>! CREATOR;
    field public static final androidx.customview.view.AbsSavedState! EMPTY_STATE;
  }

}

package androidx.customview.widget {

  public abstract class ExploreByTouchHelper extends androidx.core.view.AccessibilityDelegateCompat {
    ctor public ExploreByTouchHelper(android.view.View);
    method public final boolean clearKeyboardFocusForVirtualView(int);
    method public final boolean dispatchHoverEvent(android.view.MotionEvent);
    method public final boolean dispatchKeyEvent(android.view.KeyEvent);
    method public final int getAccessibilityFocusedVirtualViewId();
    method @Deprecated public int getFocusedVirtualView();
    method public final int getKeyboardFocusedVirtualViewId();
    method protected abstract int getVirtualViewAt(float, float);
    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer!>!);
    method public final void invalidateRoot();
    method public final void invalidateVirtualView(int);
    method public final void invalidateVirtualView(int, int);
    method public final void onFocusChanged(boolean, int, android.graphics.Rect?);
    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle?);
    method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
    method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
    method protected void onPopulateNodeForHost(androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
    method protected abstract void onPopulateNodeForVirtualView(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
    method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
    method public final boolean requestKeyboardFocusForVirtualView(int);
    method public final boolean sendEventForVirtualView(int, int);
    field public static final int HOST_ID = -1; // 0xffffffff
    field public static final int INVALID_ID = -2147483648; // 0x80000000
  }

  public class ViewDragHelper {
    method public void abort();
    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
    method public void cancel();
    method public void captureChildView(android.view.View, int);
    method public boolean checkTouchSlop(int);
    method public boolean checkTouchSlop(int, int);
    method public boolean continueSettling(boolean);
    method public static androidx.customview.widget.ViewDragHelper! create(android.view.ViewGroup, androidx.customview.widget.ViewDragHelper.Callback);
    method public static androidx.customview.widget.ViewDragHelper! create(android.view.ViewGroup, float, androidx.customview.widget.ViewDragHelper.Callback);
    method public android.view.View? findTopChildUnder(int, int);
    method public void flingCapturedView(int, int, int, int);
    method public int getActivePointerId();
    method public android.view.View? getCapturedView();
    method @Px public int getDefaultEdgeSize();
    method @Px public int getEdgeSize();
    method public float getMinVelocity();
    method @Px public int getTouchSlop();
    method public int getViewDragState();
    method public boolean isCapturedViewUnder(int, int);
    method public boolean isEdgeTouched(int);
    method public boolean isEdgeTouched(int, int);
    method public boolean isPointerDown(int);
    method public boolean isViewUnder(android.view.View?, int, int);
    method public void processTouchEvent(android.view.MotionEvent);
    method public void setEdgeSize(@Px @IntRange(from=0) int);
    method public void setEdgeTrackingEnabled(int);
    method public void setMinVelocity(float);
    method public boolean settleCapturedViewAt(int, int);
    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
    method public boolean smoothSlideViewTo(android.view.View, int, int);
    field public static final int DIRECTION_ALL = 3; // 0x3
    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
    field public static final int DIRECTION_VERTICAL = 2; // 0x2
    field public static final int EDGE_ALL = 15; // 0xf
    field public static final int EDGE_BOTTOM = 8; // 0x8
    field public static final int EDGE_LEFT = 1; // 0x1
    field public static final int EDGE_RIGHT = 2; // 0x2
    field public static final int EDGE_TOP = 4; // 0x4
    field public static final int INVALID_POINTER = -1; // 0xffffffff
    field public static final int STATE_DRAGGING = 1; // 0x1
    field public static final int STATE_IDLE = 0; // 0x0
    field public static final int STATE_SETTLING = 2; // 0x2
  }

  public abstract static class ViewDragHelper.Callback {
    ctor public ViewDragHelper.Callback();
    method public int clampViewPositionHorizontal(android.view.View, int, int);
    method public int clampViewPositionVertical(android.view.View, int, int);
    method public int getOrderedChildIndex(int);
    method public int getViewHorizontalDragRange(android.view.View);
    method public int getViewVerticalDragRange(android.view.View);
    method public void onEdgeDragStarted(int, int);
    method public boolean onEdgeLock(int);
    method public void onEdgeTouched(int, int);
    method public void onViewCaptured(android.view.View, int);
    method public void onViewDragStateChanged(int);
    method public void onViewPositionChanged(android.view.View, int, int, @Px int, @Px int);
    method public void onViewReleased(android.view.View, float, float);
    method public abstract boolean tryCaptureView(android.view.View, int);
  }

}

