226 lines
7.7 KiB
Java
226 lines
7.7 KiB
Java
/*
|
|
This file is part of Subsonic.
|
|
|
|
Subsonic 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.
|
|
|
|
Subsonic 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 Subsonic. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
Copyright 2009 (C) Sindre Mehus
|
|
*/
|
|
package net.nullsum.audinaut.view;
|
|
|
|
import android.content.Context;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.widget.ImageButton;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import net.nullsum.audinaut.R;
|
|
import net.nullsum.audinaut.domain.MusicDirectory;
|
|
import net.nullsum.audinaut.service.DownloadFile;
|
|
import net.nullsum.audinaut.service.DownloadService;
|
|
import net.nullsum.audinaut.util.DrawableTint;
|
|
import net.nullsum.audinaut.util.Util;
|
|
|
|
import java.io.File;
|
|
|
|
/**
|
|
* Used to display songs in a {@code ListView}.
|
|
*
|
|
* @author Sindre Mehus
|
|
*/
|
|
public class SongView extends UpdateView2<MusicDirectory.Entry, Boolean> {
|
|
|
|
private final TextView trackTextView;
|
|
private final TextView titleTextView;
|
|
private final TextView artistTextView;
|
|
private final TextView durationTextView;
|
|
private final TextView statusTextView;
|
|
private final ImageView statusImageView;
|
|
private final ImageView playedButton;
|
|
private final View bottomRowView;
|
|
private TextView playingTextView;
|
|
private DownloadService downloadService;
|
|
private long revision = -1;
|
|
private DownloadFile downloadFile;
|
|
private boolean dontChangeDownloadFile = false;
|
|
|
|
private boolean playing = false;
|
|
private boolean rightImage = false;
|
|
private int moreImage = 0;
|
|
private boolean isWorkDone = false;
|
|
private boolean isSaved = false;
|
|
private File partialFile;
|
|
private boolean partialFileExists = false;
|
|
private boolean loaded = false;
|
|
private boolean isPlayedShown = false;
|
|
private boolean showAlbum = false;
|
|
|
|
public SongView(Context context) {
|
|
super(context, true);
|
|
LayoutInflater.from(context).inflate(R.layout.song_list_item, this, true);
|
|
|
|
trackTextView = findViewById(R.id.song_track);
|
|
titleTextView = findViewById(R.id.song_title);
|
|
artistTextView = findViewById(R.id.song_artist);
|
|
durationTextView = findViewById(R.id.song_duration);
|
|
statusTextView = findViewById(R.id.song_status);
|
|
statusImageView = findViewById(R.id.song_status_icon);
|
|
playedButton = (ImageButton) findViewById(R.id.song_played);
|
|
moreButton = findViewById(R.id.item_more);
|
|
bottomRowView = findViewById(R.id.song_bottom);
|
|
}
|
|
|
|
protected void setObjectImpl(MusicDirectory.Entry song, Boolean checkable) {
|
|
this.checkable = checkable;
|
|
|
|
StringBuilder artist = new StringBuilder(40);
|
|
|
|
if (showAlbum) {
|
|
artist.append(song.getAlbum());
|
|
} else {
|
|
artist.append(song.getArtist());
|
|
}
|
|
|
|
durationTextView.setText(Util.formatDuration(song.getDuration()));
|
|
bottomRowView.setVisibility(View.VISIBLE);
|
|
|
|
String title = song.getTitle();
|
|
Integer track = song.getTrack();
|
|
TextView newPlayingTextView;
|
|
if (track != null && Util.getDisplayTrack(context)) {
|
|
trackTextView.setText(String.format("%02d", track));
|
|
trackTextView.setVisibility(View.VISIBLE);
|
|
newPlayingTextView = trackTextView;
|
|
} else {
|
|
trackTextView.setVisibility(View.GONE);
|
|
newPlayingTextView = titleTextView;
|
|
}
|
|
|
|
if (newPlayingTextView != playingTextView || playingTextView == null) {
|
|
if (playing) {
|
|
playingTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
|
playing = false;
|
|
}
|
|
|
|
playingTextView = newPlayingTextView;
|
|
}
|
|
|
|
titleTextView.setText(title);
|
|
artistTextView.setText(artist);
|
|
|
|
this.setBackgroundColor(0x00000000);
|
|
|
|
revision = -1;
|
|
loaded = false;
|
|
dontChangeDownloadFile = false;
|
|
}
|
|
|
|
public DownloadFile getDownloadFile() {
|
|
return downloadFile;
|
|
}
|
|
|
|
public void setDownloadFile(DownloadFile downloadFile) {
|
|
this.downloadFile = downloadFile;
|
|
dontChangeDownloadFile = true;
|
|
}
|
|
|
|
@Override
|
|
protected void updateBackground() {
|
|
if (downloadService == null) {
|
|
downloadService = DownloadService.getInstance();
|
|
if (downloadService == null) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
long newRevision = downloadService.getDownloadListUpdateRevision();
|
|
if ((revision != newRevision && !dontChangeDownloadFile) || downloadFile == null) {
|
|
downloadFile = downloadService.forSong(item);
|
|
revision = newRevision;
|
|
}
|
|
|
|
isWorkDone = downloadFile.isWorkDone();
|
|
isSaved = downloadFile.isSaved();
|
|
partialFile = downloadFile.getPartialFile();
|
|
partialFileExists = partialFile.exists();
|
|
|
|
// Check if needs to load metadata: check against all fields that we know are null in offline mode
|
|
if (item.getBitRate() == null && item.getDuration() == null && item.getDiscNumber() == null && isWorkDone) {
|
|
item.loadMetadata(downloadFile.getCompleteFile());
|
|
loaded = true;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void update() {
|
|
if (loaded) {
|
|
setObjectImpl(item, item2);
|
|
}
|
|
if (downloadService == null || downloadFile == null) {
|
|
return;
|
|
}
|
|
|
|
if (isWorkDone) {
|
|
int moreImage = isSaved ? R.drawable.download_pinned : R.drawable.download_cached;
|
|
if (moreImage != this.moreImage) {
|
|
moreButton.setImageResource(moreImage);
|
|
this.moreImage = moreImage;
|
|
}
|
|
} else if (this.moreImage != R.drawable.download_none) {
|
|
moreButton.setImageResource(DrawableTint.getDrawableRes(context, R.attr.download_none));
|
|
this.moreImage = R.drawable.download_none;
|
|
}
|
|
|
|
if (downloadFile.isDownloading() && !downloadFile.isDownloadCancelled() && partialFileExists) {
|
|
double percentage = (partialFile.length() * 100.0) / downloadFile.getEstimatedSize();
|
|
percentage = Math.min(percentage, 100);
|
|
statusTextView.setText((int) percentage + " %");
|
|
if (!rightImage) {
|
|
statusImageView.setVisibility(View.VISIBLE);
|
|
rightImage = true;
|
|
}
|
|
} else if (rightImage) {
|
|
statusTextView.setText(null);
|
|
statusImageView.setVisibility(View.GONE);
|
|
rightImage = false;
|
|
}
|
|
|
|
boolean playing = Util.equals(downloadService.getCurrentPlaying(), downloadFile);
|
|
if (playing) {
|
|
if (!this.playing) {
|
|
this.playing = true;
|
|
playingTextView.setCompoundDrawablesWithIntrinsicBounds(DrawableTint.getDrawableRes(context, R.attr.playing), 0, 0, 0);
|
|
}
|
|
} else {
|
|
if (this.playing) {
|
|
this.playing = false;
|
|
playingTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
if (isPlayedShown) {
|
|
playedButton.setVisibility(View.GONE);
|
|
isPlayedShown = false;
|
|
}
|
|
}
|
|
|
|
public MusicDirectory.Entry getEntry() {
|
|
return item;
|
|
}
|
|
|
|
public void setShowAlbum(boolean showAlbum) {
|
|
this.showAlbum = showAlbum;
|
|
}
|
|
}
|