diff --git a/src/org/kreed/vanilla/MediaAdapter.java b/src/org/kreed/vanilla/MediaAdapter.java index 1f3634f9..1fc68a90 100644 --- a/src/org/kreed/vanilla/MediaAdapter.java +++ b/src/org/kreed/vanilla/MediaAdapter.java @@ -47,10 +47,10 @@ public class MediaAdapter extends BaseAdapter implements Filterable { private List mObjects; private SongData[] mAllObjects; private ArrayFilter mFilter; - private int mLimiter; + private long mLimiter; private SongData mLimiterData; private CharSequence mPublishedFilter; - private int mPublishedLimiter; + private long mPublishedLimiter; private int mPrimaryField; private int mSecondaryField; @@ -116,9 +116,9 @@ public class MediaAdapter extends BaseAdapter implements Filterable { private class ArrayFilter extends Filter { protected class ArrayFilterResults extends FilterResults { - public int limiter; + public long limiter; - public ArrayFilterResults(List list, int limiter) + public ArrayFilterResults(List list, long limiter) { values = list; count = list.size(); @@ -148,7 +148,7 @@ public class MediaAdapter extends BaseAdapter implements Filterable { } int limiterField = limiterField(mLimiter); - int limiterId = limiterId(mLimiter); + long limiterId = limiterId(mLimiter); int count = mAllObjects.length; ArrayList newValues = new ArrayList(); @@ -205,20 +205,22 @@ public class MediaAdapter extends BaseAdapter implements Filterable { notifyDataSetInvalidated(); } - public void setLimiter(int limiter, SongData data) + public void setLimiter(long limiter, SongData data) { mLimiter = limiter; mLimiterData = data; getFilter().filter(mPublishedFilter); } - public final int getLimiter() + public final long getLimiter() { return mLimiter; } public final int getLimiterField() { + if (mLimiter == -1) + return -1; return limiterField(mLimiter); } @@ -227,22 +229,22 @@ public class MediaAdapter extends BaseAdapter implements Filterable { return mLimiterData; } - private static final int FIELD_SHIFT = 29; - private static final int ID_MASK = ~(0x7 << FIELD_SHIFT); + private static final int ID_SHIFT = 2; + private static final int FIELD_MASK = ~(~0 << ID_SHIFT); - public static int makeLimiter(int field, SongData data) + public static long makeLimiter(int field, SongData data) { - return (field << FIELD_SHIFT) + data.getFieldId(field); + return (data.getFieldId(field) << ID_SHIFT) + (field & FIELD_MASK); } - public static int limiterField(int limiter) + public static int limiterField(long limiter) { - return limiter >> FIELD_SHIFT; + return (int)(limiter & FIELD_MASK); } - public static int limiterId(int limiter) + public static long limiterId(long limiter) { - return limiter & ID_MASK; + return limiter >> ID_SHIFT; } public int getCount() diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java index e90892b0..f7e16e15 100644 --- a/src/org/kreed/vanilla/PlaybackService.java +++ b/src/org/kreed/vanilla/PlaybackService.java @@ -622,21 +622,21 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On loadPreference((String)message.obj); break; case DO_ITEM: - int id = message.obj == null ? -1 : ((Intent)message.obj).getIntExtra("id", -1); + long id = message.obj == null ? -1 : ((Intent)message.obj).getLongExtra("id", -1); if (id == -1) { mQueuePos = 0; } else { Intent intent = (Intent)message.obj; boolean enqueue = intent.getIntExtra("action", ACTION_PLAY) == ACTION_ENQUEUE; - int[] songs = Song.getAllSongIdsWith(intent.getIntExtra("type", SongData.FIELD_TITLE), id); + long[] songs = Song.getAllSongIdsWith(intent.getIntExtra("type", SongData.FIELD_TITLE), id); if (songs == null || songs.length == 0) break; Random random = ContextApplication.getRandom(); for (int i = songs.length; --i != 0; ) { int j = random.nextInt(i + 1); - int tmp = songs[j]; + long tmp = songs[j]; songs[j] = songs[i]; songs[i] = tmp; } diff --git a/src/org/kreed/vanilla/PlaybackServiceState.java b/src/org/kreed/vanilla/PlaybackServiceState.java index f7af6f28..e8a9fb27 100644 --- a/src/org/kreed/vanilla/PlaybackServiceState.java +++ b/src/org/kreed/vanilla/PlaybackServiceState.java @@ -32,7 +32,7 @@ public class PlaybackServiceState { private static final long STATE_FILE_MAGIC = 0x8a9d3f9fca31L; public int savedIndex; - public int[] savedIds; + public long[] savedIds; public int savedSeek; public boolean load(Context context) @@ -44,9 +44,9 @@ public class PlaybackServiceState { int n = in.readInt(); if (n > 0) { - savedIds = new int[n]; + savedIds = new long[n]; for (int i = 0; i != n; ++i) - savedIds[i] = in.readInt(); + savedIds[i] = in.readLong(); savedSeek = in.readInt(); return true; @@ -71,7 +71,7 @@ public class PlaybackServiceState { int n = songs == null ? 0 : songs.size(); out.writeInt(n); for (int i = 0; i != n; ++i) - out.writeInt(songs.get(i).id); + out.writeLong(songs.get(i).id); out.writeInt(seek); out.close(); } catch (IOException e) { diff --git a/src/org/kreed/vanilla/Song.java b/src/org/kreed/vanilla/Song.java index f9b5b381..80ff9997 100644 --- a/src/org/kreed/vanilla/Song.java +++ b/src/org/kreed/vanilla/Song.java @@ -35,7 +35,7 @@ public class Song implements Parcelable { MediaStore.Audio.Media.ALBUM_ID }; - public int id; + public long id; public String path; public String coverPath; @@ -49,7 +49,7 @@ public class Song implements Parcelable { randomize(); } - public Song(int id) + public Song(long id) { this.id = id; } @@ -79,7 +79,7 @@ public class Song implements Parcelable { private void populate(ContentResolver resolver, Cursor cursor) { - id = cursor.getInt(0); + id = cursor.getLong(0); path = cursor.getString(1); title = cursor.getString(2); album = cursor.getString(3); @@ -98,7 +98,7 @@ public class Song implements Parcelable { } } - public static int[] getAllSongIds(String selection) + public static long[] getAllSongIds(String selection) { Uri media = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Audio.Media._ID }; @@ -118,7 +118,7 @@ public class Song implements Parcelable { if (count == 0) return null; - int[] songs = new int[count]; + long[] songs = new long[count]; while (--count != -1) { if (!cursor.moveToNext()) return null; @@ -129,10 +129,10 @@ public class Song implements Parcelable { return songs; } - public static int[] getAllSongIdsWith(int type, int id) + public static long[] getAllSongIdsWith(int type, long id) { if (type == SongData.FIELD_TITLE) - return new int[] { id }; + return new long[] { id }; else if (type == SongData.FIELD_ALBUM) return Song.getAllSongIds(MediaStore.Audio.Media.ALBUM_ID + '=' + id); else if (type == SongData.FIELD_ARTIST) @@ -177,7 +177,7 @@ public class Song implements Parcelable { public Song(Parcel in) { - id = in.readInt(); + id = in.readLong(); path = in.readString(); coverPath = in.readString(); title = in.readString(); @@ -187,7 +187,7 @@ public class Song implements Parcelable { public void writeToParcel(Parcel out, int flags) { - out.writeInt(id); + out.writeLong(id); out.writeString(path); out.writeString(coverPath); out.writeString(title); diff --git a/src/org/kreed/vanilla/SongData.java b/src/org/kreed/vanilla/SongData.java index e1ef8ca3..91737162 100644 --- a/src/org/kreed/vanilla/SongData.java +++ b/src/org/kreed/vanilla/SongData.java @@ -32,9 +32,9 @@ public class SongData { public static final int FIELD_ALBUM = 2; public static final int FIELD_TITLE = 3; - public int id; - public int albumId; - public int artistId; + public long id; + public long albumId; + public long artistId; public String title; public String album; @@ -42,11 +42,11 @@ public class SongData { private SongData(Cursor cursor) { - id = cursor.getInt(0); + id = cursor.getLong(0); title = cursor.getString(1); - albumId = cursor.getInt(2); + albumId = cursor.getLong(2); album = cursor.getString(3); - artistId = cursor.getInt(4); + artistId = cursor.getLong(4); artist = cursor.getString(5); } @@ -63,7 +63,7 @@ public class SongData { return null; } - public int getFieldId(int field) + public long getFieldId(int field) { switch (field) { case FIELD_TITLE: @@ -121,7 +121,7 @@ public class SongData { return a.album.compareToIgnoreCase(b.album); } - public int getId(SongData song) + public long getId(SongData song) { return song.albumId; } @@ -133,14 +133,14 @@ public class SongData { return a.artist.compareToIgnoreCase(b.artist); } - public int getId(SongData song) + public long getId(SongData song) { return song.artistId; } } public static interface IdComparator extends Comparator { - public int getId(SongData song); + public long getId(SongData song); } public static SongData[] filter(SongData[] songs, IdComparator comparator) @@ -148,7 +148,7 @@ public class SongData { SparseArray albums = new SparseArray(songs.length); for (int i = songs.length; --i != -1; ) { SongData song = songs[i]; - int id = comparator.getId(song); + int id = (int)comparator.getId(song); if (albums.get(id) == null) albums.put(id, song); } diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java index c7303217..12a8df80 100644 --- a/src/org/kreed/vanilla/SongSelector.java +++ b/src/org/kreed/vanilla/SongSelector.java @@ -164,7 +164,7 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe { int field = view.getPrimaryField(); SongData data = view.getExpanderData(); - int limiter = MediaAdapter.makeLimiter(field, data); + long limiter = MediaAdapter.makeLimiter(field, data); for (int i = field; i != 3; ++i) { MediaAdapter adapter = getAdapter(i); @@ -216,7 +216,7 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe int field = adapter.getLimiterField(); SongData data = adapter.getLimiterData(); - if (data == null) + if (field == -1) return; LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); @@ -251,7 +251,7 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe } else { int field = (Integer)view.getTag() - 1; SongData data = getAdapter(mTabHost.getCurrentTab()).getLimiterData(); - int limiter = field == 0 ? -1 : MediaAdapter.makeLimiter(field, data); + long limiter = field == 0 ? -1 : MediaAdapter.makeLimiter(field, data); for (int i = 3; --i != -1; ) { MediaAdapter adapter = getAdapter(i);