diff --git a/mobile/res/layout/activity_main.xml b/mobile/res/layout/activity_main.xml index 532a4f7d..d4a8ccbc 100644 --- a/mobile/res/layout/activity_main.xml +++ b/mobile/res/layout/activity_main.xml @@ -1,32 +1,45 @@ + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent"> - + - + - + - + + + + + \ No newline at end of file diff --git a/mobile/res/layout/list_item_narrow.xml b/mobile/res/layout/list_item_narrow.xml new file mode 100644 index 00000000..64771748 --- /dev/null +++ b/mobile/res/layout/list_item_narrow.xml @@ -0,0 +1,10 @@ + + diff --git a/mobile/res/layout/map_options_header.xml b/mobile/res/layout/map_options_header.xml new file mode 100644 index 00000000..6efdd616 --- /dev/null +++ b/mobile/res/layout/map_options_header.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 966fdf72..a31bdf3e 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -95,8 +95,8 @@ Share Browser - Base Layers - Overlay Layers - Deselect/Select all + Highlighter + Base Layer + Overlay Layers \ No newline at end of file diff --git a/mobile/res/values/styles.xml b/mobile/res/values/styles.xml index 7843ae20..d8351bc3 100644 --- a/mobile/res/values/styles.xml +++ b/mobile/res/values/styles.xml @@ -17,4 +17,6 @@ + #99111111 + \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index a2cab2dc..f1ae0f6e 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -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 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(); - 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(); - } - - // 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(); + 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); } - } - - // --------------- 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); } }); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_MapSettings.java b/mobile/src/com/cradle/iitc_mobile/IITC_MapSettings.java new file mode 100644 index 00000000..4cd8fac3 --- /dev/null +++ b/mobile/src/com/cradle/iitc_mobile/IITC_MapSettings.java @@ -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 { + @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 + { + 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 mHighlighters; + private ArrayAdapter mBaseLayers; + private ArrayAdapter mOverlayLayers; + + private Spinner mSpinnerBaseMap; + private Spinner mSpinnerHighlighter; + private ListView mListViewOverlayLayers; + + private String mActiveHighlighter; + private int mActiveLayer; + + private class HighlighterAdapter extends ArrayAdapter { + 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; + } +} diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 22c1fa83..18ea4a2d 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -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 mDialogStack = new Stack(); private SharedPreferences mSharedPrefs; private IITC_NavigationHelper mNavigationHelper; + private IITC_MapSettings mMapSettings; // Used for custom back stack handling private final Stack mBackStack = new Stack(); @@ -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; + } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_NavigationHelper.java b/mobile/src/com/cradle/iitc_mobile/IITC_NavigationHelper.java index 1d4132f1..cc8e4b60 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_NavigationHelper.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_NavigationHelper.java @@ -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 { - - // Move "No Highlights" on top. Sort the rest alphabetically - private class HighlighterComparator implements Comparator { - @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 { 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); + } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java index 6e932266..25bad9d8 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java @@ -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() { @@ -53,7 +53,7 @@ public class IITC_WebView extends WebView { */ @Override public void onGeolocationPermissionsShowPrompt(String origin, - GeolocationPermissions.Callback callback) { + GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); }