Android Open Source - PlayTunes Playlist Manager






From Project

Back to project page PlayTunes.

License

The source code is released under:

Copyright (c) 2014, Impeccable Labs, LLC. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions ar...

If you think the Android project PlayTunes listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.ideabag.playtunes;
//from www  . java2  s.co m
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;
    
  }
  
}




Java Source Code List

com.ideabag.playtunes.PlaylistManager.java
com.ideabag.playtunes.DragNDrop.DragListener.java
com.ideabag.playtunes.DragNDrop.DragNDropListView.java
com.ideabag.playtunes.DragNDrop.DropListener.java
com.ideabag.playtunes.DragNDrop.RemoveListener.java
com.ideabag.playtunes.activity.MainActivity.java
com.ideabag.playtunes.activity.NowPlayingActivity.java
com.ideabag.playtunes.activity.SettingsActivity.java
com.ideabag.playtunes.adapter.AlbumListAdapter.java
com.ideabag.playtunes.adapter.AlbumsAllAdapter.java
com.ideabag.playtunes.adapter.AlbumsOneAdapter.java
com.ideabag.playtunes.adapter.ArtistAlbumsAdapter.java
com.ideabag.playtunes.adapter.ArtistAllSongsAdapter.java
com.ideabag.playtunes.adapter.ArtistListAdapter.java
com.ideabag.playtunes.adapter.ArtistSinglesAdapter.java
com.ideabag.playtunes.adapter.ArtistsAllAdapter.java
com.ideabag.playtunes.adapter.AsyncQueryAdapter.java
com.ideabag.playtunes.adapter.GenresAllAdapter.java
com.ideabag.playtunes.adapter.GenresOneAdapter.java
com.ideabag.playtunes.adapter.NavigationListAdapter.java
com.ideabag.playtunes.adapter.PlaylistsAllAdapter.java
com.ideabag.playtunes.adapter.PlaylistsOneAdapter.java
com.ideabag.playtunes.adapter.SongListAdapter.java
com.ideabag.playtunes.adapter.SongsAllAdapter.java
com.ideabag.playtunes.adapter.search.SearchAlbumsAdapter.java
com.ideabag.playtunes.adapter.search.SearchArtistsAdapter.java
com.ideabag.playtunes.adapter.search.SearchSongsAdapter.java
com.ideabag.playtunes.database.MediaQuery.java
com.ideabag.playtunes.dialog.AddToPlaylistDialogFragment.java
com.ideabag.playtunes.dialog.CreatePlaylistDialogFragment.java
com.ideabag.playtunes.dialog.FeedbackDialogFragment.java
com.ideabag.playtunes.dialog.PlaylistDeleteDialogFragment.java
com.ideabag.playtunes.dialog.PlaylistMenuDialogFragment.java
com.ideabag.playtunes.dialog.PlaylistRenameDialogFragment.java
com.ideabag.playtunes.dialog.RateAppDialogFragment.java
com.ideabag.playtunes.dialog.SongMenuDialogFragment.java
com.ideabag.playtunes.fragment.AlbumsAllFragment.java
com.ideabag.playtunes.fragment.AlbumsOneFragment.java
com.ideabag.playtunes.fragment.ArtistSinglesFragment.java
com.ideabag.playtunes.fragment.ArtistsAllFragment.java
com.ideabag.playtunes.fragment.ArtistsOneFragment.java
com.ideabag.playtunes.fragment.FooterControlsFragment.java
com.ideabag.playtunes.fragment.GenresAllFragment.java
com.ideabag.playtunes.fragment.GenresOneFragment.java
com.ideabag.playtunes.fragment.MusicBrowserFragment.java
com.ideabag.playtunes.fragment.NavigationDrawerFragment.java
com.ideabag.playtunes.fragment.NavigationFragment.java
com.ideabag.playtunes.fragment.PlaylistsAllFragment.java
com.ideabag.playtunes.fragment.PlaylistsOneFragment.java
com.ideabag.playtunes.fragment.SaveScrollListFragment.java
com.ideabag.playtunes.fragment.SongsFragment.java
com.ideabag.playtunes.fragment.TrackProgressFragment.java
com.ideabag.playtunes.fragment.search.SearchAlbumsFragment.java
com.ideabag.playtunes.fragment.search.SearchAllFragment.java
com.ideabag.playtunes.fragment.search.SearchArtistsFragment.java
com.ideabag.playtunes.fragment.search.SearchFragment.java
com.ideabag.playtunes.fragment.search.SearchSongsFragment.java
com.ideabag.playtunes.fragment.search.SearchSuggestionsFragment.java
com.ideabag.playtunes.media.AudioFocusHelper.java
com.ideabag.playtunes.media.MusicFocusable.java
com.ideabag.playtunes.media.MusicIntentReceiver.java
com.ideabag.playtunes.media.PlaylistMediaPlayer.java
com.ideabag.playtunes.media.RemoteControlClientCompat.java
com.ideabag.playtunes.media.RemoteControlHelper.java
com.ideabag.playtunes.service.LockscreenManager.java
com.ideabag.playtunes.service.MusicPlayerService.java
com.ideabag.playtunes.service.PlaybackNotification.java
com.ideabag.playtunes.util.AdmobUtil.java
com.ideabag.playtunes.util.AlbumSongsCountTask.java
com.ideabag.playtunes.util.AsyncDrawable.java
com.ideabag.playtunes.util.BitmapWorkerTask.java
com.ideabag.playtunes.util.CheckRemoteVersionFileTask.java
com.ideabag.playtunes.util.DrawerLayout.java
com.ideabag.playtunes.util.GAEvent.java
com.ideabag.playtunes.util.IMusicBrowser.java
com.ideabag.playtunes.util.ISearchableAdapter.java
com.ideabag.playtunes.util.LoadAlbumStackTask.java
com.ideabag.playtunes.util.MergeAdapter.java
com.ideabag.playtunes.util.QueryCountTask.java
com.ideabag.playtunes.util.SackOfViewsAdapter.java
com.ideabag.playtunes.util.SearchHistory.java
com.ideabag.playtunes.util.StarToggleTask.java
com.ideabag.playtunes.util.TrackerSingleton.java