/* * 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(); } }