blob: 022c000c15405ef932ed06cb958fbeebecced707 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.car.radio;
import android.content.Context;
import android.graphics.drawable.GradientDrawable;
import android.hardware.radio.ProgramSelector;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.android.car.broadcastradio.support.Program;
import com.android.car.broadcastradio.support.platform.ProgramSelectorExt;
import java.util.Objects;
/**
* A {@link RecyclerView.ViewHolder} that can bind a {@link Program} to the layout
* {@code R.layout.radio_favorite_item}.
*/
public class ProgramViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final OnPresetClickListener mPresetClickListener;
private final OnPresetFavoriteListener mPresetFavoriteListener;
private final Context mContext;
private final View mPresetsCard;
private GradientDrawable mPresetItemChannelBg;
private final TextView mPresetItemChannel;
private final TextView mPresetItemMetadata;
private ImageButton mPresetButton;
/**
* Interface for a listener when the View held by this ViewHolder has been clicked.
*/
public interface OnPresetClickListener {
/**
* Method to be called when the View in this ViewHolder has been clicked.
*
* @param position The position of the View within the RecyclerView this ViewHolder is
* populating.
*/
void onPresetClicked(int position);
}
/**
* Interface for a listener that will be notified when a favorite in the presets list has been
* toggled.
*/
public interface OnPresetFavoriteListener {
/**
* Method called when an item's favorite status has been toggled
*/
void onPresetFavoriteChanged(int position, boolean saveAsFavorite);
}
/**
* @param presetsView A view that contains the layout {@code R.layout.radio_favorite_item}.
*/
public ProgramViewHolder(@NonNull View presetsView, @NonNull OnPresetClickListener listener,
@NonNull OnPresetFavoriteListener favoriteListener) {
super(presetsView);
mContext = presetsView.getContext();
mPresetsCard = presetsView.findViewById(R.id.browse_card);
mPresetsCard.setOnClickListener(this);
mPresetClickListener = Objects.requireNonNull(listener);
mPresetFavoriteListener = Objects.requireNonNull(favoriteListener);
mPresetItemChannel = presetsView.findViewById(R.id.browse_station_channel);
mPresetItemMetadata = presetsView.findViewById(R.id.browse_item_metadata);
mPresetButton = presetsView.findViewById(R.id.browse_button);
mPresetItemChannelBg = (GradientDrawable)
presetsView.findViewById(R.id.browse_station_background).getBackground();
}
@Override
public void onClick(View view) {
mPresetClickListener.onPresetClicked(getAdapterPosition());
}
/**
* Binds the given {@link Program} to this View within this ViewHolder.
*/
public void bindPreset(Program program, boolean isActiveStation, int itemCount,
boolean isFavorite) {
// If the preset is null, clear any existing text.
if (program == null) {
mPresetItemChannel.setText(null);
mPresetItemMetadata.setText(null);
return;
}
ProgramSelector sel = program.getSelector();
mPresetItemChannel.setText(ProgramSelectorExt.getDisplayName(
sel, ProgramSelectorExt.NAME_NO_MODULATION));
mPresetItemChannelBg.setColor(mContext.getResources().getColor(isActiveStation
? R.color.accent_color
: R.color.radio_card_color, null));
mPresetItemChannel.setCompoundDrawablesRelativeWithIntrinsicBounds(isActiveStation
? R.drawable.ic_equalizer
: 0, 0, 0, 0);
String programName = program.getName();
if (programName.isEmpty()) {
// If there is no metadata text, then use text to indicate the favorite number to the
// user so that list does not appear empty.
mPresetItemMetadata.setText(mContext.getString(
R.string.radio_default_favorite_metadata_text, getAdapterPosition() + 1));
} else {
mPresetItemMetadata.setText(programName);
}
setFavoriteButtonFilled(isFavorite);
mPresetButton.setOnClickListener(v -> {
boolean favoriteToggleOn =
((Integer) mPresetButton.getTag() == R.drawable.ic_star_empty);
setFavoriteButtonFilled(favoriteToggleOn);
mPresetFavoriteListener.onPresetFavoriteChanged(getAdapterPosition(), favoriteToggleOn);
});
}
private void setFavoriteButtonFilled(boolean favoriteToggleOn) {
mPresetButton.setImageResource(favoriteToggleOn
? R.drawable.ic_star_filled
: R.drawable.ic_star_empty);
mPresetButton.setTag(favoriteToggleOn
? R.drawable.ic_star_filled
: R.drawable.ic_star_empty);
mPresetButton.setColorFilter(mContext.getColor(favoriteToggleOn
? R.color.accent_color
: R.color.control_button_color));
}
}