From 7c087cc6af03787be8936806614fd8e4ecda486a Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Thu, 11 Mar 2010 01:04:30 -0600 Subject: [PATCH] Allow a limiter set by an expander to be removed --- res/layout/song_selector.xml | 5 ++ res/values/ids.xml | 3 +- src/org/kreed/vanilla/MediaAdapter.java | 20 +++++-- src/org/kreed/vanilla/MediaView.java | 2 +- src/org/kreed/vanilla/SongSelector.java | 69 +++++++++++++++++++++++-- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/res/layout/song_selector.xml b/res/layout/song_selector.xml index 01356dc5..0eef1e08 100644 --- a/res/layout/song_selector.xml +++ b/res/layout/song_selector.xml @@ -37,6 +37,11 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:fastScrollEnabled="true" /> + diff --git a/res/values/ids.xml b/res/values/ids.xml index 25044267..1aacb351 100644 --- a/res/values/ids.xml +++ b/res/values/ids.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file diff --git a/src/org/kreed/vanilla/MediaAdapter.java b/src/org/kreed/vanilla/MediaAdapter.java index 768ad4fd..dbf2c46f 100644 --- a/src/org/kreed/vanilla/MediaAdapter.java +++ b/src/org/kreed/vanilla/MediaAdapter.java @@ -41,7 +41,7 @@ public class MediaAdapter extends BaseAdapter implements Filterable { private Song[] mAllObjects; private ArrayFilter mFilter; private int mLimiterField = -1; - private int mLimiterId = -1; + private Song mLimiterMedia; private CharSequence mLastFilter; private int mPrimaryField; @@ -135,6 +135,8 @@ public class MediaAdapter extends BaseAdapter implements Filterable { matchers[i] = createMatcher(words[i]); } + int limiterId = mLimiterField == -1 ? 0 : mLimiterMedia.getFieldId(mLimiterField); + int count = mAllObjects.length; ArrayList newValues = new ArrayList(); newValues.ensureCapacity(count); @@ -143,7 +145,7 @@ public class MediaAdapter extends BaseAdapter implements Filterable { for (int i = 0; i != count; ++i) { Song song = mAllObjects[i]; - if (mLimiterField != -1 && song.getFieldId(mLimiterField) != mLimiterId) + if (mLimiterField != -1 && song.getFieldId(mLimiterField) != limiterId) continue; if (!noFilter) { @@ -183,10 +185,10 @@ public class MediaAdapter extends BaseAdapter implements Filterable { } } - public void setLimiter(int field, int id) + public void setLimiter(int field, Song media) { mLimiterField = field; - mLimiterId = id; + mLimiterMedia = media; mObjects = new ArrayList(); notifyDataSetInvalidated(); @@ -194,6 +196,16 @@ public class MediaAdapter extends BaseAdapter implements Filterable { getFilter().filter(mLastFilter); } + public int getLimiterField() + { + return mLimiterField; + } + + public Song getLimiterMedia() + { + return mLimiterMedia; + } + public int getCount() { if (mObjects == null) { diff --git a/src/org/kreed/vanilla/MediaView.java b/src/org/kreed/vanilla/MediaView.java index 3f7805a4..dbca9414 100644 --- a/src/org/kreed/vanilla/MediaView.java +++ b/src/org/kreed/vanilla/MediaView.java @@ -141,6 +141,6 @@ public class MediaView extends ViewGroup { if (mSecondaryLine != null) mSecondaryLine.setText(song.getField(secondaryField)); if (mExpander != null) - mExpander.setTag(R.id.id, song.getFieldId(primaryField)); + mExpander.setTag(R.id.media, song); } } \ No newline at end of file diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java index 9ea8c45d..9311d40d 100644 --- a/src/org/kreed/vanilla/SongSelector.java +++ b/src/org/kreed/vanilla/SongSelector.java @@ -26,28 +26,34 @@ import android.app.TabActivity; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.drawable.PaintDrawable; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.text.Editable; import android.text.InputType; +import android.text.TextUtils; import android.text.TextWatcher; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.BaseAdapter; +import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TabHost; import android.widget.TextView; import android.widget.Toast; -public class SongSelector extends TabActivity implements AdapterView.OnItemClickListener, TextWatcher, View.OnClickListener { +public class SongSelector extends TabActivity implements AdapterView.OnItemClickListener, TextWatcher, View.OnClickListener, TabHost.OnTabChangeListener { private TabHost mTabHost; private TextView mTextFilter; private View mClearButton; + private ViewGroup mLimiters; private MediaAdapter[] mAdapters = new MediaAdapter[3]; private int mDefaultAction; @@ -71,6 +77,7 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick setContentView(R.layout.song_selector); mTabHost = getTabHost(); + mTabHost.setOnTabChangedListener(this); Resources res = getResources(); mTabHost.addTab(mTabHost.newTabSpec("tab_artists").setIndicator(res.getText(R.string.artists), res.getDrawable(R.drawable.tab_artists)).setContent(R.id.artist_list)); @@ -83,6 +90,8 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick mClearButton = findViewById(R.id.clear_button); mClearButton.setOnClickListener(this); + mLimiters = (ViewGroup)findViewById(R.id.limiter_layout); + SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); int inputType; if (settings.getBoolean("phone_input", false)) @@ -164,6 +173,47 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick adapter.getFilter().filter(s); } + private void updateLimiterViews() + { + if (mLimiters == null) + return; + + mLimiters.removeAllViews(); + + MediaAdapter adapter = mAdapters[mTabHost.getCurrentTab()]; + if (adapter == null) + return; + + int field = adapter.getLimiterField(); + if (field == -1) + return; + + Song media = adapter.getLimiterMedia(); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + params.leftMargin = 5; + for (int i = Song.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(media.getField(i) + " | X"); + view.setTextColor(Color.WHITE); + view.setBackgroundDrawable(background); + view.setLayoutParams(params); + view.setPadding(5, 2, 5, 2); + view.setTag(R.id.limiter_field, i); + view.setOnClickListener(this); + mLimiters.addView(view); + } + } + + public void onTabChanged(String tabId) + { + updateLimiterViews(); + } + public void onClick(View view) { if (view == mClearButton) { @@ -172,10 +222,21 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick 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); + Song media = (Song)view.getTag(R.id.media); for (int i = field; i != 3; ++i) - mAdapters[i].setLimiter(field, id); + mAdapters[i].setLimiter(field, media); + mTabHost.setCurrentTab(field); + } else { + fieldObj = view.getTag(R.id.limiter_field); + if (fieldObj != null) { + int field = (Integer)fieldObj; + int newField = field == Song.FIELD_ARTIST ? -1 : field - 1; + for (int i = mAdapters.length; --i != -1; ) { + if (mAdapters[i].getLimiterField() >= field) + mAdapters[i].setLimiter(newField, mAdapters[i].getLimiterMedia()); + } + updateLimiterViews(); + } } } }