Merge branch 'pie-gsi' of https://android.googlesource.com/platform//frameworks/support into HEAD

Change-Id: I3f540dd8572cca5f83169a7306f71a9f421584bf
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..9f4aed2
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=review.blissroms.com
+port=29418
+project=platform_frameworks_support.git
+defaultbranch=p9.0
diff --git a/content/src/main/java/androidx/contentpager/content/Query.java b/content/src/main/java/androidx/contentpager/content/Query.java
index d1cfbde..d9d35e0 100644
--- a/content/src/main/java/androidx/contentpager/content/Query.java
+++ b/content/src/main/java/androidx/contentpager/content/Query.java
@@ -37,7 +37,7 @@
  */
 public final class Query {
 
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
     private static final String TAG = "Query";
 
     private final Uri mUri;
diff --git a/preference/res/drawable-v21/ic_arrow_down_24dp.xml b/preference/res/drawable-v21/ic_arrow_down_24dp.xml
index 1815b8c..7a709eb 100644
--- a/preference/res/drawable-v21/ic_arrow_down_24dp.xml
+++ b/preference/res/drawable-v21/ic_arrow_down_24dp.xml
@@ -18,9 +18,8 @@
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorAccent">
+        android:viewportHeight="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="@*android:color/accent_device_default_dark"
         android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
 </vector>
diff --git a/preference/res/drawable/ic_arrow_down_24dp.xml b/preference/res/drawable/ic_arrow_down_24dp.xml
index c52399e..84628df 100644
--- a/preference/res/drawable/ic_arrow_down_24dp.xml
+++ b/preference/res/drawable/ic_arrow_down_24dp.xml
@@ -20,6 +20,6 @@
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="@*android:color/accent_device_default_dark"
         android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
 </vector>
diff --git a/preference/res/values/colors.xml b/preference/res/values/colors.xml
index cb4f235..86b5f69 100644
--- a/preference/res/values/colors.xml
+++ b/preference/res/values/colors.xml
@@ -17,5 +17,5 @@
 
 <resources>
     <!-- Fallback color for versions of the system where ?android:attr/colorAccent is not available -->
-    <color name="preference_fallback_accent_color">#ff80cbc4</color>
+    <color name="preference_fallback_accent_color">@*android:color/accent_device_default_light</color>
 </resources>
diff --git a/preference/src/main/java/androidx/preference/Preference.java b/preference/src/main/java/androidx/preference/Preference.java
index 50833b5..1bec258 100644
--- a/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/src/main/java/androidx/preference/Preference.java
@@ -1510,6 +1510,14 @@
         mDefaultValue = defaultValue;
     }
 
