/** * */ package gilday.android.powerhour.view; import gilday.android.powerhour.MusicUtils; import gilday.android.powerhour.R; import gilday.android.powerhour.data.Keys; import gilday.android.powerhour.data.PreferenceRepository; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ListView; import android.widget.SimpleAdapter; /** * @author John Gilday * */ public class MyPlaylistBrowserActivity extends Activity { private static String ID = "playlist_id"; private static String NAME = "playlist_name"; private static String SIZE = "playlist_size"; // List of playlists in the form of key,value property mappings. Used for SimpleAdapter private ArrayList<HashMap<String,String>> playlists = new ArrayList<HashMap<String,String>>(); private SimpleAdapter myAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setTitle(getString(R.string.PlaylistBrowserTitle)); setContentView(R.layout.playlistbrowser); // Set up filter button to reload playlists CheckBox filterButton = (CheckBox)findViewById(R.id.filter_button); filterButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton button, boolean isChecked) { loadPlaylists(isChecked); } }); ListView playlist_listView = (ListView) findViewById(R.id.playlist_ListView); myAdapter = new SimpleAdapter(this, playlists, R.layout.playlist_item, new String[] { NAME, SIZE }, new int[] { R.id.playlist_name, R.id.playlist_size }); playlist_listView.setAdapter(myAdapter); // When a playlist is selected, get its ID from the hashmap playlist_listView.setOnItemClickListener(new ListView.OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { Intent respondIntent = new Intent(); int playlistId = Integer.parseInt(playlists.get(position).get(ID)); respondIntent.putExtra(Keys.PLAYLIST_ID_KEY, playlistId); setResult(RESULT_OK, respondIntent); finish(); } }); // Load all playlists at first loadPlaylists(false); } /** * Populates the ListView with playlists from the Android music system * @param filter Should this method only show playlists that contain enough songs to meet the duration of the power hour */ private void loadPlaylists(boolean filter) { // Initially clear the playlists structure playlists.clear(); // Get playlist information from the system's MediaStore // Include playlist ID and name Cursor cursor = getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Audio.Playlists._ID, MediaStore.Audio.Playlists.NAME}, null, null, MediaStore.Audio.Playlists.DEFAULT_SORT_ORDER); if(cursor == null) { return; } if(!cursor.moveToFirst()){ // Cursor is empty, return cursor.close(); return; } int colidx = cursor.getColumnIndex(MediaStore.Audio.Playlists._ID); int colnamex = cursor.getColumnIndex(MediaStore.Audio.Playlists.NAME); // Get duration if filtering int duration = new PreferenceRepository(this).getDuration(); // Generate key,value property mappings for each playlist do { int playlistId = cursor.getInt(colidx); // measure playlist size int size = MusicUtils.getPlaylistSize(this, playlistId); // If we're filtering playlists that are too short, check if playlist size is sufficient if(!filter || size >= duration) { HashMap<String,String> playlist = new HashMap<String,String>(); playlist.put(ID, "" + playlistId); playlist.put(NAME, cursor.getString(colnamex)); playlist.put(SIZE, String.format(getString(R.string.playlistSongsCount), size)); playlists.add(playlist); } } while(cursor.moveToNext()); cursor.close(); myAdapter.notifyDataSetChanged(); } }