diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DownloadGroupViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/DownloadGroupViewHolder.java new file mode 100644 index 0000000000..a95e75a6f4 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/download/ui/DownloadGroupViewHolder.java @@ -0,0 +1,71 @@ +package net.osmand.plus.download.ui; + +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.TextView; + +import net.osmand.plus.IconsCache; +import net.osmand.plus.R; +import net.osmand.plus.download.DownloadActivity; +import net.osmand.plus.download.DownloadActivityType; +import net.osmand.plus.download.DownloadResourceGroup; +import net.osmand.plus.download.IndexItem; + +public class DownloadGroupViewHolder { + TextView textView; + private DownloadActivity ctx; + + public DownloadGroupViewHolder(DownloadActivity ctx, View v) { + this.ctx = ctx; + textView = (TextView) v.findViewById(R.id.title); + } + + private boolean isParentWorld(DownloadResourceGroup group) { + return group.getParentGroup() == null + || group.getParentGroup().getType() == DownloadResourceGroup.DownloadResourceGroupType.WORLD; + } + + private Drawable getIconForGroup(DownloadResourceGroup group) { + Drawable iconLeft; + if (group.getType() == DownloadResourceGroup.DownloadResourceGroupType.VOICE_REC + || group.getType() == DownloadResourceGroup.DownloadResourceGroupType.VOICE_TTS) { + iconLeft = ctx.getMyApplication().getIconsCache().getContentIcon(R.drawable.ic_action_volume_up); + } else { + IconsCache cache = ctx.getMyApplication().getIconsCache(); + if (isParentWorld(group) || isParentWorld(group.getParentGroup())) { + iconLeft = cache.getContentIcon(R.drawable.ic_world_globe_dark); + } else { + DownloadResourceGroup ggr = group + .getSubGroupById(DownloadResourceGroup.DownloadResourceGroupType.REGION_MAPS.getDefaultId()); + iconLeft = cache.getContentIcon(R.drawable.ic_map); + if (ggr != null && ggr.getIndividualResources() != null) { + IndexItem item = null; + for (IndexItem ii : ggr.getIndividualResources()) { + if (ii.getType() == DownloadActivityType.NORMAL_FILE + || ii.getType() == DownloadActivityType.ROADS_FILE) { + if (ii.isDownloaded() || ii.isOutdated()) { + item = ii; + break; + } + } + } + if (item != null) { + if (item.isOutdated()) { + iconLeft = cache.getIcon(R.drawable.ic_map, R.color.color_distance); + } else { + iconLeft = cache.getIcon(R.drawable.ic_map, R.color.color_ok); + } + } + } + } + } + return iconLeft; + } + + public void bindItem(DownloadResourceGroup group) { + Drawable iconLeft = getIconForGroup(group); + textView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, null, null, null); + String name = group.getName(ctx); + textView.setText(name); + } +} diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java index 81873cbc80..5f539a4f7a 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupFragment.java @@ -1,31 +1,11 @@ package net.osmand.plus.download.ui; -import java.util.ArrayList; -import java.util.List; - -import net.osmand.plus.IconsCache; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandSettings; -import net.osmand.plus.R; -import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; -import net.osmand.plus.download.DownloadActivity; -import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion; -import net.osmand.plus.download.DownloadActivityType; -import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents; -import net.osmand.plus.download.DownloadResourceGroup; -import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType; -import net.osmand.plus.download.DownloadResources; -import net.osmand.plus.download.IndexItem; -import net.osmand.util.Algorithms; import android.content.Context; -import android.content.DialogInterface; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.view.MenuItemCompat; -import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.util.TypedValue; import android.view.LayoutInflater; @@ -39,6 +19,22 @@ import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.TextView; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.R; +import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; +import net.osmand.plus.download.DownloadActivity; +import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion; +import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents; +import net.osmand.plus.download.DownloadResourceGroup; +import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType; +import net.osmand.plus.download.DownloadResources; +import net.osmand.plus.download.IndexItem; +import net.osmand.util.Algorithms; + +import java.util.ArrayList; +import java.util.List; + public class DownloadResourceGroupFragment extends DialogFragment implements DownloadEvents, OnChildClickListener { public static final int RELOAD_ID = 0; public static final int SEARCH_ID = 1; @@ -230,66 +226,6 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow return fragment; } - - - private static class DownloadGroupViewHolder { - TextView textView; - private DownloadActivity ctx; - - public DownloadGroupViewHolder(DownloadActivity ctx, View v) { - this.ctx = ctx; - textView = (TextView) v.findViewById(R.id.title); - } - - private boolean isParentWorld(DownloadResourceGroup group) { - return group.getParentGroup() == null - || group.getParentGroup().getType() == DownloadResourceGroupType.WORLD; - } - - private Drawable getIconForGroup(DownloadResourceGroup group) { - Drawable iconLeft; - if (group.getType() == DownloadResourceGroupType.VOICE_REC - || group.getType() == DownloadResourceGroupType.VOICE_TTS) { - iconLeft = ctx.getMyApplication().getIconsCache().getContentIcon(R.drawable.ic_action_volume_up); - } else { - IconsCache cache = ctx.getMyApplication().getIconsCache(); - if (isParentWorld(group) || isParentWorld(group.getParentGroup())) { - iconLeft = cache.getContentIcon(R.drawable.ic_world_globe_dark); - } else { - DownloadResourceGroup ggr = group - .getSubGroupById(DownloadResourceGroupType.REGION_MAPS.getDefaultId()); - iconLeft = cache.getContentIcon(R.drawable.ic_map); - if (ggr != null && ggr.getIndividualResources() != null) { - IndexItem item = null; - for (IndexItem ii : ggr.getIndividualResources()) { - if (ii.getType() == DownloadActivityType.NORMAL_FILE - || ii.getType() == DownloadActivityType.ROADS_FILE) { - if (ii.isDownloaded() || ii.isOutdated()) { - item = ii; - break; - } - } - } - if (item != null) { - if (item.isOutdated()) { - iconLeft = cache.getIcon(R.drawable.ic_map, R.color.color_distance); - } else { - iconLeft = cache.getIcon(R.drawable.ic_map, R.color.color_ok); - } - } - } - } - } - return iconLeft; - } - - public void bindItem(DownloadResourceGroup group) { - Drawable iconLeft = getIconForGroup(group); - textView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, null, null, null); - String name = group.getName(ctx); - textView.setText(name); - } - } public static class DownloadResourceGroupAdapter extends OsmandBaseExpandableListAdapter { diff --git a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java index 4208fd283c..9793d5adc3 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java @@ -1,34 +1,50 @@ package net.osmand.plus.download.ui; +import android.content.res.TypedArray; import android.os.Bundle; import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.BaseAdapter; +import android.widget.ExpandableListView; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.LinearLayout; +import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.SearchView; + +import net.osmand.Collator; +import net.osmand.OsmAndCollator; +import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.download.DownloadActivity; +import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion; import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents; +import net.osmand.plus.download.DownloadResourceGroup; +import net.osmand.plus.download.DownloadResources; +import net.osmand.plus.download.IndexItem; -// FIXME -public class SearchDialogFragment extends DialogFragment { +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; - public static DialogFragment createInstance(String tg) { - return new SearchDialogFragment(); - } - - - - /*extends DialogFragment implements DownloadEvents { +public class SearchDialogFragment extends DialogFragment implements DownloadEvents, OnItemClickListener { public static final String TAG = "SearchDialogFragment"; private static final String SEARCH_TEXT_DLG_KEY = "search_text_dlg_key"; + private ListView listView; + private SearchListAdapter listAdapter; + private BannerAndDownloadFreeVersion banner; private String searchText; private SearchView search; @@ -63,6 +79,24 @@ public class SearchDialogFragment extends DialogFragment { } }); + banner = new BannerAndDownloadFreeVersion(view, (DownloadActivity) getActivity()); + + LinearLayout ll = (LinearLayout) view; + ExpandableListView expandablelistView = (ExpandableListView) view.findViewById(android.R.id.list); + ll.removeView(expandablelistView); + + listView = new ListView(getActivity()); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0); + layoutParams.weight = 1; + layoutParams.setMargins(0, 0, 0, 0); + listView.setLayoutParams(layoutParams); + ll.addView(listView); + + listView.setOnItemClickListener(this); + listAdapter = new SearchListAdapter(getDownloadActivity()); + listView.setOnItemClickListener(this); + listView.setAdapter(listAdapter); + search = new SearchView(getActivity()); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); @@ -95,25 +129,46 @@ public class SearchDialogFragment extends DialogFragment { @Override public boolean onQueryTextChange(String newText) { - Fragment f = getChildFragmentManager().findFragmentByTag(SearchItemsFragment.TAG); - if (f != null) { - ((SearchItemsFragment) f).updateSearchText(newText); - return true; - } - return false; + updateSearchText(newText); + return true; } }); - Fragment fragment = getChildFragmentManager().findFragmentById(R.id.fragmentContainer); - if (fragment == null) { - getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer, - SearchItemsFragment.createInstance(searchText), SearchItemsFragment.TAG).commit(); - } - - getDownloadActivity().registerFreeVersionBanner(view); return view; } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setShowsDialog(true); + listView.setBackgroundColor(getResources().getColor( + getMyApplication().getSettings().isLightContent() ? R.color.bg_color_light : R.color.bg_color_dark)); + } + + @Override + public void newDownloadIndexes() { + if(banner != null) { + banner.updateBannerInProgress(); + } + updateSearchText(searchText); + } + + @Override + public void downloadHasFinished() { + if(banner != null) { + banner.updateBannerInProgress(); + } + listAdapter.notifyDataSetChanged(); + } + + @Override + public void downloadInProgress() { + if(banner != null) { + banner.updateBannerInProgress(); + } + listAdapter.notifyDataSetChanged(); + } + @Override public void onSaveInstanceState(Bundle outState) { outState.putString(SEARCH_TEXT_DLG_KEY, searchText); @@ -126,6 +181,11 @@ public class SearchDialogFragment extends DialogFragment { search.setIconified(false); } + public void updateSearchText(String searchText) { + this.searchText = searchText; + listAdapter.getFilter().filter(searchText); + } + private OsmandApplication getMyApplication() { return (OsmandApplication) getActivity().getApplication(); } @@ -134,13 +194,6 @@ public class SearchDialogFragment extends DialogFragment { return (DownloadActivity) getActivity(); } - public void newDownloadIndexes() { - Fragment f = getChildFragmentManager().findFragmentByTag(SearchItemsFragment.TAG); - if (f != null) { - ((SearchItemsFragment) f).onCategorizationFinished(); - } - } - public static SearchDialogFragment createInstance(String searchText) { Bundle bundle = new Bundle(); bundle.putString(SEARCH_TEXT_DLG_KEY, searchText); @@ -148,5 +201,247 @@ public class SearchDialogFragment extends DialogFragment { fragment.setArguments(bundle); return fragment; } - */ + + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + Object obj = listAdapter.getItem(position); + if (obj instanceof DownloadResourceGroup) { + String uniqueId = ((DownloadResourceGroup) obj).getUniqueId(); + final DownloadResourceGroupFragment regionDialogFragment = DownloadResourceGroupFragment + .createInstance(uniqueId); + ((DownloadActivity) getActivity()).showDialog(getActivity(), regionDialogFragment); + } else if (obj instanceof IndexItem) { + IndexItem indexItem = (IndexItem) obj; + ItemViewHolder vh = (ItemViewHolder) v.getTag(); + View.OnClickListener ls = vh.getRightButtonAction(indexItem, vh.getClickAction(indexItem), null); + ls.onClick(v); + } + } + + private class SearchListAdapter extends BaseAdapter implements Filterable { + + private SearchIndexFilter mFilter; + + private List items = new LinkedList<>(); + private DownloadActivity ctx; + + public SearchListAdapter(DownloadActivity ctx) { + this.ctx = ctx; + TypedArray ta = ctx.getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimary}); + ta.recycle(); + } + + public void clear() { + items.clear(); + notifyDataSetChanged(); + } + + @Override + public Object getItem(int position) { + return items.get(position); + } + + @Override + public int getCount() { + return items.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemViewType(int position) { + Object obj = items.get(position); + if (obj instanceof IndexItem) { + return 0; + } else { + return 1; + } + } + + @Override + public int getViewTypeCount() { + return 2; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + final Object obj = items.get(position); + if (obj instanceof IndexItem) { + + IndexItem item = (IndexItem) obj; + ItemViewHolder viewHolder; + if (convertView != null && convertView.getTag() instanceof ItemViewHolder) { + viewHolder = (ItemViewHolder) convertView.getTag(); + } else { + convertView = LayoutInflater.from(parent.getContext()).inflate( + R.layout.two_line_with_images_list_item, parent, false); + viewHolder = new ItemViewHolder(convertView, getDownloadActivity()); + viewHolder.setShowRemoteDate(true); + convertView.setTag(viewHolder); + } + viewHolder.setShowTypeInDesc(true); + viewHolder.bindIndexItem(item, null); + } else { + DownloadResourceGroup group = (DownloadResourceGroup) obj; + DownloadGroupViewHolder viewHolder; + if (convertView != null && convertView.getTag() instanceof DownloadGroupViewHolder) { + viewHolder = (DownloadGroupViewHolder) convertView.getTag(); + } else { + convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_list_menu_item, + parent, false); + viewHolder = new DownloadGroupViewHolder(getDownloadActivity(), convertView); + convertView.setTag(viewHolder); + } + viewHolder.bindItem(group); + } + return convertView; + } + + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public Filter getFilter() { + if (mFilter == null) { + mFilter = new SearchIndexFilter(); + } + return mFilter; + } + + private final class SearchIndexFilter extends Filter { + + private OsmandRegions osmandRegions; + + public SearchIndexFilter() { + this.osmandRegions = ctx.getMyApplication().getRegions(); + } + + private void processGroup(DownloadResourceGroup group, List filter, List> conds) { + String indexLC = group.getName(ctx).toLowerCase(); + if (isMatch(conds, false, indexLC)) { + filter.add(group); + } + if (group.getGroups() != null) { + for (DownloadResourceGroup g : group.getGroups()) { + processGroup(g, filter, conds); + } + } + } + + @Override + protected FilterResults performFiltering(CharSequence constraint) { + DownloadResources root = ctx.getDownloadThread().getIndexes(); + + FilterResults results = new FilterResults(); + if (constraint == null || constraint.length() < 2) { + results.values = new ArrayList<>(); + results.count = 0; + } else { + String[] ors = constraint.toString().split(","); + List> conds = new ArrayList<>(); + for (String or : ors) { + final ArrayList cond = new ArrayList<>(); + for (String term : or.split("\\s")) { + final String t = term.trim().toLowerCase(); + if (t.length() > 0) { + cond.add(t); + } + } + if (cond.size() > 0) { + conds.add(cond); + } + } + + List filter = new ArrayList<>(); + processGroup(root, filter, conds); + + /* + List regions = new ArrayList<>(); + for (WorldRegion region : worldRegions) { + String indexLC = region.getName().toLowerCase(); + if (isMatch(conds, false, indexLC)) { + regions.add(region); + } + } + + for (WorldRegion region : regions) { + if (region.getSubregions().size() > 0) { + filter.add(region); + } + + List items = getDownloadActivity().getIndexItemsByRegion(region); + if (items.size() > 1) { + if (!filter.contains(region)) { + filter.add(region); + } + } else { + filter.addAll(items); + } + } + */ + + final Collator collator = OsmAndCollator.primaryCollator(); + Collections.sort(filter, new Comparator() { + @Override + public int compare(Object obj1, Object obj2) { + String str1; + String str2; + if (obj1 instanceof DownloadResourceGroup) { + str1 = ((DownloadResourceGroup) obj1).getName(ctx); + } else { + str1 = ((IndexItem) obj1).getVisibleName(getMyApplication(), osmandRegions, false); + } + if (obj2 instanceof DownloadResourceGroup) { + str2 = ((DownloadResourceGroup) obj2).getName(ctx); + } else { + str2 = ((IndexItem) obj2).getVisibleName(getMyApplication(), osmandRegions, false); + } + return collator.compare(str1, str2); + } + }); + + results.values = filter; + results.count = filter.size(); + } + return results; + } + + private boolean isMatch(List> conditions, boolean matchByDefault, String text) { + boolean res = matchByDefault; + for (List or : conditions) { + boolean tadd = true; + for (String var : or) { + if (!text.contains(var)) { + tadd = false; + break; + } + } + if (!tadd) { + res = false; + } else { + res = true; + break; + } + } + return res; + } + + @SuppressWarnings("unchecked") + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + items.clear(); + List values = (List) results.values; + if (values != null && !values.isEmpty()) { + items.addAll(values); + } + notifyDataSetChanged(); + } + } + } } diff --git a/OsmAnd/src/net/osmand/plus/download/ui/SearchItemsFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/SearchItemsFragment.java deleted file mode 100644 index 35b6acf0bb..0000000000 --- a/OsmAnd/src/net/osmand/plus/download/ui/SearchItemsFragment.java +++ /dev/null @@ -1,337 +0,0 @@ -package net.osmand.plus.download.ui; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; - -import net.osmand.Collator; -import net.osmand.OsmAndCollator; -import net.osmand.map.OsmandRegions; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.R; -import net.osmand.plus.WorldRegion; -import net.osmand.plus.download.BaseDownloadActivity; -import net.osmand.plus.download.DownloadActivity; -import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents; -import net.osmand.plus.download.IndexItem; -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.Filter; -import android.widget.Filterable; -import android.widget.ListView; - -//FIXME merge into search dialog fragment -public class SearchItemsFragment { /*extends Fragment implements DownloadEvents { - public static final String TAG = "SearchItemsFragment"; - - private SearchItemsAdapter listAdapter; - - private static final String SEARCH_TEXT_KEY = "world_region_id_key"; - private String searchText; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.download_search_items_fragment, container, false); - if (savedInstanceState != null) { - searchText = savedInstanceState.getString(SEARCH_TEXT_KEY); - } - if (searchText == null) { - searchText = getArguments().getString(SEARCH_TEXT_KEY); - } - if (searchText == null) - searchText = ""; - - ListView listView = (ListView) view.findViewById(android.R.id.list); - listAdapter = new SearchItemsAdapter(getActivity()); - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - doItemClick(view, position); - } - }); - fillSearchItemsAdapter(); - - return view; - } - - @Override - public void onSaveInstanceState(Bundle outState) { - outState.putString(SEARCH_TEXT_KEY, searchText); - super.onSaveInstanceState(outState); - } - - public boolean doItemClick(View view, int position) { - Object obj = listAdapter.getItem(position); - if (obj instanceof WorldRegion) { - WorldRegion region = (WorldRegion) obj; - getDownloadActivity().showDialog(getActivity(), RegionDialogFragment.createInstance(region.getRegionId())); - return true; - } else if (obj instanceof ItemsListBuilder.ResourceItem) { - if (((ItemViewHolder) view.getTag()).isItemAvailable()) { - IndexItem indexItem = ((ItemsListBuilder.ResourceItem) obj).getIndexItem(); - ((BaseDownloadActivity) getActivity()).startDownload(indexItem); - return true; - } - } else if (obj instanceof IndexItem) { - if (((ItemViewHolder) view.getTag()).isItemAvailable()) { - IndexItem indexItem = (IndexItem) obj; - ((BaseDownloadActivity) getActivity()).startDownload(indexItem); - return true; - } - } - return false; - } - - public OsmandApplication getMyApplication() { - return (OsmandApplication) getActivity().getApplication(); - } - - public DownloadActivity getMyActivity() { - return (DownloadActivity) getActivity(); - } - - private void fillSearchItemsAdapter() { - if (listAdapter != null) { - listAdapter.clear(); - List flattenedList = getMyApplication().getWorldRegion().getFlattenedSubregions(); - List indexItems = getDownloadActivity().getIndexFiles(); - if (flattenedList != null && flattenedList.size() > 0 && - indexItems != null && indexItems.size() > 0) { - listAdapter.addWorldRegions(flattenedList); - listAdapter.addIndexItems(indexItems); - listAdapter.notifyDataSetChanged(); - } - } - } - - public void onCategorizationFinished() { - fillSearchItemsAdapter(); - } - - public void updateSearchText(String searchText) { - this.searchText = searchText; - if(listAdapter != null){ - listAdapter.getFilter().filter(searchText); - } - } - - private DownloadActivity getDownloadActivity() { - return (DownloadActivity) getActivity(); - } - - public static SearchItemsFragment createInstance(String regionId) { - Bundle bundle = new Bundle(); - bundle.putString(SEARCH_TEXT_KEY, regionId); - SearchItemsFragment fragment = new SearchItemsFragment(); - fragment.setArguments(bundle); - return fragment; - } - - private class SearchItemsAdapter extends BaseAdapter implements Filterable { - - private SearchIndexFilter mFilter; - - private List worldRegions = new LinkedList<>(); - private List indexItems = new LinkedList<>(); - private List items = new LinkedList<>(); - - private OsmandRegions osmandRegions; - - public SearchItemsAdapter(Context ctx) { - osmandRegions = getMyApplication().getResourceManager().getOsmandRegions(); - TypedArray ta = ctx.getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimary}); - ta.recycle(); - } - - public void clear() { - worldRegions.clear(); - indexItems.clear(); - items.clear(); - notifyDataSetChanged(); - } - - public void addWorldRegions(List worldRegions) { - this.worldRegions.addAll(worldRegions); - } - - public void addIndexItems(List indexItems) { - this.indexItems.addAll(indexItems); - } - - @Override - public Object getItem(int position) { - return items.get(position); - } - - @Override - public int getCount() { - return items.size(); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final Object item = getItem(position); - ItemViewHolder viewHolder; - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.two_line_with_images_list_item, parent, false); - viewHolder = new ItemViewHolder(convertView, - getMyActivity(), - getMyApplication().getResourceManager().getDateFormat()); - convertView.setTag(viewHolder); - } else { - viewHolder = (ItemViewHolder) convertView.getTag(); - } - if (item instanceof WorldRegion) { - viewHolder.bindRegion((WorldRegion) item); - } else if (item instanceof IndexItem) { - viewHolder.bindIndexItem((IndexItem) item, false, true); - } else { - throw new IllegalArgumentException("Item must be of type WorldRegion or " + - "IndexItem but is of type:" + item.getClass()); - } - - return convertView; - } - - @Override - public boolean hasStableIds() { - return false; - } - - @Override - public Filter getFilter() { - if (mFilter == null) { - mFilter = new SearchIndexFilter(); - } - return mFilter; - } - - private final class SearchIndexFilter extends Filter { - @Override - protected FilterResults performFiltering(CharSequence constraint) { - FilterResults results = new FilterResults(); - if (constraint == null || constraint.length() < 2) { - results.values = new ArrayList<>(); - results.count = 0; - } else { - String[] ors = constraint.toString().split(","); - List> conds = new ArrayList<>(); - for (String or : ors) { - final ArrayList cond = new ArrayList<>(); - for (String term : or.split("\\s")) { - final String t = term.trim().toLowerCase(); - if (t.length() > 0) { - cond.add(t); - } - } - if (cond.size() > 0) { - conds.add(cond); - } - } - - List filter = new ArrayList<>(); - List regions = new ArrayList<>(); - for (WorldRegion region : worldRegions) { - String indexLC = region.getName().toLowerCase(); - if (isMatch(conds, false, indexLC)) { - regions.add(region); - } - } - - for (WorldRegion region : regions) { - if (region.getSubregions().size() > 0) { - filter.add(region); - } - - List items = getDownloadActivity().getIndexItemsByRegion(region); - if (items.size() > 1) { - if (!filter.contains(region)) { - filter.add(region); - } - } else { - filter.addAll(items); - } - } - - final Collator collator = OsmAndCollator.primaryCollator(); - Collections.sort(filter, new Comparator() { - @Override - public int compare(Object obj1, Object obj2) { - String str1; - String str2; - if (obj1 instanceof WorldRegion) { - str1 = ((WorldRegion) obj1).getName(); - } else { - str1 = ((IndexItem) obj1).getVisibleName(getMyApplication(), osmandRegions, false); - } - if (obj2 instanceof WorldRegion) { - str2 = ((WorldRegion) obj2).getName(); - } else { - str2 = ((IndexItem) obj2).getVisibleName(getMyApplication(), osmandRegions, false); - } - return collator.compare(str1, str2); - } - }); - - results.values = filter; - results.count = filter.size(); - } - return results; - } - - private boolean isMatch(List> conditions, boolean matchByDefault, String text) { - boolean res = matchByDefault; - for (List or : conditions) { - boolean tadd = true; - for (String var : or) { - if (!text.contains(var)) { - tadd = false; - break; - } - } - if (!tadd) { - res = false; - } else { - res = true; - break; - } - } - return res; - } - - @SuppressWarnings("unchecked") - @Override - protected void publishResults(CharSequence constraint, FilterResults results) { - items.clear(); - List values = (List) results.values; - if (values != null && !values.isEmpty()) { - items.addAll(values); - } - notifyDataSetChanged(); - } - } - } - */ -}