Introduce a second drawer with map settings

This commit is contained in:
fkloft 2013-09-23 18:35:10 +02:00
parent e06f8f87d9
commit f560ff369f
10 changed files with 421 additions and 373 deletions

View File

@ -1,4 +1,5 @@
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -15,7 +16,8 @@
android:background="@android:color/darker_gray"
android:paddingBottom="20dp"
android:paddingTop="20dp"
android:src="@drawable/iitc"/>
android:src="@drawable/iitc"
tools:ignore="ContentDescription"/>
<!-- The navigation drawer -->
@ -24,9 +26,20 @@
android:layout_width="180dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:background="@color/drawer_background"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"/>
<!-- The right drawer -->
<ListView
android:id="@+id/right_drawer"
android:layout_width="260dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@color/drawer_background"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"/>
</android.support.v4.widget.DrawerLayout>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/activatedBackgroundIndicator"
android:drawablePadding="?android:attr/listPreferredItemPaddingLeft"
android:gravity="center_vertical"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:textAppearance="?android:attr/textAppearanceListItemSmall"/>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:labelFor="@+id/spinnerHighlighter"
android:paddingLeft="5dip"
android:text="@string/label_highlighter"/>
<Spinner
android:id="@+id/spinnerHighlighter"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:labelFor="@+id/spinnerBaseLayer"
android:paddingLeft="5dip"
android:text="@string/label_base_layer"/>
<Spinner
android:id="@+id/spinnerBaseLayer"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dip"
android:text="@string/label_overlay_layers"/>
</LinearLayout>

View File

@ -95,8 +95,8 @@
<string name="tab_share">Share</string>
<string name="tab_browser">Browser</string>
<string name="base_layers">Base Layers</string>
<string name="overlay_layers">Overlay Layers</string>
<string name="toggle_layer_selection">Deselect/Select all</string>
<string name="label_highlighter">Highlighter</string>
<string name="label_base_layer">Base Layer</string>
<string name="label_overlay_layers">Overlay Layers</string>
</resources>

View File

@ -17,4 +17,6 @@
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
<color name="drawer_background">#99111111</color>
</resources>

View File

