Merge "Create separate setter for AlphaJumpAdapter." into androidx-master-dev
diff --git a/car/core/api/1.0.0-alpha8.txt b/car/core/api/1.0.0-alpha8.txt
index fd5adc6..79cec7e 100644
--- a/car/core/api/1.0.0-alpha8.txt
+++ b/car/core/api/1.0.0-alpha8.txt
@@ -499,6 +499,7 @@
     method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
     method public void scrollToPosition(int);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public void setAlphaJumpAdapter(androidx.car.widget.AlphaJumpAdapter);
     method public void setAlphaJumpVisible(boolean);
     method public void setDividerColor(@ColorInt int);
     method public void setDividerVisibilityManager(androidx.car.widget.PagedListView.DividerVisibilityManager!);
@@ -573,7 +574,8 @@
     method public void setButtonTintColor(@ColorRes int);
     method public void setDownButtonIcon(android.graphics.drawable.Drawable!);
     method public void setDownEnabled(boolean);
-    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener!);
+    method public void setOnAlphaJumpListener(androidx.car.widget.PagedScrollBarView.OnAlphaJumpListener?);
+    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener?);
     method public void setParameters(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
     method public void setScrollbarThumbColor(@ColorRes int);
     method public void setScrollbarThumbEnabled(boolean);
@@ -581,8 +583,12 @@
     method public void setUpEnabled(boolean);
   }
 
-  public static interface PagedScrollBarView.PaginationListener {
+  public static interface PagedScrollBarView.OnAlphaJumpListener {
     method public void onAlphaJump();
+  }
+
+  public static interface PagedScrollBarView.PaginationListener {
+    method @Deprecated public default void onAlphaJump();
     method public void onPaginate(int);
     field public static final int PAGE_DOWN = 1; // 0x1
     field public static final int PAGE_UP = 0; // 0x0
diff --git a/car/core/api/current.txt b/car/core/api/current.txt
index fd5adc6..79cec7e 100644
--- a/car/core/api/current.txt
+++ b/car/core/api/current.txt
@@ -499,6 +499,7 @@
     method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
     method public void scrollToPosition(int);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public void setAlphaJumpAdapter(androidx.car.widget.AlphaJumpAdapter);
     method public void setAlphaJumpVisible(boolean);
     method public void setDividerColor(@ColorInt int);
     method public void setDividerVisibilityManager(androidx.car.widget.PagedListView.DividerVisibilityManager!);
@@ -573,7 +574,8 @@
     method public void setButtonTintColor(@ColorRes int);
     method public void setDownButtonIcon(android.graphics.drawable.Drawable!);
     method public void setDownEnabled(boolean);
-    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener!);
+    method public void setOnAlphaJumpListener(androidx.car.widget.PagedScrollBarView.OnAlphaJumpListener?);
+    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener?);
     method public void setParameters(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
     method public void setScrollbarThumbColor(@ColorRes int);
     method public void setScrollbarThumbEnabled(boolean);
@@ -581,8 +583,12 @@
     method public void setUpEnabled(boolean);
   }
 
-  public static interface PagedScrollBarView.PaginationListener {
+  public static interface PagedScrollBarView.OnAlphaJumpListener {
     method public void onAlphaJump();
+  }
+
+  public static interface PagedScrollBarView.PaginationListener {
+    method @Deprecated public default void onAlphaJump();
     method public void onPaginate(int);
     field public static final int PAGE_DOWN = 1; // 0x1
     field public static final int PAGE_UP = 0; // 0x0
diff --git a/car/core/api/restricted_1.0.0-alpha8.txt b/car/core/api/restricted_1.0.0-alpha8.txt
index b4ab402..480b3d0 100644
--- a/car/core/api/restricted_1.0.0-alpha8.txt
+++ b/car/core/api/restricted_1.0.0-alpha8.txt
@@ -524,6 +524,7 @@
     method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
     method public void scrollToPosition(int);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public void setAlphaJumpAdapter(androidx.car.widget.AlphaJumpAdapter);
     method public void setAlphaJumpVisible(boolean);
     method public void setDividerColor(@ColorInt int);
     method public void setDividerVisibilityManager(androidx.car.widget.PagedListView.DividerVisibilityManager!);
@@ -598,7 +599,8 @@
     method public void setButtonTintColor(@ColorRes int);
     method public void setDownButtonIcon(android.graphics.drawable.Drawable!);
     method public void setDownEnabled(boolean);
-    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener!);
+    method public void setOnAlphaJumpListener(androidx.car.widget.PagedScrollBarView.OnAlphaJumpListener?);
+    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener?);
     method public void setParameters(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
     method public void setScrollbarThumbColor(@ColorRes int);
     method public void setScrollbarThumbEnabled(boolean);
@@ -606,8 +608,12 @@
     method public void setUpEnabled(boolean);
   }
 
