package com.ideabag.playtunes.fragment; import android.app.Activity; import android.content.ContentResolver; import android.database.ContentObserver; import android.database.Cursor; import android.graphics.PorterDuff; import android.os.Bundle; import android.os.Handler; import android.provider.MediaStore; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.ToggleButton; import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Tracker; import com.ideabag.playtunes.PlaylistManager; import com.ideabag.playtunes.R; import com.ideabag.playtunes.activity.MainActivity; import com.ideabag.playtunes.adapter.AlbumsOneAdapter; import com.ideabag.playtunes.database.MediaQuery; import com.ideabag.playtunes.dialog.SongMenuDialogFragment; import com.ideabag.playtunes.media.PlaylistMediaPlayer.PlaybackListener; import com.ideabag.playtunes.util.AsyncDrawable; import com.ideabag.playtunes.util.BitmapWorkerTask; import com.ideabag.playtunes.util.GAEvent; import com.ideabag.playtunes.util.IMusicBrowser; import com.ideabag.playtunes.util.TrackerSingleton; public class AlbumsOneFragment extends SaveScrollListFragment implements IMusicBrowser { public static final String TAG = "One Album Fragment"; AlbumsOneAdapter adapter; private MainActivity mActivity; private Tracker mTracker; private ContentResolver mResolver; private String ALBUM_ID = ""; private View albumArtHeader; private ImageView mAlbumArt; private ImageView mAlbumArtBackground; private TextView mAlbumTitle; private TextView mAlbumSubtitle; @Override public void setMediaID( String media_id ) { ALBUM_ID = media_id; } @Override public String getMediaID() { return ALBUM_ID; } @Override public void onAttach( Activity activity ) { super.onAttach( activity ); mActivity = ( MainActivity ) activity; mTracker = TrackerSingleton.getDefaultTracker( mActivity ); mResolver = activity.getContentResolver(); mTracker.setScreenName( TAG ); albumArtHeader = getActivity().getLayoutInflater().inflate( R.layout.list_header_albumart, null, false ); mAlbumTitle = ( TextView ) albumArtHeader.findViewById( R.id.AlbumArtTitle ); mAlbumSubtitle = ( TextView ) albumArtHeader.findViewById( R.id.AlbumArtSubtitle ); mAlbumArt = ( ImageView ) albumArtHeader.findViewById( R.id.AlbumArtFull ); mAlbumArtBackground = ( ImageView ) albumArtHeader.findViewById( R.id.AlbumArtBackground ); MediaQuery albumQuery = new MediaQuery( MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Albums.ARTIST, MediaStore.Audio.Albums._ID }, MediaStore.Audio.Albums._ID + "=?", new String[] { ALBUM_ID }, null ); MediaQuery.executeAsync( getActivity(), albumQuery, new MediaQuery.OnQueryCompletedListener() { @Override public void onQueryCompleted( MediaQuery mQuery, Cursor mResult ) { if ( null != mResult && mResult.getCount() > 0 ) { mResult.moveToFirst(); String albumTitle, albumArtist; String albumUriString = mResult.getString( mResult.getColumnIndexOrThrow( MediaStore.Audio.Albums.ALBUM_ART ) ); if ( null != albumUriString) { final BitmapWorkerTask albumThumbTask = new BitmapWorkerTask( mAlbumArt ); final BitmapWorkerTask albumFullTask = new BitmapWorkerTask( mAlbumArtBackground, -1 ); final AsyncDrawable asyncThumbDrawable = new AsyncDrawable( getResources(), null, // BitmapFactory.decodeResource( mContext.getResources(), R.drawable.no_album_art_thumb ) albumThumbTask ); final AsyncDrawable asyncFullDrawable = new AsyncDrawable( getResources(), null, // BitmapFactory.decodeResource( mContext.getResources(), R.drawable.no_album_art_thumb ) albumFullTask ); mAlbumArt.setImageDrawable( asyncThumbDrawable ); albumThumbTask.execute( albumUriString ); mAlbumArtBackground.setImageDrawable( asyncFullDrawable ); albumFullTask.execute( albumUriString ); } else { mAlbumArtBackground.setImageResource( R.drawable.no_album_art_full ); mAlbumArt.setImageResource( R.drawable.no_album_art_thumb ); } albumTitle = mResult.getString( mResult.getColumnIndexOrThrow( MediaStore.Audio.Albums.ALBUM ) ); albumArtist = mResult.getString( mResult.getColumnIndex( MediaStore.Audio.Albums.ARTIST ) ); mActivity.setActionbarTitle( albumTitle ); mAlbumTitle.setText( albumTitle ); mAlbumSubtitle.setText( albumArtist ); restoreScrollPosition(); } if ( null != mResult && !mResult.isClosed() ) { mResult.close(); } } }); } @Override public void onSaveInstanceState( Bundle outState ) { super.onSaveInstanceState( outState ); outState.putString( getString( R.string.key_state_media_id ), ALBUM_ID ); } @Override public void onActivityCreated( Bundle savedInstanceState ) { super.onActivityCreated( savedInstanceState ); if ( null != savedInstanceState ) { ALBUM_ID = savedInstanceState.getString( getString( R.string.key_state_media_id ) ); } //getView().setBackgroundColor( getResources().getColor( android.R.color.white ) ); getListView().setDivider( getResources().getDrawable( R.drawable.list_divider ) ); getListView().setDividerHeight( 1 ); getListView().setSelector( R.drawable.list_item_background ); getListView().setHeaderDividersEnabled( false ); adapter = new AlbumsOneAdapter( getActivity(), ALBUM_ID, songMenuClickListener, new MediaQuery.OnQueryCompletedListener() { @Override public void onQueryCompleted( MediaQuery mQuery, Cursor mResult ) { mActivity.setActionbarSubtitle( mResult.getCount() + " " + ( mResult.getCount() == 1 ? getString( R.string.song_singular ) : getString( R.string.songs_plural ) ) ); mTracker.send( new HitBuilders.EventBuilder() .setCategory( GAEvent.Categories.PLAYLIST ) .setAction( GAEvent.Playlist.ACTION_SHOWLIST ) .setValue( mResult.getCount() ) .build()); } }); // TODO: A start at showing an indicator next to the song that's playing in the list. //adapter.setNowPlayingMedia( mActivity.mBoundService.CURRENT_MEDIA_ID ); getListView().addHeaderView( albumArtHeader, null, false ); getListView().setOnItemLongClickListener( mSongMenuLongClickListener ); mAlbumArtBackground.setColorFilter( getResources().getColor( R.color.now_playing_background ), PorterDuff.Mode.MULTIPLY ); setListAdapter( adapter ); mResolver.registerContentObserver( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mediaStoreChanged ); mResolver.registerContentObserver( MediaStore.Audio.Playlists.Members.getContentUri( "external", Long.parseLong( new PlaylistManager( getActivity() ).createStarredIfNotExist() ) ), true, mediaStoreChanged ); } @Override public void onListItemClick( ListView l, View v, int position, long id ) { String playlistName = mActivity.getSupportActionBar().getTitle().toString(); mActivity.mBoundService.setPlaylist( adapter.getQuery(), playlistName, AlbumsOneFragment.class, ALBUM_ID ); mActivity.mBoundService.setPlaylistPosition( position - l.getHeaderViewsCount() ); mActivity.mBoundService.play(); mTracker.send( new HitBuilders.EventBuilder() .setCategory( GAEvent.Categories.PLAYLIST ) .setAction( GAEvent.Playlist.ACTION_CLICK ) .setValue( position ) .build()); } @Override public void onResume() { super.onResume(); // Set screen name. // Where path is a String representing the screen name. //t.set( "_count", ""+adapter.getCount() ); // Send a screen view. mTracker.send( new HitBuilders.AppViewBuilder().build() ); mActivity.addPlaybackListener( mPlaybackListener ); } @Override public void onPause() { super.onPause(); mActivity.removePlaybackListener( mPlaybackListener ); } @Override public void onDestroy() { super.onDestroy(); mResolver.unregisterContentObserver( mediaStoreChanged ); } @Override public void onDestroyView() { super.onDestroyView(); /* if ( null != mAlbumArt ) { BitmapDrawable mAlbumArtDrawable = ( BitmapDrawable ) mAlbumArt.getDrawable(); if ( null != mAlbumArtDrawable ) { mAlbumArtDrawable.getBitmap().recycle(); mAlbumArt.setImageBitmap( null ); } } if ( null != mAlbumArtBackground ) { BitmapDrawable mAlbumArtBackgroundDrawable = ( BitmapDrawable ) mAlbumArtBackground.getDrawable(); if ( null != mAlbumArtBackgroundDrawable ) { mAlbumArtBackgroundDrawable.getBitmap().recycle(); mAlbumArtBackground.setImageBitmap( null ); } } */ setListAdapter( null ); } protected AdapterView.OnItemLongClickListener mSongMenuLongClickListener = new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View v, int position, long id) { showSongMenuDialog( "" + id ); mTracker.send( new HitBuilders.EventBuilder() .setCategory( GAEvent.Categories.PLAYLIST ) .setAction( GAEvent.Playlist.ACTION_LONGCLICK ) .setValue( position ) .build()); return true; } }; protected View.OnClickListener songMenuClickListener = new View.OnClickListener() { @Override public void onClick( View v ) { int viewID = v.getId(); String songID = "" + v.getTag( R.id.tag_song_id ); if ( viewID == R.id.StarButton ) { ToggleButton starButton = ( ToggleButton ) v; if ( starButton.isChecked() ) { mActivity.PlaylistManager.addFavorite( songID ); //android.util.Log.i( "starred", songID ); } else { mActivity.PlaylistManager.removeFavorite( songID ); //android.util.Log.i( "unstarred", songID ); } } else if ( viewID == R.id.MenuButton ) { showSongMenuDialog( songID ); } } }; protected void showSongMenuDialog( String songID ) { FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); SongMenuDialogFragment newFragment = new SongMenuDialogFragment(); newFragment.setMediaID( songID ); newFragment.show( ft, "dialog" ); } ContentObserver mediaStoreChanged = new ContentObserver(new Handler()) { @Override public void onChange( boolean selfChange ) { mActivity.runOnUiThread( new Runnable() { @Override public void run() { saveScrollPosition(); adapter.requery(); } }); super.onChange( selfChange ); } }; private PlaybackListener mPlaybackListener = new PlaybackListener() { @Override public void onTrackChanged( String media_id ) { adapter.setNowPlayingMedia( media_id ); } @Override public void onPlaylistDone() { adapter.setNowPlayingMedia( null ); } @Override public void onPlay() { } @Override public void onPause() { } @Override public void onLoopingChanged(int loop) { } @Override public void onShuffleChanged(boolean isShuffling) { } @Override public void onDurationChanged( int position, int duration ) { } }; }