1/* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.example.androidx.car; 18 19import android.app.Activity; 20import android.content.Context; 21import android.os.Bundle; 22import android.widget.SeekBar; 23import android.widget.Toast; 24 25import androidx.car.widget.ListItem; 26import androidx.car.widget.ListItemAdapter; 27import androidx.car.widget.ListItemProvider; 28import androidx.car.widget.PagedListView; 29import androidx.car.widget.SeekbarListItem; 30import androidx.car.widget.SubheaderListItem; 31 32import java.util.ArrayList; 33import java.util.List; 34 35/** 36 * Demo activity for {@link ListItem}. 37 */ 38public class SeekbarListItemActivity extends Activity { 39 40 PagedListView mPagedListView; 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 setContentView(R.layout.activity_paged_list_view); 46 47 mPagedListView = findViewById(R.id.paged_list_view); 48 49 ListItemAdapter adapter = new ListItemAdapter(this, 50 new SampleProvider(this), ListItemAdapter.BackgroundStyle.PANEL); 51 mPagedListView.setAdapter(adapter); 52 mPagedListView.setMaxPages(PagedListView.UNLIMITED_PAGES); 53 } 54 55 private static class SampleProvider extends ListItemProvider { 56 57 private Context mContext; 58 SeekBar.OnSeekBarChangeListener mListener = new SeekBar.OnSeekBarChangeListener() { 59 @Override 60 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 61 Toast.makeText(mContext, "" + progress, Toast.LENGTH_SHORT).show(); 62 } 63 64 @Override 65 public void onStartTrackingTouch(SeekBar seekBar) { 66 67 } 68 69 @Override 70 public void onStopTrackingTouch(SeekBar seekBar) { 71 72 } 73 }; 74 private List<ListItem> mItems; 75 76 private ListItemProvider.ListProvider mListProvider; 77 78 SampleProvider(Context context) { 79 mContext = context; 80 mItems = new ArrayList<>(); 81 82 String longText = mContext.getString(R.string.long_text); 83 84 SubheaderListItem subheaderItem; 85 SeekbarListItem item; 86 87 // Slider only. 88 subheaderItem = new SubheaderListItem(mContext, "Slider Only"); 89 mItems.add(subheaderItem); 90 91 item = initSeekbarListItem(); 92 item.setText(null); 93 mItems.add(item); 94 95 item = initSeekbarListItem(); 96 item.setText("one line text"); 97 mItems.add(item); 98 99 item = initSeekbarListItem(); 100 item.setText(longText); 101 mItems.add(item); 102 103 104 // Start icon. 105 subheaderItem = new SubheaderListItem(mContext, "With Primary Action"); 106 mItems.add(subheaderItem); 107 // Only slider. No text. 108 item = initSeekbarListItem(); 109 item.setText(null); 110 item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon); 111 mItems.add(item); 112 113 // One line text. 114 item = initSeekbarListItem(); 115 item.setText("one line text"); 116 item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon); 117 mItems.add(item); 118 119 // Long text. 120 item = initSeekbarListItem(); 121 item.setText(longText); 122 item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon); 123 mItems.add(item); 124 125 // Clickable PrimaryActionIcon. 126 item = initSeekbarListItem(); 127 item.setText("with clickable Primary icon"); 128 item.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon); 129 item.setPrimaryActionIconListener(v -> Toast.makeText(mContext, 130 "Primary icon clicked!", Toast.LENGTH_SHORT).show()); 131 mItems.add(item); 132 133 // End icon with divider. 134 subheaderItem = new SubheaderListItem(mContext, "With Supplemental Action"); 135 mItems.add(subheaderItem); 136 137 item = initSeekbarListItem(); 138 item.setText(null); 139 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 140 mItems.add(item); 141 142 item = initSeekbarListItem(); 143 item.setText("one line text"); 144 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 145 mItems.add(item); 146 147 item = initSeekbarListItem(); 148 item.setText(longText); 149 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 150 mItems.add(item); 151 152 item = initSeekbarListItem(); 153 item.setText("with clickable icon"); 154 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true); 155 item.setSupplementalIconListener(v -> Toast.makeText(mContext, 156 "Supplemental icon clicked!", Toast.LENGTH_SHORT).show()); 157 mItems.add(item); 158 159 // Empty end icon with divider. 160 subheaderItem = new SubheaderListItem(mContext, "With Empty Icon"); 161 mItems.add(subheaderItem); 162 163 item = initSeekbarListItem(); 164 item.setText(null); 165 item.setSupplementalEmptyIcon(true); 166 mItems.add(item); 167 168 item = initSeekbarListItem(); 169 item.setText("one line text"); 170 item.setSupplementalEmptyIcon(true); 171 mItems.add(item); 172 173 item = initSeekbarListItem(); 174 item.setText(longText); 175 item.setSupplementalEmptyIcon(true); 176 mItems.add(item); 177 178 // End icon without divider. 179 subheaderItem = new SubheaderListItem(mContext, "Without Supplemental Action Divider"); 180 mItems.add(subheaderItem); 181 182 item = initSeekbarListItem(); 183 item.setText(null); 184 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false); 185 mItems.add(item); 186 187 item = initSeekbarListItem(); 188 item.setText("one line text"); 189 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false); 190 mItems.add(item); 191 192 item = initSeekbarListItem(); 193 item.setText(longText); 194 item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false); 195 mItems.add(item); 196 197 // Empty end icon without divider. 198 subheaderItem = new SubheaderListItem(mContext, "With Empty Icon No Divider"); 199 mItems.add(subheaderItem); 200 201 item = initSeekbarListItem(); 202 item.setText(null); 203 item.setSupplementalEmptyIcon(false); 204 mItems.add(item); 205 206 item = initSeekbarListItem(); 207 item.setText("one line text"); 208 item.setSupplementalEmptyIcon(false); 209 mItems.add(item); 210 211 item = initSeekbarListItem(); 212 item.setText(longText); 213 item.setSupplementalEmptyIcon(false); 214 mItems.add(item); 215 216 // Secondary progress. 217 subheaderItem = new SubheaderListItem(mContext, "Secondary Progress"); 218 mItems.add(subheaderItem); 219 220 item = new SeekbarListItem(mContext); 221 item.setMax(100); 222 item.setProgress(0); 223 item.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 224 @Override 225 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 226 seekBar.setSecondaryProgress(progress + 10); 227 } 228 229 @Override 230 public void onStartTrackingTouch(SeekBar seekBar) { 231 } 232 233 @Override 234 public void onStopTrackingTouch(SeekBar seekBar) { 235 } 236 }); 237 mItems.add(item); 238 239 mListProvider = new ListItemProvider.ListProvider(mItems); 240 } 241 242 private SeekbarListItem initSeekbarListItem() { 243 SeekbarListItem item = new SeekbarListItem(mContext); 244 item.setMax(100); 245 item.setProgress(0); 246 item.setOnSeekBarChangeListener(mListener); 247 return item; 248 } 249 250 @Override 251 public ListItem get(int position) { 252 return mListProvider.get(position); 253 } 254 255 @Override 256 public int size() { 257 return mListProvider.size(); 258 } 259 } 260} 261