-  public static interface PagedScrollBarView.PaginationListener {
+  public static interface PagedScrollBarView.OnAlphaJumpListener {
     method public void onAlphaJump();
+  }
+
+  public static interface PagedScrollBarView.PaginationListener {
+    method @Deprecated public default void onAlphaJump();
     method public void onPaginate(int);
     field public static final int PAGE_DOWN = 1; // 0x1
     field public static final int PAGE_UP = 0; // 0x0
diff --git a/car/core/api/restricted_current.txt b/car/core/api/restricted_current.txt
index b4ab402..480b3d0 100644
--- a/car/core/api/restricted_current.txt
+++ b/car/core/api/restricted_current.txt
@@ -524,6 +524,7 @@
     method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
     method public void scrollToPosition(int);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+    method public void setAlphaJumpAdapter(androidx.car.widget.AlphaJumpAdapter);
     method public void setAlphaJumpVisible(boolean);
     method public void setDividerColor(@ColorInt int);
     method public void setDividerVisibilityManager(androidx.car.widget.PagedListView.DividerVisibilityManager!);
@@ -598,7 +599,8 @@
     method public void setButtonTintColor(@ColorRes int);
     method public void setDownButtonIcon(android.graphics.drawable.Drawable!);
     method public void setDownEnabled(boolean);
-    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener!);
+    method public void setOnAlphaJumpListener(androidx.car.widget.PagedScrollBarView.OnAlphaJumpListener?);
+    method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener?);
     method public void setParameters(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
     method public void setScrollbarThumbColor(@ColorRes int);
     method public void setScrollbarThumbEnabled(boolean);
@@ -606,8 +608,12 @@
     method public void setUpEnabled(boolean);
   }
 
-  public static interface PagedScrollBarView.PaginationListener {
+  public static interface PagedScrollBarView.OnAlphaJumpListener {
     method public void onAlphaJump();
+  }
+
+  public static interface PagedScrollBarView.PaginationListener {
+    method @Deprecated public default void onAlphaJump();
     method public void onPaginate(int);
     field public static final int PAGE_DOWN = 1; // 0x1
     field public static final int PAGE_UP = 0; // 0x0
diff --git a/car/core/src/androidTest/java/androidx/car/widget/AlphaJumpPagedListViewTest.java b/car/core/src/androidTest/java/androidx/car/widget/AlphaJumpPagedListViewTest.java
index 44a55eb..2119810 100644
--- a/car/core/src/androidTest/java/androidx/car/widget/AlphaJumpPagedListViewTest.java
+++ b/car/core/src/androidTest/java/androidx/car/widget/AlphaJumpPagedListViewTest.java
@@ -87,7 +87,9 @@
         try {
             mActivityRule.runOnUiThread(() -> {
                 mPagedListView.setMaxPages(PagedListView.ItemCap.UNLIMITED);
-                mPagedListView.setAdapter(new AlphaJumpTestAdapter());
+                AlphaJumpTestAdapter adapter = new AlphaJumpTestAdapter();
+                mPagedListView.setAdapter(adapter);
+                mPagedListView.setAlphaJumpAdapter(adapter);
             });
         } catch (Throwable throwable) {
             throwable.printStackTrace();
diff --git a/car/core/src/main/java/androidx/car/app/CarDialogUtil.java b/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
index f47e7f1..39f2244 100644
--- a/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
+++ b/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
@@ -99,10 +99,6 @@
                         Log.e(TAG, "Unknown pagination direction (" + direction + ")");
                 }
             }
-
-            @Override
-            public void onAlphaJump() {
-            }
         });
     }
 
diff --git a/car/core/src/main/java/androidx/car/widget/PagedListView.java b/car/core/src/main/java/androidx/car/widget/PagedListView.java
index ea89551..5b9d47c 100644
--- a/car/core/src/main/java/androidx/car/widget/PagedListView.java
+++ b/car/core/src/main/java/androidx/car/widget/PagedListView.java
@@ -118,6 +118,7 @@
 
     private int mRowsPerPage = -1;
     private RecyclerView.Adapter<? extends RecyclerView.ViewHolder> mAdapter;
+    private AlphaJumpAdapter mAlphaJumpAdapter;
 
     /** Maximum number of pages to show. */
     private int mMaxPages = UNLIMITED_PAGES;
@@ -356,11 +357,6 @@
                         Log.e(TAG, "Unknown pagination direction (" + direction + ")");
                 }
             }