+     /**
+     * Returns whether the preference can be found in persistent storage
+     * @hide
+     */
+    protected boolean isPersisted() {
+        return getSharedPreferences().contains(mKey);
+    }
+
     private void dispatchSetInitialValue() {
         if (getPreferenceDataStore() != null) {
             onSetInitialValue(true, mDefaultValue);
@@ -1518,7 +1526,7 @@
 
         // By now, we know if we are persistent.
         final boolean shouldPersist = shouldPersist();
-        if (!shouldPersist || !getSharedPreferences().contains(mKey)) {
+        if (!shouldPersist || !isPersisted()) {
             if (mDefaultValue != null) {
                 onSetInitialValue(false, mDefaultValue);
             }
diff --git a/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 6cde56d..3fa60db 100644
--- a/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -164,6 +164,10 @@
 
     static final boolean DEBUG = false;
 
+    private static final boolean OPTS_INPUT = true;
+
+    private static final double MOVE_TOUCH_SLOP = 0.3;
+
     static final boolean VERBOSE_TRACING = false;
 
     private static final int[]  NESTED_SCROLLING_ATTRS =
@@ -234,6 +238,10 @@
      */
     public static final int TOUCH_SLOP_DEFAULT = 0;
 
+    private boolean mIsFirstTouchMoveEvent = false;
+    private int mMoveAcceleration;
+    private int mNumTouchMoveEvent = 0;
+
     /**
      * Constant for use with {@link #setScrollingTouchSlop(int)}. Indicates
      * that the RecyclerView should use the standard touch slop for scrolling
@@ -619,6 +627,9 @@
                 ViewConfigurationCompat.getScaledHorizontalScrollFactor(vc, context);
         mScaledVerticalScrollFactor =
                 ViewConfigurationCompat.getScaledVerticalScrollFactor(vc, context);
+        if (OPTS_INPUT) {
+            mMoveAcceleration = (int)(mTouchSlop * MOVE_TOUCH_SLOP);
+        }
         mMinFlingVelocity = vc.getScaledMinimumFlingVelocity();
         mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
         setWillNotDraw(getOverScrollMode() == View.OVER_SCROLL_NEVER);
@@ -1066,10 +1077,16 @@
                 // fall-through
             case TOUCH_SLOP_DEFAULT:
                 mTouchSlop = vc.getScaledTouchSlop();
+                if (OPTS_INPUT) {
+                    mMoveAcceleration = (int)(mTouchSlop * MOVE_TOUCH_SLOP);
+                }
                 break;
 
             case TOUCH_SLOP_PAGING:
                 mTouchSlop = vc.getScaledPagingTouchSlop();
+                if (OPTS_INPUT) {
+                    mMoveAcceleration = (int)(mTouchSlop * MOVE_TOUCH_SLOP);
+                }
                 break;
         }
     }
@@ -2951,6 +2968,9 @@
 
         switch (action) {
             case MotionEvent.ACTION_DOWN:
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 if (mIgnoreMotionEventTillDown) {
                     mIgnoreMotionEventTillDown = false;
                 }
@@ -2977,12 +2997,18 @@
                 break;
 
             case MotionEvent.ACTION_POINTER_DOWN:
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mScrollPointerId = e.getPointerId(actionIndex);
                 mInitialTouchX = mLastTouchX = (int) (e.getX(actionIndex) + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY(actionIndex) + 0.5f);
                 break;
 
             case MotionEvent.ACTION_MOVE: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent++;
+                }
                 final int index = e.findPointerIndex(mScrollPointerId);
                 if (index < 0) {
                     Log.e(TAG, "Error processing scroll; pointer index for id "
@@ -2996,11 +3022,31 @@
                     final int dx = x - mInitialTouchX;
                     final int dy = y - mInitialTouchY;
                     boolean startScroll = false;
-                    if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) {
+
+                    boolean isFarEnoughX = false;
+                    boolean isFarEnoughY = false;
+                    int realTouchSlop;
+                    if (OPTS_INPUT) {
+                        if (mNumTouchMoveEvent == 1) {
+                            isFarEnoughX = Math.abs(dx) > mMoveAcceleration;
+                            isFarEnoughY = Math.abs(dy) > mMoveAcceleration;
+                            realTouchSlop = mMoveAcceleration;
+                        } else {
+                            isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                            isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                            realTouchSlop = mTouchSlop;
+                        }
+                    } else {
+                        isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                        isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                        realTouchSlop = mTouchSlop;
+                    }
+
+                    if (canScrollHorizontally && isFarEnoughX) {
                         mLastTouchX = x;
                         startScroll = true;
                     }
-                    if (canScrollVertically && Math.abs(dy) > mTouchSlop) {
+                    if (canScrollVertically && isFarEnoughY) {
                         mLastTouchY = y;
                         startScroll = true;
                     }
@@ -3011,15 +3057,24 @@
             } break;
 
             case MotionEvent.ACTION_POINTER_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 onPointerUp(e);
             } break;
 
             case MotionEvent.ACTION_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mVelocityTracker.clear();
                 stopNestedScroll(TYPE_TOUCH);
             } break;
 
             case MotionEvent.ACTION_CANCEL: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 cancelTouch();
             }
         }
@@ -3069,6 +3124,9 @@
 
         switch (action) {
             case MotionEvent.ACTION_DOWN: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mScrollPointerId = e.getPointerId(0);
                 mInitialTouchX = mLastTouchX = (int) (e.getX() + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY() + 0.5f);
@@ -3084,12 +3142,18 @@
             } break;
 
             case MotionEvent.ACTION_POINTER_DOWN: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mScrollPointerId = e.getPointerId(actionIndex);
                 mInitialTouchX = mLastTouchX = (int) (e.getX(actionIndex) + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY(actionIndex) + 0.5f);
             } break;
 
             case MotionEvent.ACTION_MOVE: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent++;
+                }
                 final int index = e.findPointerIndex(mScrollPointerId);
                 if (index < 0) {
                     Log.e(TAG, "Error processing scroll; pointer index for id "
@@ -3111,21 +3175,40 @@
                     mNestedOffsets[1] += mScrollOffset[1];
                 }
 
+                boolean isFarEnoughX = false;
+                boolean isFarEnoughY = false;
+                int realTouchSlop;
+                if (OPTS_INPUT) {
+                    if (mNumTouchMoveEvent == 1) {
+                        isFarEnoughX = Math.abs(dx) > mMoveAcceleration;
+                        isFarEnoughY = Math.abs(dy) > mMoveAcceleration;
+                        realTouchSlop = mMoveAcceleration;
+                    } else {
+                        isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                        isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                        realTouchSlop = mTouchSlop;
+                    }
+                } else {
+                    isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                    isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                    realTouchSlop = mTouchSlop;
+                }
+
                 if (mScrollState != SCROLL_STATE_DRAGGING) {
                     boolean startScroll = false;
-                    if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) {
+                    if (canScrollHorizontally && isFarEnoughX) {
                         if (dx > 0) {
-                            dx -= mTouchSlop;
+                            dx -= realTouchSlop;
                         } else {
-                            dx += mTouchSlop;
+                            dx += realTouchSlop;
                         }
                         startScroll = true;
                     }
-                    if (canScrollVertically && Math.abs(dy) > mTouchSlop) {
+                    if (canScrollVertically && isFarEnoughY) {
                         if (dy > 0) {
-                            dy -= mTouchSlop;
+                            dy -= realTouchSlop;
                         } else {
-                            dy += mTouchSlop;
+                            dy += realTouchSlop;
                         }
                         startScroll = true;
                     }
@@ -3151,10 +3234,16 @@
             } break;
 
             case MotionEvent.ACTION_POINTER_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 onPointerUp(e);
             } break;
 
             case MotionEvent.ACTION_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mVelocityTracker.addMovement(vtev);
                 eventAddedToVelocityTracker = true;
                 mVelocityTracker.computeCurrentVelocity(1000, mMaxFlingVelocity);
@@ -3169,6 +3258,9 @@
             } break;
 
             case MotionEvent.ACTION_CANCEL: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 cancelTouch();
             } break;
         }