blob: 9c1179af3b86bfcdbae405f01ca7f74003f77239 [file] [log] [blame]
/*
* Copyright (C) 2016 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.support.v4.media.session.PlaybackStateCompat;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewStub;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.car.radio.audio.IPlaybackStateListener;
import com.android.car.radio.utils.LocalInterface;
/**
* Controller that controls the appearance state of various UI elements in the radio.
*/
public class RadioDisplayController implements IPlaybackStateListener, LocalInterface {
private final Context mContext;
private TextView mChannelBand;
private TextView mChannelNumber;
private TextView mCurrentSongTitleAndArtist;
private TextView mCurrentStation;
private ImageView mBackwardSeekButton;
private ImageView mForwardSeekButton;
private PlayPauseButton mPlayButton;
private PlayPauseButton mPresetPlayButton;
private ImageView mPresetsListButton;
private ImageView mAddPresetsButton;
public RadioDisplayController(Context context) {
mContext = context;
}
public void initialize(View container) {
// Note that the band and channel number can exist without the stub
// single_channel_view_stub. Refer to setSingleChannelDisplay() for more information.
mChannelBand = container.findViewById(R.id.radio_station_band);
mChannelNumber = container.findViewById(R.id.radio_station_channel);
mCurrentSongTitleAndArtist = container.findViewById(R.id.radio_station_song_artist);
mCurrentStation = container.findViewById(R.id.radio_station_name);
mBackwardSeekButton = container.findViewById(R.id.radio_back_button);
mForwardSeekButton = container.findViewById(R.id.radio_forward_button);
mPlayButton = container.findViewById(R.id.radio_play_button);
mPresetPlayButton = container.findViewById(R.id.preset_radio_play_button);
mPresetsListButton = container.findViewById(R.id.radio_presets_list);
mAddPresetsButton = container.findViewById(R.id.radio_add_presets_button);
}
/**
* Sets this radio controller to display with a single box representing the current radio
* station.
*/
public void setSingleChannelDisplay(View container) {
ViewStub stub = container.findViewById(R.id.single_channel_view_stub);
if (stub != null) {
container = stub.inflate();
}
// Update references to the band and channel number.
mChannelBand = container.findViewById(R.id.radio_station_band);
mChannelNumber = container.findViewById(R.id.radio_station_channel);
}
/**
* Set whether or not the buttons controlled by this controller are enabled. If {@code false}
* is passed to this method, then no {@link View.OnClickListener}s will be
* triggered when the buttons are pressed. In addition, the look of the button wil be updated
* to reflect their disabled state.
*/
public void setEnabled(boolean enabled) {
// Color the buttons so that they are grey in appearance if they are disabled.
int tint = enabled
? mContext.getColor(R.color.car_radio_control_button)
: mContext.getColor(R.color.car_radio_control_button_disabled);
if (mPlayButton != null) {
// No need to tint the play button because its drawable already contains a disabled
// state.
mPlayButton.setEnabled(enabled);
}
if (mPresetPlayButton != null) {
// No need to tint the play button because its drawable already contains a disabled
// state.
mPresetPlayButton.setEnabled(enabled);
}
if (mForwardSeekButton != null) {
mForwardSeekButton.setEnabled(enabled);
mForwardSeekButton.setColorFilter(tint);
}
if (mBackwardSeekButton != null) {
mBackwardSeekButton.setEnabled(enabled);
mBackwardSeekButton.setColorFilter(tint);
}
if (mPresetsListButton != null) {
mPresetsListButton.setEnabled(enabled);
mPresetsListButton.setColorFilter(tint);
}
if (mAddPresetsButton != null) {
mAddPresetsButton.setEnabled(enabled);
mAddPresetsButton.setColorFilter(tint);
}
}
/**
* Sets the {@link android.view.View.OnClickListener} for the backwards seek button.
*/
public void setBackwardSeekButtonListener(View.OnClickListener listener) {
if (mBackwardSeekButton != null) {
mBackwardSeekButton.setOnClickListener(listener);
}
}
/**
* Sets the {@link android.view.View.OnClickListener} for the forward seek button.
*/
public void setForwardSeekButtonListener(View.OnClickListener listener) {
if (mForwardSeekButton != null) {
mForwardSeekButton.setOnClickListener(listener);
}
}
/**
* Sets the {@link android.view.View.OnClickListener} for the play button. Clicking on this
* button should toggle the radio from muted to un-muted.
*/
public void setPlayButtonListener(View.OnClickListener listener) {
if (mPlayButton != null) {
mPlayButton.setOnClickListener(listener);
}
if (mPresetPlayButton != null) {
mPresetPlayButton.setOnClickListener(listener);
}
}
/**
* Sets the {@link android.view.View.OnClickListener} for the button that will add the current
* radio station to a list of stored presets.
*/
public void setAddPresetButtonListener(View.OnClickListener listener) {
if (mAddPresetsButton != null) {
mAddPresetsButton.setOnClickListener(listener);
}
}
/**
* Sets the current radio channel (e.g. 88.5).
*/
public void setChannelNumber(String channel) {
if (mChannelNumber != null) {
mChannelNumber.setText(channel);
}
}
/**
* Sets the radio channel band (e.g. FM).
*/
public void setChannelBand(String channelBand) {
if (mChannelBand != null) {
mChannelBand.setText(channelBand);
mChannelBand.setVisibility(
!TextUtils.isEmpty(channelBand) ? View.VISIBLE : View.GONE);
}
}
/**
* Sets the title of the currently playing song.
*/
public void setCurrentSongTitleAndArtist(String songTitle, String songArtist) {
if (mCurrentSongTitleAndArtist != null) {
boolean isTitleEmpty = TextUtils.isEmpty(songTitle);
boolean isArtistEmpty = TextUtils.isEmpty(songArtist);
String titleAndArtist = null;
if (!isTitleEmpty) {
titleAndArtist = songTitle.trim();
if (!isArtistEmpty) {
titleAndArtist += '\u2014' + songArtist.trim();
}
} else if (!isArtistEmpty) {
titleAndArtist = songArtist.trim();
}
mCurrentSongTitleAndArtist.setText(titleAndArtist);
mCurrentSongTitleAndArtist.setVisibility(
(isTitleEmpty && isArtistEmpty)? View.INVISIBLE : View.VISIBLE);
}
}
/**
* Sets the artist(s) of the currently playing song or current radio station information
* (e.g. KOIT).
*/
public void setCurrentStation(String stationName) {
if (mCurrentStation != null) {
boolean isEmpty = TextUtils.isEmpty(stationName);
mCurrentStation.setText(isEmpty ? null : stationName.trim());
mCurrentStation.setVisibility(isEmpty ? View.INVISIBLE : View.VISIBLE);
}
}
@Override
public void onPlaybackStateChanged(@PlaybackStateCompat.State int state) {
if (mPlayButton != null) {
mPlayButton.setPlayState(state);
mPlayButton.refreshDrawableState();
}
if (mPresetPlayButton != null) {
mPresetPlayButton.setPlayState(state);
mPresetPlayButton.refreshDrawableState();
}
}
/**
* Sets whether or not the current channel that is playing is a preset. If it is, then the
* icon in {@link #mPresetsListButton} will be updatd to reflect this state.
*/
public void setChannelIsPreset(boolean isPreset) {
if (mAddPresetsButton != null) {
mAddPresetsButton.setImageResource(isPreset
? R.drawable.ic_star_filled
: R.drawable.ic_star_empty);
}
}
}