/*
* Copyright (C) 2005-2009 Team XBMC
* http://xbmc.org
*
* 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 2, 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 XBMC Remote; see the file license. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
* http://www.gnu.org/copyleft/gpl.html
*
*/
package org.xbmc.android.remote.presentation.activity;
import java.io.File;
import java.util.ArrayList;
import org.xbmc.android.remote.R;
import org.xbmc.android.util.Crc32;
import org.xbmc.android.util.ImportUtilities;
import org.xbmc.api.business.DataResponse;
import org.xbmc.api.business.IMusicManager;
import org.xbmc.api.object.Album;
import org.xbmc.api.object.Artist;
import org.xbmc.api.object.Song;
import org.xbmc.api.type.MediaType;
import org.xbmc.api.type.ThumbSize;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.TypedValue;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
/**
* Keeps all the more sophisticated dialogs in one place. Feel free to change
* if it gets inconvenient.
*
* @author Team XBMC
*/
public abstract class DialogFactory {
/**
* Returns the album details dialog, the one with big cover and queue/play button.
* @param activity Parent activity
* @param album Album to display
* @return Album details dialog
*/
public static Dialog getAlbumDetail(final IMusicManager musicManager, final Activity activity, final Album album, final Context context) {
final Dialog dialog = new Dialog(activity);
dialog.setContentView(R.layout.albuminfo);
// get controls
final TextView artistText = (TextView) dialog.findViewById(R.id.album_artistname);
final ImageView cover = (ImageView) dialog.findViewById(R.id.album_cover);
final TextView genresText = (TextView) dialog.findViewById(R.id.album_genres);
final TextView yearText = (TextView) dialog.findViewById(R.id.album_year);
final Button queueButton = (Button) dialog.findViewById(R.id.album_queuebutton);
final Button playButton = (Button) dialog.findViewById(R.id.album_playbutton);
musicManager.updateAlbumInfo(new DataResponse<Album>() {
public void run() {
final Album album = value;
artistText.setText(album.artist);
if (album.year > 0) {
yearText.setText(String.valueOf(album.year));
} else {
yearText.setVisibility(View.GONE);
}
if (album.genres != null) {
genresText.setText(album.genres);
} else {
genresText.setVisibility(View.GONE);
}
}
}, album, context);
dialog.setTitle(album.name);
// set the button's listener
queueButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
musicManager.play(new DataResponse<Boolean>(), album, context);
}
});
playButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
musicManager.addToPlaylist(new DataResponse<Boolean>(), album, context);
}
});
// asynchronously load the cover
musicManager.getCover(new DataResponse<Bitmap>() {
public void run() {
if (value == null) {
cover.setImageResource(R.drawable.nocover);
} else {
cover.setImageBitmap(value);
}
}
}, album, ThumbSize.BIG, null, context, false);
cover.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getTrackDetail(musicManager, activity, album, context).show();
}
});
return dialog;
}
/**
* Returns the track listing of an album.
* @param activity
* @param album
* @return Track listing dialog
*/
public static Dialog getTrackDetail(final IMusicManager musicManager, final Activity activity, final Album album, final Context context) {
Dialog dialog = new Dialog(activity);
dialog.setContentView(R.layout.albumtracks);
dialog.setTitle(album.name);
// get controls
final TextView artistText = (TextView) dialog.findViewById(R.id.album_artistname);
final ImageView cover = (ImageView)dialog.findViewById(R.id.album_cover);
final TextView numTrackText = (TextView) dialog.findViewById(R.id.album_numtracks);
final TextView yearText = (TextView) dialog.findViewById(R.id.album_year);
final TableLayout trackTable = (TableLayout) dialog.findViewById(R.id.album_tracktable);
// update content
artistText.setText(album.artist);
if (album.year > 0) {
yearText.setText(String.valueOf(album.year));
} else {
yearText.setVisibility(View.GONE);
}
final File file = new File(ImportUtilities.getCacheDirectory(MediaType.getArtFolder(album.getMediaType()), ThumbSize.SMALL), Crc32.formatAsHexLowerCase(album.getCrc()));
if (file.exists()) {
cover.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
}
trackTable.setScrollContainer(true);
musicManager.getSongs(new DataResponse<ArrayList<Song>>() {
public void run() {
final ArrayList<Song> songs = value;
numTrackText.setText(songs.size() + " Tracks");
for (Song song: songs) {
TableRow tr = new TableRow(activity);
TextView txtTrack = new TextView(activity);
txtTrack.setText(String.valueOf(song.track));
txtTrack.setGravity(Gravity.RIGHT);
txtTrack.setWidth(20);
txtTrack.setPadding(0, 0, 5, 0);
txtTrack.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10);
TextView txtTitle = new TextView(activity);
if (album.isVA()) {
txtTitle.setText(song.artist + " - " + song.title);
} else {
txtTitle.setText(song.title);
}
txtTitle.setWidth(200);
TextView txtDuration = new TextView(activity);
txtDuration.setText(song.getDuration());
txtDuration.setGravity(Gravity.RIGHT);
tr.addView(txtTrack);
tr.addView(txtTitle);
tr.addView(txtDuration);
trackTable.addView(tr);
}
}
}, album, context);
return dialog;
}
/**
* Returns the artist details dialog.
* @param activity Parent activity
* @param album Artist to display
* @return Artist details dialog
*/
public static Dialog getArtistDetail(final IMusicManager musicManager, final Activity activity, final Artist artist, final Context context) {
Dialog dialog = new Dialog(activity);
dialog.setContentView(R.layout.artistinfo);
dialog.setTitle(artist.name);
// get controls
final ImageView cover = (ImageView) dialog.findViewById(R.id.artist_cover);
final TextView bornText = (TextView) dialog.findViewById(R.id.artist_born);
final TextView formedText = (TextView) dialog.findViewById(R.id.artist_formed);
final TextView genresText = (TextView) dialog.findViewById(R.id.artist_genres);
final TextView biographyText = (TextView) dialog.findViewById(R.id.artist_biography);
final File file = new File(ImportUtilities.getCacheDirectory(MediaType.getArtFolder(artist.getMediaType()), ThumbSize.MEDIUM), Crc32.formatAsHexLowerCase(artist.getCrc()));
if (file.exists()) {
final Bitmap coverBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
if (coverBitmap != null) {
cover.setImageBitmap(coverBitmap);
// correct alignment if texts do not fit
final Display display = activity.getWindowManager().getDefaultDisplay();
final LinearLayout header = (LinearLayout) dialog.findViewById(R.id.LinearLayoutHeader);
if (coverBitmap.getWidth() > display.getWidth() / 2) {
header.setOrientation(LinearLayout.VERTICAL);
} else {
header.setOrientation(LinearLayout.HORIZONTAL);
}
}
}
biographyText.setScrollContainer(true);
musicManager.updateArtistInfo(new DataResponse<Artist>() {
public void run() {
final Artist artist = value;
// update content
if (artist.born != null) {
bornText.setText("Born: " + artist.born);
} else {
bornText.setVisibility(View.GONE);
}
if (artist.formed != null) {
formedText.setText("Formed: " + artist.formed);
} else {
formedText.setVisibility(View.GONE);
}
if (artist.genres != null) {
genresText.setText("Genre: " + artist.genres);
} else {
genresText.setVisibility(View.GONE);
}
if (artist.biography != null) {
biographyText.setText(artist.biography);
} else {
biographyText.setVisibility(View.GONE);
}
}
}, artist, context);
return dialog;
}
}