From 3be34a854f8458522b3dfa912e4f6986815da61f Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 28 Feb 2015 16:20:19 +0100 Subject: [PATCH] Using SQL SELECTION --- .../adapter/PlayingQueueAdapter.java | 4 +- .../adapter/songadapter/SongAdapter.java | 4 +- .../songadapter/SongViewListAdapter.java | 4 +- .../materialmusic/loader/AlbumLoader.java | 46 +++++++------- .../materialmusic/loader/ArtistLoader.java | 36 +++++------ .../materialmusic/loader/SongFileLoader.java | 62 ------------------- .../loader/SongFilePathLoader.java | 60 ++++++++++++++++++ .../materialmusic/loader/SongLoader.java | 24 ++++--- .../activities/MusicControllerActivity.java | 4 +- .../tageditor/AlbumTagEditorActivity.java | 10 +-- .../tageditor/SongTagEditorActivity.java | 6 +- 11 files changed, 125 insertions(+), 135 deletions(-) delete mode 100644 app/src/main/java/com/kabouzeid/materialmusic/loader/SongFileLoader.java create mode 100644 app/src/main/java/com/kabouzeid/materialmusic/loader/SongFilePathLoader.java diff --git a/app/src/main/java/com/kabouzeid/materialmusic/adapter/PlayingQueueAdapter.java b/app/src/main/java/com/kabouzeid/materialmusic/adapter/PlayingQueueAdapter.java index 6baccce8..e95a0254 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/adapter/PlayingQueueAdapter.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/adapter/PlayingQueueAdapter.java @@ -15,7 +15,7 @@ import com.kabouzeid.materialmusic.App; import com.kabouzeid.materialmusic.R; import com.kabouzeid.materialmusic.adapter.songadapter.SongAdapter; import com.kabouzeid.materialmusic.helper.SongDetailDialogHelper; -import com.kabouzeid.materialmusic.loader.SongFileLoader; +import com.kabouzeid.materialmusic.loader.SongFilePathLoader; import com.kabouzeid.materialmusic.misc.AppKeys; import com.kabouzeid.materialmusic.model.Song; import com.kabouzeid.materialmusic.ui.activities.tageditor.SongTagEditorActivity; @@ -72,7 +72,7 @@ public class PlayingQueueAdapter extends ArrayAdapter { context.startActivity(intent); return true; case R.id.action_details: - String songFilePath = SongFileLoader.getSongFile(context, song.id); + String songFilePath = SongFilePathLoader.getSongFilePath(context, song.id); File songFile = new File(songFilePath); SongDetailDialogHelper.getDialog(context, songFile).show(); return true; diff --git a/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongAdapter.java index 3ce09172..c2f310ab 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongAdapter.java @@ -13,7 +13,7 @@ import android.widget.TextView; import com.kabouzeid.materialmusic.R; import com.kabouzeid.materialmusic.helper.SongDetailDialogHelper; -import com.kabouzeid.materialmusic.loader.SongFileLoader; +import com.kabouzeid.materialmusic.loader.SongFilePathLoader; import com.kabouzeid.materialmusic.misc.AppKeys; import com.kabouzeid.materialmusic.model.Song; import com.kabouzeid.materialmusic.ui.activities.tageditor.SongTagEditorActivity; @@ -62,7 +62,7 @@ public class SongAdapter extends ArrayAdapter { context.startActivity(intent); return true; case R.id.action_details: - String songFilePath = SongFileLoader.getSongFile(context, song.id); + String songFilePath = SongFilePathLoader.getSongFilePath(context, song.id); File songFile = new File(songFilePath); SongDetailDialogHelper.getDialog(context, songFile).show(); return true; diff --git a/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongViewListAdapter.java b/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongViewListAdapter.java index 90036742..484c07bd 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongViewListAdapter.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/adapter/songadapter/SongViewListAdapter.java @@ -12,7 +12,7 @@ import android.widget.TextView; import com.kabouzeid.materialmusic.R; import com.kabouzeid.materialmusic.helper.SongDetailDialogHelper; -import com.kabouzeid.materialmusic.loader.SongFileLoader; +import com.kabouzeid.materialmusic.loader.SongFilePathLoader; import com.kabouzeid.materialmusic.misc.AppKeys; import com.kabouzeid.materialmusic.model.Song; import com.kabouzeid.materialmusic.ui.activities.tageditor.SongTagEditorActivity; @@ -58,7 +58,7 @@ public class SongViewListAdapter extends SongAdapter { context.startActivity(intent); return true; case R.id.action_details: - String songFilePath = SongFileLoader.getSongFile(context, song.id); + String songFilePath = SongFilePathLoader.getSongFilePath(context, song.id); File songFile = new File(songFilePath); SongDetailDialogHelper.getDialog(context, songFile).show(); return true; diff --git a/app/src/main/java/com/kabouzeid/materialmusic/loader/AlbumLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/loader/AlbumLoader.java index 7b6ee76f..493357a4 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/loader/AlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/loader/AlbumLoader.java @@ -38,7 +38,11 @@ public class AlbumLoader { return albums; } - private static Cursor makeAlbumCursor(final Context context) { + public static final Cursor makeAlbumCursor(final Context context) { + return makeAlbumCursor(context, null); + } + + public static final Cursor makeAlbumCursor(final Context context, String selection) { return context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[]{ /* 0 */ @@ -53,25 +57,21 @@ public class AlbumLoader { MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS, /* 5 */ MediaStore.Audio.AlbumColumns.FIRST_YEAR - }, null, null, null); + }, selection, null, null); } public static Album getAlbum(Context context, int albumId) { - Cursor cursor = makeAlbumCursor(context); + Cursor cursor = makeAlbumCursor(context, BaseColumns._ID + "=" + albumId); Album album = new Album(); if (cursor != null && cursor.moveToFirst()) { - do { - final int id = cursor.getInt(0); - if (id == albumId) { - final String albumName = cursor.getString(1); - final String artist = cursor.getString(2); - final int artistId = cursor.getInt(3); - final int songCount = cursor.getInt(4); - final int year = cursor.getInt(5); + final int id = cursor.getInt(0); + final String albumName = cursor.getString(1); + final String artist = cursor.getString(2); + final int artistId = cursor.getInt(3); + final int songCount = cursor.getInt(4); + final int year = cursor.getInt(5); - album = new Album(id, albumName, artist, artistId, songCount, year); - } - } while (cursor.moveToNext()); + album = new Album(id, albumName, artist, artistId, songCount, year); } if (cursor != null) { @@ -81,21 +81,19 @@ public class AlbumLoader { } public static List getAlbums(Context context, String query) { - Cursor cursor = makeAlbumCursor(context); + Cursor cursor = makeAlbumCursor(context, MediaStore.Audio.AlbumColumns.ALBUM + " LIKE '%" + query + "%'"); List albums = new ArrayList<>(); if (cursor != null && cursor.moveToFirst()) { do { final String albumName = cursor.getString(1); - if (albumName.trim().toLowerCase().contains(query.trim().toLowerCase())) { - final int id = cursor.getInt(0); - final String artist = cursor.getString(2); - final int artistId = cursor.getInt(3); - final int songCount = cursor.getInt(4); - final int year = cursor.getInt(5); + final int id = cursor.getInt(0); + final String artist = cursor.getString(2); + final int artistId = cursor.getInt(3); + final int songCount = cursor.getInt(4); + final int year = cursor.getInt(5); - final Album album = new Album(id, albumName, artist, artistId, songCount, year); - albums.add(album); - } + final Album album = new Album(id, albumName, artist, artistId, songCount, year); + albums.add(album); } while (cursor.moveToNext()); } if (cursor != null) { diff --git a/app/src/main/java/com/kabouzeid/materialmusic/loader/ArtistLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/loader/ArtistLoader.java index 088bf33b..ffdb7c26 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/loader/ArtistLoader.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/loader/ArtistLoader.java @@ -37,6 +37,10 @@ public class ArtistLoader { } public static final Cursor makeArtistCursor(final Context context) { + return makeArtistCursor(context, null); + } + + public static final Cursor makeArtistCursor(final Context context, String selection) { return context.getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, new String[]{ /* 0 */ @@ -47,23 +51,19 @@ public class ArtistLoader { MediaStore.Audio.ArtistColumns.NUMBER_OF_ALBUMS, /* 3 */ MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS - }, null, null, null); + }, selection, null, null); } public static Artist getArtist(Context context, int artistId) { - Cursor cursor = makeArtistCursor(context); + Cursor cursor = makeArtistCursor(context, BaseColumns._ID + "=" + artistId); Artist artist = new Artist(); if (cursor != null && cursor.moveToFirst()) { - do { - final int id = cursor.getInt(0); - if (id == artistId) { - final String artistName = cursor.getString(1); - final int albumCount = cursor.getInt(2); - final int songCount = cursor.getInt(3); + final int id = cursor.getInt(0); + final String artistName = cursor.getString(1); + final int albumCount = cursor.getInt(2); + final int songCount = cursor.getInt(3); - artist = new Artist(id, artistName, albumCount, songCount); - } - } while (cursor.moveToNext()); + artist = new Artist(id, artistName, albumCount, songCount); } if (cursor != null) { @@ -73,19 +73,17 @@ public class ArtistLoader { } public static List getArtists(Context context, String query) { - Cursor cursor = makeArtistCursor(context); + Cursor cursor = makeArtistCursor(context, MediaStore.Audio.ArtistColumns.ARTIST + " LIKE '%" + query + "%'"); List artists = new ArrayList<>(); if (cursor != null && cursor.moveToFirst()) { do { final String artistName = cursor.getString(1); - if (artistName.trim().toLowerCase().contains(query.trim().toLowerCase())) { - final int id = cursor.getInt(0); - final int albumCount = cursor.getInt(2); - final int songCount = cursor.getInt(3); + final int id = cursor.getInt(0); + final int albumCount = cursor.getInt(2); + final int songCount = cursor.getInt(3); - final Artist artist = new Artist(id, artistName, albumCount, songCount); - artists.add(artist); - } + final Artist artist = new Artist(id, artistName, albumCount, songCount); + artists.add(artist); } while (cursor.moveToNext()); } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/loader/SongFileLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/loader/SongFileLoader.java deleted file mode 100644 index bda100c9..00000000 --- a/app/src/main/java/com/kabouzeid/materialmusic/loader/SongFileLoader.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.kabouzeid.materialmusic.loader; - -import android.content.Context; -import android.database.Cursor; -import android.provider.BaseColumns; -import android.provider.MediaStore; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by karim on 11.01.15. - */ -public class SongFileLoader { - public static final String TAG = SongFileLoader.class.getSimpleName(); - - public static List getSongFiles(Context context, List queryIds) { - Cursor cursor = makeSongFileCursor(context); - List songFiles = new ArrayList<>(); - if (cursor != null && cursor.moveToFirst()) { - do { - final int id = cursor.getInt(0); - if (queryIds.contains(id)) { - songFiles.add(cursor.getString(1)); - } - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - return songFiles; - } - - public static final Cursor makeSongFileCursor(final Context context) { - return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, - new String[]{ - /* 0 */ - BaseColumns._ID, - /* 1 */ - MediaStore.Audio.AudioColumns.DATA, - }, null, null, null); - } - - public static String getSongFile(Context context, int queryId) { - Cursor cursor = makeSongFileCursor(context); - String filePath = ""; - if (cursor != null && cursor.moveToFirst()) { - do { - final int id = cursor.getInt(0); - if (id == queryId) { - filePath = cursor.getString(1); - break; - } - } while (cursor.moveToNext()); - } - if (cursor != null) { - cursor.close(); - } - return filePath; - } -} diff --git a/app/src/main/java/com/kabouzeid/materialmusic/loader/SongFilePathLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/loader/SongFilePathLoader.java new file mode 100644 index 00000000..a41fc2d4 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/materialmusic/loader/SongFilePathLoader.java @@ -0,0 +1,60 @@ +package com.kabouzeid.materialmusic.loader; + +import android.content.Context; +import android.database.Cursor; +import android.provider.BaseColumns; +import android.provider.MediaStore; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by karim on 11.01.15. + */ +public class SongFilePathLoader { + public static final String TAG = SongFilePathLoader.class.getSimpleName(); + + public static List getSongFilePaths(Context context, int[] queryIds) { + StringBuilder selectionBuilder = new StringBuilder(); + selectionBuilder.append(BaseColumns._ID).append(" IN("); + for (int i = 0; i < queryIds.length; i++) { + selectionBuilder.append(queryIds[i]); + if (i < queryIds.length - 1) { + selectionBuilder.append(","); + } + } + selectionBuilder.append(")"); + Cursor cursor = makeSongFilePathCursor(context, selectionBuilder.toString()); + List songFiles = new ArrayList<>(); + if (cursor != null && cursor.moveToFirst()) { + do { + songFiles.add(cursor.getString(0)); + } while (cursor.moveToNext()); + } + + if (cursor != null) { + cursor.close(); + } + return songFiles; + } + + public static String getSongFilePath(Context context, int queryId){ + try { + return getSongFilePaths(context, new int[]{queryId}).get(0); + } catch (Exception e){ + return ""; + } + } + + public static final Cursor makeSongFilePathCursor(final Context context) { + return makeSongFilePathCursor(context, null); + } + + public static final Cursor makeSongFilePathCursor(final Context context, String selection) { + return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + new String[]{ + /* 0 */ + MediaStore.Audio.AudioColumns.DATA, + }, selection, null, null); + } +} diff --git a/app/src/main/java/com/kabouzeid/materialmusic/loader/SongLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/loader/SongLoader.java index b9368d70..302f5229 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/loader/SongLoader.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/loader/SongLoader.java @@ -43,7 +43,7 @@ public class SongLoader { return makeSongCursor(context, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1")); } - private static final Cursor makeSongCursor(final Context context, final String selection) { + public static final Cursor makeSongCursor(final Context context, final String selection) { return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{ /* 0 */ @@ -66,23 +66,21 @@ public class SongLoader { } public static List getSongs(Context context, String query) { - Cursor cursor = makeSongCursor(context); + Cursor cursor = makeSongCursor(context, MediaStore.Audio.AudioColumns.TITLE + " LIKE '%" + query + "%'"); List songs = new ArrayList<>(); if (cursor != null && cursor.moveToFirst()) { do { final String songName = cursor.getString(1); - if (songName.trim().toLowerCase().contains(query.trim().toLowerCase())) { - final int id = cursor.getInt(0); - final String artist = cursor.getString(2); - final String album = cursor.getString(3); - final long duration = cursor.getLong(4); - final int trackNumber = cursor.getInt(5); - final int artistId = cursor.getInt(6); - final int albumId = cursor.getInt(7); + final int id = cursor.getInt(0); + final String artist = cursor.getString(2); + final String album = cursor.getString(3); + final long duration = cursor.getLong(4); + final int trackNumber = cursor.getInt(5); + final int artistId = cursor.getInt(6); + final int albumId = cursor.getInt(7); - final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); - songs.add(song); - } + final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber); + songs.add(song); } while (cursor.moveToNext()); } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/MusicControllerActivity.java index a977f889..74dd9571 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/MusicControllerActivity.java @@ -24,7 +24,7 @@ import com.kabouzeid.materialmusic.helper.PlayingQueueDialogHelper; import com.kabouzeid.materialmusic.helper.SongDetailDialogHelper; import com.kabouzeid.materialmusic.interfaces.OnMusicRemoteEventListener; import com.kabouzeid.materialmusic.lastfm.artist.LastFMArtistImageLoader; -import com.kabouzeid.materialmusic.loader.SongFileLoader; +import com.kabouzeid.materialmusic.loader.SongFilePathLoader; import com.kabouzeid.materialmusic.misc.AppKeys; import com.kabouzeid.materialmusic.model.MusicRemoteEvent; import com.kabouzeid.materialmusic.model.Song; @@ -413,7 +413,7 @@ public class MusicControllerActivity extends AbsFabActivity implements OnMusicRe startActivity(intent); return true; case R.id.action_details: - String songFilePath = SongFileLoader.getSongFile(this, song.id); + String songFilePath = SongFilePathLoader.getSongFilePath(this, song.id); File songFile = new File(songFilePath); SongDetailDialogHelper.getDialog(this, songFile).show(); return true; diff --git a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/AlbumTagEditorActivity.java index c5555621..f3b6e682 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -12,7 +12,7 @@ import android.widget.Toast; import com.kabouzeid.materialmusic.R; import com.kabouzeid.materialmusic.lastfm.album.LastFMAlbumImageLoader; import com.kabouzeid.materialmusic.loader.AlbumSongLoader; -import com.kabouzeid.materialmusic.loader.SongFileLoader; +import com.kabouzeid.materialmusic.loader.SongFilePathLoader; import com.kabouzeid.materialmusic.model.Song; import com.kabouzeid.materialmusic.util.MusicUtil; import com.kabouzeid.materialmusic.util.Util; @@ -157,11 +157,11 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override protected List getSongPaths() { List songs = AlbumSongLoader.getAlbumSongList(this, getId()); - List songIds = new ArrayList<>(); - for (Song song : songs) { - songIds.add(song.id); + int[] songIds = new int[songs.size()]; + for (int i = 0; i < songs.size(); i++) { + songIds[i] = songs.get(i).id; } - return SongFileLoader.getSongFiles(this, songIds); + return SongFilePathLoader.getSongFilePaths(this, songIds); } @Override diff --git a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/SongTagEditorActivity.java b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/SongTagEditorActivity.java index b81cf929..c7053bac 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/SongTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/tageditor/SongTagEditorActivity.java @@ -7,7 +7,7 @@ import android.text.TextWatcher; import android.widget.EditText; import com.kabouzeid.materialmusic.R; -import com.kabouzeid.materialmusic.loader.SongFileLoader; +import com.kabouzeid.materialmusic.loader.SongFilePathLoader; import org.jaudiotagger.tag.FieldKey; @@ -103,9 +103,7 @@ public class SongTagEditorActivity extends AbsTagEditorActivity implements TextW @Override protected List getSongPaths() { - List tempIdList = new ArrayList<>(); - tempIdList.add(getId()); - return SongFileLoader.getSongFiles(this, tempIdList); + return SongFilePathLoader.getSongFilePaths(this, new int[]{getId()}); } @Override