diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleContentsFragment.java b/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleContentsFragment.java index 6d0e9d6c5b..2fe0444a6e 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleContentsFragment.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleContentsFragment.java @@ -19,12 +19,8 @@ import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; -import net.osmand.plus.wikivoyage.data.ContentsJsonParser; -import net.osmand.plus.wikivoyage.data.ContentsJsonParser.ContentsContainer; +import net.osmand.plus.wikivoyage.data.WikivoyageJsonParser; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFragment { @@ -37,9 +33,6 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag private ExpandableListView expListView; - private LinkedHashMap map; - private String link; - @Override public void createMenuItems(Bundle savedInstanceState) { Bundle args = getArguments(); @@ -52,20 +45,15 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag return; } - ContentsContainer contentsContainer = ContentsJsonParser.parseJsonContents(contentsJson); - if (contentsContainer == null) { + final WikivoyageJsonParser.WikivoyageContentItem wikivoyageContentItem = WikivoyageJsonParser.parseJsonContents(contentsJson); + if (wikivoyageContentItem == null) { return; } - final ArrayList listDataHeader = contentsContainer.listDataHeader; - final LinkedHashMap> listDataChild = contentsContainer.listDataChild; - - map = contentsContainer.map; - items.add(new TitleItem(getString(R.string.shared_string_contents))); expListView = new ExpandableListView(getContext()); - ExpandableListAdapter listAdapter = new ExpandableListAdapter(getContext(), listDataHeader, listDataChild); + ExpandableListAdapter listAdapter = new ExpandableListAdapter(getContext(), wikivoyageContentItem); expListView.setAdapter(listAdapter); Drawable transparent = ContextCompat.getDrawable(getContext(), R.color.color_transparent); @@ -80,9 +68,9 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, - int groupPosition, int childPosition, long id) { - link = map.get(listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition)); - sendResult(); + int groupPosition, int childPosition, long id) { + String link = wikivoyageContentItem.getSubItems().get(groupPosition).getSubItems().get(childPosition).getLink(); + sendResult(link); dismiss(); return false; } @@ -90,8 +78,8 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { - link = map.get(listDataHeader.get(groupPosition)); - sendResult(); + String link = wikivoyageContentItem.getSubItems().get(groupPosition).getLink(); + sendResult(link); dismiss(); return false; } @@ -102,7 +90,7 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag items.add(new SimpleBottomSheetItem.Builder().setCustomView(container).create()); } - private void sendResult() { + private void sendResult(String link) { Intent intent = new Intent(); intent.putExtra(CONTENTS_LINK_KEY, link); Fragment fragment = getTargetFragment(); @@ -130,17 +118,14 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag private Context context; - private List listDataHeader; - private LinkedHashMap> listDataChild; + private WikivoyageJsonParser.WikivoyageContentItem wikivoyageContentItem; private Drawable itemGroupIcon; private Drawable itemChildIcon; - ExpandableListAdapter(Context context, List listDataHeader, - LinkedHashMap> listChildData) { + ExpandableListAdapter(Context context, WikivoyageJsonParser.WikivoyageContentItem wikivoyageContentItem) { this.context = context; - this.listDataHeader = listDataHeader; - this.listDataChild = listChildData; + this.wikivoyageContentItem = wikivoyageContentItem; itemGroupIcon = getIcon(R.drawable.ic_action_list_header, nightMode ? R.color.wikivoyage_contents_parent_icon_dark : R.color.wikivoyage_contents_parent_icon_light); @@ -151,7 +136,7 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag @Override public Object getChild(int groupPosition, int childPosititon) { - return listDataChild.get(listDataHeader.get(groupPosition)).get(childPosititon); + return wikivoyageContentItem.getSubItems().get(groupPosition).getSubItems().get(childPosititon).getName(); } @Override @@ -176,7 +161,7 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag convertView.findViewById(R.id.upper_row_divider).setVisibility(View.GONE); txtListChild.setTypeface(null); - if (childPosition == listDataChild.get(listDataHeader.get(groupPosition)).size() - 1) { + if (childPosition == wikivoyageContentItem.getSubItems().get(groupPosition).getSubItems().size() - 1) { convertView.findViewById(R.id.bottom_row_divider).setVisibility(View.VISIBLE); } else { convertView.findViewById(R.id.bottom_row_divider).setVisibility(View.GONE); @@ -187,18 +172,18 @@ public class WikivoyageArticleContentsFragment extends MenuBottomSheetDialogFrag @Override public int getChildrenCount(int groupPosition) { - List list = listDataChild.get(listDataHeader.get(groupPosition)); - return list == null ? 0 : list.size(); + return wikivoyageContentItem.getSubItems().get(groupPosition).getSubItems().size(); } @Override public Object getGroup(int groupPosition) { - return this.listDataHeader.get(groupPosition); + return wikivoyageContentItem.getSubItems().get(groupPosition).getName(); + } @Override public int getGroupCount() { - return this.listDataHeader.size(); + return wikivoyageContentItem.getSubItems().size(); } @Override diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/ContentsJsonParser.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/ContentsJsonParser.java deleted file mode 100644 index 76773c7507..0000000000 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/ContentsJsonParser.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.osmand.plus.wikivoyage.data; - -import android.support.annotation.Nullable; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; - -public class ContentsJsonParser { - - @Nullable - public static ContentsContainer parseJsonContents(String contentsJson) { - LinkedHashMap map = new LinkedHashMap<>(); - ArrayList listDataHeader = new ArrayList<>(); - LinkedHashMap> listDataChild = new LinkedHashMap<>(); - - JSONObject reader; - try { - reader = new JSONObject(contentsJson); - } catch (JSONException e) { - e.printStackTrace(); - return null; - } - List secondLevel = null; - JSONArray jArray = reader.names(); - for (int i = 0; i < jArray.length(); i++) { - try { - JSONArray contacts = reader.getJSONArray(reader.names().getString(i)); - String link = contacts.getString(1); - - map.put(reader.names().getString(i), link); - - int level = contacts.getInt(0); - - if (level == 2) { - listDataHeader.add(reader.names().getString(i)); - secondLevel = new ArrayList<>(); - } - if (level == 3) { - if (secondLevel == null) { - secondLevel = new ArrayList<>(); - } - secondLevel.add(reader.names().getString(i)); - listDataChild.put(listDataHeader.get(listDataHeader.size() - 1), secondLevel); - } - } catch (JSONException e) { - e.printStackTrace(); - } - } - return new ContentsContainer(map, listDataHeader, listDataChild); - } - - public static class ContentsContainer { - - public LinkedHashMap map; - public ArrayList listDataHeader; - public LinkedHashMap> listDataChild; - - ContentsContainer(LinkedHashMap map, - ArrayList listDataHeader, - LinkedHashMap> listChildData) { - this.map = map; - this.listDataHeader = listDataHeader; - this.listDataChild = listChildData; - } - } -} diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/WikivoyageJsonParser.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/WikivoyageJsonParser.java new file mode 100644 index 0000000000..cb791f9913 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/WikivoyageJsonParser.java @@ -0,0 +1,97 @@ +package net.osmand.plus.wikivoyage.data; + +import android.support.annotation.Nullable; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class WikivoyageJsonParser { + + private static final String HEADERS = "headers"; + private static final String SUBHEADERS = "subheaders"; + private static final String LINK = "link"; + + @Nullable + public static WikivoyageContentItem parseJsonContents(String contentsJson) { + + JSONObject jArray; + JSONObject reader; + + try { + reader = new JSONObject(contentsJson); + jArray = reader.getJSONObject(HEADERS); + } catch (JSONException e) { + e.printStackTrace(); + return null; + } + + WikivoyageContentItem topWikivoyageContentItem = new WikivoyageContentItem(HEADERS, null); + for (int i = 0; i < jArray.length(); i++) { + try { + String link = ""; + JSONObject jsonHeader = jArray.getJSONObject(jArray.names().getString(i)); + link = jsonHeader.getString(LINK); + WikivoyageContentItem contentHeaderItem = new WikivoyageContentItem(jArray.names().getString(i), link, topWikivoyageContentItem); + topWikivoyageContentItem.subItems.add(contentHeaderItem); + + JSONArray jsonSubheaders = jsonHeader.getJSONArray(SUBHEADERS); + List subheaderNames = null; + for (int j = 0; j < jsonSubheaders.length(); j++) { + JSONObject jsonSubheader = jsonSubheaders.getJSONObject(j); + JSONObject jsonSubheaderLink = jsonSubheader.getJSONObject(jsonSubheader.keys().next()); + if (subheaderNames == null) { + subheaderNames = new ArrayList<>(); + } + subheaderNames.add(jsonSubheader.keys().next()); + link = jsonSubheaderLink.getString(LINK); + + WikivoyageContentItem contentsSubHeaderContainer = new WikivoyageContentItem(jsonSubheader.names().getString(0), link, contentHeaderItem); + contentHeaderItem.subItems.add(contentsSubHeaderContainer); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + return topWikivoyageContentItem; + } + + public static class WikivoyageContentItem { + + private String link; + private String name; + private ArrayList subItems = new ArrayList<>(); + private WikivoyageContentItem parent; + + private WikivoyageContentItem(String name, String link) { + this.name = name; + this.link = link; + } + + private WikivoyageContentItem(String name, String link, WikivoyageContentItem parent) { + this.parent = parent; + this.name = name; + this.link = link; + } + + public String getName() { + return name; + } + + public String getLink() { + return link; + } + + public WikivoyageContentItem getParent() { + return parent; + } + + public ArrayList getSubItems() { + return subItems; + } + + } +}