Skip to content

Commit

Permalink
order regions by continents
Browse files Browse the repository at this point in the history
  • Loading branch information
ialokim committed Dec 11, 2017
1 parent b2020a3 commit b7e895e
Show file tree
Hide file tree
Showing 9 changed files with 372 additions and 55 deletions.
56 changes: 56 additions & 0 deletions app/src/main/java/de/grobox/transportr/networks/Continent.java
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

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);
}

}
111 changes: 111 additions & 0 deletions app/src/main/java/de/grobox/transportr/networks/ContinentItem.java
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

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<ContinentItem, ContinentViewHolder, RegionItem> {

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<Object> 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<ContinentItem> 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<IItem> {

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;
}
}

}
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -82,22 +85,30 @@ 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);
list = findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(this));
list.setAdapter(adapter);

Map<Region, List<TransportNetwork>> networksByRegion = getTransportNetworksByRegion();
for (Region region : networksByRegion.keySet()) {
RegionItem regionItem = new RegionItem(region);
List<TransportNetwork> networks = networksByRegion.get(region);
List<TransportNetworkItem> networkItems = new ArrayList<>(networks.size());
for (TransportNetwork n : networks) networkItems.add(new TransportNetworkItem(n));
regionItem.withSubItems(networkItems);
adapter.add(regionItem);
Map<Continent, HashMap<Region, List<TransportNetwork>>> continents = getRegionsAndNetworksByContinent();
for (Continent continent : continents.keySet()) {
ContinentItem continentItem = new ContinentItem(continent);
Map<Region, List<TransportNetwork>> regions = continents.get(continent);
List<RegionItem> regionItems = new ArrayList<RegionItem>(regions.size());
for (Region region : regions.keySet()) {
RegionItem regionItem = new RegionItem(region);
List<TransportNetwork> networks = regions.get(region);
List<TransportNetworkItem> 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);

Expand Down Expand Up @@ -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<Region, List<TransportNetwork>> getTransportNetworksByRegion() {
HashMap<Region, List<TransportNetwork>> networks = new HashMap<>();

private HashMap<Continent, HashMap<Region, List<TransportNetwork>>> getRegionsAndNetworksByContinent() {

HashMap<Continent, HashMap<Region, List<TransportNetwork>>> continents = new HashMap<>();
for (TransportNetwork n : TransportNetworks.networks) {
if (networks.containsKey(n.getRegion())) {
networks.get(n.getRegion()).add(n);
} else {
List<TransportNetwork> list = new ArrayList<>();
list.add(n);
networks.put(n.getRegion(), list);
Region region = n.getRegion();
Continent continent = region.getContinent();
HashMap<Region, List<TransportNetwork>> regions = new HashMap();
List<TransportNetwork> 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;
}

}
Loading

0 comments on commit b7e895e

Please sign in to comment.