@ -1,68 +1,48 @@
package com.cradle.iitc_mobile;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.cradle.iitc_mobile.IITC_NavigationHelper.Pane;
import com.cradle.iitc_mobile.share.ShareActivity;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.HashMap;
import java.util.Locale;
// provide communication between IITC script and android app
public class IITC_JSInterface {
// context of main activity
private final Context mContext;
private final HashMap<String, String> mLayerIds;
private boolean[] mOverlayIsActive;
private int mActiveBaseLayer;
private String[] mOverlayLayers, mBaseLayers;
private int mNumBaseLayers;
private int mNumOverlayLayers;
private IITC_Mobile mIitc;
IITC_JSInterface(Context c) {
mLayerIds = new HashMap<String, String>();
mContext = c;
IITC_JSInterface(IITC_Mobile iitc) {
mIitc = iitc;
}
// open dialog to send geo intent for navigation apps like gmaps or waze etc...
@JavascriptInterface
public void intentPosLink(double lat, double lng, int zoom, String title, boolean isPortal) {
Intent intent = new Intent(mContext, ShareActivity.class);
Intent intent = new Intent(mIitc, ShareActivity.class);
intent.putExtra("lat", lat);
intent.putExtra("lng", lng);
intent.putExtra("zoom", zoom);
intent.putExtra("title", title);
intent.putExtra("isPortal", isPortal);
mContext.startActivity(intent);
mIitc.startActivity(intent);
}
// share a string to the IITC share activity. only uses the share tab.
@JavascriptInterface
public void shareString(String str) {
Intent intent = new Intent(mContext, ShareActivity.class);
Intent intent = new Intent(mIitc, ShareActivity.class);
intent.putExtra("shareString", str);
intent.putExtra("onlyShare", true);
mContext.startActivity(intent);
mIitc.startActivity(intent);
}
// disable javascript injection while spinner is enabled
@ -70,26 +50,25 @@ public class IITC_JSInterface {
@JavascriptInterface
public void spinnerEnabled(boolean en) {
Log.d("iitcm", "disableJS? " + en);
((IITC_Mobile) mContext).getWebView().disableJS(en);
mIitc.getWebView().disableJS(en);
}
// copy link to specific portal to android clipboard
@JavascriptInterface
public void copy(String s) {
ClipboardManager clipboard = (ClipboardManager) mContext
ClipboardManager clipboard = (ClipboardManager) mIitc
.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copied Text ", s);
clipboard.setPrimaryClip(clip);
Toast.makeText(mContext, "copied to clipboard", Toast.LENGTH_SHORT)
.show();
Toast.makeText(mIitc, "copied to clipboard", Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public int getVersionCode() {
int versionCode = 0;
try {
PackageInfo pInfo = mContext.getPackageManager()
.getPackageInfo(mContext.getPackageName(), 0);
PackageInfo pInfo = mIitc.getPackageManager()
.getPackageInfo(mIitc.getPackageName(), 0);
versionCode = pInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
@ -99,9 +78,7 @@ public class IITC_JSInterface {
@JavascriptInterface
public void switchToPane(final String id) {
final IITC_Mobile iitcm = (IITC_Mobile) mContext;
iitcm.runOnUiThread(new Runnable() {
mIitc.runOnUiThread(new Runnable() {
@Override
public void run() {
Pane pane;
@ -111,237 +88,61 @@ public class IITC_JSInterface {
pane = Pane.MAP;
}
iitcm.setCurrentPane(pane);
mIitc.setCurrentPane(pane);
}
});
}
@JavascriptInterface
public void dialogOpened(String id, boolean open) {
((IITC_Mobile) mContext).dialogOpened(id, open);
public void dialogFocused(String id) {
mIitc.setFocusedDialog(id);
}
@JavascriptInterface
public void dialogFocused(String id) {
((IITC_Mobile) mContext).setFocusedDialog(id);
public void dialogOpened(String id, boolean open) {
mIitc.dialogOpened(id, open);
}
@JavascriptInterface
public void removeSplashScreen() {
Log.d("iitcm", "removing splash screen");
final IITC_Mobile iitc = ((IITC_Mobile) mContext);
iitc.runOnUiThread(new Runnable() {
mIitc.runOnUiThread(new Runnable() {
@Override
public void run() {
iitc.setLoadingState(false);
mIitc.setLoadingState(false);
mIitc.getMapSettings().updateLayers();
}
});
}
// get layers and list them in a dialog
@JavascriptInterface
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_layersJSON = null;
JSONArray overlay_layersJSON = null;
try {
base_layersJSON = new JSONArray(base_layer);
overlay_layersJSON = new JSONArray(overlay_layer);
} catch (JSONException e) {
e.printStackTrace();
public void setLayers(final String base_layer, final String overlay_layer) {
mIitc.runOnUiThread(new Runnable() {
@Override
public void run() {
mIitc.getMapSettings().setLayers(base_layer, overlay_layer);
}
// get length and initialize arrays
mNumBaseLayers = base_layersJSON.length();
mNumOverlayLayers = overlay_layersJSON.length();
mOverlayIsActive = new boolean[mNumOverlayLayers];
mOverlayLayers = new String[mNumOverlayLayers];
mBaseLayers = new String[mNumBaseLayers];
mLayerIds.clear();
// --------------- base layers ------------------------
for (int i = 0; i < mNumBaseLayers; ++i) {
try {
String layer = base_layersJSON.getString(i);
layer = layer.replace("{", "");
layer = layer.replace("}", "");
/*
* we now should have a string like
* ["layerId":27,"name":"MapQuest OSM","active":true]
* split it on ,
*/
String[] layers = layer.split(",");
/*
* we should have 3 strings in a form like
* "name":"MapQuest OSM"
* get the values and get rid of the quotation marks
*/
String id = "";
String name = "";
boolean isActive = false;
for (String b_layer : layers) {
String[] values = b_layer.split(":");
if (values[0].contains("active")) isActive = values[1].equals("true");
if (values[0].contains("layerId")) id = values[1];
if (values[0].contains("name")) name = values[1];
}
name = name.replace("\"", "");
mLayerIds.put(name, id);
this.mBaseLayers[i] = name;
if (isActive) mActiveBaseLayer = i;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// --------------- overlay layers ------------------------
for (int i = 0; i < mNumOverlayLayers; ++i) {
try {
String layer = overlay_layersJSON.getString(i);
layer = layer.replace("{", "");
layer = layer.replace("}", "");
String[] layers = layer.split(",");
String id = "";
String name = "";
boolean isActive = false;
for (String o_layer : layers) {
String[] values = o_layer.split(":");
if (values[0].contains("active")) isActive = values[1].equals("true");
if (values[0].contains("layerId")) id = values[1];
if (values[0].contains("name")) name = values[1];
}
name = name.replace("\"", "");
mLayerIds.put(name, id);
this.mOverlayLayers[i] = name;
this.mOverlayIsActive[i] = isActive;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// show overlay layers by default
showMultiSelection();
});
}
@JavascriptInterface
public void addPortalHighlighter(final String name) {
final IITC_Mobile iitc = ((IITC_Mobile) mContext);
iitc.runOnUiThread(new Runnable() {
mIitc.runOnUiThread(new Runnable() {
@Override
public void run() {
iitc.getNavigationHelper().addPortalHighlighter(name);
mIitc.getMapSettings().addPortalHighlighter(name);
}
});
}
@JavascriptInterface
public void setActiveHighlighter(final String name) {
final IITC_Mobile iitc = ((IITC_Mobile) mContext);
iitc.runOnUiThread(new Runnable() {
mIitc.runOnUiThread(new Runnable() {
@Override
public void run() {
iitc.getNavigationHelper().setActiveHighlighter(name);
}
});
}
// show all overlay layers in a multi selection list dialog
private void showMultiSelection() {
// build the layer chooser dialog
AlertDialog.Builder d_m = new AlertDialog.Builder(mContext);
OnMultiChoiceClickListener m_listener = new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// activate clicked layer
showLayer(mLayerIds.get(mOverlayLayers[which]), isChecked);
}
};
d_m.setMultiChoiceItems(mOverlayLayers, mOverlayIsActive, m_listener);
// switch to base layers
d_m.setPositiveButton(R.string.base_layers, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showSingleSelection();
dialog.dismiss();
}
});
d_m.setNegativeButton(R.string.close, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
d_m.setTitle(R.string.overlay_layers);
final AlertDialog dialog = d_m.create();
final ListView list = dialog.getListView();
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
boolean disable = false;
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
int j = 0;
for (String layer : mOverlayLayers) {
if (!mOverlayLayers[j].contains("DEBUG")) {
// uncheck the item + set the boolean in the isActive array
mOverlayIsActive[j] = disable;
list.setItemChecked(j, disable);
showLayer(mLayerIds.get(layer), disable);
}
++j;
}
disable = !disable;
return true;
}
});
dialog.show();
}
// show all base layers in a single selection list dialog
private void showSingleSelection() {
OnClickListener s_listener = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// activate clicked layer
showLayer(mLayerIds.get(mBaseLayers[which]), true);
mActiveBaseLayer = which;
}
};
AlertDialog.Builder d_s = new AlertDialog.Builder(mContext);
d_s.setSingleChoiceItems(mBaseLayers, mActiveBaseLayer, s_listener);
// switch to overlay layers
d_s.setPositiveButton(R.string.overlay_layers, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showMultiSelection();
dialog.dismiss();
}
});
d_s.setNegativeButton(R.string.close, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
d_s.setTitle(R.string.base_layers);
final AlertDialog dialog = d_s.create();
dialog.show();
}
private void showLayer(final String id, final boolean enable) {
((Activity) mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
((IITC_Mobile) mContext).getWebView().loadUrl("javascript: " +
"window.layerChooser.showLayer("
+ id + "," + enable + ");");
mIitc.getMapSettings().setActiveHighlighter(name);
}
});
}

View File

@ -0,0 +1,263 @@
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;
}
}

View File

@ -17,7 +17,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@ -27,7 +26,6 @@ import android.view.WindowManager;
import android.webkit.CookieManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
@ -58,6 +56,7 @@ public class IITC_Mobile extends Activity {
private final Stack<String> mDialogStack = new Stack<String>();
private SharedPreferences mSharedPrefs;
private IITC_NavigationHelper mNavigationHelper;
private IITC_MapSettings mMapSettings;
// Used for custom back stack handling
private final Stack<Pane> mBackStack = new Stack<IITC_NavigationHelper.Pane>();
@ -74,10 +73,11 @@ public class IITC_Mobile extends Activity {
setContentView(R.layout.activity_main);
mIitcWebView = (IITC_WebView) findViewById(R.id.iitc_webview);
// pass ActionBar to helper because we deprecated getActionBar
mNavigationHelper = new IITC_NavigationHelper(this, super.getActionBar(),
(ListView) findViewById(R.id.left_drawer),
(DrawerLayout) findViewById(R.id.drawer_layout));
mNavigationHelper = new IITC_NavigationHelper(this, super.getActionBar());
mMapSettings = new IITC_MapSettings(this);
// do something if user changed something in the settings
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
@ -326,7 +326,7 @@ public class IITC_Mobile extends Activity {
// close drawer if opened
if (mNavigationHelper.isDrawerOpened()) {
mNavigationHelper.closeDrawer();
mNavigationHelper.closeDrawers();
return;
}
@ -432,11 +432,7 @@ public class IITC_Mobile extends Activity {
toggleFullscreen();
return true;
case R.id.layer_chooser:
// Force map view to handle potential issue with back stack
if (!mBackStack.isEmpty() && mCurrentPane != Pane.MAP)
switchToPane(Pane.MAP);
// the getLayers function calls the setLayers method of IITC_JSInterface
mIitcWebView.loadUrl("javascript: window.layerChooser.getLayers()");
mNavigationHelper.openRightDrawer();
return true;
case R.id.locate: // get the users current location and focus it on map
switchToPane(Pane.MAP);
@ -618,4 +614,8 @@ public class IITC_Mobile extends Activity {
public IITC_NavigationHelper getNavigationHelper() {
return mNavigationHelper;
}
public IITC_MapSettings getMapSettings() {
return mMapSettings;
}
}

View File

@ -1,7 +1,6 @@
package com.cradle.iitc_mobile;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
@ -16,9 +15,7 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Comparator;
public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNavigationListener, OnItemClickListener {
public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnItemClickListener {
// Show/hide the up arrow on the very left
// getActionBar().setDisplayHomeAsUpEnabled(enabled);
@ -31,42 +28,6 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
// Makes the icon/title clickable
// getActionBar().setHomeButtonEnabled(enabled);
private class HighlighterAdapter extends ArrayAdapter<String> {
// Move "No Highlights" on top. Sort the rest alphabetically
private class HighlighterComparator implements Comparator<String> {
@Override
public int compare(String lhs, String rhs) {
if (lhs.equals("No Highlights"))
return -1000;
else if (rhs.equals("No Highlights"))
return 1000;
else
return lhs.compareTo(rhs);
}
}
private HighlighterComparator mComparator = new HighlighterComparator();
public HighlighterAdapter() {
super(mIitc, android.R.layout.simple_list_item_1);
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
}
};
private class NavigationAdapter extends ArrayAdapter<Pane> {
public NavigationAdapter() {
super(mIitc, R.layout.list_item_selectable);
@ -122,12 +83,11 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
private IITC_Mobile mIitc;
private ActionBar mActionBar;
private SharedPreferences mPrefs;
private HighlighterAdapter mHighlighters;
private NavigationAdapter mNavigationAdapter;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ListView mDrawerLeft;
private View mDrawerRight;
private String mActiveHighlighter = null;
private boolean mDesktopMode = false;
private boolean mDrawerOpened;
private boolean mFullscreen = false;
@ -135,35 +95,33 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
private boolean mHideInFullscreen = false;
private Pane mPane = Pane.MAP;
public IITC_NavigationHelper(IITC_Mobile activity, ActionBar bar, ListView drawerList, DrawerLayout drawerLayout) {
super(activity, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
public IITC_NavigationHelper(IITC_Mobile activity, ActionBar bar) {
super(activity, (DrawerLayout) activity.findViewById(R.id.drawer_layout),
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
mIitc = activity;
mActionBar = bar;
mDrawerList = drawerList;
mDrawerLayout = drawerLayout;
mDrawerLeft = (ListView) activity.findViewById(R.id.left_drawer);
mDrawerRight = activity.findViewById(R.id.right_drawer);
mDrawerLayout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);
mPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
mHighlighters = new HighlighterAdapter();
mActionBar.setDisplayShowHomeEnabled(true); // show icon
mActionBar.setListNavigationCallbacks(mHighlighters, this);
mNavigationAdapter = new NavigationAdapter();
mDrawerList.setAdapter(mNavigationAdapter);
mDrawerList.setOnItemClickListener(this);
mDrawerList.setItemChecked(0, true);
mDrawerLeft.setAdapter(mNavigationAdapter);
mDrawerLeft.setOnItemClickListener(this);
mDrawerLeft.setItemChecked(0, true);
mDrawerLayout.setDrawerListener(this);
onPrefChanged(); // also calls updateActionBar()
}
private void updateActionBar() {
boolean showHighlighter = true;
int position = mNavigationAdapter.getPosition(mPane);
if (position >= 0 && position < mNavigationAdapter.getCount())
mDrawerList.setItemChecked(position, true);
mDrawerLeft.setItemChecked(position, true);
if (mDesktopMode) {
mActionBar.setDisplayHomeAsUpEnabled(false); // Hide "up" indicator
@ -188,42 +146,16 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
setDrawerIndicatorEnabled(true);
}
if (mPane != Pane.MAP)
showHighlighter = false;
mActionBar.setTitle(getPaneTitle(mPane));
}
if (mHighlighters.getCount() < 2) // there should always be "No Highlights"
showHighlighter = false;
if (mDrawerOpened)
showHighlighter = false;
if (showHighlighter) {
mActionBar.setDisplayShowTitleEnabled(false); // Hide title
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
setActiveHighlighter(mActiveHighlighter);
} else {
mActionBar.setDisplayShowTitleEnabled(true); // Show title
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
if (mFullscreen && mHideInFullscreen)
mActionBar.hide();
else
mActionBar.show();
}
public void addPortalHighlighter(String name) {
mHighlighters.add(name);
if (name.equals(mActiveHighlighter))
setActiveHighlighter(name);
updateActionBar();
}
public void closeDrawer() {
public void closeDrawers() {
mDrawerLayout.closeDrawers();
}
@ -275,15 +207,7 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Pane item = mNavigationAdapter.getItem(position);
mIitc.switchToPane(item);
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public boolean onNavigationItemSelected(int position, long itemId) {
String name = mHighlighters.getItem(position);
mIitc.getWebView().loadUrl("javascript: window.changePortalHighlights('" + name + "')");
return true;
mDrawerLayout.closeDrawer(mDrawerLeft);
}
public void onPostCreate(Bundle savedInstanceState) {
@ -298,21 +222,11 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
}
public void reset() {
mHighlighters.clear();
// TODO mHighlighters.clear();
mPane = Pane.MAP;
updateActionBar();
}
public void setActiveHighlighter(String name) {
mActiveHighlighter = name;
if (mActionBar.getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST) {
int position = mHighlighters.getPosition(mActiveHighlighter);
if (position >= 0 && position < mActionBar.getNavigationItemCount())
mActionBar.setSelectedNavigationItem(position);
}
}
public void setDebugMode(boolean enabled) {
mNavigationAdapter.remove(Pane.DEBUG); // avoid duplicates
if (enabled)
@ -339,4 +253,9 @@ public class IITC_NavigationHelper extends ActionBarDrawerToggle implements OnNa
updateActionBar();
}
public void openRightDrawer() {
// TODO should close left drawer
mDrawerLayout.openDrawer(mDrawerRight);
}
}

View File

@ -42,7 +42,7 @@ public class IITC_WebView extends WebView {
+ "/databases/");
mSettings.setAppCachePath(this.getContext().getCacheDir()
.getAbsolutePath());
this.mJsInterface = new IITC_JSInterface(mContext);
this.mJsInterface = new IITC_JSInterface((IITC_Mobile) mContext);
this.addJavascriptInterface(mJsInterface, "android");
this.setWebChromeClient(new WebChromeClient() {