Covert ids from int to long

MediaStore keeps ids as longs. It is unlikely that someone will have more than 65k songs... but you never know
This commit is contained in:
Christopher Eby 2010-04-02 12:33:15 -05:00
parent a3ded6499c
commit 0571a3189c
6 changed files with 47 additions and 45 deletions

View File

@ -47,10 +47,10 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
private List<SongData> 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<SongData> list, int limiter)
public ArrayFilterResults(List<SongData> 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<SongData> newValues = new ArrayList<SongData>();
@ -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()

View File

@ -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;
}

View File

@ -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) {

View File

@ -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);

View File

@ -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<SongData> {
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<SongData> albums = new SparseArray<SongData>(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);
}

View File

@ -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);