-
-            @Override
-            public void onAlphaJump() {
-                setAlphaJumpVisible(true);
-            }
         });
 
         if (a.hasValue(R.styleable.PagedListView_scrollBarGravity)) {
@@ -781,7 +777,17 @@
         mRecyclerView.setAdapter(adapter);
 
         updateMaxItems();
-        updateAlphaJump();
+    }
+
+    /**
+     * Sets the alpha jump adapter for the list.
+     *
+     * @param adapter The alpha jump adapter to set for the list.
+     */
+    public void setAlphaJumpAdapter(@NonNull AlphaJumpAdapter adapter) {
+        mAlphaJumpAdapter = adapter;
+        mScrollBarView.setOnAlphaJumpListener(() -> setAlphaJumpVisible(true));
+        mScrollBarView.setShowAlphaJump(true);
     }
 
     /**
@@ -1388,11 +1394,6 @@
         dispatchThawSelfOnly(container);
     }
 
-    private void updateAlphaJump() {
-        boolean supportsAlphaJump = (mAdapter instanceof AlphaJumpAdapter);
-        mScrollBarView.setShowAlphaJump(supportsAlphaJump);
-    }
-
     /**
      * Returns {@code true} if the Alpha Jump Overlay is shown.
      */
diff --git a/car/core/src/main/java/androidx/car/widget/PagedScrollBarView.java b/car/core/src/main/java/androidx/car/widget/PagedScrollBarView.java
index 78cc96b..fa47350 100644
--- a/car/core/src/main/java/androidx/car/widget/PagedScrollBarView.java
+++ b/car/core/src/main/java/androidx/car/widget/PagedScrollBarView.java
@@ -34,6 +34,7 @@
 import androidx.annotation.ColorRes;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntRange;
+import androidx.annotation.Nullable;
 import androidx.car.R;
 import androidx.core.content.ContextCompat;
 
@@ -58,6 +59,22 @@
          * <p>AlphaJump buckets only support characters from the {@code en} language. Characters
          * from other languages not supported and bucketing behavior is undefined. AlphaJump overlay
          * is still displayed if all buckets are empty.
+         *
+         * @deprecated Use {@link OnAlphaJumpListener#onAlphaJump()} instead.
+         */
+        @Deprecated
+        default void onAlphaJump() {}
+    }
+
+    public interface OnAlphaJumpListener {
+        /**
+         * Called when the 'alpha jump' button is clicked and the linked view should switch into
+         * alpha jump mode, where we display a list of buttons to allow the user to quickly scroll
+         * to a certain point in the list, bypassing a lot of manual scrolling.
+         *
+         * <p>AlphaJump buckets only support characters from the {@code en} language. Characters
+         * from other languages not supported and bucketing behavior is undefined. AlphaJump overlay
+         * is still displayed if all buckets are empty.
          */
         void onAlphaJump();
     }
@@ -166,12 +183,21 @@
      *
      * @param listener The listener to set.
      */
-    public void setPaginationListener(PaginationListener listener) {
+    public void setPaginationListener(@Nullable PaginationListener listener) {
         mUpButtonClickListener.setPaginationListener(listener);
         mDownButtonClickListener.setPaginationListener(listener);
         mAlphaJumpButtonClickListener.setPaginationListener(listener);
     }
 
+    /**
+     * Sets the listener that will be notified when alpha jump button has been pressed.
+     *
+     * @param listener The listener to set.
+     */
+    public void setOnAlphaJumpListener(@Nullable OnAlphaJumpListener listener) {
+        mAlphaJumpButtonClickListener.setOnAlphaJumpListener(listener);
+    }
+
     /** Returns {@code true} if the "up" button is pressed */
     public boolean isUpPressed() {
         return mUpButton.isPressed();
@@ -554,17 +580,26 @@
     }
 
     private static class AlphaJumpButtonClickListener implements View.OnClickListener {
+        private OnAlphaJumpListener mOnAlphaJumpListener;
         private PaginationListener mPaginationListener;
 
         AlphaJumpButtonClickListener() {
         }
 
+        public void setOnAlphaJumpListener(OnAlphaJumpListener listener) {
+            mOnAlphaJumpListener = listener;
+        }
+
         public void setPaginationListener(PaginationListener listener) {
             mPaginationListener = listener;
         }
 
         @Override
         public void onClick(View v) {
+            if (mOnAlphaJumpListener != null) {
+                mOnAlphaJumpListener.onAlphaJump();
+            }
+
             if (mPaginationListener != null) {
                 mPaginationListener.onAlphaJump();
             }
diff --git a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/AlphaJumpActivity.java b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/AlphaJumpActivity.java
index 8ad42a5..3917c9f 100644
--- a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/AlphaJumpActivity.java
+++ b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/AlphaJumpActivity.java
@@ -83,7 +83,9 @@
         toolbar.setNavigationIconOnClickListener(v -> onNavigateUp());
 
         PagedListView pagedListView = findViewById(R.id.paged_list_view);
-        pagedListView.setAdapter(new CheeseAdapter());
+        CheeseAdapter adapter = new CheeseAdapter();
+        pagedListView.setAdapter(adapter);
+        pagedListView.setAlphaJumpAdapter(adapter);
     }
 
     /**