diff --git a/app/src/main/java/de/grobox/transportr/networks/Continent.java b/app/src/main/java/de/grobox/transportr/networks/Continent.java
new file mode 100644
index 000000000..e6e949eb4
--- /dev/null
+++ b/app/src/main/java/de/grobox/transportr/networks/Continent.java
@@ -0,0 +1,56 @@
+/*
+ * Transportr
+ *
+ * Copyright (c) 2013 - 2017 Torsten Grote
+ *
+ * This program is Free Software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.grobox.transportr.networks;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import de.grobox.transportr.R;
+
+@ParametersAreNonnullByDefault
+enum Continent {
+
+ EUROPE(R.string.np_continent_europe),
+ AFRICA(R.string.np_continent_africa),
+ NORTH_AMERICA(R.string.np_continent_north_america),
+ SOUTH_AMERICA(R.string.np_continent_south_america),
+ ASIA(R.string.np_continent_asia),
+ AUSTRALIA(R.string.np_continent_australia);
+
+
+ private final @StringRes int name;
+
+ Continent(@StringRes int name) {
+ this.name = name;
+ }
+
+ @StringRes
+ public int getName() {
+ return name;
+ }
+
+ public String getName(Context context) {
+ return context.getString(name);
+ }
+
+}
diff --git a/app/src/main/java/de/grobox/transportr/networks/ContinentItem.java b/app/src/main/java/de/grobox/transportr/networks/ContinentItem.java
new file mode 100644
index 000000000..15b0171fb
--- /dev/null
+++ b/app/src/main/java/de/grobox/transportr/networks/ContinentItem.java
@@ -0,0 +1,111 @@
+/*
+ * Transportr
+ *
+ * Copyright (c) 2013 - 2017 Torsten Grote
+ *
+ * This program is Free Software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.grobox.transportr.networks;
+
+import android.content.Context;
+import android.support.annotation.IdRes;
+import android.support.annotation.LayoutRes;
+import android.support.v4.view.ViewCompat;
+import android.view.View;
+
+import com.mikepenz.fastadapter.IItem;
+import com.mikepenz.fastadapter.expandable.items.AbstractExpandableItem;
+import com.mikepenz.fastadapter.listeners.OnClickListener;
+
+import java.util.Comparator;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import de.grobox.transportr.R;
+
+@ParametersAreNonnullByDefault
+class ContinentItem extends AbstractExpandableItem {
+
+ private final Continent continent;
+
+ ContinentItem(Continent continent) {
+ super();
+ this.continent = continent;
+ }
+
+ @IdRes
+ @Override
+ public int getType() {
+ return R.id.list_item_transport_continent;
+ }
+
+ @Override
+ @LayoutRes
+ public int getLayoutRes() {
+ return R.layout.list_item_transport_continent;
+ }
+
+ @Override
+ public void bindView(ContinentViewHolder ui, List payloads) {
+ super.bindView(ui, payloads);
+ ui.bind(continent, isExpanded());
+ }
+
+ @Override
+ public ContinentViewHolder getViewHolder(View view) {
+ return new ContinentViewHolder(view);
+ }
+
+ @Override
+ public long getIdentifier() {
+ return continent.getName();
+ }
+
+ @Override
+ public OnClickListener getOnItemClickListener() {
+ return (v, adapter, item, position) -> {
+ if (item.getSubItems() != null) {
+ if (!item.isExpanded()) {
+ ViewCompat.animate(v.findViewById(R.id.chevron)).rotation(180).start();
+ } else {
+ ViewCompat.animate(v.findViewById(R.id.chevron)).rotation(0).start();
+ }
+ return true;
+ }
+ return false;
+ };
+ }
+
+ static class ContinentComparator implements Comparator {
+
+ private final Context context;
+
+ ContinentComparator(Context context) {
+ super();
+ this.context = context;
+ }
+
+ @Override
+ public int compare(IItem i1, IItem i2) {
+ if (i1 instanceof ContinentItem && i2 instanceof ContinentItem) {
+ // sort continents alphabetically
+ return ((ContinentItem) i1).continent.getName(context).compareTo(((ContinentItem) i2).continent.getName(context));
+ }
+ return 0;
+ }
+ }
+
+}
diff --git a/app/src/main/java/de/grobox/transportr/networks/ContinentViewHolder.java b/app/src/main/java/de/grobox/transportr/networks/ContinentViewHolder.java
new file mode 100644
index 000000000..7d8504a2d
--- /dev/null
+++ b/app/src/main/java/de/grobox/transportr/networks/ContinentViewHolder.java
@@ -0,0 +1,50 @@
+/*
+ * Transportr
+ *
+ * Copyright (c) 2013 - 2017 Torsten Grote
+ *
+ * This program is Free Software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package de.grobox.transportr.networks;
+
+import android.os.Build;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import de.grobox.transportr.R;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+class ContinentViewHolder extends RecyclerView.ViewHolder {
+
+ private final TextView name;
+ private final ImageView chevron;
+
+ ContinentViewHolder(View v) {
+ super(v);
+ name = v.findViewById(R.id.name);
+ chevron = v.findViewById(R.id.chevron);
+ }
+
+ void bind(Continent continent, boolean expanded) {
+ name.setText(continent.getName());
+ if (expanded) chevron.setRotation(0);
+ else chevron.setRotation(180);
+ }
+
+}
diff --git a/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.java b/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.java
index 22db9c453..e8648098a 100644
--- a/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.java
+++ b/app/src/main/java/de/grobox/transportr/networks/PickTransportNetworkActivity.java
@@ -23,16 +23,19 @@
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
+import android.support.v7.util.SortedList;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;
+import com.google.common.collect.RowSortedTable;
import com.mikepenz.fastadapter.IItem;
import com.mikepenz.fastadapter.ISelectionListener;
import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter;
import com.mikepenz.fastadapter.expandable.ExpandableExtension;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -82,7 +85,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
adapter = new FastItemAdapter<>();
adapter.withSelectable(true);
- adapter.getItemAdapter().withComparator(new RegionItem.RegionComparator(this));
+ adapter.getItemAdapter().withComparator(new ContinentItem.ContinentComparator(this));
adapter.withSelectionListener(this);
expandableExtension = new ExpandableExtension<>();
adapter.addExtension(expandableExtension);
@@ -90,14 +93,22 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
list.setLayoutManager(new LinearLayoutManager(this));
list.setAdapter(adapter);
- Map> networksByRegion = getTransportNetworksByRegion();
- for (Region region : networksByRegion.keySet()) {
- RegionItem regionItem = new RegionItem(region);
- List networks = networksByRegion.get(region);
- List networkItems = new ArrayList<>(networks.size());
- for (TransportNetwork n : networks) networkItems.add(new TransportNetworkItem(n));
- regionItem.withSubItems(networkItems);
- adapter.add(regionItem);
+ Map>> continents = getRegionsAndNetworksByContinent();
+ for (Continent continent : continents.keySet()) {
+ ContinentItem continentItem = new ContinentItem(continent);
+ Map> regions = continents.get(continent);
+ List regionItems = new ArrayList(regions.size());
+ for (Region region : regions.keySet()) {
+ RegionItem regionItem = new RegionItem(region);
+ List networks = regions.get(region);
+ List networkItems = new ArrayList<>(networks.size());
+ for (TransportNetwork n : networks) networkItems.add(new TransportNetworkItem(n));
+ regionItem.withSubItems(networkItems);
+ regionItems.add(regionItem);
+ }
+ Collections.sort(regionItems, new RegionItem.RegionComparator(this));
+ continentItem.withSubItems(regionItems);
+ adapter.add(continentItem);
}
if (savedInstanceState != null) adapter.withSavedInstanceState(savedInstanceState);
@@ -134,31 +145,49 @@ private void selectItem() {
selectAllowed = true;
return;
}
- int pos = adapter.getPosition(new RegionItem(network.getRegion()));
+ int pos = adapter.getPosition(new ContinentItem(network.getRegion().getContinent()));
if (pos != -1) {
expandableExtension.expand(pos);
- pos = adapter.getPosition(new TransportNetworkItem(network));
+ pos = adapter.getPosition(new RegionItem(network.getRegion()));
if (pos != -1) {
- adapter.select(pos, false);
- list.scrollToPosition(pos);
- list.smoothScrollBy(0, -75);
- selectAllowed = true;
+ expandableExtension.expand(pos);
+ pos = adapter.getPosition(new TransportNetworkItem(network));
+ if (pos != -1) {
+ adapter.select(pos, false);
+ list.scrollToPosition(pos);
+ list.smoothScrollBy(0, -75);
+ selectAllowed = true;
+ }
}
}
}
-
- private HashMap> getTransportNetworksByRegion() {
- HashMap> networks = new HashMap<>();
+
+ private HashMap>> getRegionsAndNetworksByContinent() {
+
+ HashMap>> continents = new HashMap<>();
for (TransportNetwork n : TransportNetworks.networks) {
- if (networks.containsKey(n.getRegion())) {
- networks.get(n.getRegion()).add(n);
- } else {
- List list = new ArrayList<>();
- list.add(n);
- networks.put(n.getRegion(), list);
+ Region region = n.getRegion();
+ Continent continent = region.getContinent();
+ HashMap> regions = new HashMap();
+ List networks = new ArrayList();
+
+ if (continents.containsKey(continent)) {
+ regions = continents.get(continent);
+ }
+ if (regions.containsKey(region)) {
+ networks = regions.get(region);
+ }
+
+ networks.add(n);
+
+ if (!regions.containsKey(region)) {
+ regions.put(region, networks);
+ }
+ if (!continents.containsKey(continent)) {
+ continents.put(continent, regions);
}
}
- return networks;
+ return continents;
}
}
diff --git a/app/src/main/java/de/grobox/transportr/networks/Region.java b/app/src/main/java/de/grobox/transportr/networks/Region.java
index 5c6f25dda..e8020e691 100644
--- a/app/src/main/java/de/grobox/transportr/networks/Region.java
+++ b/app/src/main/java/de/grobox/transportr/networks/Region.java
@@ -30,39 +30,41 @@
@ParametersAreNonnullByDefault
enum Region {
- EUROPE(R.string.np_region_europe, "๐ช๐บ"),
- GERMANY(R.string.np_region_germany, "๐ฉ๐ช"),
- AUSTRIA(R.string.np_region_austria, "๐ฆ๐น"),
- LIECHTENSTEIN(R.string.np_region_liechtenstein, "๐ฑ๐ฎ"),
- SWITZERLAND(R.string.np_region_switzerland, "๐จ๐ญ"),
- BELGIUM(R.string.np_region_belgium, "๐ง๐ช"),
- LUXEMBOURG(R.string.np_region_luxembourg, "๐ฑ๐บ"),
- NETHERLANDS(R.string.np_region_netherlands, "๐ณ๐ฑ"),
- DENMARK(R.string.np_region_denmark, "๐ฉ๐ฐ"),
- SWEDEN(R.string.np_region_sweden, "๐ธ๐ช"),
- NORWAY(R.string.np_region_norway, "๐ณ๐ด"),
- FINLAND(R.string.np_region_finland, "๐ซ๐ฎ"),
- GREAT_BRITAIN(R.string.np_region_gb, "๐ฌ๐ง"),
- IRELAND(R.string.np_region_ireland, "๐ฎ๐ช"),
- ITALY(R.string.np_region_italy, "๐ฎ๐น"),
- POLAND(R.string.np_region_poland, "๐ต๐ฑ"),
- UAE(R.string.np_region_uae, "๐ฆ๐ช"),
- USA(R.string.np_region_usa, "๐บ๐ธ"),
- AUSTRALIA(R.string.np_region_australia, "๐ฆ๐บ"),
- FRANCE(R.string.np_region_france, "๐ซ๐ท"),
- NEW_ZEALAND(R.string.np_region_nz, "๐ณ๐ฟ"),
- SPAIN(R.string.np_region_spain, "๐ช๐ธ"),
- BRAZIL(R.string.np_region_br, "๐ง๐ท"),
- CANADA(R.string.np_region_canada, "๐จ๐ฆ"),
- COSTA_RICA(R.string.np_region_costa_rica, "๐จ๐ท"),
- AFRICA(R.string.np_region_africa, "๐");
+ EUROPE(R.string.np_region_europe, "๐ช๐บ", Continent.EUROPE),
+ GERMANY(R.string.np_region_germany, "๐ฉ๐ช", Continent.EUROPE),
+ AUSTRIA(R.string.np_region_austria, "๐ฆ๐น", Continent.EUROPE),
+ LIECHTENSTEIN(R.string.np_region_liechtenstein, "๐ฑ๐ฎ", Continent.EUROPE),
+ SWITZERLAND(R.string.np_region_switzerland, "๐จ๐ญ", Continent.EUROPE),
+ BELGIUM(R.string.np_region_belgium, "๐ง๐ช", Continent.EUROPE),
+ LUXEMBOURG(R.string.np_region_luxembourg, "๐ฑ๐บ", Continent.EUROPE),
+ NETHERLANDS(R.string.np_region_netherlands, "๐ณ๐ฑ", Continent.EUROPE),
+ DENMARK(R.string.np_region_denmark, "๐ฉ๐ฐ", Continent.EUROPE),
+ SWEDEN(R.string.np_region_sweden, "๐ธ๐ช", Continent.EUROPE),
+ NORWAY(R.string.np_region_norway, "๐ณ๐ด", Continent.EUROPE),
+ FINLAND(R.string.np_region_finland, "๐ซ๐ฎ", Continent.EUROPE),
+ GREAT_BRITAIN(R.string.np_region_gb, "๐ฌ๐ง", Continent.EUROPE),
+ IRELAND(R.string.np_region_ireland, "๐ฎ๐ช", Continent.EUROPE),
+ ITALY(R.string.np_region_italy, "๐ฎ๐น", Continent.EUROPE),
+ POLAND(R.string.np_region_poland, "๐ต๐ฑ", Continent.EUROPE),
+ UAE(R.string.np_region_uae, "๐ฆ๐ช", Continent.ASIA),
+ USA(R.string.np_region_usa, "๐บ๐ธ", Continent.NORTH_AMERICA),
+ AUSTRALIA(R.string.np_region_australia, "๐ฆ๐บ", Continent.AUSTRALIA),
+ FRANCE(R.string.np_region_france, "๐ซ๐ท", Continent.EUROPE),
+ NEW_ZEALAND(R.string.np_region_nz, "๐ณ๐ฟ", Continent.AUSTRALIA),
+ SPAIN(R.string.np_region_spain, "๐ช๐ธ", Continent.EUROPE),
+ BRAZIL(R.string.np_region_br, "๐ง๐ท", Continent.SOUTH_AMERICA),
+ CANADA(R.string.np_region_canada, "๐จ๐ฆ", Continent.NORTH_AMERICA),
+ COSTA_RICA(R.string.np_region_costa_rica, "๐จ๐ท", Continent.NORTH_AMERICA),
+ GHANA(R.string.np_region_ghana, "๐ฌ๐ญ", Continent.AFRICA);
private final @StringRes int name;
private final @Nullable String flag;
+ private final Continent continent;
- Region(@StringRes int name, @Nullable String flag) {
+ Region(@StringRes int name, @Nullable String flag, Continent continent) {
this.name = name;
this.flag = flag;
+ this.continent = continent;
}
@StringRes
@@ -78,5 +80,9 @@ public String getName(Context context) {
public String getFlag() {
return flag;
}
+
+ public Continent getContinent() {
+ return continent;
+ }
}
diff --git a/app/src/main/java/de/grobox/transportr/networks/TransportNetworks.java b/app/src/main/java/de/grobox/transportr/networks/TransportNetworks.java
index 79ff027d5..2ef9b4734 100644
--- a/app/src/main/java/de/grobox/transportr/networks/TransportNetworks.java
+++ b/app/src/main/java/de/grobox/transportr/networks/TransportNetworks.java
@@ -638,7 +638,7 @@ public interface TransportNetworks {
.setId(NetworkId.GHANA)
.setName(R.string.np_name_ghana)
.setDescription(R.string.np_desc_ghana)
- .setRegion(Region.AFRICA)
+ .setRegion(Region.GHANA)
.setStatus(ALPHA)
.setGoodLineNames(true)
.build(),
diff --git a/app/src/main/res/layout/list_item_transport_continent.xml b/app/src/main/res/layout/list_item_transport_continent.xml
new file mode 100644
index 000000000..fe0b86133
--- /dev/null
+++ b/app/src/main/res/layout/list_item_transport_continent.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 9fa818665..db1aafb1e 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -156,6 +156,12 @@ es welche gibt) anzeigen lassen.
รnderungsprotokoll
Was gibt\'s Neues
Mehrโฆ
+ Europa
+ Afrika
+ Nordamerika
+ Sรผdamerika
+ Asien
+ Australien
Australien
Melbourne, Sydney, Brisbane, Perth, Adelaide, Hobart, Launceston, Burnie
Australien, Neusรผdwales, Sydney
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 586436e68..bc94dae69 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -186,6 +186,13 @@ there are any).
Changelog
What\'s New
Moreโฆ
+
+ Europe
+ Africa
+ North America
+ South America
+ Asia
+ Australia
Australia
Australia
@@ -230,7 +237,7 @@ there are any).
Denmark
Denmark, Copenhagen
- Europe
+ Europe (cross-border)
Europe
Long-distance trains only
Railteam alliance
@@ -373,7 +380,7 @@ there are any).
Tren Urbano
INCOFER
- Africa
+ Ghana
Ghana
Accra