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

View File

@ -108,33 +108,6 @@ public class SongData {
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 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)
{
SongData data = view.getExpanderData();
int field = view.getPrimaryField();
SongData.Field limiter = new SongData.Field(field, data);
int hashCode = limiter.hashCode();
SongData data = view.getExpanderData();
int limiter = MediaAdapter.makeLimiter(field, data);
for (int i = field; i != 3; ++i) {
MediaAdapter tabAdapter = getAdapter(i);
SongData.Field tabLimiter = tabAdapter.getLimiter();
if (tabLimiter == null || tabLimiter.hashCode() != hashCode)
tabAdapter.hideAll();
tabAdapter.setLimiter(limiter);
MediaAdapter adapter = getAdapter(i);
if (adapter.getLimiter() != limiter) {
adapter.hideAll();
adapter.setLimiter(limiter, data);
}
}
mTabHost.setCurrentTab(field);
}
@ -216,20 +217,21 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick
if (adapter == null)
return;
SongData.Field limiter = adapter.getLimiter();
if (limiter == null)
int field = adapter.getLimiterField();
SongData data = adapter.getLimiterData();
if (data == null)
return;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
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);
background.setCornerRadius(5);
TextView view = new TextView(this);
view.setSingleLine();
view.setEllipsize(TextUtils.TruncateAt.MARQUEE);
view.setText(limiter.data.getField(i) + " | X");
view.setText(data.getField(i) + " | X");
view.setTextColor(Color.WHITE);
view.setBackgroundDrawable(background);
view.setLayoutParams(params);
@ -250,15 +252,16 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick
if (view == mClearButton) {
mTextFilter.setText("");
} else {
SongData.Field limiter = getAdapter(mTabHost.getCurrentTab()).getLimiter();
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; ) {
MediaAdapter adapter = getAdapter(i);
SongData.Field currentLimiter = adapter.getLimiter();
if (currentLimiter != null && currentLimiter.field > field)
adapter.setLimiter(limiter);
if (adapter.getLimiterField() > field)
adapter.setLimiter(limiter, data);
}
updateLimiterViews();
}
}