Home | History | Annotate | Download | only in radio
      1 /*
      2  * Copyright (C) 2016 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 
     17 package com.android.car.radio;
     18 
     19 import android.support.car.ui.PagedListView;
     20 import android.support.v7.widget.RecyclerView;
     21 import android.util.Log;
     22 import android.view.LayoutInflater;
     23 import android.view.View;
     24 import android.view.ViewGroup;
     25 import com.android.car.radio.service.RadioStation;
     26 
     27 import java.util.List;
     28 
     29 /**
     30  * Adapter that will display a list of radio stations that represent the user's presets.
     31  */
     32 public class PresetsAdapter extends RecyclerView.Adapter<PresetsViewHolder>
     33         implements PresetsViewHolder.OnPresetClickListener, PagedListView.ItemCap {
     34     private static final String TAG = "Em.PresetsAdapter";
     35 
     36     // Only one type of view in this adapter.
     37     private static final int PRESETS_VIEW_TYPE = 0;
     38 
     39     private RadioStation mActiveRadioStation;
     40 
     41     private List<RadioStation> mPresets;
     42     private OnPresetItemClickListener mPresetClickListener;
     43 
     44     /**
     45      * Interface for a listener that will be notified when an item in the presets list has been
     46      * clicked.
     47      */
     48     public interface OnPresetItemClickListener {
     49         /**
     50          * Method called when an item in the preset list has been clicked.
     51          *
     52          * @param radioStation The {@link RadioStation} corresponding to the clicked preset.
     53          */
     54         void onPresetItemClicked(RadioStation radioStation);
     55     }
     56 
     57     /**
     58      * Set a listener to be notified whenever a preset card is pressed.
     59      */
     60     public void setOnPresetItemClickListener(OnPresetItemClickListener listener) {
     61         mPresetClickListener = listener;
     62     }
     63 
     64     /**
     65      * Sets the given list as the list of presets to display.
     66      */
     67     public void setPresets(List<RadioStation> presets) {
     68         mPresets = presets;
     69         notifyDataSetChanged();
     70     }
     71 
     72     /**
     73      * Indicates which radio station is the active one inside the list of presets that are set on
     74      * this adapter. This will cause that station to be highlighted in the list. If the station
     75      * passed to this method does not match any of the presets, then none will be highlighted.
     76      */
     77     public void setActiveRadioStation(RadioStation station) {
     78         mActiveRadioStation = station;
     79         notifyDataSetChanged();
     80     }
     81 
     82     @Override
     83     public PresetsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     84         View view = LayoutInflater.from(parent.getContext())
     85                 .inflate(R.layout.radio_preset_stream_card, parent, false);
     86 
     87         return new PresetsViewHolder(view, this /* listener */);
     88     }
     89 
     90     @Override
     91     public void onBindViewHolder(PresetsViewHolder holder, int position) {
     92         RadioStation station = mPresets.get(position);
     93         boolean isActiveStation = station.equals(mActiveRadioStation);
     94 
     95         holder.bindPreset(station, isActiveStation, getItemCount());
     96     }
     97 
     98     @Override
     99     public void onPresetClicked(int position) {
    100         if (Log.isLoggable(TAG, Log.DEBUG)) {
    101             Log.d(TAG, String.format("onPresetClicked(); item count: %d; position: %d",
    102                     getItemCount(), position));
    103         }
    104 
    105         if (mPresetClickListener != null && getItemCount() > position) {
    106             mPresetClickListener.onPresetItemClicked(mPresets.get(position));
    107         }
    108     }
    109 
    110     @Override
    111     public int getItemViewType(int position) {
    112         return PRESETS_VIEW_TYPE;
    113     }
    114 
    115     @Override
    116     public int getItemCount() {
    117         return mPresets == null ? 0 : mPresets.size();
    118     }
    119 
    120     @Override
    121     public void setMaxItems(int max) {
    122         // No-op. A PagedListView needs the ItemCap interface to be implemented. However, the
    123         // list of presets should not be limited.
    124     }
    125 }
    126