264 lines
8.8 KiB
Java
264 lines
8.8 KiB
Java
package com.cradle.iitc_mobile;
|
|
|
|
import android.content.Context;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.AdapterView;
|
|
import android.widget.AdapterView.OnItemClickListener;
|
|
import android.widget.AdapterView.OnItemLongClickListener;
|
|
import android.widget.AdapterView.OnItemSelectedListener;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.CheckedTextView;
|
|
import android.widget.ListView;
|
|
import android.widget.Spinner;
|
|
import android.widget.TextView;
|
|
|
|
import org.json.JSONArray;
|
|
import org.json.JSONException;
|
|
import org.json.JSONObject;
|
|
|
|
import java.util.Comparator;
|
|
|
|
public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickListener, OnItemLongClickListener {
|
|
private class HighlighterComparator implements Comparator<String> {
|
|
@Override
|
|
public int compare(String lhs, String rhs) {
|
|
// Move "No Highlights" on top. Sort the rest alphabetically
|
|
if (lhs.equals("No Highlights"))
|
|
return -1000;
|
|
else if (rhs.equals("No Highlights"))
|
|
return 1000;
|
|
else
|
|
return lhs.compareTo(rhs);
|
|
}
|
|
}
|
|
|
|
private class Layer {
|
|
boolean active;
|
|
int id;
|
|
String name;
|
|
|
|
@Override
|
|
public String toString() {
|
|
return name;
|
|
}
|
|
}
|
|
|
|
private class LayerAdapter extends ArrayAdapter<Layer>
|
|
{
|
|
public LayerAdapter(int resource) {
|
|
super(mIitc, resource);
|
|
}
|
|
|
|
@Override
|
|
public View getView(int position, View convertView, ViewGroup parent) {
|
|
Layer item = getItem(position);
|
|
View view = (TextView) super.getView(position, convertView, parent);
|
|
|
|
if (view instanceof CheckedTextView)
|
|
((CheckedTextView) view).setChecked(item.active);
|
|
return view;
|
|
}
|
|
}
|
|
|
|
private IITC_Mobile mIitc;
|
|
|
|
private ArrayAdapter<String> mHighlighters;
|
|
private ArrayAdapter<Layer> mBaseLayers;
|
|
private ArrayAdapter<Layer> mOverlayLayers;
|
|
|
|
private Spinner mSpinnerBaseMap;
|
|
private Spinner mSpinnerHighlighter;
|
|
private ListView mListViewOverlayLayers;
|
|
|
|
private String mActiveHighlighter;
|
|
private int mActiveLayer;
|
|
|
|
private class HighlighterAdapter extends ArrayAdapter<String> {
|
|
private HighlighterComparator mComparator = new HighlighterComparator();
|
|
|
|
private HighlighterAdapter(int resource) {
|
|
super(mIitc, resource);
|
|
clear();
|
|
}
|
|
|
|
@Override
|
|
public void add(String object) {
|
|
super.remove(object); // to avoid duplicates
|
|
super.add(object);
|
|
super.sort(mComparator);
|
|
}
|
|
|
|
@Override
|
|
public void clear() {
|
|
super.clear();
|
|
add("No Highlights");// Probably must be the same as window._no_highlighter
|
|
}
|
|
}
|
|
|
|
public IITC_MapSettings(IITC_Mobile activity) {
|
|
mIitc = activity;
|
|
|
|
mHighlighters = new HighlighterAdapter(R.layout.list_item_narrow);
|
|
mBaseLayers = new LayerAdapter(R.layout.list_item_narrow);
|
|
mOverlayLayers = new LayerAdapter(android.R.layout.simple_list_item_multiple_choice);
|
|
|
|
mHighlighters.setDropDownViewResource(R.layout.list_item_selectable);
|
|
mBaseLayers.setDropDownViewResource(R.layout.list_item_selectable);
|
|
|
|
LayoutInflater inflater = (LayoutInflater) mIitc.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
View header = inflater.inflate(R.layout.map_options_header, null);
|
|
|
|
mSpinnerHighlighter = (Spinner) header.findViewById(R.id.spinnerHighlighter);
|
|
mSpinnerBaseMap = (Spinner) header.findViewById(R.id.spinnerBaseLayer);
|
|
mListViewOverlayLayers = (ListView) mIitc.findViewById(R.id.right_drawer);
|
|
|
|
mListViewOverlayLayers.addHeaderView(header);
|
|
|
|
mSpinnerHighlighter.setAdapter(mHighlighters);
|
|
mSpinnerBaseMap.setAdapter(mBaseLayers);
|
|
mListViewOverlayLayers.setAdapter(mOverlayLayers);
|
|
|
|
mSpinnerHighlighter.setOnItemSelectedListener(this);
|
|
mSpinnerBaseMap.setOnItemSelectedListener(this);
|
|
mListViewOverlayLayers.setOnItemClickListener(this);
|
|
mListViewOverlayLayers.setOnItemLongClickListener(this);
|
|
}
|
|
|
|
public void updateLayers() {
|
|
mIitc.getWebView().loadUrl("javascript: window.layerChooser.getLayers()");
|
|
}
|
|
|
|
public void addPortalHighlighter(String name) {
|
|
mHighlighters.add(name);
|
|
|
|
if (name.equals(mActiveHighlighter))
|
|
setActiveHighlighter(name);
|
|
}
|
|
|
|
public void setActiveHighlighter(String name) {
|
|
mActiveHighlighter = name;
|
|
|
|
int position = mHighlighters.getPosition(mActiveHighlighter);
|
|
if (position >= 0 && position < mHighlighters.getCount())
|
|
mSpinnerHighlighter.setSelection(position);
|
|
}
|
|
|
|
public void setLayers(String base_layer, String overlay_layer) {
|
|
/*
|
|
* the layer strings have a form like:
|
|
* [{"layerId":27,"name":"MapQuest OSM","active":true},
|
|
* {"layerId":28,"name":"Default Ingress Map","active":false}]
|
|
* Put it in a JSONArray and parse it
|
|
*/
|
|
JSONArray base_layers = null;
|
|
JSONArray overlay_layers = null;
|
|
|
|
try {
|
|
base_layers = new JSONArray(base_layer);
|
|
overlay_layers = new JSONArray(overlay_layer);
|
|
} catch (JSONException e) {
|
|
e.printStackTrace();
|
|
return;
|
|
}
|
|
|
|
mActiveLayer = 0;
|
|
mBaseLayers.setNotifyOnChange(false);
|
|
mBaseLayers.clear();
|
|
for (int i = 0; i < base_layers.length(); i++) {
|
|
try {
|
|
JSONObject layerObj = base_layers.getJSONObject(i);
|
|
Layer layer = new Layer();
|
|
|
|
layer.id = layerObj.getInt("layerId");
|
|
layer.name = layerObj.getString("name");
|
|
layer.active = layerObj.getBoolean("active");
|
|
|
|
if (layer.active)
|
|
// getCount() will be the index of the layer we are about to add
|
|
mActiveLayer = mBaseLayers.getCount();
|
|
|
|
mBaseLayers.add(layer);
|
|
} catch (JSONException e) {
|
|
e.printStackTrace();
|
|
continue;
|
|
}
|
|
}
|
|
mBaseLayers.notifyDataSetChanged();
|
|
mSpinnerBaseMap.setSelection(mActiveLayer);
|
|
|
|
mOverlayLayers.setNotifyOnChange(false);
|
|
mOverlayLayers.clear();
|
|
for (int i = 0; i < overlay_layers.length(); i++) {
|
|
try {
|
|
JSONObject layerObj = overlay_layers.getJSONObject(i);
|
|
Layer layer = new Layer();
|
|
|
|
layer.id = layerObj.getInt("layerId");
|
|
layer.name = layerObj.getString("name");
|
|
layer.active = layerObj.getBoolean("active");
|
|
|
|
mOverlayLayers.add(layer);
|
|
} catch (JSONException e) {
|
|
e.printStackTrace();
|
|
continue;
|
|
}
|
|
}
|
|
mOverlayLayers.notifyDataSetChanged();
|
|
}
|
|
|
|
private void updateLayer(Layer layer) {
|
|
mIitc.getWebView().loadUrl(
|
|
"javascript: window.layerChooser.showLayer(" + layer.id + "," + layer.active + ");");
|
|
}
|
|
|
|
@Override
|
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
|
if (parent.equals(mSpinnerHighlighter)) {
|
|
String name = mHighlighters.getItem(position);
|
|
mIitc.getWebView().loadUrl("javascript: window.changePortalHighlights('" + name + "')");
|
|
}
|
|
else if (parent.equals(mSpinnerBaseMap)) {
|
|
mBaseLayers.getItem(mActiveLayer).active = false; // set old layer to hidden, but no need to really hide
|
|
|
|
Layer layer = mBaseLayers.getItem(position);
|
|
layer.active = true;
|
|
updateLayer(layer);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onNothingSelected(AdapterView<?> parent) {
|
|
// ignore
|
|
}
|
|
|
|
@Override
|
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
position--; // The ListView header counts as an item as well.
|
|
|
|
Layer item = mOverlayLayers.getItem(position);
|
|
item.active = !item.active;
|
|
updateLayer(item);
|
|
mOverlayLayers.notifyDataSetChanged();
|
|
}
|
|
|
|
@Override
|
|
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
|
|
position--; // The ListView header counts as an item as well.
|
|
boolean active = !mOverlayLayers.getItem(position).active;
|
|
|
|
for (int i = 0; i < mOverlayLayers.getCount(); i++) {
|
|
Layer item = mOverlayLayers.getItem(i);
|
|
if (item.name.contains("DEBUG")) continue;
|
|
if (active == item.active) continue; // no need to set same value again
|
|
item.active = active;
|
|
updateLayer(item);
|
|
}
|
|
|
|
mOverlayLayers.notifyDataSetChanged();
|
|
|
|
return true;
|
|
}
|
|
}
|