1aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding/*
2aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * Copyright 2018 The Android Open Source Project
3aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding *
4aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * Licensed under the Apache License, Version 2.0 (the "License");
5aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * you may not use this file except in compliance with the License.
6aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * You may obtain a copy of the License at
7aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding *
8aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding *      http://www.apache.org/licenses/LICENSE-2.0
9aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding *
10aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * Unless required by applicable law or agreed to in writing, software
11aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * distributed under the License is distributed on an "AS IS" BASIS,
12aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * See the License for the specific language governing permissions and
14aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * limitations under the License.
15aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding */
16aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
17aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingpackage com.example.androidx.car;
18aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
19aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.app.Activity;
20aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.os.Bundle;
21aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.util.Log;
22aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.view.LayoutInflater;
23aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.view.View;
24aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.view.ViewGroup;
25aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport android.widget.TextView;
26aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
27aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport androidx.car.widget.AlphaJumpBucketer;
28aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport androidx.car.widget.IAlphaJumpAdapter;
29aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport androidx.car.widget.PagedListView;
30aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingimport androidx.recyclerview.widget.RecyclerView;
31aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
32f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikasimport java.util.Arrays;
33f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikasimport java.util.Collection;
34f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikas
35aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding/**
36aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * An activity with a long list of cheeses, initially in a random order but you can use alpha jump
37aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding * to quickly jump to your favourite cheese.
38aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding */
39aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Hardingpublic class AlphaJumpActivity extends Activity {
40aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    private static final String TAG = "AlphaJumpActivity";
41aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
42aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    private static final String[] CHEESES = {
43aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Pourly", "Macconais", "Bonchester", "Olivet Cendre", "Fruit Cream Cheese",
44aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Metton (Cancoillotte)", "Lyonnais", "Crema Agria", "Nantais",
45aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Brusselae Kaas (Fromage de Bruxelles)", "Rouleau De Beaulieu", "Flor de Guia",
46aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Poivre d'Ane", "Tomme des Chouans", "Whitestone Farmhouse", "Queso de Murcia",
47aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Saint-Marcellin", "Pave d'Affinois", "Quatre-Vents", "Galette du Paludier", "Pyramide",
48aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Capricorn Goat", "Feta", "Queso del Montsec", "Telemea", "Cooleney",
49aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Buchette d'Anjou", "Banon", "Bosworth", "Bergader", "Mothais a la Feuille",
50aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Mascarpone Torta", "Richelieu", "Guerbigny", "Taupiniere", "Anneau du Vic-Bilh",
51aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Tupi", "Queso Fresco", "Timboon Brie", "Neufchatel", "Blue Castello",
52aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Brebis du Puyfaucon", "Gratte-Paille", "Palet de Babligny", "Caciotta", "Rigotte",
53aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Caciocavallo", "Bleu Des Causses", "Civray", "Bath Cheese", "Farmer", "Cachaille",
54aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Ricotta", "Caravane", "Selles sur Cher", "Chaource", "Cottage Cheese (Australian)",
55aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Pelardon des Corbieres", "Cold Pack", "Queso Fresco (Adobera)", "Bleu de Gex",
56aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Provel", "Torta del Casar", "Golden Cross", "Mascarpone", "Fougerus",
57aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Dessertnyj Belyj", "Fresh Ricotta", "Gris de Lille", "Breakfast Cheese", "Venaco",
58aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Pant ys Gawn", "Mascarpone (Australian)", "Sharpam", "Humboldt Fog",
59aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Evansdale Farmhouse Brie", "Kernhem", "Mozzarella Rolls", "Dolcelatte",
60aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Briquette de Brebis", "Niolo", "Selva", "Dunbarra", "King Island Cape Wickham Brie",
61aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Carre de l'Est", "Broccio", "Castelo Branco", "Finn", "Panela", "Basket Cheese",
62aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Woodside Cabecou", "Truffe", "Flower Marie", "Mozzarella Fresh, in water",
63aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Jubilee Blue", "Coeur de Camembert au Calvados", "Caprice des Dieux", "Caboc",
64aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Crottin du Chavignol", "Cabecou", "Cottage Cheese", "Cashel Blue", "Patefine Fort",
65aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Mahoe Aged Gouda", "Cornish Pepper", "Greuilh", "Ricotta (Australian)", "Grand Vatel",
66aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Prince-Jean", "Coulommiers", "Scamorza", "Romans Part Dieu", "Quark", "Frinault",
67aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Chabichou du Poitou", "Le Lacandou", "Maredsous", "Fin-de-Siecle", "Button (Innes)",
68aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Washed Rind Cheese (Australian)", "Daralagjazsky", "Margotin", "Pithtviers au Foin",
69aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Cathelain", "Yarra Valley Pyramid", "Sirene", "Emlett", "Explorateur", "Bandal",
70aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Lingot Saint Bousquet d'Orb", "Gorgonzola", "Bresse Bleu", "Beer Cheese",
71aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            "Brinza (Burduf Brinza)", "Bakers", "Little Rydings", "Bryndza"
72aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    };
73aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
74aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    @Override
75aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    protected void onCreate(Bundle savedInstanceState) {
76aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        super.onCreate(savedInstanceState);
77aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        setContentView(R.layout.activity_paged_list_view);
78aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
79aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        PagedListView pagedListView = findViewById(R.id.paged_list_view);
80aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        pagedListView.setAdapter(new CheeseAdapter());
81aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    }
82aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
83aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    /**
84aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding     * Adapter that populates a number of items for demo purposes.
85aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding     */
86aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    public static class CheeseAdapter extends RecyclerView.Adapter<CheeseAdapter.ViewHolder>
87aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            implements IAlphaJumpAdapter {
88aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        private String[] mCheeses;
89aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        private boolean mIsSorted;
90aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
91aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        CheeseAdapter() {
92aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            // Start out not being sorted.
93aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            mCheeses = CHEESES;
94aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            mIsSorted = false;
95aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
96aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
97aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        @Override
98aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public CheeseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
99aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
100aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            View view = inflater.inflate(R.layout.alpha_jump_list_item, parent, false);
101aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            return new CheeseAdapter.ViewHolder(view);
102aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
103aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
104aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        @Override
105aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public void onBindViewHolder(CheeseAdapter.ViewHolder holder, int position) {
106aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            holder.mTextView.setText(mCheeses[position]);
107aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
108aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
109aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        @Override
110aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public int getItemCount() {
111aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            return mCheeses.length;
112aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
113aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
114aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        @Override
115aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public Collection<Bucket> getAlphaJumpBuckets() {
116aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            if (!mIsSorted) {
117aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                Log.i(TAG, "Sorting...");
118aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                // We'll sort the first time we need to populate the buckets.
119aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                mCheeses = mCheeses.clone();
120aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                Arrays.sort(mCheeses);
121aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                mIsSorted = true;
122aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                notifyDataSetChanged();
123aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            }
124aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
125aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            AlphaJumpBucketer bucketer = new AlphaJumpBucketer();
126aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            return bucketer.createBuckets(mCheeses);
127aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
128aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
129aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        @Override
130aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public void onAlphaJumpEnter() {
131aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            Log.i(TAG, "onAlphaJumpEnter");
132aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
133aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
134aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        @Override
135aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public void onAlphaJumpLeave(Bucket bucket) {
136aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            Log.i(TAG, "onAlphaJumpLeave: " + bucket.getLabel());
137aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
138aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
139aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        /**
140aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding         * ViewHolder for CheeseAdapter.
141aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding         */
142aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        public static class ViewHolder extends RecyclerView.ViewHolder {
143aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            private final TextView mTextView;
144aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding
145aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            public ViewHolder(View itemView) {
146aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                super(itemView);
147aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding                mTextView = itemView.findViewById(R.id.text);
148aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding            }
149aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding        }
150aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding    }
151aa1fd35cceebd3e32536cb11c30d07e28aabc9d1Dean Harding}
152