Downloads list fix in progress

This commit is contained in:
Alexey Kulish 2015-10-02 20:54:44 +03:00
parent 08e463803c
commit c0e086f18c
6 changed files with 385 additions and 417 deletions

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical"
android:paddingLeft="@dimen/list_header_padding"
android:paddingRight="@dimen/list_header_padding">
<TextView
android:id="@+id/section_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/list_header_top_margin"
android:layout_marginLeft="12dp"
android:maxLines="1"
android:text="World Regions"
android:textSize="@dimen/default_list_text_size"/>
</LinearLayout>

View file

@ -1,73 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
<ExpandableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/download_index_fragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/list_world_regions_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="World Regions"
android:textSize="@dimen/default_desc_text_size"/>
<ListView
android:id="@+id/list_world_regions"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:groupIndicator="@android:color/transparent"
android:isScrollContainer="false"
android:scrollbars="none"/>
<TextView
android:id="@+id/list_world_maps_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="World Maps"
android:textSize="@dimen/default_desc_text_size"/>
<ListView
android:id="@+id/list_world_maps"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:groupIndicator="@android:color/transparent"
android:isScrollContainer="false"
android:scrollbars="none"/>
<TextView
android:id="@+id/list_voice_promts_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="Voice Promts"
android:textSize="@dimen/default_desc_text_size"/>
<ListView
android:id="@+id/list_voice_promts"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:groupIndicator="@android:color/transparent"
android:isScrollContainer="false"
android:scrollbars="none"/>
</LinearLayout>
</ScrollView>
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:focusable="true"
android:groupIndicator="@android:color/transparent"/>

View file

