Audinaut-subsonic-app-android/app/src/main/java/net/nullsum/audinaut/view/SongView.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;
}
}