/* * Copyright (C) 2014 Fastboot Mobile, LLC. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; * if not, see <http://www.gnu.org/licenses>. */ package com.fastbootmobile.encore.app.adapters; import android.content.res.Resources; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import com.getbase.floatingactionbutton.FloatingActionButton; import com.fastbootmobile.encore.app.R; import com.fastbootmobile.encore.utils.Utils; import com.fastbootmobile.encore.app.ui.AlbumArtImageView; import com.fastbootmobile.encore.app.ui.PlayPauseDrawable; import com.fastbootmobile.encore.framework.ListenLogger; import com.fastbootmobile.encore.framework.PlaybackProxy; import com.fastbootmobile.encore.model.Artist; import com.fastbootmobile.encore.model.Song; import com.fastbootmobile.encore.providers.ProviderAggregator; import com.fastbootmobile.encore.service.PlaybackService; import java.util.List; /** * Adapter for playback queue */ public class PlaybackQueueAdapter extends BaseAdapter { private ListenLogger mListenLogger; private List<Song> mQueue; private ViewHolder mCurrentTrackTag; private View.OnClickListener mPlayFabClickListener; private View.OnClickListener mNextClickListener; private View.OnClickListener mPreviousClickListener; private View.OnClickListener mRepeatClickListener; private View.OnClickListener mShuffleClickListener; private View.OnClickListener mLikeClickListener; private View.OnClickListener mDislikeClickListener; private View.OnClickListener mOverflowClickListener; private View.OnClickListener mAlbumArtCLickListener; private SeekBar.OnSeekBarChangeListener mSeekListener; public PlaybackQueueAdapter(View.OnClickListener playFabClickListener, View.OnClickListener nextClickListener, View.OnClickListener previousClickListener, SeekBar.OnSeekBarChangeListener seekListener, View.OnClickListener repeatClickListener, View.OnClickListener likeClickListener, View.OnClickListener dislikeClickListener, View.OnClickListener albumArtClickListener, View.OnClickListener shuffleClickListener) { mPlayFabClickListener = playFabClickListener; mNextClickListener = nextClickListener; mPreviousClickListener = previousClickListener; mSeekListener = seekListener; mRepeatClickListener = repeatClickListener; mLikeClickListener = likeClickListener; mDislikeClickListener = dislikeClickListener; mAlbumArtCLickListener = albumArtClickListener; mShuffleClickListener = shuffleClickListener; mOverflowClickListener = new View.OnClickListener() { @Override public void onClick(View v) { ViewHolder tag = (ViewHolder) v.getTag(); Utils.showCurrentSongOverflow(tag.vRoot.getContext(), v, tag.song, true); } }; } public ViewHolder getCurrentTrackTag() { return mCurrentTrackTag; } public void setPlaybackQueue(List<Song> queue) { synchronized (this) { mQueue = queue; notifyDataSetChanged(); } } @Override public int getCount() { synchronized (this) { if (mQueue != null) { return mQueue.size(); } else { return 0; } } } @Override public Song getItem(int position) { synchronized (this) { final ProviderAggregator aggregator = ProviderAggregator.getDefault(); Song copy = mQueue.get(position); if (copy != null) { return aggregator.retrieveSong(copy.getRef(), copy.getProvider()); } else { return null; } } } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (mListenLogger == null) { mListenLogger = new ListenLogger(parent.getContext()); } final ProviderAggregator aggregator = ProviderAggregator.getDefault(); final Resources res = parent.getResources(); final Song item; synchronized (this) { item = getItem(position); } final boolean isCurrent = position == PlaybackProxy.getCurrentTrackIndex(); ViewHolder tag; if (convertView == null || ((ViewHolder) convertView.getTag()).isCurrent != isCurrent) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); if (isCurrent) { convertView = inflater.inflate(R.layout.item_playbackqueue_current, parent, false); } else { convertView = inflater.inflate(R.layout.item_playbar, parent, false); } tag = new ViewHolder(); tag.vRoot = (ViewGroup) convertView; tag.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle); tag.tvArtist = (TextView) convertView.findViewById(R.id.tvArtist); tag.ivAlbumArt = (AlbumArtImageView) convertView.findViewById(R.id.ivAlbumArt); tag.ivAlbumArt.setOnClickListener(mAlbumArtCLickListener); tag.ivAlbumArt.setTag(tag); tag.vRoot.setClickable(false); if (isCurrent) { // Lookup views tag.sbSeek = (SeekBar) convertView.findViewById(R.id.sbSeek); tag.btnNext = (ImageView) convertView.findViewById(R.id.btnForward); tag.btnPrevious = (ImageView) convertView.findViewById(R.id.btnPrevious); tag.btnRepeat = (ImageView) convertView.findViewById(R.id.btnRepeat); tag.btnShuffle = (ImageView) convertView.findViewById(R.id.btnShuffle); tag.btnThumbs = (ImageView) convertView.findViewById(R.id.btnThumbs); tag.btnThumbsDown = (ImageView) convertView.findViewById(R.id.btnThumbsDown); tag.btnOverflow = (ImageView) convertView.findViewById(R.id.btnOverflow); tag.fabPlay = (FloatingActionButton) convertView.findViewById(R.id.fabPlay); tag.tvCurrentTime = (TextView) convertView.findViewById(R.id.tvCurrentTime); tag.tvTotalTime = (TextView) convertView.findViewById(R.id.tvTotalTime); // Setup some initial states if (PlaybackProxy.isRepeatMode()) { tag.btnRepeat.setImageResource(R.drawable.ic_replay); } else { tag.btnRepeat.setImageResource(R.drawable.ic_replay_gray); } if (PlaybackProxy.isShuffleMode()) { tag.btnShuffle.setImageResource(R.drawable.ic_shuffle); } else { tag.btnShuffle.setImageResource(R.drawable.ic_shuffle_gray); } tag.btnOverflow.setTag(tag); tag.btnThumbs.setTag(tag); tag.btnThumbsDown.setTag(tag); // Play FAB drawable tag.fabPlay.setFixupInset(false); tag.fabPlayDrawable = new PlayPauseDrawable(res, 1.2f, 1.1f); tag.fabPlayDrawable.setYOffset(6); tag.fabPlayDrawable.setColor(res.getColor(R.color.white)); updatePlaystate(tag.fabPlayDrawable); tag.fabPlay.setImageDrawable(tag.fabPlayDrawable); // Click listeners tag.fabPlay.setOnClickListener(mPlayFabClickListener); tag.btnPrevious.setOnClickListener(mPreviousClickListener); tag.btnNext.setOnClickListener(mNextClickListener); tag.sbSeek.setOnSeekBarChangeListener(mSeekListener); tag.btnRepeat.setOnClickListener(mRepeatClickListener); tag.btnThumbs.setOnClickListener(mLikeClickListener); tag.btnThumbsDown.setOnClickListener(mDislikeClickListener); tag.btnOverflow.setOnClickListener(mOverflowClickListener); tag.btnShuffle.setOnClickListener(mShuffleClickListener); } convertView.setTag(tag); } else { tag = (ViewHolder) convertView.getTag(); } tag.isCurrent = isCurrent; tag.song = item; if (isCurrent) { mCurrentTrackTag = tag; } if (tag.btnThumbs != null && mListenLogger.isLiked(item.getRef())) { tag.btnThumbs.setImageResource(R.drawable.ic_thumbs_up); } else if (tag.btnThumbs != null) { tag.btnThumbs.setImageResource(R.drawable.ic_thumbs_up_gray); } if (tag.btnThumbsDown != null && mListenLogger.isDisliked(item.getRef())) { tag.btnThumbsDown.setImageResource(R.drawable.ic_thumb_down); } else if (tag.btnThumbsDown != null) { tag.btnThumbsDown.setImageResource(R.drawable.ic_thumb_down_gray); } if (item != null && item.isLoaded()) { tag.tvTitle.setText(item.getTitle()); Artist artist = aggregator.retrieveArtist(item.getArtist(), item.getProvider()); if (artist != null && artist.getName() != null && !artist.getName().isEmpty()) { tag.tvArtist.setText(artist.getName()); } else if (artist != null) { tag.tvArtist.setText("..."); } else { tag.tvArtist.setText(null); } tag.ivAlbumArt.loadArtForSong(item); } else { tag.tvTitle.setText(R.string.loading); tag.tvArtist.setText(null); tag.ivAlbumArt.setDefaultArt(); } if (item == null || !item.isAvailable()) { tag.vRoot.setAlpha(0.5f); } else { tag.vRoot.setAlpha(1.0f); } return convertView; } private void updatePlaystate(PlayPauseDrawable drawable) { boolean buffering; int shape; switch (PlaybackProxy.getState()) { case PlaybackService.STATE_PLAYING: shape = PlayPauseDrawable.SHAPE_PAUSE; buffering = false; break; case PlaybackService.STATE_BUFFERING: shape = PlayPauseDrawable.SHAPE_PAUSE; buffering = true; break; case PlaybackService.STATE_PAUSING: shape = PlayPauseDrawable.SHAPE_PLAY; buffering = true; break; case PlaybackService.STATE_PAUSED: case PlaybackService.STATE_STOPPED: default: shape = PlayPauseDrawable.SHAPE_PLAY; buffering = false; break; } drawable.setShape(shape); drawable.setBuffering(buffering); } public static class ViewHolder { public boolean isCurrent; public ViewGroup vRoot; public TextView tvTitle; public TextView tvArtist; public TextView tvCurrentTime; public TextView tvTotalTime; public AlbumArtImageView ivAlbumArt; public SeekBar sbSeek; public FloatingActionButton fabPlay; public PlayPauseDrawable fabPlayDrawable; public ImageView btnNext; public ImageView btnPrevious; public ImageView btnRepeat; public ImageView btnThumbs; public ImageView btnOverflow; public ImageView btnShuffle; public ImageView btnThumbsDown; public Song song; } }