From d1aa74df89a899c76b531fdde304df2363124809 Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Sat, 20 Mar 2010 18:47:53 -0500 Subject: [PATCH] Remove SongData.Field --- src/org/kreed/vanilla/MediaAdapter.java | 57 +++++++++++++++++++------ src/org/kreed/vanilla/SongData.java | 27 ------------ src/org/kreed/vanilla/SongSelector.java | 37 ++++++++-------- 3 files changed, 63 insertions(+), 58 deletions(-) diff --git a/src/org/kreed/vanilla/MediaAdapter.java b/src/org/kreed/vanilla/MediaAdapter.java index 4a5d8a0e..1f3634f9 100644 --- a/src/org/kreed/vanilla/MediaAdapter.java +++ b/src/org/kreed/vanilla/MediaAdapter.java @@ -47,7 +47,8 @@ public class MediaAdapter extends BaseAdapter implements Filterable { private List 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 list, int limiterHash) + public ArrayFilterResults(List 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 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 newValues = new ArrayList(); @@ -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)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) { diff --git a/src/org/kreed/vanilla/SongData.java b/src/org/kreed/vanilla/SongData.java index 3cb7c123..e1ef8ca3 100644 --- a/src/org/kreed/vanilla/SongData.java +++ b/src/org/kreed/vanilla/SongData.java @@ -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 { public int compare(SongData a, SongData b) { diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java index 24c53927..e3aa50fb 100644 --- a/src/org/kreed/vanilla/SongSelector.java +++ b/src/org/kreed/vanilla/SongSelector.java @@ -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(); } }