diff --git a/res/values/ids.xml b/res/values/ids.xml
index abd10379..25044267 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -1,5 +1,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/src/org/kreed/vanilla/AbstractAdapter.java b/src/org/kreed/vanilla/AbstractAdapter.java
index 2cd66175..31375f16 100644
--- a/src/org/kreed/vanilla/AbstractAdapter.java
+++ b/src/org/kreed/vanilla/AbstractAdapter.java
@@ -43,14 +43,20 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
public static final int ONE_LINE = 0x1;
private Context mContext;
+ private OnClickListener mExpanderListener;
+
private List mObjects;
private Song[] mAllObjects;
private ArrayFilter mFilter;
+ private int mLimiterField = -1;
+ private int mLimiterId = -1;
+ private CharSequence mLastFilter;
+
private float mSize;
private int mPadding;
+
private int mDrawFlags;
private int mMediaField;
- private OnClickListener mExpanderListener;
public AbstractAdapter(Context context, Song[] allObjects, int drawFlags, int mediaField)
{
@@ -100,8 +106,7 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
button.setImageResource(R.drawable.expander_arrow);
button.setId(3);
button.setLayoutParams(params);
- button.setTag(R.id.list, mMediaField);
- button.setTag(R.id.song, get(position));
+ button.setTag(R.id.field, mMediaField);
button.setOnClickListener(mExpanderListener);
view.addView(button);
@@ -135,6 +140,8 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
}
updateText(position, (TextView)view.findViewById(1),(TextView)view.findViewById(2));
+ if (mExpanderListener != null)
+ view.findViewById(3).setTag(R.id.id, (int)getItemId(position));
return view;
}
@@ -168,14 +175,19 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
{
FilterResults results = new FilterResults();
- if (filter == null || filter.length() == 0) {
+ boolean noFilter = filter == null || filter.length() == 0;
+
+ if (noFilter && mLimiterField == -1) {
results.values = Arrays.asList(mAllObjects);
results.count = mAllObjects.length;
} else {
- String[] words = filter.toString().split("\\s+");
- Matcher[] matchers = new Matcher[words.length];
- for (int i = words.length; --i != -1; )
- matchers[i] = createMatcher(words[i]);
+ Matcher[] matchers = null;
+ if (!noFilter) {
+ String[] words = filter.toString().split("\\s+");
+ matchers = new Matcher[words.length];
+ for (int i = words.length; --i != -1; )
+ matchers[i] = createMatcher(words[i]);
+ }
int count = mAllObjects.length;
ArrayList newValues = new ArrayList();
@@ -185,14 +197,19 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
for (int i = 0; i != count; ++i) {
Song song = mAllObjects[i];
- for (int j = matchers.length; --j != -1; ) {
- if (matchers[j].reset(song.artist).find())
- continue;
- if (mMediaField > 1 && matchers[j].reset(song.album).find())
- continue;
- if (mMediaField > 2 && matchers[j].reset(song.title).find())
- continue;
- continue outer;
+ if (mLimiterField != -1 && song.getFieldId(mLimiterField) != mLimiterId)
+ continue;
+
+ if (!noFilter) {
+ for (int j = matchers.length; --j != -1; ) {
+ if (matchers[j].reset(song.artist).find())
+ continue;
+ if (mMediaField > 1 && matchers[j].reset(song.album).find())
+ continue;
+ if (mMediaField > 2 && matchers[j].reset(song.title).find())
+ continue;
+ continue outer;
+ }
}
newValues.add(song);
@@ -212,6 +229,7 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
protected void publishResults(CharSequence constraint, FilterResults results)
{
mObjects = (List)results.values;
+ mLastFilter = constraint;
if (results.count == 0)
notifyDataSetInvalidated();
else
@@ -219,6 +237,17 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable
}
}
+ public void setLimiter(int field, int id)
+ {
+ mLimiterField = field;
+ mLimiterId = id;
+
+ mObjects = new ArrayList();
+ notifyDataSetInvalidated();
+
+ getFilter().filter(mLastFilter);
+ }
+
public int getCount()
{
if (mObjects == null) {
diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java
index 7c3fd725..1b4f6310 100644
--- a/src/org/kreed/vanilla/SongSelector.java
+++ b/src/org/kreed/vanilla/SongSelector.java
@@ -157,9 +157,14 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick
if (view == mClearButton) {
mTextFilter.setText("");
} else {
- Object list = view.getTag(R.id.list);
- if (list != null)
- mTabHost.setCurrentTab((Integer)list);
+ Object fieldObj = view.getTag(R.id.field);
+ if (fieldObj != null) {
+ int field = (Integer)fieldObj;
+ int id = (Integer)view.getTag(R.id.id);
+ mTabHost.setCurrentTab(field);
+ for (int i = field; i != 3; ++i)
+ mAdapters[i].setLimiter(field, id);
+ }
}
}