package com.ideabag.playtunes;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.ideabag.playtunes.util.GAEvent.Categories;
import com.ideabag.playtunes.util.GAEvent.UserPlaylist;
import com.ideabag.playtunes.util.TrackerSingleton;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
public class PlaylistManager {
public static final String TAG = "PlaylistManager";
private String STARRED_PLAYLIST_NAME;
private Context mContext;
private ContentResolver mResolver;
private Uri playlistsUri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
public String STARRED_PLAYLIST_ID = null;
private SharedPreferences prefs;
private Tracker mTracker;
public PlaylistManager( Context context ) {
mContext = context;
mResolver = mContext.getContentResolver();
STARRED_PLAYLIST_NAME = mContext.getString( R.string.playlist_name_starred );
prefs = context.getSharedPreferences( STARRED_PLAYLIST_NAME, Context.MODE_PRIVATE );
mTracker = TrackerSingleton.getDefaultTracker( context );
//mResolver.update(uri, values, where, selectionArgs)
}
// Add Song to Playlist
public boolean addSong( String playlist_id, String song_id ) {
Cursor songCursor = mResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] {
"*"
},
MediaStore.Audio.Media._ID + "=?",
new String[] {
song_id
},
null);
addSongsInCursorToPlaylist( songCursor, playlist_id);
// Maybe do a null check here?
songCursor.close();
//
// Analytics Event
//
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.USER_PLAYLIST )
.setAction( playlist_id == this.createStarredIfNotExist() ? UserPlaylist.ACTION_ADDSTAR : UserPlaylist.ACTION_ADD )
.build());
return true;
}
private void addSongsInCursorToPlaylist( Cursor c, String mPlaylistId ) {
int mIdCol;
int mCount;
ContentProviderClient mCRC = null;
try {
mCount = c.getCount();
mIdCol = c.getColumnIndex( MediaStore.Audio.Media._ID );
ContentValues[] mInsertList = new ContentValues[1];
mInsertList[0] = new ContentValues();
//int mPlaylistId = mPrefs.getInt(AM.PLAYLIST_NOWPLAYING_ID, AM.PLAYLIST_ID_DEFAULT);
Uri mUri = MediaStore.Audio.Playlists.Members.getContentUri( "external", Long.parseLong( mPlaylistId ) );
Cursor c2 = mResolver.query(mUri,
new String[] {
MediaStore.Audio.Playlists.Members._ID,
MediaStore.Audio.Playlists.Members.PLAY_ORDER
},
null,
null,
MediaStore.Audio.Playlists.Members.PLAY_ORDER + " DESC ");
int mPlayOrder = 1;
if ( c2 != null ) {
if ( c2.moveToFirst() ) {
mPlayOrder = ( c2.getInt( c2.getColumnIndex( MediaStore.Audio.Playlists.Members.PLAY_ORDER ) ) ) + 1;
}
c2.close();
}
//mCRC = mResolver.acquireContentProviderClient( mUri );
//mCRC.
for ( int i = 0; i < mCount; i++ ) {
if ( c.moveToPosition( i ) ) {
mInsertList[ 0 ].put( MediaStore.Audio.Playlists.Members.AUDIO_ID, c.getLong( mIdCol ) );
mInsertList[ 0 ].put( MediaStore.Audio.Playlists.Members.PLAY_ORDER, mPlayOrder++ );
mResolver.insert( mUri, mInsertList[ 0 ] );
}
//mCRC.release();
}
} catch ( Throwable t ) {
t.printStackTrace();
}
}
// Projection to get high water mark of PLAY_ORDER in a particular playlist
// Projection to get the list of song IDs to be added to a playlist
/*
public static final String[] PROJECTION_SONGS_ADDTOPLAYLIST = new String[] {
MediaStore.Audio.Media._ID,
};
*/
// Remove Song from playlist
public boolean removeSong( String playlist_id, String song_id ) {
int rows = mResolver.delete( MediaStore.Audio.Playlists.Members.getContentUri( "external", Long.parseLong( playlist_id ) ),
MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?",
new String[] {
song_id
}
);
if ( rows > 0 ) {
//
// Analytics Event
//
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.USER_PLAYLIST )
.setAction( playlist_id == this.createStarredIfNotExist() ? UserPlaylist.ACTION_REMOVESTAR : UserPlaylist.ACTION_REMOVE )
.build());
}
return ( rows > 0 );
}
// Create new playlist
// Returns the playlist_id
//
public int createPlaylist( String playlistName ) {
String[] PROJECTION_PLAYLIST = new String[] {
MediaStore.Audio.Playlists._ID,
MediaStore.Audio.Playlists.NAME,
MediaStore.Audio.Playlists.DATA
};
int playlist_id = -1;
ContentValues values = new ContentValues();
values.put( MediaStore.Audio.Playlists.NAME, playlistName );
values.put( MediaStore.Audio.Playlists.DATE_ADDED, System.currentTimeMillis() );
values.put( MediaStore.Audio.Playlists.DATE_MODIFIED, System.currentTimeMillis() );
Uri mUri = mResolver.insert( MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, values );
if ( null != mUri ) {
//playlist_id = -1;
//mResult = FM.SUCCESS;
Cursor c = mResolver.query( mUri, PROJECTION_PLAYLIST, null, null, null );
if ( c != null ) {
c.moveToFirst();
// Save the newly created ID so it can be selected. Names are allowed to be duplicated,
// but IDs can never be.
playlist_id = c.getInt( c.getColumnIndex( MediaStore.Audio.Playlists._ID ) );
c.close();
}
//
// Analytics Event
//
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.USER_PLAYLIST )
.setAction( UserPlaylist.ACTION_CREATE )
.build());
}
return playlist_id;
}
//
//
// Delete Playlist
//
//
public boolean deletePlaylist( String playlist_id ) {
int mCountDeleted = mResolver.delete( playlistsUri,
MediaStore.Audio.Playlists._ID + "=?",
new String[] {
playlist_id
}
);
if ( mCountDeleted > 0 ) {
//
// Analytics Event
//
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.USER_PLAYLIST )
.setAction( UserPlaylist.ACTION_CREATE )
.build());
}
return ( mCountDeleted > 0 );
}
public boolean renamePlaylist( String playlist_id, String new_name ) {
ContentValues updateValues = new ContentValues();
updateValues.put( MediaStore.Audio.Playlists.NAME, new_name );
int mCountUpdated = mResolver.update( playlistsUri,
updateValues,
MediaStore.Audio.Playlists._ID + "=?",
new String[] {
playlist_id
});
if ( mCountUpdated > 0 ) {
//
// Analytics Event
//
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.USER_PLAYLIST )
.setAction( UserPlaylist.ACTION_RENAME )
.build());
}
return ( mCountUpdated > 0 );
}
//
// Starred Songs / Favorites
//
public boolean addFavorite( String song_id ) {
// check if favorite playlist exists, create if it doesn't
String playlist_id = createStarredIfNotExist();
addSong( playlist_id, song_id );
return true;
}
public boolean removeFavorite( String song_id ) {
// check if favorite playlist exists, create if it doesn't
String playlist_id = createStarredIfNotExist();
removeSong( playlist_id, song_id );
return true;
}
private static final String[] starredPlaylistSelection = new String[] {
MediaStore.Audio.Playlists.Members.PLAYLIST_ID,
MediaStore.Audio.Playlists.Members.AUDIO_ID,
MediaStore.Audio.Playlists.Members._ID
};
public boolean isStarred( String song_id ) {
boolean isStarred = false;
String starred_playlist_id = createStarredIfNotExist();
Cursor starredQueryCursor = mResolver.query(
MediaStore.Audio.Playlists.Members.getContentUri( "external", Long.parseLong( starred_playlist_id ) ),
starredPlaylistSelection,
MediaStore.Audio.Playlists.Members.AUDIO_ID + "=? AND " + MediaStore.Audio.Playlists.Members.PLAYLIST_ID + "=?",
new String[] {
song_id,
starred_playlist_id
},
null
);
isStarred = ( null != starredQueryCursor && starredQueryCursor.getCount() > 0 );
if ( starredQueryCursor != null && !starredQueryCursor.isClosed() ) {
starredQueryCursor.close();
}
return isStarred;
}
public Cursor getStarredCursor() {
String starred_playlist_id = createStarredIfNotExist();
Cursor starredQueryCursor = mResolver.query(
MediaStore.Audio.Playlists.Members.getContentUri( "external", Long.parseLong( starred_playlist_id ) ),
new String[] {
MediaStore.Audio.Playlists.Members.AUDIO_ID
},
null,
null,
null
);
return starredQueryCursor;
}
public String createStarredIfNotExist() {
Cursor starredQueryCursor = null;
if ( null == STARRED_PLAYLIST_ID ) {
STARRED_PLAYLIST_ID = prefs.getString( STARRED_PLAYLIST_NAME, null );
}
if ( null == STARRED_PLAYLIST_ID) {
starredQueryCursor = mResolver.query(
playlistsUri,
new String[] {
MediaStore.Audio.Playlists.NAME,
MediaStore.Audio.Playlists._ID
},
MediaStore.Audio.Playlists.NAME + "=?",
new String[] {
STARRED_PLAYLIST_NAME
},
null
);
if ( null == starredQueryCursor || 0 == starredQueryCursor.getCount()) {
if ( starredQueryCursor != null && !starredQueryCursor.isClosed() ) {
starredQueryCursor.close();
}
STARRED_PLAYLIST_ID = "" + createPlaylist( STARRED_PLAYLIST_NAME );
} else {
starredQueryCursor.moveToFirst();
STARRED_PLAYLIST_ID = starredQueryCursor.getString( starredQueryCursor.getColumnIndex( MediaStore.Audio.Playlists._ID ) );
}
SharedPreferences.Editor editor = prefs.edit();
editor.putString( STARRED_PLAYLIST_NAME, STARRED_PLAYLIST_ID );
editor.commit();
}
if ( starredQueryCursor != null && !starredQueryCursor.isClosed() ) {
starredQueryCursor.close();
}
return STARRED_PLAYLIST_ID;
}
// Reorder songs in a playlist
public boolean moveTrack( String playlist_id, int from, int to ) {
boolean success = false;
success = MediaStore.Audio.Playlists.Members.moveItem( mResolver, Long.parseLong( playlist_id ), from, to );
if ( success ) {
//
// Analytics Event
//
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.USER_PLAYLIST )
.setAction( playlist_id == this.createStarredIfNotExist() ? UserPlaylist.ACTION_MOVESTAR : UserPlaylist.ACTION_MOVE )
.build());
}
return success;
}
}