avoid possible callback loop

This commit is contained in:
fkloft
2015-11-07 22:00:00 +01:00
parent ef34c38910
commit 584780ec05

View File

@ -23,13 +23,13 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
private class HighlighterAdapter extends ArrayAdapter<String> { private class HighlighterAdapter extends ArrayAdapter<String> {
private final HighlighterComparator mComparator = new HighlighterComparator(); private final HighlighterComparator mComparator = new HighlighterComparator();
private HighlighterAdapter(int resource) { private HighlighterAdapter(final int resource) {
super(mIitc, resource); super(mIitc, resource);
clear(); clear();
} }
@Override @Override
public void add(String object) { public void add(final String object) {
super.remove(object); // to avoid duplicates super.remove(object); // to avoid duplicates
super.add(object); super.add(object);
super.sort(mComparator); super.sort(mComparator);
@ -44,7 +44,7 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
private class HighlighterComparator implements Comparator<String> { private class HighlighterComparator implements Comparator<String> {
@Override @Override
public int compare(String lhs, String rhs) { public int compare(final String lhs, final String rhs) {
// Move "No Highlights" on top. Sort the rest alphabetically // Move "No Highlights" on top. Sort the rest alphabetically
if (lhs.equals("No Highlights")) { if (lhs.equals("No Highlights")) {
return -1000; return -1000;
@ -68,14 +68,14 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
} }
private class LayerAdapter extends ArrayAdapter<Layer> { private class LayerAdapter extends ArrayAdapter<Layer> {
public LayerAdapter(int resource) { public LayerAdapter(final int resource) {
super(mIitc, resource); super(mIitc, resource);
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(final int position, final View convertView, final ViewGroup parent) {
Layer item = getItem(position); final Layer item = getItem(position);
View view = super.getView(position, convertView, parent); final View view = super.getView(position, convertView, parent);
if (view instanceof CheckedTextView) { if (view instanceof CheckedTextView) {
((CheckedTextView) view).setChecked(item.active); ((CheckedTextView) view).setChecked(item.active);
@ -98,8 +98,9 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
private int mActiveLayer; private int mActiveLayer;
private boolean mLoading = true; private boolean mLoading = true;
private boolean mDisableListeners = false;
public IITC_MapSettings(IITC_Mobile activity) { public IITC_MapSettings(final IITC_Mobile activity) {
mIitc = activity; mIitc = activity;
mHighlighters = new HighlighterAdapter(R.layout.list_item_narrow); mHighlighters = new HighlighterAdapter(R.layout.list_item_narrow);
@ -109,8 +110,8 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
mHighlighters.setDropDownViewResource(R.layout.list_item_selectable); mHighlighters.setDropDownViewResource(R.layout.list_item_selectable);
mBaseLayers.setDropDownViewResource(R.layout.list_item_selectable); mBaseLayers.setDropDownViewResource(R.layout.list_item_selectable);
LayoutInflater inflater = (LayoutInflater) mIitc.getSystemService(Context.LAYOUT_INFLATER_SERVICE); final LayoutInflater inflater = (LayoutInflater) mIitc.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View header = inflater.inflate(R.layout.map_options_header, null); final View header = inflater.inflate(R.layout.map_options_header, null);
mSpinnerHighlighter = (Spinner) header.findViewById(R.id.spinnerHighlighter); mSpinnerHighlighter = (Spinner) header.findViewById(R.id.spinnerHighlighter);
mSpinnerBaseMap = (Spinner) header.findViewById(R.id.spinnerBaseLayer); mSpinnerBaseMap = (Spinner) header.findViewById(R.id.spinnerBaseLayer);
@ -128,14 +129,14 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
mListViewOverlayLayers.setOnItemLongClickListener(this); mListViewOverlayLayers.setOnItemLongClickListener(this);
} }
private void setLayer(Layer layer) { private void setLayer(final Layer layer) {
if (!mLoading) { if (!mLoading) {
mIitc.getWebView().loadUrl( mIitc.getWebView().loadUrl(
"javascript: window.layerChooser.showLayer(" + layer.id + "," + layer.active + ");"); "javascript: window.layerChooser.showLayer(" + layer.id + "," + layer.active + ");");
} }
} }
public void addPortalHighlighter(String name) { public void addPortalHighlighter(final String name) {
mHighlighters.add(name); mHighlighters.add(name);
// to select active highlighter. must be called every time because of sorting // to select active highlighter. must be called every time because of sorting
@ -147,22 +148,24 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
} }
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(final AdapterView<?> parent, final View view, int position, final long id) {
if (mDisableListeners) return;
position--; // The ListView header counts as an item as well. position--; // The ListView header counts as an item as well.
Layer item = mOverlayLayers.getItem(position); final Layer item = mOverlayLayers.getItem(position);
item.active = !item.active; item.active = !item.active;
setLayer(item); setLayer(item);
mOverlayLayers.notifyDataSetChanged(); mOverlayLayers.notifyDataSetChanged();
} }
@Override @Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { public boolean onItemLongClick(final AdapterView<?> parent, final View view, int position, final long id) {
if (mDisableListeners) return false;
position--; // The ListView header counts as an item as well. position--; // The ListView header counts as an item as well.
boolean active = !mOverlayLayers.getItem(position).active; final boolean active = !mOverlayLayers.getItem(position).active;
for (int i = 0; i < mOverlayLayers.getCount(); i++) { for (int i = 0; i < mOverlayLayers.getCount(); i++) {
Layer item = mOverlayLayers.getItem(i); final Layer item = mOverlayLayers.getItem(i);
if (item.name.contains("DEBUG")) continue; if (item.name.contains("DEBUG")) continue;
if (active == item.active) continue; // no need to set same value again if (active == item.active) continue; // no need to set same value again
item.active = active; item.active = active;
@ -175,23 +178,24 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
} }
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(final AdapterView<?> parent, final View view, final int position, final long id) {
if (mLoading) return; if (mLoading) return;
if (mDisableListeners) return;
if (parent.equals(mSpinnerHighlighter)) { if (parent.equals(mSpinnerHighlighter)) {
String name = mHighlighters.getItem(position); final String name = mHighlighters.getItem(position);
mIitc.getWebView().loadUrl("javascript: window.changePortalHighlights('" + name + "')"); mIitc.getWebView().loadUrl("javascript: window.changePortalHighlights('" + name + "')");
} else if (parent.equals(mSpinnerBaseMap)) { } else if (parent.equals(mSpinnerBaseMap)) {
mBaseLayers.getItem(mActiveLayer).active = false; // set old layer to hidden, but no need to really hide mBaseLayers.getItem(mActiveLayer).active = false; // set old layer to hidden, but no need to really hide
Layer layer = mBaseLayers.getItem(position); final Layer layer = mBaseLayers.getItem(position);
layer.active = true; layer.active = true;
setLayer(layer); setLayer(layer);
} }
} }
@Override @Override
public void onNothingSelected(AdapterView<?> parent) { public void onNothingSelected(final AdapterView<?> parent) {
// ignore // ignore
} }
@ -205,10 +209,10 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
mLoading = true; mLoading = true;
} }
public void setActiveHighlighter(String name) { public void setActiveHighlighter(final String name) {
mActiveHighlighter = name; mActiveHighlighter = name;
int position = mHighlighters.getPosition(mActiveHighlighter); final int position = mHighlighters.getPosition(mActiveHighlighter);
if (position >= 0 && position < mHighlighters.getCount()) { if (position >= 0 && position < mHighlighters.getCount()) {
mSpinnerHighlighter.setSelection(position); mSpinnerHighlighter.setSelection(position);
} }
@ -216,7 +220,7 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
mIitc.getNavigationHelper().setHighlighter(name); mIitc.getNavigationHelper().setHighlighter(name);
} }
public void setLayers(String base_layer, String overlay_layer) { public void setLayers(final String base_layer, final String overlay_layer) {
/* /*
* the layer strings have a form like: * the layer strings have a form like:
* [{"layerId":27,"name":"MapQuest OSM","active":true}, * [{"layerId":27,"name":"MapQuest OSM","active":true},
@ -229,18 +233,20 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
try { try {
base_layers = new JSONArray(base_layer); base_layers = new JSONArray(base_layer);
overlay_layers = new JSONArray(overlay_layer); overlay_layers = new JSONArray(overlay_layer);
} catch (JSONException e) { } catch (final JSONException e) {
Log.w(e); Log.w(e);
return; return;
} }
mDisableListeners = true;
mActiveLayer = 0; mActiveLayer = 0;
mBaseLayers.setNotifyOnChange(false); mBaseLayers.setNotifyOnChange(false);
mBaseLayers.clear(); mBaseLayers.clear();
for (int i = 0; i < base_layers.length(); i++) { for (int i = 0; i < base_layers.length(); i++) {
try { try {
JSONObject layerObj = base_layers.getJSONObject(i); final JSONObject layerObj = base_layers.getJSONObject(i);
Layer layer = new Layer(); final Layer layer = new Layer();
layer.id = layerObj.getInt("layerId"); layer.id = layerObj.getInt("layerId");
layer.name = layerObj.getString("name"); layer.name = layerObj.getString("name");
@ -253,7 +259,7 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
} }
mBaseLayers.add(layer); mBaseLayers.add(layer);
} catch (JSONException e) { } catch (final JSONException e) {
Log.w(e); Log.w(e);
} }
} }
@ -264,18 +270,20 @@ public class IITC_MapSettings implements OnItemSelectedListener, OnItemClickList
mOverlayLayers.clear(); mOverlayLayers.clear();
for (int i = 0; i < overlay_layers.length(); i++) { for (int i = 0; i < overlay_layers.length(); i++) {
try { try {
JSONObject layerObj = overlay_layers.getJSONObject(i); final JSONObject layerObj = overlay_layers.getJSONObject(i);
Layer layer = new Layer(); final Layer layer = new Layer();
layer.id = layerObj.getInt("layerId"); layer.id = layerObj.getInt("layerId");
layer.name = layerObj.getString("name"); layer.name = layerObj.getString("name");
layer.active = layerObj.getBoolean("active"); layer.active = layerObj.getBoolean("active");
mOverlayLayers.add(layer); mOverlayLayers.add(layer);
} catch (JSONException e) { } catch (final JSONException e) {
Log.w(e); Log.w(e);
} }
} }
mOverlayLayers.notifyDataSetChanged(); mOverlayLayers.notifyDataSetChanged();
mDisableListeners = false;
} }
} }