@ -1,6 +1,8 @@
package net.osmand.plus.download;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
@ -107,9 +109,27 @@ public class DownloadOsmandIndexesHelper {
log.info(strUrl);
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
URLConnection connection = NetworkUtils.getHttpURLConnection(strUrl);
InputStream in = connection.getInputStream();
GZIPInputStream gzin = new GZIPInputStream(in);
File tmp = new File(ctx.getAppPath(IndexConstants.BACKUP_INDEX_DIR), "map_indexes.tmp");
if (!tmp.exists()) {
log.info(strUrl);
log.warn("111 - NO FILE");
URLConnection connection = NetworkUtils.getHttpURLConnection(strUrl);
InputStream in = connection.getInputStream();
FileOutputStream out = new FileOutputStream(tmp);
int read;
byte[] buffer = new byte[32256];
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
out.close();
} else {
log.warn("111 - READ BACKUP");
}
GZIPInputStream gzin = new GZIPInputStream(new FileInputStream(tmp));
parser.setInput(gzin, "UTF-8"); //$NON-NLS-1$
int next;
while((next = parser.next()) != XmlPullParser.END_DOCUMENT) {
@ -128,7 +148,7 @@ public class DownloadOsmandIndexesHelper {
}
result.sort();
gzin.close();
in.close();
//in.close();
} catch (IOException e) {
log.error("Error while loading indexes from repository", e); //$NON-NLS-1$
return null;

View file

@ -6,12 +6,10 @@ import net.osmand.PlatformUtil;
import net.osmand.map.OsmandRegions;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.WorldRegion;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.openseamapsplugin.NauticalMapsPlugin;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.util.Algorithms;
@ -35,9 +33,6 @@ public class ItemsListBuilder {
private String resourceId;
private String title;
private long contentSize;
private long containerSize;
private boolean disabled;
private IndexItem indexItem;
private WorldRegion worldRegion;
@ -66,30 +61,6 @@ public class ItemsListBuilder {
this.title = title;
}
public long getContentSize() {
return contentSize;
}
public void setContentSize(long contentSize) {
this.contentSize = contentSize;
}
public long getContainerSize() {
return containerSize;
}
public void setContainerSize(long containerSize) {
this.containerSize = containerSize;
}
public boolean isDisabled() {
return disabled;
}
public void setDisabled(boolean disabled) {
this.disabled = disabled;
}
public ResourceItem(IndexItem indexItem, WorldRegion worldRegion) {
this.indexItem = indexItem;
this.worldRegion = worldRegion;
@ -158,7 +129,7 @@ public class ItemsListBuilder {
public ItemsListBuilder(OsmandApplication app) {
this.app = app;
regionMapItems = new LinkedList();
regionMapItems = new LinkedList<>();
allResourceItems = new LinkedList();
allSubregionItems = new LinkedList<>();
}
@ -320,8 +291,6 @@ public class ItemsListBuilder {
ResourceItem resItem = new ResourceItem(indexItem, region);
resItem.setResourceId(indexItem.getSimplifiedFileName());
resItem.setTitle(name);
resItem.setContentSize(indexItem.getContentSize());
resItem.setContainerSize(indexItem.getSize());
if (region != this.region && srtmDisabled) {
if (hasSrtm && indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE)

View file

@ -1,16 +1,12 @@
package net.osmand.plus.download.items;
import android.content.Context;
import android.graphics.drawable.Drawable;
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.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ExpandableListView;
import android.widget.TextView;
import net.osmand.PlatformUtil;
@ -18,30 +14,28 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.WorldRegion;
import net.osmand.plus.activities.OsmandBaseExpandableListAdapter;
import net.osmand.plus.activities.OsmandExpandableListFragment;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import org.apache.commons.logging.Log;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class RegionItemsFragment extends Fragment {
public class RegionItemsFragment extends OsmandExpandableListFragment {
public static final String TAG = "RegionItemsFragment";
private static final Log LOG = PlatformUtil.getLog(RegionItemsFragment.class);
private static final MessageFormat formatGb = new MessageFormat("{0, number,<b>#.##</b>} GB", Locale.US);
private ItemsListBuilder builder;
private RegionsAdapter regionsAdapter;
private MapsAdapter mapsAdapter;
private VoicePromtsAdapter voicePromtsAdapter;
private TextView mapsTextView;
private ListView mapsListView;
private TextView regionsTextView;
private ListView regionsListView;
private TextView voicePromtsTextView;
private ListView voicePromtsListView;
private RegionsItemsAdapter listAdapter;
private static final String REGION_KEY = "world_region_key";
private WorldRegion region;
@ -75,39 +69,15 @@ public class RegionItemsFragment extends Fragment {
builder = new ItemsListBuilder(getMyApplication(), this.region);
mapsTextView = (TextView) view.findViewById(R.id.list_world_regions_title);
mapsTextView.setText("Region maps".toUpperCase());
mapsListView = (ListView) view.findViewById(R.id.list_world_regions);
mapsAdapter = new MapsAdapter(getActivity());
mapsListView.setAdapter(mapsAdapter);
regionsTextView = (TextView) view.findViewById(R.id.list_world_maps_title);
regionsTextView.setText("Additional maps".toUpperCase());
regionsListView = (ListView) view.findViewById(R.id.list_world_maps);
regionsAdapter = new RegionsAdapter(getActivity());
regionsListView.setAdapter(regionsAdapter);
regionsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object obj = regionsAdapter.getItem(position);
if (obj instanceof WorldRegion) {
WorldRegion region = (WorldRegion) obj;
((RegionDialogFragment) getParentFragment())
.onRegionSelected(region);
}
}
});
voicePromtsTextView = (TextView) view.findViewById(R.id.list_voice_promts_title);
voicePromtsTextView.setText("Voice promts".toUpperCase());
voicePromtsListView = (ListView) view.findViewById(R.id.list_voice_promts);
voicePromtsAdapter = new VoicePromtsAdapter(getActivity(), getMyApplication());
voicePromtsListView.setAdapter(voicePromtsAdapter);
ExpandableListView listView = (ExpandableListView)view.findViewById(android.R.id.list);
listAdapter = new RegionsItemsAdapter(getActivity());
listView.setAdapter(listAdapter);
setListView(listView);
if (builder.build()) {
fillMapsAdapter();
fillRegionsAdapter();
fillVoicePromtsAdapter();
fillRegionItemsAdapter();
listAdapter.notifyDataSetChanged();
expandAllGroups();
}
return view;
@ -119,41 +89,38 @@ public class RegionItemsFragment extends Fragment {
super.onSaveInstanceState(outState);
}
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Object obj = listAdapter.getChild(groupPosition, childPosition);
if (obj instanceof WorldRegion) {
WorldRegion region = (WorldRegion) obj;
((RegionDialogFragment) getParentFragment())
.onRegionSelected(region);
return true;
} else {
return false;
}
}
private void expandAllGroups() {
for (int i = 0; i < listAdapter.getGroupCount(); i++) {
getExpandableListView().expandGroup(i);
}
}
public OsmandApplication getMyApplication() {
return (OsmandApplication)getActivity().getApplication();
}
private void fillRegionsAdapter() {
if (regionsAdapter != null) {
regionsAdapter.clear();
regionsAdapter.addAll(builder.getAllResourceItems());
updateVisibility(regionsAdapter, regionsTextView, regionsListView);
}
}
private void fillMapsAdapter() {
if (mapsAdapter != null) {
mapsAdapter.clear();
mapsAdapter.addAll(builder.getRegionMapItems());
updateVisibility(mapsAdapter, mapsTextView, mapsListView);
}
}
private void fillVoicePromtsAdapter() {
if (voicePromtsAdapter != null) {
voicePromtsAdapter.clear();
//voicePromtsAdapter.addAll(cats);
updateVisibility(voicePromtsAdapter, voicePromtsTextView, voicePromtsListView);
}
}
private void updateVisibility(ArrayAdapter adapter, TextView textView, ListView listView) {
if (adapter.isEmpty()) {
textView.setVisibility(View.GONE);
listView.setVisibility(View.GONE);
} else {
textView.setVisibility(View.VISIBLE);
listView.setVisibility(View.VISIBLE);
private void fillRegionItemsAdapter() {
if (listAdapter != null) {
listAdapter.clear();
if (builder.getRegionMapItems().size() > 0) {
listAdapter.add("Region maps".toUpperCase(), builder.getRegionMapItems());
}
if (builder.getAllResourceItems().size() > 0) {
listAdapter.add("Additional maps".toUpperCase(), builder.getAllResourceItems());
}
}
}
@ -169,97 +136,143 @@ public class RegionItemsFragment extends Fragment {
return fragment;
}
private static class MapsAdapter extends ArrayAdapter<ItemsListBuilder.ResourceItem> {
private class RegionsItemsAdapter extends OsmandBaseExpandableListAdapter {
private Map<String, List> data = new LinkedHashMap<>();
private List<String> sections = new LinkedList<>();
private Context ctx;
private boolean srtmDisabled;
public MapsAdapter(Context context) {
super(context, R.layout.simple_list_menu_item);
public RegionsItemsAdapter(Context ctx) {
this.ctx = ctx;
srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null;
TypedArray ta = ctx.getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimary});
ta.recycle();
}
public void clear() {
data.clear();
sections.clear();
notifyDataSetChanged();
}
public void add(String section, List list) {
if (!sections.contains(section)) {
sections.add(section);
}
if (!data.containsKey(section)) {
data.put(section, new ArrayList());
}
data.get(section).addAll(list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
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);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder) convertView.getTag();
}
viewHolder.setSrtmDisabled(srtmDisabled);
ItemsListBuilder.ResourceItem item = getItem(position);
viewHolder.bindIndexItem(item.getIndexItem(), (DownloadActivity) getContext(), true, false);
return convertView;
}
}
private static class RegionsAdapter extends ArrayAdapter {
private boolean srtmDisabled;
public RegionsAdapter(Context context) {
super(context, R.layout.two_line_with_images_list_item);
srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null;
public Object getChild(int groupPosition, int childPosition) {
String section = sections.get(groupPosition);
return data.get(section).get(childPosition);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
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);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder) convertView.getTag();
}
viewHolder.setSrtmDisabled(srtmDisabled);
Object item = getItem(position);
if (item instanceof WorldRegion) {
viewHolder.bindRegion((WorldRegion) item, (DownloadActivity) getContext());
} else if (item instanceof ItemsListBuilder.ResourceItem) {
viewHolder.bindIndexItem(((ItemsListBuilder.ResourceItem) item).getIndexItem(),
(DownloadActivity) getContext(), false, true);
} else {
throw new IllegalArgumentException("Item must be of type WorldRegion or " +
"IndexItem but is of type:" + item.getClass());
}
return convertView;
}
}
private static class VoicePromtsAdapter extends ArrayAdapter {
private final OsmandApplication osmandApplication;
public VoicePromtsAdapter(Context context, OsmandApplication osmandApplication) {
super(context, R.layout.simple_list_menu_item);
this.osmandApplication = osmandApplication;
public long getChildId(int groupPosition, int childPosition) {
return groupPosition * 10000 + childPosition;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RegionItemViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.simple_list_menu_item, parent, false);
viewHolder = new RegionItemViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(viewHolder);
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final Object child = getChild(groupPosition, childPosition);
if (child instanceof ItemsListBuilder.ResourceItem && groupPosition == 0 && getGroupCount() > 1) {
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);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder) convertView.getTag();
}
viewHolder.setSrtmDisabled(srtmDisabled);
ItemsListBuilder.ResourceItem item = (ItemsListBuilder.ResourceItem)child;
viewHolder.bindIndexItem(item.getIndexItem(), getDownloadActivity(), true, false);
} else {
viewHolder = (RegionItemViewHolder) convertView.getTag();
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);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder) convertView.getTag();
}
viewHolder.setSrtmDisabled(srtmDisabled);
if (child instanceof WorldRegion) {
viewHolder.bindRegion((WorldRegion) child, getDownloadActivity());
} else if (child instanceof ItemsListBuilder.ResourceItem) {
viewHolder.bindIndexItem(((ItemsListBuilder.ResourceItem) child).getIndexItem(),
getDownloadActivity(), false, true);
} else {
throw new IllegalArgumentException("Item must be of type WorldRegion or " +
"IndexItem but is of type:" + child.getClass());
}
}
Drawable iconLeft = osmandApplication.getIconsCache()
.getContentIcon(R.drawable.ic_world_globe_dark);
viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, null, null, null);
viewHolder.textView.setText(getItem(position).toString());
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onChildClick(null, v, groupPosition, childPosition, 0);
}
});
return convertView;
}
}
private static class RegionItemViewHolder {
TextView textView;
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View v = convertView;
String section = getGroup(groupPosition);
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getDownloadActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.download_item_list_section, parent, false);
}
TextView nameView = ((TextView) v.findViewById(R.id.section_name));
nameView.setText(section);
v.setOnClickListener(null);
return v;
}
@Override
public int getChildrenCount(int groupPosition) {
String section = sections.get(groupPosition);
return data.get(section).size();
}
@Override
public String getGroup(int groupPosition) {
return sections.get(groupPosition);
}
@Override
public int getGroupCount() {
return sections.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}

