Refactor filter adapter to not be expandable

pull/14/head
Sam Bosley 13 years ago
parent 9d237bf81f
commit 50eebc46b8

@ -2,7 +2,7 @@ package com.todoroo.astrid.locale;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ExpandableListActivity;
import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
@ -10,8 +10,8 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Spinner;
import com.timsu.astrid.R;
@ -33,7 +33,7 @@ import com.twofortyfouram.SharedResources;
* @author Tim Su <tim@todoroo.com>
*
*/
public final class LocaleEditAlerts extends ExpandableListActivity {
public final class LocaleEditAlerts extends ListActivity {
// --- locale constants
@ -156,7 +156,7 @@ public final class LocaleEditAlerts extends ExpandableListActivity {
// if we match a selection, make it selected
final String finalSelection = selectionToMatch;
adapter = new FilterAdapter(this, getExpandableListView(), R.layout.filter_adapter_row, true) {
adapter = new FilterAdapter(this, getListView(), R.layout.filter_adapter_row, true) {
@Override
public void onReceiveFilter(FilterListItem item) {
if(adapter.getSelection() != null || finalSelection == null)
@ -197,32 +197,9 @@ public final class LocaleEditAlerts extends ExpandableListActivity {
}
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
FilterListItem item = (FilterListItem) adapter.getChild(groupPosition,
childPosition);
if(item instanceof Filter) {
adapter.setSelection(item);
}
return true;
}
@Override
public void onGroupExpand(int groupPosition) {
FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
if(item instanceof Filter)
adapter.setSelection(item);
else if(item instanceof FilterCategory)
adapter.saveExpansionSetting((FilterCategory) item, true);
}
@Override
public void onGroupCollapse(int groupPosition) {
FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
if(item instanceof Filter)
adapter.setSelection(item);
else if(item instanceof FilterCategory)
adapter.saveExpansionSetting((FilterCategory) item, false);
public void onListItemClick(ListView parent, View v, int position, long id) {
Filter item = adapter.getItem(position);
adapter.setSelection(item);
}
/**

@ -30,7 +30,7 @@
<!-- List -->
<ExpandableListView android:id="@android:id/list"
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"

@ -30,7 +30,7 @@
<!-- List -->
<ExpandableListView android:id="@android:id/list"
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"

@ -28,7 +28,7 @@
android:layout_margin="10px"
android:background="@drawable/locale_border">
<ExpandableListView android:id="@android:id/list"
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"

@ -8,7 +8,7 @@
android:background="@drawable/background_gradient">
<!-- List -->
<ExpandableListView android:id="@android:id/list"
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"

@ -270,7 +270,7 @@
<style name="TextAppearance.FLA_Filter">
<item name="android:textSize">18sp</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">?attr/asTextColor</item>
<item name="android:textColor">@android:color/white</item>
</style>
<style name="TextAppearance.FLA_Header" parent="TextAppearance.FLA_Filter">

@ -15,6 +15,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.support.v4.app.SupportActivity;
import android.support.v4.view.Menu;
import android.support.v4.view.MenuItem;
@ -28,11 +29,11 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.FrameLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
@ -48,7 +49,6 @@ import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.core.CustomFilterActivity;
import com.todoroo.astrid.data.Task;
@ -63,7 +63,7 @@ import com.todoroo.astrid.tags.TagsPlugin;
* @author Tim Su <tim@todoroo.com>
*
*/
public class FilterListActivity extends ExpandableListFragment {
public class FilterListActivity extends ListFragment {
public static final String TAG_FILTERLIST_FRAGMENT = "filterlist_fragment";
@ -172,8 +172,6 @@ public class FilterListActivity extends ExpandableListFragment {
}
});
onContentChanged();
onNewIntent(getActivity().getIntent());
Fragment tasklistFrame = getFragmentManager().findFragmentByTag(TaskListActivity.TAG_TASKLIST_FRAGMENT);
@ -181,8 +179,8 @@ public class FilterListActivity extends ExpandableListFragment {
if (mDualFragments) {
// In dual-pane mode, the list view highlights the selected item.
getExpandableListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getExpandableListView().setItemsCanFocus(false);
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setItemsCanFocus(false);
}
}
@ -279,63 +277,45 @@ public class FilterListActivity extends ExpandableListFragment {
/** Sets up the coach list adapter */
protected void setUpList() {
adapter = new FilterAdapter(getActivity(), getExpandableListView(),
adapter = new FilterAdapter(getActivity(), getListView(),
R.layout.filter_adapter_row, false);
setListAdapter(adapter);
registerForContextMenu(getExpandableListView());
registerForContextMenu(getListView());
}
@Override
public void setListAdapter(ListAdapter adapter) {
super.setListAdapter(adapter);
Activity activity = getActivity();
if (activity instanceof TaskListWrapperActivity && adapter instanceof FilterAdapter) {
((TaskListWrapperActivity) activity).setPopoverAdapter((FilterAdapter) adapter);
}
}
/* ======================================================================
* ============================================================== actions
* ====================================================================== */
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
public void onListItemClick(ListView parent, View v, int position, long id) {
// if (mDualFragments)
// {
// setSelectedChild(groupPosition, childPosition, false);
// setItemChecked((int) getSelectedPosition(), true);
// }
FilterListItem item = (FilterListItem) adapter.getChild(groupPosition,
childPosition);
return mListener.onFilterItemClicked(item);
}
@Override
public void onGroupExpand(int groupPosition) {
FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
mListener.onFilterItemClicked(item);
if(item instanceof FilterCategory)
adapter.saveExpansionSetting((FilterCategory) item, true);
}
@Override
public void onGroupCollapse(int groupPosition) {
FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
Filter item = adapter.getItem(position);
mListener.onFilterItemClicked(item);
if(item instanceof FilterCategory)
adapter.saveExpansionSetting((FilterCategory) item, false);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuInfo;
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
FilterListItem item;
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
item = (FilterListItem) adapter.getChild(groupPos, childPos);
} else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
item = (FilterListItem) adapter.getGroup(groupPos);
} else {
return;
}
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
Filter item = adapter.getItem(info.position);
android.view.MenuItem menuItem;
@ -420,7 +400,7 @@ public class FilterListActivity extends ExpandableListFragment {
return true;
}
case CONTEXT_MENU_SHORTCUT: {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo();
AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
final Intent shortcutIntent = item.getIntent();
FilterListItem filter = ((FilterAdapter.ViewHolder)info.targetView.getTag()).item;
if(filter instanceof Filter)

@ -6,12 +6,12 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.ui.ListDropdownPopover;
@ -22,7 +22,7 @@ public class TaskListWrapperActivity extends AstridWrapperActivity {
private View listsNav;
private TextView lists;
private ArrayAdapter<Filter> listDropdownAdapter;
private FilterAdapter listDropdownAdapter;
private ListDropdownPopover popover;
private final OnItemClickListener listClickListener = new OnItemClickListener() {
@ -102,7 +102,7 @@ public class TaskListWrapperActivity extends AstridWrapperActivity {
super.onResume();
}
public void updateDropdownNav(ArrayAdapter<Filter> arrayAdapter) {
public void setPopoverAdapter(FilterAdapter arrayAdapter) {
listDropdownAdapter = arrayAdapter;
popover.setAdapter(listDropdownAdapter, listClickListener);
}

@ -20,9 +20,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.TextUtils;
@ -33,10 +31,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
@ -44,9 +41,7 @@ import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.activity.TaskListWrapperActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.AstridFilterExposer;
import com.todoroo.astrid.api.Filter;
@ -57,7 +52,7 @@ import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterWithUpdate;
import com.todoroo.astrid.service.TaskService;
public class FilterAdapter extends BaseExpandableListAdapter {
public class FilterAdapter extends ArrayAdapter<Filter> {
// --- style constants
@ -73,11 +68,10 @@ public class FilterAdapter extends BaseExpandableListAdapter {
protected final Activity activity;
/** owner listview */
protected final ExpandableListView listView;
protected final ListView listView;
/** list of filters */
private final ArrayList<FilterListItem> items;
private final FilterArrayAdapter arrayAdapter;
/** display metrics for scaling icons */
private final DisplayMetrics metrics = new DisplayMetrics();
@ -107,16 +101,15 @@ public class FilterAdapter extends BaseExpandableListAdapter {
// if new filters are queued (obviously it cannot be garbage collected if it is possible for new filters to
// be added).
private final ThreadPoolExecutor filterExecutor = new ThreadPoolExecutor(0, 1, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
private final Drawable headerBackground;
public FilterAdapter(Activity activity, ExpandableListView listView,
public FilterAdapter(Activity activity, ListView listView,
int rowLayout, boolean skipIntentFilters) {
this(activity, listView, rowLayout, skipIntentFilters, false);
}
public FilterAdapter(Activity activity, ExpandableListView listView,
public FilterAdapter(Activity activity, ListView listView,
int rowLayout, boolean skipIntentFilters, boolean selectable) {
super();
super(activity, 0);
DependencyInjectionService.getInstance().inject(this);
@ -127,17 +120,10 @@ public class FilterAdapter extends BaseExpandableListAdapter {
this.skipIntentFilters = skipIntentFilters;
this.selectable = selectable;
arrayAdapter = new FilterArrayAdapter(activity);
inflater = (LayoutInflater) activity.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
listView.setGroupIndicator(
activity.getResources().getDrawable(R.drawable.expander_group));
TypedArray a = activity.obtainStyledAttributes(new int[] { R.attr.asFilterHeaderBackground });
headerBackground = a.getDrawable(0);
}
private void offerFilter(final Filter filter) {
@ -164,6 +150,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
});
}
@Override
public boolean hasStableIds() {
return true;
}
@ -180,9 +167,9 @@ public class FilterAdapter extends BaseExpandableListAdapter {
}
}
@Override
public void clear() {
items.clear();
arrayAdapter.clear();
notifyDataSetInvalidated();
}
@ -223,71 +210,22 @@ public class FilterAdapter extends BaseExpandableListAdapter {
public View decoration;
}
/* ======================================================================
* ========================================================== child nodes
* ====================================================================== */
public Object getChild(int groupPosition, int childPosition) {
FilterListItem item = items.get(groupPosition);
if(!(item instanceof FilterCategory) || ((FilterCategory)item).children == null)
return null;
return ((FilterCategory)item).children[childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
FilterListItem item = items.get(groupPosition);
if(!(item instanceof FilterCategory))
return 0;
return ((FilterCategory)item).children.length;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.item = (FilterListItem) getChild(groupPosition, childPosition);
viewHolder.item = (FilterListItem) getItem(position);
populateView(viewHolder, false);
return convertView;
}
/* ======================================================================
* ========================================================= parent nodes
* ====================================================================== */
public Object getGroup(int groupPosition) {
if(groupPosition >= items.size())
return null;
return items.get(groupPosition);
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
public int getGroupCount() {
return items.size();
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.item = (FilterListItem) getGroup(groupPosition);
populateView(viewHolder, isExpanded);
return convertView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
/* ======================================================================
* ============================================================ selection
* ====================================================================== */
@ -363,23 +301,13 @@ public class FilterAdapter extends BaseExpandableListAdapter {
if (filter instanceof FilterCategory) {
Filter[] children = ((FilterCategory) filter).children;
for (Filter f : children) {
arrayAdapter.add(f);
add(f);
}
} else if (filter instanceof Filter){
arrayAdapter.add((Filter) filter);
add((Filter) filter);
}
}
notifyDataSetChanged();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
expandList(filters);
if (activity instanceof TaskListWrapperActivity) {
((TaskListWrapperActivity) activity).updateDropdownNav(arrayAdapter);
}
}
});
}
}
@ -405,7 +333,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
@Override
public void onReceive(Context context, Intent intent) {
if (shouldUseBladeFilter && getGroupCount() == 0 && filterExposerList != null && filterExposerList.size()>0) {
if (shouldUseBladeFilter && getCount() == 0 && filterExposerList != null && filterExposerList.size()>0) {
try {
for (ResolveInfo filterExposerInfo : filterExposerList) {
Log.d("BladeFilterReceiver", filterExposerInfo.toString());
@ -426,37 +354,6 @@ public class FilterAdapter extends BaseExpandableListAdapter {
}
}
/**
* Expand the category filters in this group according to preference
* @param filters
*/
protected void expandList(Parcelable[] filters) {
for(Parcelable filter : filters) {
if(filter instanceof FilterCategory) {
String preference = createExpansionPreference((FilterCategory) filter);
if(!Preferences.getBoolean(preference, true))
continue;
int count = getGroupCount();
for(int i = 0; i < count; i++)
if(getGroup(i) == filter) {
listView.expandGroup(i);
break;
}
}
}
}
/**
* Call to save user preference for whether a node is expanded
* @param category
* @param expanded
*/
public void saveExpansionSetting(FilterCategory category, boolean expanded) {
String preference = createExpansionPreference(category);
Preferences.setBoolean(preference, expanded);
}
/**
* Broadcast a request for lists. The request is sent to every
* application registered to listen for this broadcast. Each application
@ -485,7 +382,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
IntentFilter bladeFilter = new IntentFilter(AstridApiConstants.BROADCAST_SEND_FILTERS);
bladeFilter.setPriority(1);
activity.registerReceiver(bladeFilterReceiver, bladeFilter);
if(getGroupCount() == 0)
if(getCount() == 0)
getLists();
}
@ -524,7 +421,6 @@ public class FilterAdapter extends BaseExpandableListAdapter {
if(viewHolder.item instanceof FilterListHeader || viewHolder.item instanceof FilterCategory) {
viewHolder.name.setTextAppearance(activity, headerStyle);
viewHolder.name.setShadowLayer(1, 1, 1, Color.BLACK);
viewHolder.view.setBackgroundDrawable(headerBackground);
viewHolder.view.setPadding((int) (7 * metrics.density), 5, 0, 5);
viewHolder.view.getLayoutParams().height = (int) (40 * metrics.density);
} else {
@ -616,7 +512,6 @@ public class FilterAdapter extends BaseExpandableListAdapter {
activity.runOnUiThread(new Runnable() {
public void run() {
clear();
arrayAdapter.clear();
}
});
}
@ -627,28 +522,4 @@ public class FilterAdapter extends BaseExpandableListAdapter {
}
});
}
private class FilterArrayAdapter extends ArrayAdapter<Filter> {
public FilterArrayAdapter(Context context) {
super(context, 0);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.item = (FilterListItem) getItem(position);
populateView(viewHolder, false);
viewHolder.name.setTextColor(Color.WHITE);
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
}
}

@ -1,6 +1,6 @@
package com.todoroo.astrid.widget;
import android.app.ExpandableListActivity;
import android.app.ListActivity;
import android.appwidget.AppWidgetManager;
import android.content.ContentValues;
import android.content.Intent;
@ -8,21 +8,20 @@ import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ListView;
import com.timsu.astrid.R;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
@SuppressWarnings("nls")
abstract public class WidgetConfigActivity extends ExpandableListActivity {
abstract public class WidgetConfigActivity extends ListActivity {
static final String PREF_TITLE = "widget-title-";
static final String PREF_SQL = "widget-sql-";
@ -67,7 +66,7 @@ abstract public class WidgetConfigActivity extends ExpandableListActivity {
}
// set up ui
adapter = new FilterAdapter(this, getExpandableListView(),
adapter = new FilterAdapter(this, getListView(),
R.layout.filter_adapter_row, true, true);
setListAdapter(adapter);
@ -92,33 +91,13 @@ abstract public class WidgetConfigActivity extends ExpandableListActivity {
}
};
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
FilterListItem item = (FilterListItem) adapter.getChild(groupPosition,
childPosition);
if(item instanceof Filter) {
adapter.setSelection(item);
}
return true;
}
@Override
public void onGroupExpand(int groupPosition) {
FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
if(item instanceof Filter)
adapter.setSelection(item);
else if(item instanceof FilterCategory)
adapter.saveExpansionSetting((FilterCategory) item, true);
}
@Override
public void onGroupCollapse(int groupPosition) {
FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
if(item instanceof Filter)
adapter.setSelection(item);
else if(item instanceof FilterCategory)
adapter.saveExpansionSetting((FilterCategory) item, false);
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Filter item = adapter.getItem(position);
adapter.setSelection(item);
}
@Override

Loading…
Cancel
Save