From 045279a265165beaaa81bb2b967983708f04feb5 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Fri, 24 May 2013 17:24:02 +0200 Subject: [PATCH 01/13] extended JSInterface to finish app via js (see #312) --- .../cradle/iitc_mobile/IITC_JSInterface.java | 7 +++++++ .../src/com/cradle/iitc_mobile/IITC_Mobile.java | 17 ----------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index 8aff9177..e0dc6cff 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -64,6 +64,13 @@ public class IITC_JSInterface { .show(); } + // exit IITC Mobile + @JavascriptInterface + public void exitIITC() { + Log.d("iitcm","no back stack...finishing iitc"); + ((IITC_Mobile) context).finish(); + } + // get layers and list them in a dialog @JavascriptInterface public void setLayers(String base_layer, String overlay_layer) { diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index d98ca631..1f86fe77 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.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.os.StrictMode; import android.preference.PreferenceManager; import android.util.Log; @@ -34,7 +33,6 @@ public class IITC_Mobile extends Activity { private static final int REQUEST_LOGIN = 1; private IITC_WebView iitc_view; - private boolean back_button_pressed = false; private OnSharedPreferenceChangeListener listener; private String intel_url = "https://www.ingress.com/intel"; private boolean user_loc = false; @@ -236,22 +234,7 @@ public class IITC_Mobile extends Activity { this.toggleFullscreen(); return; } - if (this.back_button_pressed) { - super.onBackPressed(); - return; - } - iitc_view.loadUrl("javascript: window.goBack();"); - this.back_button_pressed = true; - Toast.makeText(this, "Press twice to exit", Toast.LENGTH_SHORT).show(); - - // reset back button after 0.5 seconds - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - back_button_pressed = false; - } - }, 500); } @Override From 3691402e4a6e4f718cddb87c72380ea14367a1e2 Mon Sep 17 00:00:00 2001 From: hastarin Date: Sat, 25 May 2013 11:58:35 +1000 Subject: [PATCH 02/13] Improved back handling in mobile app. Now more consistant with standard. --- code/smartphone.js | 15 +-- mobile/res/menu/main.xml | 8 +- mobile/res/values/strings.xml | 3 +- .../com/cradle/iitc_mobile/IITC_Mobile.java | 110 ++++++++++++++---- 4 files changed, 93 insertions(+), 43 deletions(-) diff --git a/code/smartphone.js b/code/smartphone.js index 20cf9300..83c459e6 100644 --- a/code/smartphone.js +++ b/code/smartphone.js @@ -81,20 +81,7 @@ window.runOnSmartphonesAfterBoot = function() { var l = $('#chatcontrols a:visible'); l.css('width', 100/l.length + '%'); - // add event to portals that allows long press to switch to sidebar - window.addHook('portalAdded', function(data) { - data.portal.on('add', function() { - if(!this._container || this.options.addedTapHoldHandler) return; - this.options.addedTapHoldHandler = true; - var guid = this.options.guid; - - // this is a hack, accessing Leaflet’s private _container is evil - $(this._container).on('taphold', function() { - window.renderPortalDetails(guid); - window.smartphone.sideButton.click(); - }); - }); - }); + // NOTE: Removed long press hook as it would break new back stack handling // Force lower render limits for mobile window.VIEWPORT_PAD_RATIO = 0.1; diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index e203e4fb..47c39131 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -2,15 +2,9 @@ - - - IITC mobile + IITC Mobile Settings Reload IITC Print Version @@ -49,7 +49,6 @@ IITC source Chat - Map Full Compact Public diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 1f86fe77..e5dfba2b 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -1,7 +1,9 @@ package com.cradle.iitc_mobile; import java.io.IOException; +import java.util.ArrayList; +import android.annotation.TargetApi; import android.app.ActionBar; import android.app.Activity; import android.app.SearchManager; @@ -16,6 +18,7 @@ import android.location.LocationManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.StrictMode; import android.preference.PreferenceManager; @@ -44,6 +47,10 @@ public class IITC_Mobile extends Activity { private IITC_DeviceAccountLogin mLogin; private MenuItem searchMenuItem; + // Used for custom back stack handling + private ArrayList backStack = new ArrayList(); + private int currentPane = android.R.id.home; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -62,8 +69,9 @@ public class IITC_Mobile extends Activity { actionBar = this.getActionBar(); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_TITLE); - actionBar.setTitle(getString(R.string.menu_map)); - actionBar.setHomeButtonEnabled(true); + actionBar.setTitle(getString(R.string.app_name)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) + actionBar.setHomeButtonEnabled(true); // do something if user changed something in the settings SharedPreferences sharedPref = PreferenceManager @@ -121,6 +129,10 @@ public class IITC_Mobile extends Activity { fullscreen_actionbar = sharedPref.getBoolean("pref_fullscreen_actionbar", false); + // Clear the back stack + backStack.clear(); + SetActionBarHomeEnabledWithUp(false); + handleIntent(getIntent(), true); } @@ -150,8 +162,10 @@ public class IITC_Mobile extends Activity { (SearchView) searchMenuItem.getActionView(); searchView.setQuery(query, false); searchView.clearFocus(); + actionBar.setTitle(getString(R.string.app_name)); + BackStackUpdate(android.R.id.home); iitc_view.loadUrl("javascript:search('" + query + "');"); - } else if (onCreate){ + } else if (onCreate) { this.loadUrl(intel_url); } } @@ -229,12 +243,41 @@ public class IITC_Mobile extends Activity { // we want a self defined behavior for the back button @Override public void onBackPressed() { - // exit fullscreen mode if it is enabled - if (fullscreen_mode) { + // exit fullscreen mode if it is enabled and action bar is disabled or the back stack is empty + if (fullscreen_mode && (backStack.isEmpty() || fullscreen_actionbar)) { this.toggleFullscreen(); + } else if (!backStack.isEmpty()) { + // Pop last item from backStack and pretend the relevant menu item was clicked + BackStackPop(); + } else { + super.onBackPressed(); + } + } + + private void BackStackPop() { + int index = backStack.size() - 1; + int itemId = backStack.remove(index); + if (backStack.isEmpty()) { + // Empty back stack means we should be at home (ie map) screen + SetActionBarHomeEnabledWithUp(false); + actionBar.setTitle(getString(R.string.app_name)); + iitc_view.loadUrl("javascript: window.show('map');"); return; } - iitc_view.loadUrl("javascript: window.goBack();"); + HandleMenuItemSelected(itemId, false); + } + + private void SetActionBarHomeEnabledWithUp(boolean enabled) { + actionBar.setDisplayHomeAsUpEnabled(enabled); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) + actionBar.setHomeButtonEnabled(enabled); + } + + private void BackStackUpdate(int itemId) { + if (itemId == currentPane) return; + backStack.add(currentPane); + currentPane = itemId; + if (backStack.size() == 1) SetActionBarHomeEnabledWithUp(true); } @Override @@ -255,31 +298,43 @@ public class IITC_Mobile extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection - switch (item.getItemId()) { + final int itemId = item.getItemId(); + boolean result = HandleMenuItemSelected(itemId, true); + if (!result) return super.onOptionsItemSelected(item); + return true; + } + + private boolean HandleMenuItemSelected(int itemId, boolean addToBackStack) { + switch (itemId) { case android.R.id.home: - iitc_view.loadUrl("javascript: window.show('map');"); - actionBar.setTitle(getString(R.string.menu_map)); - return true; - case R.id.menu_map: - iitc_view.loadUrl("javascript: window.show('map');"); - actionBar.setTitle(getString(R.string.menu_map)); + if (!backStack.isEmpty()) { + BackStackPop(); + } return true; case R.id.reload_button: + actionBar.setTitle(getString(R.string.app_name)); + backStack.clear(); + SetActionBarHomeEnabledWithUp(false); this.loadUrl(intel_url); - actionBar.setTitle(getString(R.string.menu_map)); return true; case R.id.toggle_fullscreen: toggleFullscreen(); return true; case R.id.layer_chooser: + // Force map view to handle potential issue with back stack + if (!backStack.isEmpty() && currentPane != android.R.id.home) + iitc_view.loadUrl("javascript: window.show('map');"); // the getLayers function calls the setLayers method of IITC_JSInterface iitc_view.loadUrl("javascript: window.layerChooser.getLayers()"); + actionBar.setTitle(getString(R.string.app_name)); + BackStackUpdate(android.R.id.home); return true; // get the users current location and focus it on map case R.id.locate: iitc_view.loadUrl("javascript: window.show('map');"); iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 15});"); - actionBar.setTitle(getString(R.string.menu_map)); + actionBar.setTitle(getString(R.string.app_name)); + BackStackUpdate(android.R.id.home); return true; // start settings activity case R.id.action_settings: @@ -291,29 +346,41 @@ public class IITC_Mobile extends Activity { case R.id.menu_info: iitc_view.loadUrl("javascript: window.show('info');"); actionBar.setTitle(getString(R.string.menu_info)); + actionBar.setDisplayHomeAsUpEnabled(true); + if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_full: iitc_view.loadUrl("javascript: window.show('full');"); actionBar.setTitle(getString(R.string.menu_full)); + actionBar.setDisplayHomeAsUpEnabled(true); + if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_compact: iitc_view.loadUrl("javascript: window.show('compact');"); actionBar.setTitle(getString(R.string.menu_compact)); + actionBar.setDisplayHomeAsUpEnabled(true); + if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_public: iitc_view.loadUrl("javascript: window.show('public');"); actionBar.setTitle(getString(R.string.menu_public)); + actionBar.setDisplayHomeAsUpEnabled(true); + if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_faction: iitc_view.loadUrl("javascript: window.show('faction');"); actionBar.setTitle(getString(R.string.menu_faction)); + actionBar.setDisplayHomeAsUpEnabled(true); + if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_debug: iitc_view.loadUrl("javascript: window.show('debug')"); actionBar.setTitle(getString(R.string.menu_debug)); + actionBar.setDisplayHomeAsUpEnabled(true); + if (addToBackStack) BackStackUpdate(itemId); return true; default: - return super.onOptionsItemSelected(item); + return false; } } @@ -354,17 +421,20 @@ public class IITC_Mobile extends Activity { } public void toggleFullscreen() { + // TODO: Figure out how to handle this with new back stack? + if (fullscreen_mode) { if (fullscreen_actionbar) this.getActionBar().show(); this.fullscreen_mode = false; } else { - if (fullscreen_actionbar) + if (fullscreen_actionbar) { this.getActionBar().hide(); + // show a toast with instructions to exit the fc mode again + Toast.makeText(this, "Press back button to exit fullscreen", + Toast.LENGTH_SHORT).show(); + } this.fullscreen_mode = true; - // show a toast with instructions to exit the fc mode again - Toast.makeText(this, "Press back button to exit fullscreen", - Toast.LENGTH_SHORT).show(); } // toggle notification bar WindowManager.LayoutParams attrs = getWindow().getAttributes(); From 7ada77ac21e83409166b723980eb7d3d6b9ea920 Mon Sep 17 00:00:00 2001 From: hastarin Date: Sat, 25 May 2013 12:33:27 +1000 Subject: [PATCH 03/13] Just some code clean up. --- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index e5dfba2b..1aa63f4d 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -346,37 +346,31 @@ public class IITC_Mobile extends Activity { case R.id.menu_info: iitc_view.loadUrl("javascript: window.show('info');"); actionBar.setTitle(getString(R.string.menu_info)); - actionBar.setDisplayHomeAsUpEnabled(true); if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_full: iitc_view.loadUrl("javascript: window.show('full');"); actionBar.setTitle(getString(R.string.menu_full)); - actionBar.setDisplayHomeAsUpEnabled(true); if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_compact: iitc_view.loadUrl("javascript: window.show('compact');"); actionBar.setTitle(getString(R.string.menu_compact)); - actionBar.setDisplayHomeAsUpEnabled(true); if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_public: iitc_view.loadUrl("javascript: window.show('public');"); actionBar.setTitle(getString(R.string.menu_public)); - actionBar.setDisplayHomeAsUpEnabled(true); if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_faction: iitc_view.loadUrl("javascript: window.show('faction');"); actionBar.setTitle(getString(R.string.menu_faction)); - actionBar.setDisplayHomeAsUpEnabled(true); if (addToBackStack) BackStackUpdate(itemId); return true; case R.id.menu_debug: iitc_view.loadUrl("javascript: window.show('debug')"); actionBar.setTitle(getString(R.string.menu_debug)); - actionBar.setDisplayHomeAsUpEnabled(true); if (addToBackStack) BackStackUpdate(itemId); return true; default: From 0a97d6a5e40c2a9bbb8e82683ea05d46833933cf Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 12:23:27 +0200 Subject: [PATCH 04/13] * removed not used import * handle home button correctly * update currentPane after backStack.pop() --- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 1aa63f4d..fb765ebc 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -3,7 +3,6 @@ package com.cradle.iitc_mobile; import java.io.IOException; import java.util.ArrayList; -import android.annotation.TargetApi; import android.app.ActionBar; import android.app.Activity; import android.app.SearchManager; @@ -255,8 +254,6 @@ public class IITC_Mobile extends Activity { } private void BackStackPop() { - int index = backStack.size() - 1; - int itemId = backStack.remove(index); if (backStack.isEmpty()) { // Empty back stack means we should be at home (ie map) screen SetActionBarHomeEnabledWithUp(false); @@ -264,6 +261,9 @@ public class IITC_Mobile extends Activity { iitc_view.loadUrl("javascript: window.show('map');"); return; } + int index = backStack.size() - 1; + int itemId = backStack.remove(index); + currentPane = itemId; HandleMenuItemSelected(itemId, false); } @@ -310,6 +310,8 @@ public class IITC_Mobile extends Activity { if (!backStack.isEmpty()) { BackStackPop(); } + iitc_view.loadUrl("javascript: window.show('map');"); + actionBar.setTitle(getString(R.string.app_name)); return true; case R.id.reload_button: actionBar.setTitle(getString(R.string.app_name)); From 6e6249f903b5761b09725f6bff8537c2bec6196a Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 12:24:59 +0200 Subject: [PATCH 05/13] * removed JS backstack (not needed anymore) * removed JSInterface exit method --- code/boot.js | 21 ------------------- .../cradle/iitc_mobile/IITC_JSInterface.java | 7 ------- 2 files changed, 28 deletions(-) diff --git a/code/boot.js b/code/boot.js index aa3ee313..238bdd6b 100644 --- a/code/boot.js +++ b/code/boot.js @@ -6,27 +6,6 @@ // Used to disable on multitouch devices window.showZoom = true; -window.setupBackButton = function() { - var c = window.isSmartphone() - ? window.smartphone.mapButton - : $('#chatcontrols a.active'); - - window.setupBackButton._actions = [c.get(0)]; - $('#chatcontrols a').click(function() { - // ignore shrink button - if($(this).hasClass('toggle')) return; - window.setupBackButton._actions.push(this); - window.setupBackButton._actions = window.setupBackButton._actions.slice(-2); - }); - - window.goBack = function() { - var a = window.setupBackButton._actions[0]; - if(!a) return; - $(a).click(); - window.setupBackButton._actions = [a]; - } -} - window.setupLargeImagePreview = function() { $('#portaldetails').on('click', '.imgpreview', function() { var img = $(this).find('img')[0]; diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index e0dc6cff..8aff9177 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -64,13 +64,6 @@ public class IITC_JSInterface { .show(); } - // exit IITC Mobile - @JavascriptInterface - public void exitIITC() { - Log.d("iitcm","no back stack...finishing iitc"); - ((IITC_Mobile) context).finish(); - } - // get layers and list them in a dialog @JavascriptInterface public void setLayers(String base_layer, String overlay_layer) { From 5cc27b70d9a50dde6784682ff847ecc94f7c65c1 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 12:26:53 +0200 Subject: [PATCH 06/13] removed forgotten setupBackButton function call --- code/boot.js | 1 - 1 file changed, 1 deletion(-) diff --git a/code/boot.js b/code/boot.js index 238bdd6b..c38462e6 100644 --- a/code/boot.js +++ b/code/boot.js @@ -387,7 +387,6 @@ function boot() { window.setupQRLoadLib(); window.setupLayerChooserSelectOne(); window.setupLayerChooserStatusRecorder(); - window.setupBackButton(); // read here ONCE, so the URL is only evaluated one time after the // necessary data has been loaded. urlPortalLL = getURLParam('pll'); From d3461b04515d13f8d38fb4177900dae129b45ab8 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 13:39:58 +0200 Subject: [PATCH 07/13] got back long press on portal functionality --- code/smartphone.js | 19 +++++++- .../cradle/iitc_mobile/IITC_JSInterface.java | 10 ++++ .../com/cradle/iitc_mobile/IITC_Mobile.java | 46 +++++++++---------- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/code/smartphone.js b/code/smartphone.js index 83c459e6..29bd31a4 100644 --- a/code/smartphone.js +++ b/code/smartphone.js @@ -81,7 +81,24 @@ window.runOnSmartphonesAfterBoot = function() { var l = $('#chatcontrols a:visible'); l.css('width', 100/l.length + '%'); - // NOTE: Removed long press hook as it would break new back stack handling + // add event to portals that allows long press to switch to sidebar + window.addHook('portalAdded', function(data) { + data.portal.on('add', function() { + if(!this._container || this.options.addedTapHoldHandler) return; + this.options.addedTapHoldHandler = true; + var guid = this.options.guid; + + // this is a hack, accessing Leaflet’s private _container is evil + $(this._container).on('taphold', function() { + if (typeof android !== 'undefined' && android && android.portalLongPressed) { + android.portalLongPressed(); + } else { + window.renderPortalDetails(guid); + window.smartphone.sideButton.click(); + } + }); + }); + }); // Force lower render limits for mobile window.VIEWPORT_PAD_RATIO = 0.1; diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index 8aff9177..70011373 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -64,6 +64,16 @@ public class IITC_JSInterface { .show(); } + @JavascriptInterface + public void portalLongPressed() { + final IITC_Mobile iitcm = (IITC_Mobile) context; + iitcm.runOnUiThread(new Runnable() { + @Override + public void run() { + iitcm.handleMenuItemSelected(R.id.menu_info, true); + } + }); + } // get layers and list them in a dialog @JavascriptInterface public void setLayers(String base_layer, String overlay_layer) { diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index fb765ebc..bdf4de98 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -162,7 +162,7 @@ public class IITC_Mobile extends Activity { searchView.setQuery(query, false); searchView.clearFocus(); actionBar.setTitle(getString(R.string.app_name)); - BackStackUpdate(android.R.id.home); + backStackUpdate(android.R.id.home); iitc_view.loadUrl("javascript:search('" + query + "');"); } else if (onCreate) { this.loadUrl(intel_url); @@ -247,13 +247,19 @@ public class IITC_Mobile extends Activity { this.toggleFullscreen(); } else if (!backStack.isEmpty()) { // Pop last item from backStack and pretend the relevant menu item was clicked - BackStackPop(); + backStackPop(); } else { super.onBackPressed(); } } - private void BackStackPop() { + private void SetActionBarHomeEnabledWithUp(boolean enabled) { + actionBar.setDisplayHomeAsUpEnabled(enabled); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) + actionBar.setHomeButtonEnabled(enabled); + } + + public void backStackPop() { if (backStack.isEmpty()) { // Empty back stack means we should be at home (ie map) screen SetActionBarHomeEnabledWithUp(false); @@ -264,16 +270,10 @@ public class IITC_Mobile extends Activity { int index = backStack.size() - 1; int itemId = backStack.remove(index); currentPane = itemId; - HandleMenuItemSelected(itemId, false); + handleMenuItemSelected(itemId, false); } - private void SetActionBarHomeEnabledWithUp(boolean enabled) { - actionBar.setDisplayHomeAsUpEnabled(enabled); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) - actionBar.setHomeButtonEnabled(enabled); - } - - private void BackStackUpdate(int itemId) { + public void backStackUpdate(int itemId) { if (itemId == currentPane) return; backStack.add(currentPane); currentPane = itemId; @@ -299,16 +299,16 @@ public class IITC_Mobile extends Activity { public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection final int itemId = item.getItemId(); - boolean result = HandleMenuItemSelected(itemId, true); + boolean result = handleMenuItemSelected(itemId, true); if (!result) return super.onOptionsItemSelected(item); return true; } - private boolean HandleMenuItemSelected(int itemId, boolean addToBackStack) { + public boolean handleMenuItemSelected(int itemId, boolean addToBackStack) { switch (itemId) { case android.R.id.home: if (!backStack.isEmpty()) { - BackStackPop(); + backStackPop(); } iitc_view.loadUrl("javascript: window.show('map');"); actionBar.setTitle(getString(R.string.app_name)); @@ -329,14 +329,14 @@ public class IITC_Mobile extends Activity { // the getLayers function calls the setLayers method of IITC_JSInterface iitc_view.loadUrl("javascript: window.layerChooser.getLayers()"); actionBar.setTitle(getString(R.string.app_name)); - BackStackUpdate(android.R.id.home); + backStackUpdate(android.R.id.home); return true; // get the users current location and focus it on map case R.id.locate: iitc_view.loadUrl("javascript: window.show('map');"); iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 15});"); actionBar.setTitle(getString(R.string.app_name)); - BackStackUpdate(android.R.id.home); + backStackUpdate(android.R.id.home); return true; // start settings activity case R.id.action_settings: @@ -347,33 +347,33 @@ public class IITC_Mobile extends Activity { return true; case R.id.menu_info: iitc_view.loadUrl("javascript: window.show('info');"); - actionBar.setTitle(getString(R.string.menu_info)); - if (addToBackStack) BackStackUpdate(itemId); + actionBar.setTitle((R.string.menu_info)); + if (addToBackStack) backStackUpdate(itemId); return true; case R.id.menu_full: iitc_view.loadUrl("javascript: window.show('full');"); actionBar.setTitle(getString(R.string.menu_full)); - if (addToBackStack) BackStackUpdate(itemId); + if (addToBackStack) backStackUpdate(itemId); return true; case R.id.menu_compact: iitc_view.loadUrl("javascript: window.show('compact');"); actionBar.setTitle(getString(R.string.menu_compact)); - if (addToBackStack) BackStackUpdate(itemId); + if (addToBackStack) backStackUpdate(itemId); return true; case R.id.menu_public: iitc_view.loadUrl("javascript: window.show('public');"); actionBar.setTitle(getString(R.string.menu_public)); - if (addToBackStack) BackStackUpdate(itemId); + if (addToBackStack) backStackUpdate(itemId); return true; case R.id.menu_faction: iitc_view.loadUrl("javascript: window.show('faction');"); actionBar.setTitle(getString(R.string.menu_faction)); - if (addToBackStack) BackStackUpdate(itemId); + if (addToBackStack) backStackUpdate(itemId); return true; case R.id.menu_debug: iitc_view.loadUrl("javascript: window.show('debug')"); actionBar.setTitle(getString(R.string.menu_debug)); - if (addToBackStack) BackStackUpdate(itemId); + if (addToBackStack) backStackUpdate(itemId); return true; default: return false; From 818aec09c4ac80a52f29d09fb062efb5604c765a Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 13:41:13 +0200 Subject: [PATCH 08/13] bumped version number --- mobile/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index b0fa5c5a..33e53cf8 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="23" + android:versionName="0.4.2"> Date: Sat, 25 May 2013 15:37:49 +0200 Subject: [PATCH 09/13] * display backstack correctly on home button * clear backstack on home button pressed --- .../com/cradle/iitc_mobile/IITC_Mobile.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index bdf4de98..c76eb16c 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -130,7 +130,7 @@ public class IITC_Mobile extends Activity { // Clear the back stack backStack.clear(); - SetActionBarHomeEnabledWithUp(false); + setActionBarHomeEnabledWithUp(false); handleIntent(getIntent(), true); } @@ -253,16 +253,18 @@ public class IITC_Mobile extends Activity { } } - private void SetActionBarHomeEnabledWithUp(boolean enabled) { + private void setActionBarHomeEnabledWithUp(boolean enabled) { actionBar.setDisplayHomeAsUpEnabled(enabled); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) actionBar.setHomeButtonEnabled(enabled); } public void backStackPop() { + // shouldn't be called when back stack is empty + // catch wrong usage if (backStack.isEmpty()) { // Empty back stack means we should be at home (ie map) screen - SetActionBarHomeEnabledWithUp(false); + setActionBarHomeEnabledWithUp(false); actionBar.setTitle(getString(R.string.app_name)); iitc_view.loadUrl("javascript: window.show('map');"); return; @@ -271,13 +273,18 @@ public class IITC_Mobile extends Activity { int itemId = backStack.remove(index); currentPane = itemId; handleMenuItemSelected(itemId, false); + // if we popped our last item from stack...illustrate it on home button + if (backStack.isEmpty()) { + // Empty back stack means we should be at home (ie map) screen + setActionBarHomeEnabledWithUp(false); + } } public void backStackUpdate(int itemId) { if (itemId == currentPane) return; backStack.add(currentPane); currentPane = itemId; - if (backStack.size() == 1) SetActionBarHomeEnabledWithUp(true); + if (backStack.size() == 1) setActionBarHomeEnabledWithUp(true); } @Override @@ -307,16 +314,15 @@ public class IITC_Mobile extends Activity { public boolean handleMenuItemSelected(int itemId, boolean addToBackStack) { switch (itemId) { case android.R.id.home: - if (!backStack.isEmpty()) { - backStackPop(); - } iitc_view.loadUrl("javascript: window.show('map');"); actionBar.setTitle(getString(R.string.app_name)); + this.backStack.clear(); + setActionBarHomeEnabledWithUp(false); return true; case R.id.reload_button: actionBar.setTitle(getString(R.string.app_name)); backStack.clear(); - SetActionBarHomeEnabledWithUp(false); + setActionBarHomeEnabledWithUp(false); this.loadUrl(intel_url); return true; case R.id.toggle_fullscreen: From 5311fb16411b5e4bfad88bae7c4a31eb9e93f57e Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 16:05:29 +0200 Subject: [PATCH 10/13] set currentPane to home if home button is pressed --- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index c76eb16c..b8494fcf 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -318,6 +318,7 @@ public class IITC_Mobile extends Activity { actionBar.setTitle(getString(R.string.app_name)); this.backStack.clear(); setActionBarHomeEnabledWithUp(false); + currentPane = android.R.id.home; return true; case R.id.reload_button: actionBar.setTitle(getString(R.string.app_name)); From c8dc62eafbc4b6d5fbd10e8f02875cca23ae7eda Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sat, 25 May 2013 16:25:34 +0200 Subject: [PATCH 11/13] added forgotten getString(...) --- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index b8494fcf..0524b78c 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -354,7 +354,7 @@ public class IITC_Mobile extends Activity { return true; case R.id.menu_info: iitc_view.loadUrl("javascript: window.show('info');"); - actionBar.setTitle((R.string.menu_info)); + actionBar.setTitle(getString(R.string.menu_info)); if (addToBackStack) backStackUpdate(itemId); return true; case R.id.menu_full: From 86fe10aa9c2fb0cb5d4b6a41564b2d2bdc1acda4 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sun, 26 May 2013 14:15:11 +0200 Subject: [PATCH 12/13] added back desktop mode (see #304) --- mobile/res/values/strings.xml | 2 ++ mobile/res/xml/preferences.xml | 31 ++++++++++-------- .../com/cradle/iitc_mobile/IITC_Mobile.java | 32 +++++++++++++++++-- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 756daa84..82119080 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -40,6 +40,8 @@ Shows +/- buttons even on multitouch capable devices. Hide Action Bar in fullscreen mode Nice for screenshots. Note: IITCM cannot be controlled without Action Bar. + Force desktop mode + Nice for tablets, looks awful on smartphones Force https Disabling may improve performance Developer options diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index f986bc1e..57f2c2b7 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -12,22 +12,27 @@ - - - - + android:defaultValue="false" /> + + + + backStack = new ArrayList(); @@ -79,6 +80,10 @@ public class IITC_Mobile extends Activity { @Override public void onSharedPreferenceChanged( SharedPreferences sharedPreferences, String key) { + if (key.equals("pref_force_desktop")) { + desktop = sharedPreferences.getBoolean("pref_force_desktop", false); + invalidateOptionsMenu(); + } if (key.equals("pref_user_loc")) user_loc = sharedPreferences.getBoolean("pref_user_loc", false); @@ -93,6 +98,9 @@ public class IITC_Mobile extends Activity { }; sharedPref.registerOnSharedPreferenceChangeListener(listener); + // enable/disable desktop mode on menu create and url load + desktop = sharedPref.getBoolean("pref_force_desktop", false); + // Acquire a reference to the system Location Manager loc_mngr = (LocationManager) this .getSystemService(Context.LOCATION_SERVICE); @@ -299,6 +307,8 @@ public class IITC_Mobile extends Activity { // Assumes current activity is the searchable activity searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default + // enable/disable desktop menu + enableDesktopUI(menu, desktop); return true; } @@ -397,10 +407,13 @@ public class IITC_Mobile extends Activity { } } - // Force mobile view. - // New actions are not compatible with desktop mode + // vp=f enables desktop mode...vp=m is the defaul mobile view private String addUrlParam(String url) { - return (url + "?vp=m"); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); + if (sharedPref.getBoolean("pref_force_desktop", false)) + return (url + "?vp=f"); + else + return (url + "?vp=m"); } // inject the iitc-script and load the intel url @@ -486,4 +499,17 @@ public class IITC_Mobile extends Activity { // garbage collection mLogin = null; } + + // disable/enable some menu buttons... + public void enableDesktopUI(Menu menu, boolean desktop) { + MenuItem item; + item = menu.findItem(R.id.menu_chat); + item.setVisible(!desktop); + item = menu.findItem(R.id.menu_info); + item.setVisible(!desktop); + item = menu.findItem(R.id.menu_debug); + item.setVisible(!desktop); + item = menu.findItem(R.id.layer_chooser); + item.setVisible(!desktop); + } } From c852d1f34b739d654cc75f8e50b3e47e78e1962c Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Sun, 26 May 2013 14:50:16 +0200 Subject: [PATCH 13/13] use class attribute to check for enabled/disabled desktop mode --- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index ee8dfd26..10215c5e 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -409,8 +409,7 @@ public class IITC_Mobile extends Activity { // vp=f enables desktop mode...vp=m is the defaul mobile view private String addUrlParam(String url) { - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - if (sharedPref.getBoolean("pref_force_desktop", false)) + if (desktop) return (url + "?vp=f"); else return (url + "?vp=m");