View file

@ -1,9 +1,9 @@
package net.osmand.plus.download.items;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.view.LayoutInflater;
import android.view.Menu;
@ -11,38 +11,34 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ExpandableListView;
import android.widget.TextView;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.WorldRegion;
import net.osmand.plus.activities.OsmandBaseExpandableListAdapter;
import net.osmand.plus.activities.OsmandExpandableListFragment;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.newimplementation.DownloadsUiHelper;
import org.apache.commons.logging.Log;
public class WorldItemsFragment extends Fragment {
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class WorldItemsFragment extends OsmandExpandableListFragment {
public static final String TAG = "WorldItemsFragment";
private static final Log LOG = PlatformUtil.getLog(WorldItemsFragment.class);
public static final int RELOAD_ID = 0;
private ItemsListBuilder builder;
private WorldRegionsAdapter worldRegionsAdapter;
private WorldMapsAdapter worldMapsAdapter;
private VoicePromtsAdapter voicePromtsAdapter;
private TextView worldRegionsTextView;
private ListView worldRegionsListView;
private TextView worldMapsTextView;
private ListView worldMapsListView;
private TextView voicePromtsTextView;
private ListView voicePromtsListView;
private WorldItemsAdapter listAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -56,30 +52,11 @@ public class WorldItemsFragment extends Fragment {
builder = new ItemsListBuilder(getMyApplication(), getMyApplication().getWorldRegion());
worldRegionsTextView = (TextView) view.findViewById(R.id.list_world_regions_title);
worldRegionsTextView.setText("World regions".toUpperCase());
worldRegionsListView = (ListView) view.findViewById(R.id.list_world_regions);
worldRegionsAdapter = new WorldRegionsAdapter(getActivity(), getMyApplication());
worldRegionsListView.setAdapter(worldRegionsAdapter);
worldRegionsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
WorldRegion region = worldRegionsAdapter.getItem(position);
DownloadsUiHelper.showDialog(getActivity(), RegionDialogFragment.createInstance(region));
}
});
worldMapsTextView = (TextView) view.findViewById(R.id.list_world_maps_title);
worldMapsTextView.setText("World maps".toUpperCase());
worldMapsListView = (ListView) view.findViewById(R.id.list_world_maps);
worldMapsAdapter = new WorldMapsAdapter(getActivity());
worldMapsListView.setAdapter(worldMapsAdapter);
voicePromtsTextView = (TextView) view.findViewById(R.id.list_voice_promts_title);
voicePromtsTextView.setText("Voice promts".toUpperCase());
voicePromtsListView = (ListView) view.findViewById(R.id.list_voice_promts);
voicePromtsAdapter = new VoicePromtsAdapter(getActivity(), getMyApplication());
voicePromtsListView.setAdapter(voicePromtsAdapter);
ExpandableListView listView = (ExpandableListView)view.findViewById(android.R.id.list);
listAdapter = new WorldItemsAdapter(getActivity());
listView.setAdapter(listAdapter);
expandAllGroups();
setListView(listView);
onCategorizationFinished();
@ -89,63 +66,33 @@ public class WorldItemsFragment extends Fragment {
return view;
}
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
private void expandAllGroups() {
for (int i = 0; i < listAdapter.getGroupCount(); i++) {
getExpandableListView().expandGroup(i);
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
public OsmandApplication getMyApplication() {
return (OsmandApplication)getActivity().getApplication();
}
private void fillWorldRegionsAdapter() {
if (worldRegionsAdapter != null) {
worldRegionsAdapter.clear();
worldRegionsAdapter.addAll(builder.getRegionsFromAllItems());
updateVisibility(worldRegionsAdapter, worldRegionsTextView, worldRegionsListView);
private void fillWorldItemsAdapter() {
if (listAdapter != null) {
listAdapter.clear();
listAdapter.add("World regions".toUpperCase(), builder.getRegionsFromAllItems());
listAdapter.add("World maps".toUpperCase(), builder.getRegionMapItems());
//listAdapter.add("Voice promts".toUpperCase(), null);
}
}
private void fillWorldMapsAdapter() {
if (worldMapsAdapter != null) {
worldMapsAdapter.clear();
worldMapsAdapter.addAll(builder.getRegionMapItems());
updateVisibility(worldMapsAdapter, worldMapsTextView, worldMapsListView);
}
}
private void fillVoicePromtsAdapter() {
if (voicePromtsAdapter != null) {
voicePromtsAdapter.clear();
//voicePromtsAdapter.addAll(cats);
updateVisibility(voicePromtsAdapter, voicePromtsTextView, voicePromtsListView);
}
}
private void updateVisibility(ArrayAdapter adapter, TextView textView, ListView listView) {
if (adapter.isEmpty()) {
textView.setVisibility(View.GONE);
listView.setVisibility(View.GONE);
} else {
textView.setVisibility(View.VISIBLE);
listView.setVisibility(View.VISIBLE);
setListViewHeightBasedOnChildren(listView);
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
if (groupPosition == 0) {
WorldRegion region = (WorldRegion)listAdapter.getChild(groupPosition, childPosition);
DownloadsUiHelper.showDialog(getActivity(), RegionDialogFragment.createInstance(region));
return true;
}
return false;
}
@Override
@ -171,97 +118,160 @@ public class WorldItemsFragment extends Fragment {
public void onCategorizationFinished() {
if (builder.build()) {
fillWorldRegionsAdapter();
fillWorldMapsAdapter();
fillVoicePromtsAdapter();
fillWorldItemsAdapter();
listAdapter.notifyDataSetChanged();
expandAllGroups();
}
}
private static class WorldRegionsAdapter extends ArrayAdapter<WorldRegion> {
private final OsmandApplication osmandApplication;
private class WorldItemsAdapter extends OsmandBaseExpandableListAdapter {
public WorldRegionsAdapter(Context context, OsmandApplication osmandApplication) {
super(context, R.layout.simple_list_menu_item);
this.osmandApplication = osmandApplication;
}
Map<String, List> data = new LinkedHashMap<>();
List<String> sections = new LinkedList<>();
Context ctx;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.simple_list_menu_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Drawable iconLeft = osmandApplication.getIconsCache()
.getContentIcon(R.drawable.ic_world_globe_dark);
viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, null, null, null);
viewHolder.textView.setText(getItem(position).getName());
return convertView;
}
private static class ViewHolder {
private class SimpleViewHolder {
TextView textView;
}
}
private static class WorldMapsAdapter extends ArrayAdapter<ItemsListBuilder.ResourceItem> {
public WorldItemsAdapter(Context ctx) {
this.ctx = ctx;
TypedArray ta = ctx.getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimary});
ta.recycle();
}
public WorldMapsAdapter(Context context) {
super(context, R.layout.simple_list_menu_item);
public void clear() {
data.clear();
sections.clear();
notifyDataSetChanged();
}
public void add(String section, List list) {
if (!sections.contains(section)) {
sections.add(section);
}
if (!data.containsKey(section)) {
data.put(section, new ArrayList());
}
data.get(section).addAll(list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
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);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder) convertView.getTag();
}
ItemsListBuilder.ResourceItem item = getItem(position);
viewHolder.bindIndexItem(item.getIndexItem(), (DownloadActivity) getContext(), false, false);
return convertView;
}
}
private static class VoicePromtsAdapter extends ArrayAdapter {
private final OsmandApplication osmandApplication;
public VoicePromtsAdapter(Context context, OsmandApplication osmandApplication) {
super(context, R.layout.simple_list_menu_item);
this.osmandApplication = osmandApplication;
public Object getChild(int groupPosition, int childPosition) {
String section = sections.get(groupPosition);
return data.get(section).get(childPosition);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.simple_list_menu_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(viewHolder);
public long getChildId(int groupPosition, int childPosition) {
return groupPosition * 10000 + childPosition;
}
@Override
public int getChildType(int groupPosition, int childPosition) {
final Object child = getChild(groupPosition, childPosition);
if (child instanceof WorldRegion) {
return 0;
} else {
viewHolder = (ViewHolder) convertView.getTag();
return 1;
}
Drawable iconLeft = osmandApplication.getIconsCache()
.getContentIcon(R.drawable.ic_world_globe_dark);
viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, null, null, null);
viewHolder.textView.setText(getItem(position).toString());
}
@Override
public int getChildTypeCount() {
return 2;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final Object child = getChild(groupPosition, childPosition);
if (child instanceof WorldRegion) {
WorldRegion item = (WorldRegion)child;
SimpleViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.simple_list_menu_item, parent, false);
viewHolder = new SimpleViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(viewHolder);
} else {
viewHolder = (SimpleViewHolder) convertView.getTag();
}
Drawable iconLeft = getMyApplication().getIconsCache()
.getContentIcon(R.drawable.ic_world_globe_dark);
viewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, null, null, null);
viewHolder.textView.setText(item.getName());
} else if (child instanceof ItemsListBuilder.ResourceItem) {
ItemsListBuilder.ResourceItem item = (ItemsListBuilder.ResourceItem) child;
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);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder) convertView.getTag();
}
viewHolder.bindIndexItem(item.getIndexItem(), getDownloadActivity(), false, false);
}
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onChildClick(null, v, groupPosition, childPosition, 0);
}
});
return convertView;
}
private static class ViewHolder {
TextView textView;
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View v = convertView;
String section = getGroup(groupPosition);
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getDownloadActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.download_item_list_section, parent, false);
}
TextView nameView = ((TextView) v.findViewById(R.id.section_name));
nameView.setText(section);
v.setOnClickListener(null);
return v;
}
@Override
public int getChildrenCount(int groupPosition) {
String section = sections.get(groupPosition);
return data.get(section).size();
}
@Override
public String getGroup(int groupPosition) {
return sections.get(groupPosition);
}
@Override
public int getGroupCount() {
return sections.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}