Allow a limiter set by an expander to be removed

This commit is contained in:
Christopher Eby 2010-03-11 01:04:30 -06:00
parent 1d6ca04568
commit 7c087cc6af
5 changed files with 89 additions and 10 deletions

View File

@ -37,6 +37,11 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fastScrollEnabled="true" />
<LinearLayout
android:id="@+id/limiter_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|left" />
</FrameLayout>
</LinearLayout>
</TabHost>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="id" />
<item type="id" name="media" />
<item type="id" name="field" />
<item type="id" name="limiter_field" />
</resources>

View File

@ -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<Song> newValues = new ArrayList<Song>();
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<Song>();
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) {

View File

@ -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);
}
}

View File

@ -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();
}
}
}
}