/*
* Copyright (C) 2009 Teleca Poland Sp. z o.o. <android@teleca.com>
*
* 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.teleca.jamendo.activity.album;
import java.util.ArrayList;
import com.teleca.jamendo.MyApplication;
import com.teleca.jamendo.activity.playview.PlayView;
import com.teleca.jamendo.activity.playview.PlayMethod;
import com.teleca.jamendo.adapter.PlaylistAdp;
import com.teleca.jamendo.adapter.ReviewAdp;
import com.teleca.jamendo.model.Album;
import com.teleca.jamendo.model.Playlist;
import com.teleca.jamendo.model.Review;
import com.teleca.jamendo.model.Track;
import com.teleca.jamendo.ui.loadDialog.AlbumLoadDialog;
import com.teleca.jamendo.util.DrawableAccessor;
import com.teleca.jamendo.util.Helper;
import com.teleca.jamendo.util.download.IDownload;
import com.teleca.jamendo.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TabHost;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.TabHost.TabSpec;
// TODO context menu for tracks
/**
* Activity representing album
*
* @author Lukasz Wisniewski
*/
public class AlbumView extends TabActivity{
private Album mAlbum;
private ListView mReviewAlbumListView;
private ListView mAlbumTrackListView;
private ReviewAdp mReviewAdapter;
private Spinner mLanguageSpinner;
TabSpec mAlbumTabSpec;
TabSpec mReviewsTabSpec;
private TabHost mTabHost;
private String mBetterRes;
/**
* Launch this Activity from the outside
*
* @param c Activity from which AlbumActivity should be started
* @param album Album to be presented
*/
public static void launch(Activity c, Album album){
new AlbumLoadDialog(c,R.string.album_loading, R.string.album_fail).execute(album);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.album);
mBetterRes = getResources().getString(R.string.better_res);
mAlbum = (Album) getIntent().getSerializableExtra("album");
mReviewAlbumListView = (ListView)findViewById(R.id.AlbumListView);
mAlbumTrackListView = (ListView)findViewById(R.id.AlbumTrackListView);
mLanguageSpinner = (Spinner)findViewById(R.id.LanguageSpinner);
mReviewAdapter = new ReviewAdp(this);
mReviewAdapter.setListView(mReviewAlbumListView);
mReviewAlbumListView.setAdapter(mReviewAdapter);
loadReviews();
loadTracks();
setupTabs();
}
private void setupTabs(){
mTabHost = getTabHost();
Bitmap coverBmp = MyApplication.getInstance().getImageCache().get(mAlbum.getImage());
// try 300px size
if(coverBmp == null){
coverBmp = MyApplication.getInstance().getImageCache().get(mAlbum.getImage().replaceAll("1.100.jpg", mBetterRes));
}
if(coverBmp != null){
// resize to match the tab widget
int tabSize = (int)getResources().getDimension(R.dimen.tab_size);
int newWidth = tabSize;
int newHeight = tabSize;
float scaleWidth = ((float) newWidth) / coverBmp.getWidth();
float scaleHeight = ((float) newHeight) / coverBmp.getHeight();
// create matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedCoverBmp = Bitmap.createBitmap(coverBmp, 0, 0, coverBmp.getWidth(), coverBmp.getHeight(), matrix, false);
// providing backwards compability with SDK 1.5
BitmapDrawable coverDrawable = DrawableAccessor.construct(getResources(), resizedCoverBmp);
mAlbumTabSpec = mTabHost.newTabSpec("tab1").setIndicator(mAlbum.getName(), coverDrawable).setContent(R.id.TabTracks);
} else {
mAlbumTabSpec = mTabHost.newTabSpec("tab1").setIndicator(mAlbum.getName(), getResources().getDrawable(R.drawable.tab_no_cd)).setContent(R.id.TabTracks);
}
mReviewsTabSpec = mTabHost.newTabSpec("tab1").setIndicator(getString(R.string.review), getResources().getDrawable(R.drawable.tab_review)).setContent(R.id.TabReviews);
mTabHost.addTab(mAlbumTabSpec);
mTabHost.addTab(mReviewsTabSpec);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.album, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
menu.findItem(R.id.download_menu_item).setVisible(true);
} else {
menu.findItem(R.id.download_menu_item).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.download_menu_item:
downloadAlbum();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("unchecked")
private void loadReviews() {
ArrayList<Review> reviews = (ArrayList<Review>)getIntent().getSerializableExtra("reviews");
mReviewAdapter.setList(reviews);
final ArrayList<String> langs = Helper.getLanguageCodes(reviews);
langs.add(0, "all");
ArrayAdapter<String> languageAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, Helper.getLanguageNames(langs, AlbumView.this));
languageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mLanguageSpinner.setAdapter(languageAdapter);
mLanguageSpinner.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int position, long arg3) {
mReviewAdapter.setLang(langs.get(position));
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
mReviewAdapter.setLang("all");
}
});
}
private ArrayList<Track> mTracks;
@SuppressWarnings("unchecked")
private void loadTracks(){
mTracks = (ArrayList<Track>)getIntent().getSerializableExtra("tracks");
Track[] tracks = new Track[mTracks.size()];
tracks = mTracks.toArray(tracks);
PlaylistAdp playlistAdapter = new PlaylistAdp(this);
PlayMethod playlist = new PlayMethod();
playlist.addTracks(tracks, mAlbum);
playlistAdapter.setPlaylist(playlist);
mAlbumTrackListView.setAdapter(playlistAdapter);
mAlbumTrackListView.setOnItemClickListener(mOnTracksItemClickListener);
}
/**
* Jump to the track (play it)
*/
private OnItemClickListener mOnTracksItemClickListener = new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index,
long time) {
PlayMethod playlist = MyApplication.getInstance().getPlayerEngineInterface().getPlaylist();
Track track = mTracks.get(index);
if(playlist == null){
// player's playlist is empty, create a new one with whole album and open it in the player
playlist = new PlayMethod();
Track[] tracks = new Track[mTracks.size()];
tracks = mTracks.toArray(tracks);
playlist.addTracks(tracks, mAlbum);
MyApplication.getInstance().getPlayerEngineInterface().openPlaylist(playlist);
}
playlist.selectOrAdd(track, mAlbum);
MyApplication.getInstance().getPlayerEngineInterface().play();
PlayView.launch(AlbumView.this, (PlayMethod)null);
}
};
/**
* Add whole album to the download queue
*/
private void downloadAlbum(){
AlertDialog alertDialog = new AlertDialog.Builder(AlbumView.this)
.setTitle(R.string.download_album_q)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
IDownload downloadInterface = MyApplication.getInstance().getDownloadInterface();
for(Track track : mTracks){
Playlist entry = new Playlist();
entry.setAlbum(mAlbum);
entry.setTrack(track);
downloadInterface.addToDownloadQueue(entry);
}
}
})
.setNegativeButton(R.string.cancel, null)
.create();
alertDialog.show();
}
}