Remove SongData.Field

This commit is contained in:
Christopher Eby 2010-03-20 18:47:53 -05:00
parent 6878e6e37a
commit d1aa74df89
3 changed files with 63 additions and 58 deletions

View File

@ -47,7 +47,8 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
private List<SongData> mObjects; private List<SongData> mObjects;
private SongData[] mAllObjects; private SongData[] mAllObjects;
private ArrayFilter mFilter; private ArrayFilter mFilter;
private SongData.Field mLimiter; private int mLimiter;
private SongData mLimiterData;
private CharSequence mPublishedFilter; private CharSequence mPublishedFilter;
private int mPublishedLimiter; private int mPublishedLimiter;
@ -115,13 +116,13 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
private class ArrayFilter extends Filter { private class ArrayFilter extends Filter {
protected class ArrayFilterResults extends FilterResults { protected class ArrayFilterResults extends FilterResults {
public int limiterHash; public int limiter;
public ArrayFilterResults(List<SongData> list, int limiterHash) public ArrayFilterResults(List<SongData> list, int limiter)
{ {
values = list; values = list;
count = list.size(); count = list.size();
this.limiterHash = limiterHash; this.limiter = limiter;
} }
} }
@ -129,14 +130,13 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
protected FilterResults performFiltering(CharSequence filter) protected FilterResults performFiltering(CharSequence filter)
{ {
List<SongData> list; List<SongData> list;
int limiterHash = mLimiter == null ? -1 : mLimiter.hashCode();
if (filter != null && filter.length() == 0) if (filter != null && filter.length() == 0)
filter = null; filter = null;
if ((filter == null && mPublishedFilter == null || mPublishedFilter != null && mPublishedFilter.equals(filter)) && mPublishedLimiter == limiterHash) { if ((filter == null && mPublishedFilter == null || mPublishedFilter != null && mPublishedFilter.equals(filter)) && mLimiter == mPublishedLimiter) {
list = mObjects; list = mObjects;
} else if (filter == null && mLimiter == null) { } else if (filter == null && mLimiter == -1) {
list = Arrays.asList(mAllObjects); list = Arrays.asList(mAllObjects);
} else { } else {
Matcher[] matchers = null; Matcher[] matchers = null;
@ -147,8 +147,8 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
matchers[i] = createMatcher(words[i]); matchers[i] = createMatcher(words[i]);
} }
int limiterField = mLimiter == null ? -1 : mLimiter.field; int limiterField = limiterField(mLimiter);
int limiterId = mLimiter == null ? -1 : mLimiter.data.getFieldId(limiterField); int limiterId = limiterId(mLimiter);
int count = mAllObjects.length; int count = mAllObjects.length;
ArrayList<SongData> newValues = new ArrayList<SongData>(); ArrayList<SongData> newValues = new ArrayList<SongData>();
@ -158,7 +158,7 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
for (int i = 0; i != count; ++i) { for (int i = 0; i != count; ++i) {
SongData song = mAllObjects[i]; SongData song = mAllObjects[i];
if (limiterField != -1 && song.getFieldId(limiterField) != limiterId) if (mLimiter != -1 && song.getFieldId(limiterField) != limiterId)
continue; continue;
if (filter != null) { if (filter != null) {
@ -181,7 +181,7 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
list = newValues; list = newValues;
} }
return new ArrayFilterResults(list, limiterHash); return new ArrayFilterResults(list, mLimiter);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -190,7 +190,7 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
{ {
mObjects = (List<SongData>)results.values; mObjects = (List<SongData>)results.values;
mPublishedFilter = filter == null || filter.length() == 0 ? null : filter; mPublishedFilter = filter == null || filter.length() == 0 ? null : filter;
mPublishedLimiter = ((ArrayFilterResults)results).limiterHash; mPublishedLimiter = ((ArrayFilterResults)results).limiter;
if (results.count == 0) if (results.count == 0)
notifyDataSetInvalidated(); notifyDataSetInvalidated();
@ -205,17 +205,46 @@ public class MediaAdapter extends BaseAdapter implements Filterable {
notifyDataSetInvalidated(); notifyDataSetInvalidated();
} }
public void setLimiter(SongData.Field limiter) public void setLimiter(int limiter, SongData data)
{ {
mLimiter = limiter; mLimiter = limiter;
mLimiterData = data;
getFilter().filter(mPublishedFilter); getFilter().filter(mPublishedFilter);
} }
public SongData.Field getLimiter() public final int getLimiter()
{ {
return mLimiter; return mLimiter;
} }
public final int getLimiterField()
{
return limiterField(mLimiter);
}
public final SongData getLimiterData()
{
return mLimiterData;
}
private static final int FIELD_SHIFT = 29;
private static final int ID_MASK = ~(0x7 << FIELD_SHIFT);
public static int makeLimiter(int field, SongData data)
{
return (field << FIELD_SHIFT) + data.getFieldId(field);
}
public static int limiterField(int limiter)
{
return limiter >> FIELD_SHIFT;
}
public static int limiterId(int limiter)
{
return limiter & ID_MASK;
}
public int getCount() public int getCount()
{ {
if (mObjects == null) { if (mObjects == null) {

View File

@ -108,33 +108,6 @@ public class SongData {
return songs; return songs;
} }
public static class Field {
public Field(int field, SongData data)
{
this.field = field;
this.data = data;
}
public Field(Field other)
{
this.field = other.field;
this.data = other.data;
}
public Field()
{
}
@Override
public int hashCode()
{
return (field << 29) + data.getFieldId(field);
}
public int field;
public SongData data;
}
public static class TitleComparator implements Comparator<SongData> { public static class TitleComparator implements Comparator<SongData> {
public int compare(SongData a, SongData b) public int compare(SongData a, SongData b)
{ {

View File

@ -167,17 +167,18 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick
private void expand(MediaAdapter.MediaView view) private void expand(MediaAdapter.MediaView view)
{ {
SongData data = view.getExpanderData();
int field = view.getPrimaryField(); int field = view.getPrimaryField();
SongData.Field limiter = new SongData.Field(field, data); SongData data = view.getExpanderData();
int hashCode = limiter.hashCode(); int limiter = MediaAdapter.makeLimiter(field, data);
for (int i = field; i != 3; ++i) { for (int i = field; i != 3; ++i) {
MediaAdapter tabAdapter = getAdapter(i); MediaAdapter adapter = getAdapter(i);
SongData.Field tabLimiter = tabAdapter.getLimiter(); if (adapter.getLimiter() != limiter) {
if (tabLimiter == null || tabLimiter.hashCode() != hashCode) adapter.hideAll();
tabAdapter.hideAll(); adapter.setLimiter(limiter, data);
tabAdapter.setLimiter(limiter); }
} }
mTabHost.setCurrentTab(field); mTabHost.setCurrentTab(field);
} }
@ -216,20 +217,21 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick
if (adapter == null) if (adapter == null)
return; return;
SongData.Field limiter = adapter.getLimiter(); int field = adapter.getLimiterField();
if (limiter == null) SongData data = adapter.getLimiterData();
if (data == null)
return; return;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = 5; params.leftMargin = 5;
for (int i = SongData.FIELD_ARTIST; i <= limiter.field; ++i) { for (int i = SongData.FIELD_ARTIST; i <= field; ++i) {
PaintDrawable background = new PaintDrawable(Color.GRAY); PaintDrawable background = new PaintDrawable(Color.GRAY);
background.setCornerRadius(5); background.setCornerRadius(5);
TextView view = new TextView(this); TextView view = new TextView(this);
view.setSingleLine(); view.setSingleLine();
view.setEllipsize(TextUtils.TruncateAt.MARQUEE); view.setEllipsize(TextUtils.TruncateAt.MARQUEE);
view.setText(limiter.data.getField(i) + " | X"); view.setText(data.getField(i) + " | X");
view.setTextColor(Color.WHITE); view.setTextColor(Color.WHITE);
view.setBackgroundDrawable(background); view.setBackgroundDrawable(background);
view.setLayoutParams(params); view.setLayoutParams(params);
@ -250,15 +252,16 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick
if (view == mClearButton) { if (view == mClearButton) {
mTextFilter.setText(""); mTextFilter.setText("");
} else { } else {
SongData.Field limiter = getAdapter(mTabHost.getCurrentTab()).getLimiter();
int field = (Integer)view.getTag() - 1; int field = (Integer)view.getTag() - 1;
limiter = limiter.field == 0 ? null : new SongData.Field(field, limiter.data); SongData data = getAdapter(mTabHost.getCurrentTab()).getLimiterData();
int limiter = field == 0 ? -1 : MediaAdapter.makeLimiter(field, data);
for (int i = 3; --i != -1; ) { for (int i = 3; --i != -1; ) {
MediaAdapter adapter = getAdapter(i); MediaAdapter adapter = getAdapter(i);
SongData.Field currentLimiter = adapter.getLimiter(); if (adapter.getLimiterField() > field)
if (currentLimiter != null && currentLimiter.field > field) adapter.setLimiter(limiter, data);
adapter.setLimiter(limiter);
} }
updateLimiterViews(); updateLimiterViews();
} }
} }