From 61d83567a6f0ca771761bf1975ef761e519d1ab1 Mon Sep 17 00:00:00 2001 From: Xelio Date: Thu, 2 May 2013 14:30:44 +0800 Subject: [PATCH 01/28] Add function for plugin to add layerGroup and persist display status between session --- code/utils_misc.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/utils_misc.js b/code/utils_misc.js index dede2f01..c42d50b3 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -372,3 +372,8 @@ window.isLayerGroupDisplayed = function(name) { if(typeof(overlayStatus[name]) === 'undefined') return true; return overlayStatus[name]; } + +window.addLayerGroup = function(name, layerGroup, defaultDisplay) { + if(isLayerGroupDisplayed(name) || defaultDisplay) map.addLayer(layerGroup); + layerChooser.addOverlay(layerGroup, name); +} From 32c4e79d5f1f7e37862a98bec4123e41feb5482a Mon Sep 17 00:00:00 2001 From: Xelio Date: Thu, 2 May 2013 14:41:10 +0800 Subject: [PATCH 02/28] Plugin Keys On Map: Change to use window.addLayerGroup() to handle plugin layer --- plugins/keys-on-map.user.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/keys-on-map.user.js b/plugins/keys-on-map.user.js index 0cf301b5..43aa1338 100644 --- a/plugins/keys-on-map.user.js +++ b/plugins/keys-on-map.user.js @@ -106,9 +106,7 @@ window.plugin.keysOnMap.setupCSS = function() { } window.plugin.keysOnMap.setupLayer = function() { - window.layerChooser.addOverlay(window.plugin.keysOnMap.keyLayerGroup, 'Keys'); - if(isLayerGroupDisplayed('Keys')) - map.addLayer(window.plugin.keysOnMap.keyLayerGroup); + window.addLayerGroup('Keys', window.plugin.keysOnMap.keyLayerGroup, false); } var setup = function() { From 50f4004ac5378c0353ce5046f4a8b40e2eee279e Mon Sep 17 00:00:00 2001 From: Xelio Date: Fri, 3 May 2013 13:10:25 +0800 Subject: [PATCH 03/28] Fix logic bug in addLayerGroup --- code/utils_misc.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/utils_misc.js b/code/utils_misc.js index c42d50b3..987cb81d 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -360,20 +360,20 @@ window.updateDisplayedLayerGroup = function(name, display) { // Read layerGroup status from window.overlayStatus if it was added to map, // read from cookie if it has not added to map yet. // return true if both overlayStatus and cookie didn't have the record -window.isLayerGroupDisplayed = function(name) { +window.isLayerGroupDisplayed = function(name, defaultDisplay) { if(typeof(overlayStatus[name]) !== 'undefined') return overlayStatus[name]; var layersJSON = readCookie('ingress.intelmap.layergroupdisplayed'); - if(!layersJSON) return true; + if(!layersJSON) return defaultDisplay; var layers = JSON.parse(layersJSON); // keep latest overlayStatus overlayStatus = $.extend(layers, overlayStatus); - if(typeof(overlayStatus[name]) === 'undefined') return true; + if(typeof(overlayStatus[name]) === 'undefined') return defaultDisplay; return overlayStatus[name]; } window.addLayerGroup = function(name, layerGroup, defaultDisplay) { - if(isLayerGroupDisplayed(name) || defaultDisplay) map.addLayer(layerGroup); + if(isLayerGroupDisplayed(name, defaultDisplay)) map.addLayer(layerGroup); layerChooser.addOverlay(layerGroup, name); } From 917a538a1143753b3f0bf3e3746106b4a1ae475d Mon Sep 17 00:00:00 2001 From: Xelio Date: Fri, 3 May 2013 13:14:13 +0800 Subject: [PATCH 04/28] Fix comment --- code/utils_misc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/utils_misc.js b/code/utils_misc.js index 987cb81d..dc9c6a6f 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -359,7 +359,7 @@ window.updateDisplayedLayerGroup = function(name, display) { // Read layerGroup status from window.overlayStatus if it was added to map, // read from cookie if it has not added to map yet. -// return true if both overlayStatus and cookie didn't have the record +// return 'defaultDisplay' if both overlayStatus and cookie didn't have the record window.isLayerGroupDisplayed = function(name, defaultDisplay) { if(typeof(overlayStatus[name]) !== 'undefined') return overlayStatus[name]; From 42d5b8d8f99734ea2e6de7b20bae99590476f69f Mon Sep 17 00:00:00 2001 From: Jon Atkins Date: Sun, 5 May 2013 19:15:15 +0100 Subject: [PATCH 05/28] reduce the sidebar height when no portal is selected - more useful now that the portal details now have a 'X' close button could perhaps reduce the hight further, but then the expand/colapse arrow gets a bit cramped towards the top (could look into centering this vertically though..?) also, moved the default right position of the sidebartoggle to offscreen. it's set in code anyway, and will look nicer on mobile app initialisation --- style.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/style.css b/style.css index 5ebfdb69..39264f66 100644 --- a/style.css +++ b/style.css @@ -45,7 +45,7 @@ body { margin-top: -31px; /* -(toggle height / 2) */ line-height: 10px; position: absolute; - top: 325px; /* (sidebar height / 2) */ + top: 108px; z-index: 3001; background-color: rgba(8, 48, 78, 0.9); color: #FFCE00; @@ -53,7 +53,7 @@ body { border-right: none; border-radius: 5px 0 0 5px; text-decoration: none; - right: 301px; /* overwritten later by the script with SIDEBAR_WIDTH */ + right: -50px; /* overwritten later by the script with SIDEBAR_WIDTH */ } .enl { @@ -652,7 +652,7 @@ h3 { * content when first selecting a portal) */ #portaldetails { - min-height: 485px; + min-height: 63px; position: relative; /* so the below '#portaldetails .close' is relative to this */ } From 92261c16beb9ef64fe432bed4e27462338250e64 Mon Sep 17 00:00:00 2001 From: Riccardo Binetti Date: Mon, 6 May 2013 01:46:44 +0200 Subject: [PATCH 06/28] Added player's resonators plugin --- plugins/players-resonators.user.js | 99 ++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 plugins/players-resonators.user.js diff --git a/plugins/players-resonators.user.js b/plugins/players-resonators.user.js new file mode 100644 index 00000000..63fcf280 --- /dev/null +++ b/plugins/players-resonators.user.js @@ -0,0 +1,99 @@ +// ==UserScript== +// @id iitc-plugin-players-resonators@rbino +// @name IITC plugin: Player's Resonators +// @version 0.1.3.20130505.233200 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL http://ingress.rbino.com/iitc-plugin-players-resonators.user.js +// @downloadURL http://ingress.rbino.com/iitc-plugin-players-resonators.user.js +// @description The plugins finds the resonators of a given player. The input is in the sidebar. Useful for revenge. +// @include https://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// ==/UserScript== + +// Changelog: +// +// 0.1.3 Effective player name (with wrong capitalization) if it finds some reso +// 0.1.2 Made nickname case insensitive +// 0.1.1 Added mouseover for portal location. Dirty hack to not show mousehover when the alert is fired. +// 0.1.0 First public release + +function wrapper() { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.playersResonators = function() {}; + +window.plugin.playersResonators.findReso = function(playername) { + var s = ""; + var portalSet = {}; + var effectiveName = ""; + var nickFind = playername.toLowerCase(); + $.each(window.portals, function(ind, portal){ + var r = portal.options.details.resonatorArray.resonators; + $.each(r, function(ind, reso) { + if (!reso) return true; + var nick = getPlayerName(reso.ownerGuid); + if (nick.toLowerCase() === nickFind){ + if (!effectiveName) { + effectiveName = nick; + } + if (!portalSet.hasOwnProperty(portal.options.guid)){ + portalSet[portal.options.guid] = true; + console.log(portalSet); + var latlng = [portal.options.details.locationE6.latE6/1E6, portal.options.details.locationE6.lngE6/1E6].join(); + var guid = portal.options.guid; + var jsDoubleClick = 'window.zoomToAndShowPortal(\''+guid+'\', ['+latlng+']);return false'; + var perma = '/intel?latE6='+portal.options.details.locationE6.latE6+'&lngE6='+portal.options.details.locationE6.lngE6+'&z=17&pguid='+guid; + var a = $('',{ + "class": 'help', + text: portal.options.details.portalV2.descriptiveText.TITLE, + title: portal.options.details.portalV2.descriptiveText.ADDRESS, + href: perma, + onClick: jsDoubleClick + })[0].outerHTML; + s += a + "\n"; + } + } + }); + }); + if (s) { + fakeLinkPlayer = '' + effectiveName + '' + s = fakeLinkPlayer + " has resonators on these portals:\n\n" + s; + } else { + fakeLinkPlayer = '' + playername + '' + s = fakeLinkPlayer + " has no resonators in this range\n"; + } + alert(s); +} + +var setup = function() { + var content = '
' + ''; + $('#sidebar').append(content); + $("#playerReso").keypress(function(e) { + if((e.keyCode ? e.keyCode : e.which) !== 13) return; + var data = $(this).val(); + window.plugin.playersResonators.findReso(data); + }); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + +if(window.iitcLoaded && typeof setup === 'function') { + setup(); +} else { + if(window.bootPlugins) + window.bootPlugins.push(setup); + else + window.bootPlugins = [setup]; +} +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +script.appendChild(document.createTextNode('('+ wrapper +')();')); +(document.body || document.head || document.documentElement).appendChild(script); From 11f7c31ce742a4d6d2cf67c5c046a3d4eaed7326 Mon Sep 17 00:00:00 2001 From: Riccardo Binetti Date: Mon, 6 May 2013 01:58:23 +0200 Subject: [PATCH 07/28] Fixed version date time, updateurl, downloadurl and description --- plugins/players-resonators.user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/players-resonators.user.js b/plugins/players-resonators.user.js index 63fcf280..530430de 100644 --- a/plugins/players-resonators.user.js +++ b/plugins/players-resonators.user.js @@ -1,11 +1,11 @@ // ==UserScript== // @id iitc-plugin-players-resonators@rbino // @name IITC plugin: Player's Resonators -// @version 0.1.3.20130505.233200 +// @version 0.1.3.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion -// @updateURL http://ingress.rbino.com/iitc-plugin-players-resonators.user.js -// @downloadURL http://ingress.rbino.com/iitc-plugin-players-resonators.user.js -// @description The plugins finds the resonators of a given player. The input is in the sidebar. Useful for revenge. +// @updateURL @@UPDATEURL@@ +// @downloadURL @@DOWNLOADURL@@ +// @description [@@BUILDNAME@@-@@BUILDDATE@@] The plugins finds the resonators of a given player. The input is in the sidebar. Useful for revenge. // @include https://www.ingress.com/intel* // @include http://www.ingress.com/intel* // @match https://www.ingress.com/intel* From 13bd906a9ec667edc34e8ea8695985ea96d2bfa4 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Mon, 6 May 2013 18:46:59 +1000 Subject: [PATCH 08/28] Starting work on modifying mobile app action bar. --- .gitattributes | 22 +++++++++++++++++++ build.py | 4 ++++ mobile/res/menu/main.xml | 5 +++++ mobile/res/values/strings.xml | 1 + .../com/cradle/iitc_mobile/IITC_Mobile.java | 7 ++++++ 5 files changed, 39 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/build.py b/build.py index a81bfe34..8cf81b1e 100755 --- a/build.py +++ b/build.py @@ -220,6 +220,10 @@ if buildMobile: # copy the user location script into the mobile folder. shutil.copy(os.path.join(outDir,"user-location.user.js"), "mobile/assets/user-location.user.js") # also copy plugins + try: + os.makedirs("mobile/assets/plugins") + except: + pass shutil.rmtree("mobile/assets/plugins") shutil.copytree(os.path.join(outDir,"plugins"), "mobile/assets/plugins", ignore=shutil.ignore_patterns('*.meta.js', 'force-https*')) diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index a80f271a..c7497591 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -27,4 +27,9 @@ android:showAsAction="ifRoom" android:title="@string/locate"> + + \ No newline at end of file diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 28905280..0c8cdd72 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -3,6 +3,7 @@ IITC mobile Settings + Info Reload IITC Print Version Clear Cache diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index af353f35..8227eeef 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -223,6 +223,7 @@ public class IITC_Mobile extends Activity { public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); + this.getActionBar().setHomeButtonEnabled(true); return true; } @@ -230,6 +231,9 @@ public class IITC_Mobile extends Activity { public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { + case android.R.id.home: + iitc_view.loadUrl("javascript: window.smartphone.mapButton.click();"); + return true; case R.id.reload_button: this.loadUrl(intel_url); return true; @@ -272,6 +276,9 @@ public class IITC_Mobile extends Activity { intent.putExtra("iitc_version", iitc_view.getWebViewClient().getIITCVersion()); startActivity(intent); return true; + case R.id.info: + iitc_view.loadUrl("javascript: window.smartphone.sideButton.click();"); + return true; default: return super.onOptionsItemSelected(item); } From 7e2087da63e64edf6aad97fbef3a0f1b23735f43 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Mon, 6 May 2013 22:31:50 +1000 Subject: [PATCH 09/28] Redesigned IITC Mobile to use ActionBar menu instead of web based tabs. --- code/chat.js | 16 ++- code/smartphone.js | 2 +- mobile/AndroidManifest.xml | 2 +- mobile/res/drawable-hdpi/action_about.png | Bin 0 -> 1629 bytes mobile/res/drawable-hdpi/action_search.png | Bin 0 -> 1764 bytes mobile/res/drawable-hdpi/action_settings.png | Bin 0 -> 1540 bytes mobile/res/drawable-hdpi/av_full_screen.png | Bin 0 -> 1810 bytes mobile/res/drawable-hdpi/content_remove.png | Bin 0 -> 1285 bytes .../device_access_location_found.png | Bin 0 -> 1784 bytes .../device_access_location_off.png | Bin 0 -> 1791 bytes .../device_access_location_searching.png | Bin 0 -> 1627 bytes mobile/res/drawable-hdpi/ic_menu_refresh.png | Bin 2025 -> 0 bytes mobile/res/drawable-hdpi/location_map.png | Bin 0 -> 2077 bytes .../res/drawable-hdpi/navigation_refresh.png | Bin 0 -> 3138 bytes mobile/res/drawable-hdpi/social_group.png | Bin 0 -> 2075 bytes mobile/res/drawable-ldpi/ic_menu_refresh.png | Bin 1695 -> 0 bytes mobile/res/drawable-mdpi/action_about.png | Bin 0 -> 1333 bytes mobile/res/drawable-mdpi/action_search.png | Bin 0 -> 1394 bytes mobile/res/drawable-mdpi/action_settings.png | Bin 0 -> 1339 bytes mobile/res/drawable-mdpi/av_full_screen.png | Bin 0 -> 1479 bytes mobile/res/drawable-mdpi/content_remove.png | Bin 0 -> 1138 bytes .../device_access_location_found.png | Bin 0 -> 1409 bytes .../device_access_location_off.png | Bin 0 -> 1383 bytes .../device_access_location_searching.png | Bin 0 -> 1312 bytes mobile/res/drawable-mdpi/ic_menu_refresh.png | Bin 1278 -> 0 bytes mobile/res/drawable-mdpi/location_map.png | Bin 0 -> 1648 bytes .../res/drawable-mdpi/navigation_refresh.png | Bin 0 -> 3033 bytes mobile/res/drawable-mdpi/social_group.png | Bin 0 -> 1594 bytes mobile/res/drawable-xhdpi/action_about.png | Bin 0 -> 2040 bytes mobile/res/drawable-xhdpi/action_help.png | Bin 0 -> 1793 bytes mobile/res/drawable-xhdpi/action_search.png | Bin 0 -> 2127 bytes mobile/res/drawable-xhdpi/av_full_screen.png | Bin 0 -> 2065 bytes mobile/res/drawable-xhdpi/content_remove.png | Bin 0 -> 1348 bytes .../device_access_location_found.png | Bin 0 -> 2204 bytes .../device_access_location_off.png | Bin 0 -> 2220 bytes .../device_access_location_searching.png | Bin 0 -> 1977 bytes mobile/res/drawable-xhdpi/ic_menu_refresh.png | Bin 2857 -> 0 bytes mobile/res/drawable-xhdpi/location_map.png | Bin 0 -> 2510 bytes .../res/drawable-xhdpi/navigation_refresh.png | Bin 0 -> 3219 bytes mobile/res/drawable-xhdpi/social_group.png | Bin 0 -> 2541 bytes mobile/res/layout/activity_main.xml | 2 +- mobile/res/menu/main.xml | 116 +++++++++++++----- mobile/res/values/strings.xml | 10 +- mobile/smartphone.css | 3 +- .../com/cradle/iitc_mobile/IITC_Mobile.java | 43 ++++++- 45 files changed, 150 insertions(+), 44 deletions(-) create mode 100644 mobile/res/drawable-hdpi/action_about.png create mode 100644 mobile/res/drawable-hdpi/action_search.png create mode 100644 mobile/res/drawable-hdpi/action_settings.png create mode 100644 mobile/res/drawable-hdpi/av_full_screen.png create mode 100644 mobile/res/drawable-hdpi/content_remove.png create mode 100644 mobile/res/drawable-hdpi/device_access_location_found.png create mode 100644 mobile/res/drawable-hdpi/device_access_location_off.png create mode 100644 mobile/res/drawable-hdpi/device_access_location_searching.png delete mode 100644 mobile/res/drawable-hdpi/ic_menu_refresh.png create mode 100644 mobile/res/drawable-hdpi/location_map.png create mode 100644 mobile/res/drawable-hdpi/navigation_refresh.png create mode 100644 mobile/res/drawable-hdpi/social_group.png delete mode 100644 mobile/res/drawable-ldpi/ic_menu_refresh.png create mode 100644 mobile/res/drawable-mdpi/action_about.png create mode 100644 mobile/res/drawable-mdpi/action_search.png create mode 100644 mobile/res/drawable-mdpi/action_settings.png create mode 100644 mobile/res/drawable-mdpi/av_full_screen.png create mode 100644 mobile/res/drawable-mdpi/content_remove.png create mode 100644 mobile/res/drawable-mdpi/device_access_location_found.png create mode 100644 mobile/res/drawable-mdpi/device_access_location_off.png create mode 100644 mobile/res/drawable-mdpi/device_access_location_searching.png delete mode 100644 mobile/res/drawable-mdpi/ic_menu_refresh.png create mode 100644 mobile/res/drawable-mdpi/location_map.png create mode 100644 mobile/res/drawable-mdpi/navigation_refresh.png create mode 100644 mobile/res/drawable-mdpi/social_group.png create mode 100644 mobile/res/drawable-xhdpi/action_about.png create mode 100644 mobile/res/drawable-xhdpi/action_help.png create mode 100644 mobile/res/drawable-xhdpi/action_search.png create mode 100644 mobile/res/drawable-xhdpi/av_full_screen.png create mode 100644 mobile/res/drawable-xhdpi/content_remove.png create mode 100644 mobile/res/drawable-xhdpi/device_access_location_found.png create mode 100644 mobile/res/drawable-xhdpi/device_access_location_off.png create mode 100644 mobile/res/drawable-xhdpi/device_access_location_searching.png delete mode 100644 mobile/res/drawable-xhdpi/ic_menu_refresh.png create mode 100644 mobile/res/drawable-xhdpi/location_map.png create mode 100644 mobile/res/drawable-xhdpi/navigation_refresh.png create mode 100644 mobile/res/drawable-xhdpi/social_group.png diff --git a/code/chat.js b/code/chat.js index a2b78797..cf10a99d 100644 --- a/code/chat.js +++ b/code/chat.js @@ -473,9 +473,7 @@ window.chat.needMoreMessages = function() { chat.requestPublic(true); } - -window.chat.chooser = function(event) { - var t = $(event.target); +window.chat.chooseAnchor = function(t) { var tt = t.text(); var mark = $('#chatinput mark'); @@ -524,6 +522,18 @@ window.chat.chooser = function(event) { chat.needMoreMessages(); } +window.chat.choose = function(name) { + $('#chat, #chatinput, #updatestatus').show(); + $('#map').css('visibility', 'hidden'); + + var t = $(''+name+''); + window.chat.chooseAnchor(t); +} + +window.chat.chooser = function(event) { + var t = $(event.target); + window.chat.chooseAnchor(t); +} // contains the logic to keep the correct scroll position. window.chat.keepScrollPosition = function(box, scrollBefore, isOldMsgs) { diff --git a/code/smartphone.js b/code/smartphone.js index 3162b6d5..5a1700ed 100644 --- a/code/smartphone.js +++ b/code/smartphone.js @@ -80,7 +80,7 @@ window.runOnSmartphonesAfterBoot = function() { if(!isSmartphone()) return; console.warn('running smartphone post boot stuff'); - chat.toggle(); + //chat.toggle(); smartphone.mapButton.click(); // disable img full view diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 51f57ac3..3d8e23d4 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -16,7 +16,7 @@ android:allowBackup="true" android:icon="@drawable/ic_iitcm" android:label="@string/app_name" - android:theme="@style/AppTheme" > + android:theme="@style/AppTheme" android:uiOptions="splitActionBarWhenNarrow"> l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)z{tqN#L3ju$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OzjUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfY zG!Lpb1-DyFaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zemFsXG6MtCc~2L| zkcwMxW}eL!c9b|a+az9MsZyJV3(vPlj@m&Q84Ed@G(tYUy4cLo^p~6E^}*o&x`vJl zfmfkh#90HoT{SvFY_}}&3hbHYu(j@p+SOzC4+v}Qe514b=BzaKx(zKezt2p!zc;g7 zXyw%`*|m2T$?D#7VqVyI!673dH~P%;3hM;^5@)t;FTS&C9JH?BmjAELtadEXg7No4 zZZn4^3+G1~)*mddVEz8k@XtpjxsN-90u=E7X_+|~2Wncd)-8_+nt zKsJsg_dt#H^M@u&5+&mfD_5*Lsc+ij=_to{Nbp7Dj(MkYcQ9!?O5ETOf4HM(Py1|x zWxKO3pSdj6V!XjyxSnD9gXODlN-*nn9OO82$Rwt9&S{C&CpC|4N$T@BY}FQhP_a`| z&-u{dC$CjRR?C&Ih-CYfz?Jqu>WJ*GyO!l7VCh9_6b`hiXH!Q z?<#vWKlDx0mPuyCn`1lKr)aG%V1A~1>`ln7H&?a>&kldHY75(+J6>}_o>eT)Nxtls z7}OKhCpp@$E;^Uir^tGHyJqHdroXe`M0(YWp=aOf!A9`3BzqbX+U9a>G`=KC$a( sAHJIl3^w)^1&PVosU-?Y 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 S+PXgDUn)c#CORQV&i@Df@x@jE literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-hdpi/content_remove.png b/mobile/res/drawable-hdpi/content_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..094eea589246b46e26d3cf02285f26c1abb33700 GIT binary patch literal 1285 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViu&CG&eP`1g19yq1ObbUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfX zG!Lpb1-Dy_aO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z-u2mO3IhXUxu=U` zNX4x;5!QK!97IeyTqnMNpmcm8%M>G3-WWwz*F`c-$_jIgzI(VH*9}NfITIn}t^Miq zt^CxuFJV%VoA!QA+cW?BwdPGa!e?_6*v>Ra8Zf6F;K|54eBit62Bu9MQAS0(7sOrV zFmd6sVXA&0TEJNQze)M|Ji|-NYMq;OBp)a(&?%=8T3fK(ZA-OjPsrn-ICl#d^bMbWd5M3Yv*PdK6^%G=gKVBqt7Qj zN)BD@+%+et!bv%QPyM^iQh&ccXS^D`V!EqMm&!fysN*xMLvxC}Z?AaevTWCsfY>uD z^_GXqXN1UWzHe-uzC=arVY%9>lwkirLD$Y2HE%5;kYDE~pS3yS+5Mg`)RVrhVZcwy8N_S@W-h1YJ-}%nt&gMph zFJnz{nnI(|SYgX0GHM0Q?_>t`jjd68b3?brQ0ZND>$DcsiYqtMlSwL?RD@VVDPc@;p5`lm|y^(2xo}N27HeXOJLT zC85SiHKqZ~jEZ@-zI1l22=9I=ArPBX*MbXdRT2h95 z(fgmoTDbv7crrwbr4vf3aS5*GP`E%$APN#AJZ!aHtQ&_ZC6p zSP7;~M-dG+ZNe+_)%k}Lq_BEtL1>0Z4+Wno{ z4@U1eL`J&QTgOfce(rK`){0HQxsXE^vz_>P>yv$RUWT{q-MN=*FP9vxjOCxs&)IoR zv?Sz(%>7 zR)5W+8XIS87@u>?fLax8DeC|y8`G>lQj3)12up z!Hi7=0sbOBw6%Xg2r$mKj$XZ@+B`2t#W2yu9l7!i(e#Y$+i`xZeU^LTM8p9`Gb7d@ zu&LjW?a^U?SxaqZ#?6_P$qen~me(&nWl>X`>GX!Rjvj-i0L(Mlpude<5QCYO@WY43 z7kdunFF=x?$KTJIWIdmrR_e(dnpbvGa-7*qE8BnZlI2SgAQD-%zm2@N2ubNHtFab! zIP}u0YvCQfb=A|e=f!<>d9wwtmi}tiIcAP4VAUC`*j`@0e%-4X&8o=9Q)O|^M{4Kp z?y0taaBSpohdZL{>pim3?z;Xb|IRe`;`zI}her=oG`qwPt}Q{0g_k;sjmz7hYEkap zg9q}ad!#=P3f$Z1u&V$m%^WId0Fi3#lIyHLZp_WtedB0pdKO^?=~Mx`xQ}7h0-YN@xoW*XoejJ{|VG$kL9kxU+AN zx8I|xcPH(V`HLBjt&ej5l%G&IvcpXl>*<#3wmDmqUb={tKb|gnc43Vlm!v-|8x&o! zz!{RljQDHiwNo0eD%;uL=HacUwW(Vwv4$-7`qz(g9-EH+-5OxK!bB_esq3hj|xe%#kn|HMPQy{6O_i+#18y9^iY!ZsiO`J1iTDTb!1!)a9>Pu3i5z8Zb; z4cDo2Ahuxo+Nna$6dhb^`^3$$vb&;w+fA?Xg7^EQP4-o{S@{cCzwLSU!KFWP;7qCA y({c+pr7@6S<#$#-QgJCc=x){t3xqQ|$&t3>*3c2#xpyMX|Dv#vaLH*=T+Tl*{jMtj literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-hdpi/device_access_location_off.png b/mobile/res/drawable-hdpi/device_access_location_off.png new file mode 100644 index 0000000000000000000000000000000000000000..cff8a1817ce8963d15df36a11340daeaeda00dd1 GIT binary patch literal 1791 zcmaJ?c~BEq91fRYs;Cu|qm?BfUL?C410j(JxsVhB8W3SbhL9{K!tTaoApr&rs8FAVKA85g8&^rmeq@ z_){oWp6bYGB3c^CRp2N?ZpJVSsD@-yDESPJ+XxTFAz5OTnPCSy9Tfk*qG%O&?_Ge`qIK!_wB z?Vq5crON>!u0;SJ21HjtzA)g+V!$kj!{T@YObCWRmT^dHn4RlQBF|Hs&bPBCn zL#S~KFe}Ov@DzeaBP0DM1yu7%7Snw!6In3OAlHB}12U&H4wOp&ABv)%&^khfe2(`& zg>{i>8U&OfIy^ zf37?lFmm3t*rdy4MR49&U<$I^8mjk>^aE4b`V#);Q4!qPwT?F4;~-TYUcH}sd@bqT()Fev@l zpL=BD)tmZU2WJ%^zU!;cNeX%{?aT@7Y#d2^*ic)TbK}{mCtasP`qCy_TU(~q7*FP! z-fc=MvFQMI!g;`F1mcw<}ttpk+Cji^1 zwr=kZ*+Tb(QI?a%GUxa7_-$_+i+9rot>dy+PqYRCGE@0Z2I=F~?@R{xOV zoR?owyv1vvJC?%Khrm;O*@4DO<0$49$7osZZN6TD=fu8?tw1-6Y~l-FMcV zUSlz%NsxE;{9e6nYw~D&ckWPYsvVCK{=62_SUi}NQBG942TA z->UbFZ*GgJPQ!e$uWQTzl z^#z5c$5WO~i(k?w@Hi*iI{o?S<_r0#DYNY7Yh`0oB0A@=8E?;|N2$Af7Yz($I=nkL zWBl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;)!fzDz|h>($-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OVZUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1? zG!Lpb1-DzwaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z);J~H$iTpK*3-o? zq~g|_nf4jMfg^Po#?G0ewT*3&%f{rT-p-=AJjd?0>I(++2)sCjf%j#ozK6YtNcE%deVvz zt+*-f?cyH=xjR^MN*VV#-`;)HG*GPkNYxdk4Z$&j;;!i;${*Zo#P_?XcD+BqZ>P=C z>BI7^OZm}?8*00bhJFlva&*(#qe9cXI43_&KeEEY?O(pQYTbJ^rPYs`PjpQ;-M>BL zfM#Lv9ETHK5kjrAuDldvKgzIsa$!x}9nt(~%?E8KI%F;WIPFo2^(tMo#ea_2bHNai z??-Yn_G?W_}n~?IW}q1oO&&}$QuWHded*rN#RXrziF`BxAE7pYcmArZ?t_A zbUMF^(aAG4N;b6#GgcoF=sRy|aq#&D+apoeSY@8I#4_DpoOOLo;R!e0l)nEd zzN(cDOHTaX#LSqQGyD4ki=;_5Pp-OY?w;7dS=d>m;8-{7QpMRs*4@WA?ez2>@6mLY z>wdX_X_CuApWOGK-UaAO?eE-o{`&#VFAg>bE0Z5I?NF_fwYqoOdH4BSau@kk6Q0iB zQ>|YY)bf+>9<%)IWpDm{+CP1P!tM*|amyGt*sdx&DHFC#HHw} zs~1j-P3l>__-ytIiEW$pygRSoS;BTREw`65=iKHtW5(Aag|71=ZZ&<*%n@}qJ+SRj z>#}=OKW%%#Z?J#9oBk-4JE1@^!H=pEUc-M;OVTkqNs-}o)v z!FzP2qkE&e)neBLE7^$bEX&h1lgiI9oVWRHh4HS-wjq<`UW&|ow`Uu|1Gx@69A^FEhT?M6BsOS&Dc=5=|~u;xc7ARb6Mw<&;$T}2W|EM literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-hdpi/ic_menu_refresh.png b/mobile/res/drawable-hdpi/ic_menu_refresh.png deleted file mode 100644 index e13315f5da34487cba048540f41fed1b14706180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2025 zcmVC5uat znCKD`O-rn~1e*Zqs>mQ}`-uB+M>R(3R zlib`te&>14^PcCt=e)rGV>;-+0-Qh)5FpSjs7Z{CvL*lm=`p~+%N;0k3FQAB~;fiEXcjqTHpih17fuZ2@p7ejxB^>xb*~`Y)Dl zHy_egQYrkH#5jM#7wqn2`0g8H-2BRlcK#z^#>_%EMFD3 z`2J4N69g;lJ6(RP{y^|M0Iv{aI#%Hv7lg0pj4%8pXY=lwBUTGoFkZ^e%^kwUznT+)Xokh1pSN;eP&-buI}tVlL1U}xUwN!yQk^6MM~X2fjUG&0S%6 z<^8k}DnG9S7(n5eDdKq=@~Y{66SX@`sT_bhZ4B=l0F){SL-&TbKY-j~Qa}NLPnM!| zy#x%T>D@Gjeq|H!T;p-xDj5KF!^Q>6XGV>*>DtDaUCc#^pzyCIFc85l8{+^|fs1Bd zYECg$V;4+l(BawL_-J;s^Ax}|j52_Mh{|M;UKDy(MeFu;9RZ)J6Tis(el1^{JrDWk zfCT9R0OF+bQ?W3EAY;AO0S7uxOBiqE)YMr51`xHUo?oU^RE;x75niGK3=wpLrfnE! zI8WplBcI@|d-m)qWRZn~5yY0N;CTZjD;MVkNv{oJ2GBzH-36)+(2Fn^nyMM{+6 z4KX78_=`RvHIAAI&6~{kmLQiKD{r+t8!X{0nK-NL$ePi<9GwNOOb_R9ZYw?q4GaSk zfDQ?UE`*kH-$wt8I!PXwsI6h;J{_J3N1mF(U|&qaTY!MTsFz=Px~`I3lnP5Il)_Io z>NqS9O~$Kd2n2Zm2ezX1M-}zTCIfG&_agcY2a2!=K~Oheuv(NNaZfCRI3=G+#fO3e z2>>7qhnU5&FC-s1T>A_uHaIJP635M0zaP2fWj+A|NN2L6s)ao$FbE8t&iP1tJWV@zi6>i5aO79Za8?!&-wMM;KR$8P1_Ry3CQWyBPBYf&h*#4 zJJQ!FH{cuAttvDPuWhJ*xqLTyNNX#j}1qrrfhV96GPZ1bT1 zNiQH*$*p1=1(-dDBnxp09g)c^HD}}5B)LWJgPc9s?{;RQ9&};_2|zKZO6>&z9XbF8 zv$9Epj)eTFeI%+bE${Y{i8<*hs^BSwbi{)W7W6tAu~o7HGhBeDuQLgP0Y`RvFUGFj zwl0P)mt^}3z!xDPg;Yc-NP2}1-uBazp(o8pWi@o35t*W1{hDqi> z4HhIIFw$eLz-u`8nbu>Eo@hBy>#tnzYtkx&q?n3&z3yP#4P(G}P3<2SXE8JYc1OPk@2IE8dH<=*@WB0VyMVrVXACSQpcJE_>Y_H;s7&G zssH)-CmXOH6R?zbhyVZpC3HntbYx+4WjbSWWnpw>05UK!F)c7LEiyP%GBP?eH##*l zEigDbFfgP}a>)Py03~!qSaf7zbY(hiZ)9m^c>ppnF)=MLF)cDUR5CI;G&edmGc7PU zIxsNR6Uub}000?uMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o00000NkvXX Hu0mjfQR<0n diff --git a/mobile/res/drawable-hdpi/location_map.png b/mobile/res/drawable-hdpi/location_map.png new file mode 100644 index 0000000000000000000000000000000000000000..e5907072f04b90d4119892dd0b37ec3a416e2beb GIT binary patch literal 2077 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 MSl>bq2X&7AABcbM^#A|> literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-hdpi/social_group.png b/mobile/res/drawable-hdpi/social_group.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf88a85bc4a268fbae72edf5a7818392e32810e GIT binary patch literal 2075 zcmaJ?c~nzZ9?pmzwke`40y_E#i;83eLQD=zNkTASD25QAwMv#32#~y(JRmGuTTls$ zh(H94fOx=Cfhi)2l_DY$ixO$4EUgF#4l)){a2Jqyp+blic0hsdyq4&ma)|31klf z+24ao^J5SRBo8WK8B2!*2@+5WFJpy&VhJl^^=6RBkjivWE=~l63^^nLmYSxBSJdL? zzarmztZ+pwi0YO4z#(FA`m6n~t6mNv{?RW#7#G=mus$e7{4Pg~jXhXif3!dv z%!>ftwbGDdBjm2G&JXmr`SnHs6;yN2PwA$0cV5h;-)(!4^29CarLG#rr4^qpaep*F z^e9OuIxu`!qsu!AkD4}+e$-wtp6(Fk+|#1> zpNX;h$kN9A2mUo>Pz$E(+=*2M9b zf2lG&V#lV1Rj_I;+_f{s*Z%I5s4}yJVy$BR2J*kUyFPonow?5qX!3H9L3y6APVMN` zgH>m4FL}Os^cA>T8LDx3yTK!B_k7^!z4@eqfU{b{w|(bF&oM0Vzr!jO=eSEz^&$49 zThA&v0fTGQYeX|el>zY`HeltAmZzs8oDy#u+c(CZv)S@}jf<7@rP6n2n}69>kn7{a zC~xEn((o|I(ffkvm>?H)k5^^ zHzx+@X;kg_@ zjN7~_PtVHIrwc}7TFX{7ZEj}5Cnr4NW+ZmcuIb*ow$4$r2AWrH)TZn(^OW^qQ_;iJ z;-4S)+P)HK?Ft8&VV?(Qj%%8J+jg(~h+#!nj1hNlxp}HKy|VjFTK&X2aszjA?N#l< zT8012H#^!kzI>N3Q)u%jr(~OFc5t7MxNII!y>PT{4RY=1zO+z|8)~EAvd%Nx|HaAA zO;C<(YWUmTy0Jz{ys-bDo0~%ZJtXj*-7s}nXWg%A?69A)C9_kle~Rp*3JkD|+lBQr z{Esl1n0cG2gsFy7U&HHp>pYLziJh>Wvs|m8_4@>vP|=ZQXDk>QDWDao6h`{Hk{++J^+qd&zQy?h|F6h`Y9kL`L<)^n%;_Aefyj> zwfmBHrlITCy*e|$^~9B<4gN0Sq=jzNmLZ@FoZp`nsQQ-M1{lmshJ7ub4lqr2buMT> zNgpR)d2lA9$>K>CX0*b6`ZK!=i5a@eiA{Fb>w-%(8Kmy6(6z0P<3+t~K0Tk7rCC%R za{49B`VM1qP(AREk)NmAl6u?bS{e(uhPJ8B_NiL}!yQbr4_r3>^r*{sSv@uMi)*>% zzLxh+(^QcVw!Jm|a31~PV1yUEJy2rb8T&{T*O9x`T&*FS`F_FF+!|MumVVvt6Zl#0 z>%AL+NcX|uJ)cCdWH-l+v@aqO2aXl0n_uy3TFr4*$`_i5`W=!hn-o)I!yUqK3J*%=^D**fgfEJN3GkU-pH^@ahNdy0S)eu&`ry zlv)3lD(Afk>H(wZEvF6C8q0?bs13V^3wjO&!TR4d(?6JAPmTKeKV|b_3IG5A literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-ldpi/ic_menu_refresh.png b/mobile/res/drawable-ldpi/ic_menu_refresh.png deleted file mode 100644 index b25dc061616a316beea1da94d8f15d2b6ed6a146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcmZ{kX*e6`7RRHtt17K3s*I&VL=#IqiK<~}1lJx-)RxFnq=Lkfn54bY8md8qs;zn% zwU$;jZ48;2#}YbXOoOUrtW|E+Zj?sdm{0e9xF62>J@5NF|L1%=S$;l9byYo8005wl z@^A}~(e$vC$E0UMM9TQ^1Q=l&xpOrN9}%v08c2sQLV04*c&XW`Ly|E zGEJ(~mTb{;kn$A)hwtRC?kr5uX6DX(l)E<1Uf4IBj9J)FWjH=seT{Ml96$S>>c@mW!u)=@-Le*TD0>D9)^=xHv}?9wl6%}Uw7I?&%8C!acu*x z`f}R!QA*Uo-z~yg)(r_24d*p8wbK8%8R^e!L6wJJ{T!p9=~#A5xsK^WOKp3>#eD5z z+Ty9>58?#k+g%pEqBOixC34s;-s_nV6QQa$TedOr%EBpr9Ua9VpGRtMKg|GJl0b3X zuPu6DVNU(BSIWM0v083h+k$MjwfcVb=ZkGYM}6R&vhILKaRK*~Af-QLLTk+%nJv=$ z@h2WU^}O+OEV)K2tm$}saL0SH^$=q-o|EW9&r_SR?f*=7FA@}4+K&&^DYKkz=LXMA zRlHm3PsGk4Mr+jgarfHGn_6d&U9(~j;NYFT^gKK$eeC5Bv7zAkLp}A?T1D*KU(d2H z1oou1Nz)0rVy}tr(9u*auC3`6-Lgwa`*!4Wm3IPX)V?un#+Y<47a=XzD>#*#$kDUA zuRN=5Vwq;cN=P=&UtIne5cA|1gj`?Q-O4k{XbS{pb(S$tP4&01jDf<-n!f0D*EPb^ zYpu9ayHRV$`=c{C2ksRql18&We-lmDA1brO_NDwMDbw@O*m_u>qUAd`3{y}!Mg;Dz zl=NzSS>k!Q)H3ah4K%{j$XOfw@%Iob3 zd85=xx!!>AVkT0CwPtJxN?WT7@<~PpXQdq98wYVI}3i-SF1Pd`}8^_ zcI#U)uYpx51jW=>o({)n(&k0BQRncXo&h7#2JliKyEH=5t7++NlUexFb^jyg=cNNv zdp+BTm(x}GtU??kN6Z%1y4;;Es2klMBz4D8U9BZXwCjv^+LeXmDAvjILb9$|HR>On zEp@*V(l)k&(~VDHa*{VOF9y#w^5NsNO+yB0jwumiyOs1UuG0-FdYGTD5pj@|y?wFQ znJ(~Ze_Ya~Q{|#PRQS(;*u_kPH#E-P;w16e-IF!#-fyMo;wG=Xt1D=BPv6qW7~>Aq zI)7Osb6NoPrDR-Vx7H1r0xL~TPhnb%Ixxd_qr=S?1P*XWR&gu8L;;BYg_}Abfqf-h z=0JroSm5iT4Yshr(n7_1^f$xyxrZ~ICT-&Gto+iJPtDX`S|hSE~P%y+M2nt0&>=3s0V2A?(0=cJCKmI>~>r_HCiShpf)1F#~ z$6n)b11Xw9Cnh5Bl%zxe#2Ok%Cx0(f$Nx)FsCXg`V3$;@Y%DXnhbE9pqNm^zi2xUZ fOd6rCl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)z|q{?!pPaw$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OecUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq% zG!Lpb1-DzAaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1ze&V@(9|Hs9a!(h> zkcwMxuG@Pbc93BEux#V3ATGV5T&+r5BIaybvAa2Xd!qkIH;3T*1V*^Ul(3a!!180#)Vj_p0oz7Cu~hx8>Y4pNzahrdz@@B$NHP zrX_NU{k$z~bHKL7SG!T?&0)PM72ogOoZhHdvVd>-hebkH0`9cEE@09w;GTY=CHyFm8h`~tCa51GFuh!~{x)y7#j z`yaG?{55g|GxOEv6Svb+3s|~;KR-AjsL4?In1=DPPnHjO&30aO$(8G?sAXN>ROow5 ztFT&2bwa!Oi}tq(eIM7mu03D)vp%$^$|kN@I70b j@~k{{1EsZVJ5yV%dgYXNWc z{u&?8V;Szg2?tg^6P>nd#e|R7(kf)Htm+Bmw_;8?>QN@LJhA!GWs9z@;*0GykKc;- v=;4r8i;6$F>|0RQk@;zbOuK}Ch$S$X>PoKli8&MkD#$!t{an^LB{Ts5qQ}~& literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/action_search.png b/mobile/res/drawable-mdpi/action_search.png new file mode 100644 index 0000000000000000000000000000000000000000..587d9e0bf392fc928947f04293ba009f7fc77b29 GIT binary patch literal 1394 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)(9*=*)zI10$-vFf5X3XIbTx5uc62i} zG&gZFgz0t3PcF?(%`1WFO+n~&!KoLN7;+1MHoK%2WtOF;xE1B+Du6w0m5JLejyTPO z>P^Az7AKr~^?{Dj2SqJXRKtXT=?BDwCtM&0p7c}mfa$#mn6M+i2Q6b@V0_}~;uunK z>&^AE+Ae`I$3E`tm@-`{zx9(?>dU1k*tm~+ZG0%dVMD+vFR`R_eQ9k~)lEW^HhtI? zB&0NvW8=gpsXg!4y8B+<@$PBQ%`+>{C%wC~^SkBqd7pQuuW?X#(4E%(*>&epCKp?W zrqiE|F7`;J9Gc@U;Ny}9H~GSBM$UJ2|47y7x^EaYbO zm=^RUfnEK@zlTwYmbEt*&h}S4{%}u`&SQ?!WlSjvv9{-n3Kw#{NfhghW2)KCHS6mc z^@8V*Jmr$4uC6fJ$dg^zU&?d@|$3_EuOa%?|q_h0a*8dJ>+>(i$vUCaNY#uTIE zul#VEs1omUHKv?ZC$?1V2%BBCKXsA7(geZX8pRvuyee!cJTgs9KN2D`QS`=`xX%9*}?nyAhK z_Nf-Z4{Ui>oBh!|a6Nmso8l+YBlF(g-ZfEwMbWdDrE^;>d8}GD@Z@>D4V>xD8CRkc zdVC*mVv&1FrpctHKHIFmo)(#Y4~A;Ho~#?e&Q2v6MQ%0zKUO`Q$Im5rVUFgn)AKHP zSBG=VuX=ZVUZK&Y$p$gc*{*!{ocg_l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi)$k4*r&A`;u$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OzjUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfY zG!Lpb1-DyFaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zzTW#wpMimKt*47) zNX4x;(`~&EJ4hU#eM=~Qh3+e*AEGP=FItrrTsY|WOZ1EJjvdw(oa_9oZXR?!=qWq3 zDc-Rl$fx$;g=0VJAIMucT~d2m6!_%<`}Cr{HsA03uk3vKyH4?Zpw1JUBJ%}HD)(!x zD6V6UWBYsX(wau*4TpZR-Y}|UE&5gYfy*j^@ysj}hnSn8^Y$O`h~hOlpeFH@&9n6n z+cyXQpRvy#C&-_`sd!|u1&Gh3b zxiZf4FKbLh*2~7ZL CljEBJ literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/av_full_screen.png b/mobile/res/drawable-mdpi/av_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdcd5fc4418b053eb53a0db0dd6e3d7d56ba9f8 GIT binary patch literal 1479 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVil*vQb*(aGG@$G&eP`1g19yq1OVZUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dHn$jA zS{OUInBg=Jsy7949}Q3Qz1jT3V21e%ar+~$rjqCgPCr)J(rrTR}iX zi-o?ODs=nnxbaB-G|TTVzNz}$ZtR-zWaokMe@-%!-#*j5TbXkF#hN7H2aAiQD_5vp z^U%|l^-S~5iP|;$#G90 zEFqgayuZfzEM+lh^<$iE^C__G;BIB9<-)rb%(Pgv(Ber=?BO$e-)5Y2`)E4vsnEV9 z`gayjx%U3z6tT6-zD&+%*c)|$`@#NRX+}1NQ`VxN3}&*KfQnX6S3j3^P6U1$_X9AA6!D{>-O1V0|eJyDC^?#_9aWVd(G`!pxn5HHtyB?hy%JIO7{?re4^ zxy=>PXrxrIMX-W>4j7>*6vaXxn)qO8p(L~w;Yw*^d=VlMT0s=V*_ewycrNVD%%9)y z_y3&zva{o`zj0e5!!Z7ATPjCa;JxeC(63Xe{7;vyBwZj~xQ~<-8!>SW7ZJ!BN1`DobyYg@YGptbHTGaDh`JILFc49IYYdu>7#po2~Upxm0G^7d^$; z5+Rnv^W}1xD<9yn-Ooc&6nP=UheAP$2s)!CQQV;E1ZoN?FX2>Yem*{mdiv7#=DBeLr(BgssUyB{ZPYLK|3Ue-o*P(VJAOoAwGv3JZ!79aeV>L zl_e!@q!4W9F&?Z{v9p8;c1qX+$*u?ofvl*y=~TfLJTV1#uZ@eRHN^hT;mAAysZrJ&>qq3vt&*SmMxy)?HVwt>5|Kw*#N*A@?K`5dj8%Q7oWF` vOgVUDW_-_uZ1>R1kA7S8{aE&X&*@dne`UUN{`beD-d`Y_?nqrv^qzSISl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;#m&XQ(Amh;$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1PCvUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dR=1d2 z7#ld@HV>*d1*==YdQEV;MIY!GeNfaQMKw$an0`P^c)|s8;7LC<518JIfC>Bek$Ykc z42+*WT^vIyZoQel+n>o%;F#rsQ{DVgCIY%VT)kpWN@80)lDBNxa5O49xx4p&!_>8N zxx%*HkWl`?W!KcXZHB}OfphOCy`Q9eZujGNPq=PAnf~VNxpREGt&O{vXmp)F{p@?? z9X39T(ggM=b0s*eN)qI1sE&$m&fqgi_cyPQsBsO$y@sXGly5loZ%`i^W=D!m+*6CGK@7IHvwg6@mc zSJoD+Te$D0;EKQ^mSYF3GJ@ooA`Onew=Q6l`ZMjIp>j&|^sCndQw|7waBZ@%U^o5X zku~Kg>t2!PX+75rxDU&$_;e_9e~rA$0rB!BC+k|06<-r{1ycWsY{OZ~jAYF#(gZ}r-4r>|^` z>A9nETKbLh*2~7ZF9Rj2P literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/device_access_location_off.png b/mobile/res/drawable-mdpi/device_access_location_off.png new file mode 100644 index 0000000000000000000000000000000000000000..56eae120b2a91a8dd0940e5848a6e615782d2b0b GIT binary patch literal 1383 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;)!fzDz`)Ja$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yuGi22r(RHE$SnZc?2=lPS(cjOR+OKs0QR(1CN{UY zxVab@Iy>Vu52`l>r&|nMaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zK4mX9 zoq>Vzrl*TzNX4x;)9rPb17(i?*68MXwke`zf{E#iR;jG3y%!e3%L6ZNT$xS zzQBL&purAC@du6BdllH&4yxW@DEA6m%FK1-py`Q5Lj|1@mg_}VdRN~Fv)se~rVZZb&~Y<@GRdU77u#GXIFlix6GX%_w9Ide{ap>9G^Qq#-T ztF1P$v_&KwdT`MxeR{k8=SaDI=?m4re>3Qtbx`!iw&Df6B@Oxgv!?!0T)*XOptry& z9!o~a?yV*oO{_sn&a9cfu(#`ZNH^o$t3JjjpC6d@a_jb>Z)si3XSXS7EnAp2p|`1W z{iT4d0;P?b_FNa|Pk$6O`=a6Vsk1IxlunsFQT%Ph2HAd#%;S0bDv77&y((1PxNFke z4H;*fg7&^|QGLg6WqYSPy0B66c}2&u`os0_53FZkX87PBuQ1Q=l_;p_^K|udS?83{ F1OP0q^@;!h literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/device_access_location_searching.png b/mobile/res/drawable-mdpi/device_access_location_searching.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4fb081e0986f4670deeebb6fb939043423499a GIT binary patch literal 1312 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;&A`CY$jQvq$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1POzUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1= zG!Lpb1-DyFaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zb_(je$-uxk$HGDa14WKkuk;i?qnfD`bg|Vjeo@=GU4~L?wniVlb<#dz(=CtPk=cS5xtd*g z&Il!H%{%YCZxY|t^82+{&0l!hojhIrd|q``ea-omA8YNWF6mt=v@MXSQ20i3)*ObH zGdOh)dk1M7Fv@>enyzjvxPD=yQO*ISGfn~zB=a8foco&hfb&VBeAojvy$6o>pDpC@ zF5qM@NEbErIM5^%<1Bmaz?Tn(zrv>HpH$m+_6hfeCgl?mKhmGvzI0>Xzr<*PJCl-U zwCPrCzO#;J&WpC3*Bh*I9VOo_%-9)vw?ZoV-E;9WUhNCl8oRT6d)FSh*tmyjXH>AE zkBI7>)+QD;?tVidj$`Lu%Jd!dusMvLYTnShO4bthIQ?Y+ImVXgO9sR`YNm3~^0 zrIyV5uAJ$f*dV^FBhkBN)#nG6esKXj&!avlyBKen*&^_Fr--|*8?WvEu%2sAlVf|> z0{ePTeO%>j*>`(F%GY<961<-4r@aYSw3T^o;`bKWUjN;Gb{*?>tkr&=llJBQhx_Uu bbPq7pnR#F1tm66uDziLY{an^LB{Ts5)}Gl{ literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/ic_menu_refresh.png b/mobile/res/drawable-mdpi/ic_menu_refresh.png deleted file mode 100644 index 30b660fdfcc1c517a22258837bd6106c4b387826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1278 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~G#o2QFoh{y4zQ@wMhgo+%me_nUrJl|?d@U4cI z&C66+coe3&8|36XRdu=G64uqvy3gPsOKRexV=e`a{Rv4)Jrg@vE@o)$a!^%t)N~SO zYU0djoYo}EmF%5vb>>WYe>c@^%@6#CE zbTU$6p4~e&^RwEyj?mrnmi!66`B&V!FKBP-w=aLz3G7)VeTvuj;(8RAJ`B zz8Gc=bK@mk-)r+LYpVHYL>M;)bv`Kem%1p}8+!h)=1g zJ#8(xyx?T*j`G{<=HC80`7v89!Jk+zU@nHKh@mE>g7O#ze zM_K-ukq|V^p&;x=b?SpIo?n)mDyQC`boAf){+0zSYBu!`-W|L1{oSY9UCCUrF|wyV z>8(1MbTUzsAu~v##D%wE)o(Sks5$z-ELF7J-kR2$-(Bo>w$H~gVAV4BkJWp&$?ZCL z@lb|agQ|mW;-NW9(^m)|7Mya`BExI)-;{+0KC`6{CN-?&o|jShyIFo~?Z1~^Qy=Ov zlvEwxYkMytZ}DE%m&exk?Guc7&YHBkM`Y=O1D(Fr_cuMU+%@xT)3g9d26lO;Lg$6o zmtD?sXHqG354_Ryq^^gtoAc^74df} z`j5(-xWuWcnY;L(iv1(=qt7IzIXZ%$DGBdASM!{2mqF950EOFsVk}#^@4Yjg!xpHU znjAOr#GUoeeb07sDnxni-oA-j{?v=@#ZB$g_giL9bhXo-leOGlD^s_Z;i=@`iUmsH zlea5z$bNeA^7C!W{wc*vAAVTmYizdbM>})=`~|$9mc}s5P<5YD5;UP{$17`nKAHUj zD^6d}GKu`1@c8s&@u)w3?^n({y<5_uXtCSO`>d*;`s@|o68O|Sdo#aC$kCWDb~-th*Z#}aD;4g28KgS* zlwjoSthW)N*JJF?u03?YefdA58&&V#EPS!vdH0I-ClXW~mfeml-}<$^{QJ83UwoT= zxQ_Sor2X-p^U&nwniB!<^OTr;IQEOwY;coWv16Su2h)R-y8kyS{+u~u`vnIFf#W(8 zG)`>~;c)wRdxy#->j}3_{)>k*&1A8#oAMA?G^m!iMwFx^mZVxG7o`Fz1|tJQLtO(y zT_cMSBO@ylb1PG0T>}d%1A`@gMJG`-wJDNutX$cEtjw370~qErUQ il>DSr1<%~X^wgl##FWaylc_d9MGT&#M diff --git a/mobile/res/drawable-mdpi/location_map.png b/mobile/res/drawable-mdpi/location_map.png new file mode 100644 index 0000000000000000000000000000000000000000..21de2011439aa4d2e5205504523020decc79cc8f GIT binary patch literal 1648 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 IFo%f$0VKS%G5`Po literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/social_group.png b/mobile/res/drawable-mdpi/social_group.png new file mode 100644 index 0000000000000000000000000000000000000000..a19796c36ae2938d89ab94c169b0cbbe4844fcf8 GIT binary patch literal 1594 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViy(%jg{*vZ7y$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1P0rUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfW zG!Lpb1-Dy_aq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z4tTdwmw|z4ji-xa zNX4x;)BQVq17(iC-)pRxKQGOgcVBJ4R+jGC`};7oNkAQP6Zig28{F`dyFJA1zUFnx)_x{|n_bI>D zieElrc3b(Ph>q~vN5;&&oppwCrdr>oNvN|)98Nz|_N*f`p^GDOr}w*AN2S;CE*4Vz z_VcgmF}F|e7kcC{yr1ye=DPBcV8at$bsfJKDY{KmtTFQ6v-Q`E`}31TlaI0$NI(9w z?1|5D(KXLlD{Z?MKDy;N(eY&DBaX?^FK-{2yF|-ltdES zhJMouiZ?`@Ehp?hXU+0sjgHCj2RZ=N*4k!!}4t>1n(ymtF@ae9e{ zDrrRKD#l^e}P&s%jYVh?GX^m=Pe&{y$5bD?L+e)jg0;&(sg+_O83_0pV{;L~dr z7WRs)KXPkF|CFNnDbIK+&a?%+-Y+gbb@pSXg4h3hUNQdp&iF?#fq|*&baY9{TP9Fx N?&<31vd$@?2>|ITYQO*h literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/action_about.png b/mobile/res/drawable-xhdpi/action_about.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee903f071bbd86118d23e3e348af5ff8190171f GIT binary patch literal 2040 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 literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/av_full_screen.png b/mobile/res/drawable-xhdpi/av_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..791240fd255052e94c008e8d5393d0b0f6175020 GIT binary patch literal 2065 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 literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/device_access_location_found.png b/mobile/res/drawable-xhdpi/device_access_location_found.png new file mode 100644 index 0000000000000000000000000000000000000000..52ca8ab7f3a772adb94abdc33910558ec42e2f6a GIT binary patch literal 2204 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

ba? znxypT@A3XmVbZV`M@4#+#7YSx-ME4%pDP?z5hy}ogaN~fC#slUgi#n-gyDcHGeHOf zI>czU`Yf*)Ivt#9B`L&eL{rsr9<3oXn@zAvlcZ6J!37CQaS8}(K&b?jY9vaPA|(M# zk|@Cmt{O9zT2L!B!8QHPl}yU@4TA-zJ*!c|yaqL;5SRscl{9RgJQi?Ly>YH-@>rlr zxgt6kk*~G?)#?coJwLwV>%pZjuSXxX((_KxgWdIV*vVk9<5JZMgT3cou1;&nnAx!a zi?+1BU3qR=JrtO5l;760JMRe#3Eu;7Hhko)KBU>)+g_AmV2>;gIu_f*7fO1jRP5MO zbI7zl_C<9--1+X30(jH2d3_t3BfLA;c}M#z>g?xw$p^M?eaoGd+Smr|sKTxq)!vDmHsd)b^Jdzj>efxIf$Vr?=i~V&J68TOb;KzG z27(9u5Gb7MQ6#$>ZfoDZ@Iy3bH^-=t$XB|Z`<+vOOTS);bHA@#*B;cm9seY~t^xg( z|HL?>5+6Rg&s%jgp)d8eaz*441OkbY?mW4bk)^YcK< z`J86!&aaPD6wWd(k;g=+S}FBB+?BrhQr*C*TNjU9uLT!3?S0F;MeA&j8qf@k9OSa* za6GKgbrFBNyC*l!&v7+rRm61r4bGW4m*dKUv!~rDb_VuvJc3=1Bkm9V;p=yXLK-_q z^q!`w@}R4$S0pBj1i{u^uI5)I4a$jXRwC{KZU%JbGNWAOXoT@++=7`BL0FpIi z_k>bY5mm!<=J!C`nCp7F;Ken0U~YX#dbRiQg#rW1Z|}7$iScdv?b}mbr~Jos9p2A? zALlM9Ihql9pkMDH*iYX)Tc2WU>d3Dt&vQm^jm__dwi>?wZhlE`*fRc$_4B?f{0IB* ztRQ3f^uWmRl!5S2d&eP?NR-MQHho2p`0Hg9|H&h*Z=eq=w{0|YA;w*0kg zVAIv=(L6;~T4&JA@SIw>iv2IeLBH^gRFJsFA#;(VO{0))V?Ed0PnJ+tv}qw;lJM zsoaCL!I}E6E}kgAH0-8wjXSwx53#Ic7nknPk@YdB+0938M |7QRm!woyI*hWtM8 z&if2K@Fw5U`9&EJx#VyRG+%!^xvHU&TxNPX>jzJq&>bKQw)zJSO({JyV`s{&u9&su z+qyo1z1-)Yc7N!$u#=U{&r5$AJQQ#javyy3&F!q9H9XGC;}zg+F7C8{c|p#Ujj!eL bXW5|)vLfl@9nt$uzMpBTCQaR<%-`@IemDQ2 literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/ic_menu_refresh.png b/mobile/res/drawable-xhdpi/ic_menu_refresh.png deleted file mode 100644 index 9e9f10ee8807efe8379066f03c68309187d13c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2857 zcmZ{mS5Om*5{4lH2SN!Tpj4$wRUp!XN$5zGE-ED?p++!tq^lD^5EP|_CcT4*atQ6B zARxUPq<5tgLXnVM&Uw2JcXs~&o88%e_I2Ye%?;Us0zf)CI(B0tJ*x}C{t+|7h10n- z*ry&Oe``)CV zZIfrUz4!3FA`6A>iuCY(Vf|JwEJzZ_qdc7_;n59L%_4Du> z<#X-Z$Hwifssj-XNlQtbobU7sS(8|#I zwathsiq8R&I&bdA^6N@fa-?qVIC;W(jx3z%Y*K^n(=y5HnXiyeDC)67+(MVQ@TM4( z0KS2;35%YjHKpKyy?EB01c(a*xpnc;eoam>bSo4FSl8p+zuJ!tfOReE?;V~tRwU4Q zv@=YuE~%nFi(W^l%nHo$f@U=-T{Ck$*$$8d+fHIA|3rcv5zQn~v~Y>BPTGlYw^5`X z4jyAOQnP^BJgRL4i?sQkysocp?7%;?x*;-d3Q6ZVbVe=T#FcZr9|{(x#j`OXd3{4VLG z%On7kI+hl2FW;T4=Eq#`x8{x3fG$6;q9{rkd)Jj?vv)>ETf6Y%@%mgOOVVoZR`0jh zdUkRL924JlJ*#Y?yIgQ#4o)E%fQ0F73yc)QwCB2kbQ_fWmb$z}&+?URxn9?n2g~1l zw5f2EZ*erINkJL%jUxSXJvUBc?*Z$#YCH7&!*{REP6fB>TXKn};VP}-b1`pGFGvqY zpI^@Y;TSF5q{5%hgbV+IMzY7ebo_C5U8`QBcIm^PhKLHppu1B|U$JQ%+@%WWM?kG2 z-Z?^&fhJSWoN}Xqp3oO~-R#Sku!`mOq;+s$yOaH~Y{pH>1Ztk|BYGC=V;6ooK>DYA z5Gwdm?8vx~kLB7s^i$|>?k%rPp7WH4f^2JzL5IAq7{N9v7JTS|ZYDh^{r3YO9o-UH zdu1o1iU1M;$LiICV98iY!9NHUuM%C*Ey&Hce-KxwnQl3tR*5$#MeQie6g4ICVCJ5O zVeQ=2!}&p+oO)87iQyt&S0Pw{Nx2wHx;q$cK1zfK88Qh0vaR!s$ie5=8YJ^Y_l0o0f0^X0j5F;`a$9b364kCY zthTx3s%LLI+GY&=j!-iBdQ|+E?=;(LUlHu{0uGxK%v1)4A^((@@+q)$JL9RL-5&#DU`AkrQ{ON&V@5%*iJhE=X7A`=FuM}})T9^g9|RyB7%GYU#`I=C@5AfG1L7kB%-*3eMrO{T1x zRH|kr1~<=sI_g+>Fq-wHhe~6)Z7? z8r{*#;$J_@{#xhP&}sN$<>+uQ;OvbQ`4y2dg!>7#r6~neG?yBBr#AjZ!T*UF z=42{qPG07yxCE(Q z0|3#j$t_C#ULRzmWa@9kdg`S#Yu}tEr6igbS5~;U^XjZHSbEUJ8~ZW5HynHWs{j0u zQ$YGg`7K>KNWDOzHRq=}3%5?eRbB za_+EJW<)GCjpO+Am99F1%Gkt27}+-*^CulI-J>TR9}S`NGMS~$t&fU94KeMe%o6YK zKS720F;E;t$Y01if&HiMk_;9L3B&%P^rLf|vr?qe6Ul0$ zMy4?N5NGlUaVR~qax;gBC$@!C93X|*8KH@8ulWo!IrKOc63MYUm301%S)voA_SH6Q zbj}_cDJy^%q&=KpC)CJ1Ol==@^1VCiE{{?G??jb!zj60=_wH8|7M{AY46HObmFtPA z38~UpZZXe1R&`Pr%*BLjb?!WQkc`o=qjU?sXNcjo+SQg(3M~1UiXCj9DI1eT3vLKa zhbRAzNj5O%5H0ciO(f1F_M5-EVukqn2&n~- z+Ke!zeCU07`N))_;Hdj9-+Ii{A9(b=;hxxRwS{LZ8L={<1{8ezxz-2qEi1rQ4&5Jx z%S2&t4GBMZRH{AohZ-hVfLX^$mWc_W&5D&&?$vZQn%rr-JdLpmHnQ}nsJHIoiznJ<=(xoG7w}DH A8UO$Q diff --git a/mobile/res/drawable-xhdpi/location_map.png b/mobile/res/drawable-xhdpi/location_map.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ce90a33e6bd7d9f6c34223550bea2bd6d6007e GIT binary patch literal 2510 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 literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/social_group.png b/mobile/res/drawable-xhdpi/social_group.png new file mode 100644 index 0000000000000000000000000000000000000000..32d24d2c33b8137bdcfe64212f9f7fe2c9341fd7 GIT binary patch literal 2541 zcmaJ@c{r47A07-JQwBN;eV^y~UH5(e)<52KFArx`*cuoF0#S8! zA^FI5`^8sTN%lROTU|0^ge z*$W_Y`5=Hrpv)O4D>Ptbi9lPTaF)1D00xCdA<-Bl%Gw-_!eg!RC^Ycxfy=z{nIU)| zlG8U|vYRbDOeo~xk;vHCSVXJ^g3Av@qH#DJ5`{rxFy=CZxgd@sq>0Qq0>dQ*5-4Es zSv(<&%K;V@X>@M1&=xL>^sf}yyzjCc!M8HW3WgNXct|t?wV2WpkWBvnP&WHJS|IcR z|Bm;63JWN4JP_#v3b@gHhOBWRhKsIvcp@L93AuaaX!*(@lku(`fsn>wfUYE4xJ(1VVlnYfo1LsM)>al+0?G-Ec0}VW(Kts-0@1+< zi?+5TpqIELE+d)^a)e7<=HFb)A95Fmfz6Y7CV_lb49IlibJ@Vxr17jD$AbQ$-Zw7u z$FX33$VJM6K`yrTzgoRylFiTJ@%!M)F5gEV>J25tm;O7yqGxaSX`uPy~k+=F{-%_oQ#r_n+QQN;Ejo z@RY&XSSUW}d&EI+D}F+7b;sbO$;&zkxu+ui+Pa^_X;}jUCf4b-^UZk`w|<-d*fsxA z|H+Kod6A8NewU$6{`hs%=6|f|!Map5T0=P!yLjH${KvMxDLTMI)2sIBq4zqPBD%^4;HAAt>v2H z{g4z~QQG$Nrb^}0A(G@yy-wbqbH49|jh7#`9%}1TZ(Xl~IpI7B2vUvN|9Yi}r zs%v@;UwJ7c;lLuVFl?MWfS8Fgws@~RDm)Qn55K~d_N-T zxv4GzG%l$@5@)1QZ^;l@dBK)9l0&Ln)3(@{SKhkmu<86%r83tVa8^?Q55 zRtRi=kBV2zSpYO_LpPk)9C9&>NK$HDS#qyU@+9Nu#x0)94pm?%{2kO|jzPm4Z)DyH z2_QF^r{U> zuZtK}a?vB0gcQtjuhfV{OOCr0UeJVR|1xMas=Cjn`#2HSc_F0PA$Cj0-U+G5tdSEc7V4YrD9C7z2<59|KgX#{zLb+e%4yMqk@5HTF81<^m z)J}_lpy)5%s38cBt$XAe;C+>mRRz1SvTb2=FSuo|^Dg^k&Qq;fpm$6B!Pba?AP<86 zjS{`d#B2en4$S{gEx_F^h#xa)P|>M{L{ z36tgP84{f>XEG9wE|fT^H9qi4wwgJ0(e!r0m`#L2pjM2((oRgj0kPLH2~25D@n#Tp z?D8q|fAU%p{C4=1s^VvM^38)2=RzZm+?`a>S}kL*suGq{T@6r04_sjvbCW5lnfg^a z#(}-3Ci6&ObYLHZLgilA)(|u*gWU zy6(v2$$fc>yIk7aM_x>Q@!?$?W_ZR&>Z{*P)sk3Y>U$7WHT|4hrTi8;w#-i`k3Uo0 z8yA`K3#`YWOTj(~F3-Lf<_^38L^L|djSoF?5*7HicL(88{xZRCx zY^&{?-BzaTB{zdZECd0~Y7JjLc?YK4&DQ(u3GR_k{Ku+zvEZL12kGv6l+d=yb9(Uy N%+=9@Bq0Qg{{vV@A5#DT literal 0 HcmV?d00001 diff --git a/mobile/res/layout/activity_main.xml b/mobile/res/layout/activity_main.xml index 9abfe63c..3eef9813 100644 --- a/mobile/res/layout/activity_main.xml +++ b/mobile/res/layout/activity_main.xml @@ -1,7 +1,7 @@ + android:orientation="vertical"> - - - - - - + + + + +

+ + + + + + + + + + + - - + + + android:title="@string/action_settings"> + + + + + + + + + + + - - \ No newline at end of file diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 0c8cdd72..8cb7e05d 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -3,7 +3,6 @@ IITC mobile Settings - Info Reload IITC Print Version Clear Cache @@ -46,5 +45,12 @@ If enabled, all IITC sources will be loaded from external storage of the Android device. Please copy all sources from $IITC_folder/build/mobile/ to /sdcard/IITC_Mobile/dev/. IITC source - + + Chat + Map + Full + Compact + Public + Faction + Info \ No newline at end of file diff --git a/mobile/smartphone.css b/mobile/smartphone.css index 804f6a29..a1f89fdd 100644 --- a/mobile/smartphone.css +++ b/mobile/smartphone.css @@ -30,6 +30,7 @@ body { #chatcontrols { height: 38px; width: 100%; + display: hidden; } /* hide shrink button */ @@ -52,7 +53,6 @@ body { #chat { left:0; right:0; - top:37px !important; bottom:30px; width: auto; } @@ -74,7 +74,6 @@ body { } #scrollwrapper { - top: 36px; bottom: 0; max-height: none !important; width: 100% !important; diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 8227eeef..9a598aa1 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 com.cradle.iitc_mobile.R; - import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -14,6 +13,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.StrictMode; import android.preference.PreferenceManager; +import android.app.ActionBar; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -40,16 +40,23 @@ public class IITC_Mobile extends Activity { private LocationListener loc_listener = null; private boolean keyboad_open = false; private boolean fullscreen_mode = false; + private ActionBar actionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // TODO build an async task for url.openStream() in IITC_WebViewClient StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); - setContentView(R.layout.activity_main); + setContentView(R.layout.activity_main); iitc_view = (IITC_WebView) findViewById(R.id.iitc_webview); + 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); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); listener = new OnSharedPreferenceChangeListener() { @Override @@ -193,7 +200,7 @@ public class IITC_Mobile extends Activity { // leave fullscreen mode if it is enabled if (fullscreen_mode) { // get back action bar - this.getActionBar().show(); + actionBar.show(); // show notification bar again WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; @@ -223,7 +230,7 @@ public class IITC_Mobile extends Activity { public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); - this.getActionBar().setHomeButtonEnabled(true); + return true; } @@ -233,9 +240,15 @@ public class IITC_Mobile extends Activity { switch (item.getItemId()) { case android.R.id.home: iitc_view.loadUrl("javascript: window.smartphone.mapButton.click();"); + actionBar.setTitle(getString(R.string.menu_map)); + return true; + case R.id.menu_map: + iitc_view.loadUrl("javascript: window.smartphone.mapButton.click();"); + actionBar.setTitle(getString(R.string.menu_map)); return true; case R.id.reload_button: this.loadUrl(intel_url); + actionBar.setTitle(getString(R.string.menu_map)); return true; // clear cache case R.id.cache_clear: @@ -269,15 +282,33 @@ public class IITC_Mobile extends Activity { // get the users current location and focus it on map case R.id.locate: iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 13});"); + actionBar.setTitle(getString(R.string.menu_map)); return true; // start settings activity - case R.id.settings: + case R.id.action_settings: Intent intent = new Intent(this, IITC_Settings.class); intent.putExtra("iitc_version", iitc_view.getWebViewClient().getIITCVersion()); startActivity(intent); return true; - case R.id.info: + case R.id.menu_info: iitc_view.loadUrl("javascript: window.smartphone.sideButton.click();"); + actionBar.setTitle(getString(R.string.menu_info)); + return true; + case R.id.menu_full: + iitc_view.loadUrl("javascript: window.chat.choose('full');"); + actionBar.setTitle(getString(R.string.menu_full)); + return true; + case R.id.menu_compact: + iitc_view.loadUrl("javascript: window.chat.choose('compact');"); + actionBar.setTitle(getString(R.string.menu_compact)); + return true; + case R.id.menu_public: + iitc_view.loadUrl("javascript: window.chat.choose('public');"); + actionBar.setTitle(getString(R.string.menu_public)); + return true; + case R.id.menu_faction: + iitc_view.loadUrl("javascript: window.chat.choose('faction');"); + actionBar.setTitle(getString(R.string.menu_faction)); return true; default: return super.onOptionsItemSelected(item); From d064e17c06053c62634921e45f8e27b5ef27c7e4 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Mon, 6 May 2013 22:55:16 +1000 Subject: [PATCH 10/28] Fixed a focus bug with locate button and added Exit menu option. --- mobile/res/menu/main.xml | 10 ++++++++-- mobile/res/values/strings.xml | 1 + mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index 6df399c1..20de94d0 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -85,11 +85,17 @@ - + + + \ No newline at end of file diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 8cb7e05d..8fd875cd 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -53,4 +53,5 @@ Public Faction Info + Exit \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 9a598aa1..f34e1fab 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -281,6 +281,7 @@ public class IITC_Mobile extends Activity { return true; // get the users current location and focus it on map case R.id.locate: + iitc_view.loadUrl("javascript: window.smartphone.mapButton.click();"); iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 13});"); actionBar.setTitle(getString(R.string.menu_map)); return true; @@ -310,6 +311,9 @@ public class IITC_Mobile extends Activity { iitc_view.loadUrl("javascript: window.chat.choose('faction');"); actionBar.setTitle(getString(R.string.menu_faction)); return true; + case R.id.menu_exit: + super.onBackPressed(); + return true; default: return super.onOptionsItemSelected(item); } From 7248b17ea8f264554b1145bc1e3e542bc349d38a Mon Sep 17 00:00:00 2001 From: Jon Atkins Date: Mon, 6 May 2013 23:08:44 +0100 Subject: [PATCH 11/28] refresh improvements - cancel existing refrest timer on start zoom/drag - add a manual refresh option into the status box when idle --- code/boot.js | 4 ++-- code/request_handling.js | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/boot.js b/code/boot.js index c08acf8b..69f89549 100644 --- a/code/boot.js +++ b/code/boot.js @@ -236,8 +236,8 @@ window.setupMap = function() { map.on('moveend zoomend', function() { window.mapRunsUserAction = false }); // update map hooks - map.on('movestart zoomstart', window.requests.abort); - map.on('moveend zoomend', function() { console.log('map moveend'); window.startRefreshTimeout(ON_MOVE_REFRESH*1000) }); + map.on('movestart zoomstart', function() { window.requests.abort(); window.startRefreshTimeout(-1); }); + map.on('moveend zoomend', function() { window.startRefreshTimeout(ON_MOVE_REFRESH*1000) }); window.addResumeFunction(window.requestData); window.requests.addRefreshFunction(window.requestData); diff --git a/code/request_handling.js b/code/request_handling.js index 84617d54..8b6c3ce7 100644 --- a/code/request_handling.js +++ b/code/request_handling.js @@ -38,6 +38,7 @@ window.requests.abort = function() { // gives user feedback about pending operations. Draws current status // to website. Updates info in layer chooser. window.renderUpdateStatus = function() { + var t = 'map status: '; if(mapRunsUserAction) t += 'paused during interaction'; @@ -48,7 +49,7 @@ window.renderUpdateStatus = function() { else if(window.requests._quickRefreshPending) t += 'refreshing...'; else - t += 'Up to date.'; + t += 'Up to date. '; if(renderLimitReached()) t += ' RENDER LIMIT ' @@ -82,6 +83,8 @@ window.startRefreshTimeout = function(override) { // status bar window.renderUpdateStatus(); if(refreshTimeout) clearTimeout(refreshTimeout); + if(override == -1) return; //don't set a new timeout + var t = 0; if(override) { window.requests._quickRefreshPending = true; From e34fd27e9ef2d3165505a21f8f6bfbeb5b086390 Mon Sep 17 00:00:00 2001 From: Riccardo Binetti Date: Tue, 7 May 2013 01:05:19 +0200 Subject: [PATCH 12/28] Added focus link in the toolbox. Some renaming. Removed div to use sidebar style. --- plugins/players-resonators.user.js | 39 +++++++++++++++++------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/plugins/players-resonators.user.js b/plugins/players-resonators.user.js index 530430de..7e6186cd 100644 --- a/plugins/players-resonators.user.js +++ b/plugins/players-resonators.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-players-resonators@rbino // @name IITC plugin: Player's Resonators -// @version 0.1.3.@@DATETIMEVERSION@@ +// @version 0.1.4.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -12,12 +12,15 @@ // @match http://www.ingress.com/intel* // ==/UserScript== -// Changelog: -// -// 0.1.3 Effective player name (with wrong capitalization) if it finds some reso -// 0.1.2 Made nickname case insensitive -// 0.1.1 Added mouseover for portal location. Dirty hack to not show mousehover when the alert is fired. -// 0.1.0 First public release +/********************************************************************************************************* +* Changelog: +* +* 0.1.4 Added focus link in the toolbox. Some renaming. Removed div to use sidebar style. +* 0.1.3 Effective player name (with wrong capitalization) if it finds some reso +* 0.1.2 Made nickname case insensitive +* 0.1.1 Added mouseover for portal location. Dirty hack to not show mousehover when the alert is fired. +* 0.1.0 First public release +*********************************************************************************************************/ function wrapper() { // ensure plugin framework is there, even if iitc is not yet loaded @@ -32,30 +35,31 @@ window.plugin.playersResonators = function() {}; window.plugin.playersResonators.findReso = function(playername) { var s = ""; var portalSet = {}; - var effectiveName = ""; - var nickFind = playername.toLowerCase(); + var effectiveNick = ""; + // Assuming there can be no agents with same nick with different lower/uppercase + var nickToFind = playername.toLowerCase(); $.each(window.portals, function(ind, portal){ var r = portal.options.details.resonatorArray.resonators; $.each(r, function(ind, reso) { if (!reso) return true; var nick = getPlayerName(reso.ownerGuid); - if (nick.toLowerCase() === nickFind){ - if (!effectiveName) { - effectiveName = nick; + if (nick.toLowerCase() === nickToFind){ + if (!effectiveNick) { + effectiveNick = nick; } if (!portalSet.hasOwnProperty(portal.options.guid)){ portalSet[portal.options.guid] = true; console.log(portalSet); var latlng = [portal.options.details.locationE6.latE6/1E6, portal.options.details.locationE6.lngE6/1E6].join(); var guid = portal.options.guid; - var jsDoubleClick = 'window.zoomToAndShowPortal(\''+guid+'\', ['+latlng+']);return false'; + var zoomPortal = 'window.zoomToAndShowPortal(\''+guid+'\', ['+latlng+']);return false'; var perma = '/intel?latE6='+portal.options.details.locationE6.latE6+'&lngE6='+portal.options.details.locationE6.lngE6+'&z=17&pguid='+guid; var a = $('',{ "class": 'help', text: portal.options.details.portalV2.descriptiveText.TITLE, title: portal.options.details.portalV2.descriptiveText.ADDRESS, href: perma, - onClick: jsDoubleClick + onClick: zoomPortal })[0].outerHTML; s += a + "\n"; } @@ -63,18 +67,19 @@ window.plugin.playersResonators.findReso = function(playername) { }); }); if (s) { - fakeLinkPlayer = '' + effectiveName + '' + // Showing the playername as a "fake" link to avoid the auto-mouseover effect on the first portal + fakeLinkPlayer = '' + effectiveNick + '' s = fakeLinkPlayer + " has resonators on these portals:\n\n" + s; } else { - fakeLinkPlayer = '' + playername + '' s = fakeLinkPlayer + " has no resonators in this range\n"; } alert(s); } var setup = function() { - var content = '
' + ''; + var content = ''; $('#sidebar').append(content); + $('#toolbox').append(' Player\'s Reso'); $("#playerReso").keypress(function(e) { if((e.keyCode ? e.keyCode : e.which) !== 13) return; var data = $(this).val(); From 8eb65c57641df56f76e705a14d13cd78c4bea2b6 Mon Sep 17 00:00:00 2001 From: Riccardo Binetti Date: Tue, 7 May 2013 01:18:08 +0200 Subject: [PATCH 13/28] Fixed wrong name if no reso found --- plugins/players-resonators.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/players-resonators.user.js b/plugins/players-resonators.user.js index 7e6186cd..28c03791 100644 --- a/plugins/players-resonators.user.js +++ b/plugins/players-resonators.user.js @@ -71,7 +71,7 @@ window.plugin.playersResonators.findReso = function(playername) { fakeLinkPlayer = '' + effectiveNick + '' s = fakeLinkPlayer + " has resonators on these portals:\n\n" + s; } else { - s = fakeLinkPlayer + " has no resonators in this range\n"; + s = playername + " has no resonators in this range\n"; } alert(s); } From d97b78fafb4899c62b445c158eb58508ce52a1c4 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 12:34:23 +1000 Subject: [PATCH 14/28] Removed various drawables and fixed chat scroll bug. --- .../drawable-hdpi/device_access_location_off.png | Bin 1791 -> 0 bytes .../device_access_location_searching.png | Bin 1627 -> 0 bytes .../drawable-mdpi/device_access_location_off.png | Bin 1383 -> 0 bytes .../device_access_location_searching.png | Bin 1312 -> 0 bytes mobile/res/drawable-xhdpi/action_help.png | Bin 1793 -> 0 bytes .../device_access_location_off.png | Bin 2220 -> 0 bytes .../device_access_location_searching.png | Bin 1977 -> 0 bytes mobile/smartphone.css | 1 + 8 files changed, 1 insertion(+) delete mode 100644 mobile/res/drawable-hdpi/device_access_location_off.png delete mode 100644 mobile/res/drawable-hdpi/device_access_location_searching.png delete mode 100644 mobile/res/drawable-mdpi/device_access_location_off.png delete mode 100644 mobile/res/drawable-mdpi/device_access_location_searching.png delete mode 100644 mobile/res/drawable-xhdpi/action_help.png delete mode 100644 mobile/res/drawable-xhdpi/device_access_location_off.png delete mode 100644 mobile/res/drawable-xhdpi/device_access_location_searching.png diff --git a/mobile/res/drawable-hdpi/device_access_location_off.png b/mobile/res/drawable-hdpi/device_access_location_off.png deleted file mode 100644 index cff8a1817ce8963d15df36a11340daeaeda00dd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1791 zcmaJ?c~BEq91fRYs;Cu|qm?BfUL?C410j(JxsVhB8W3SbhL9{K!tTaoApr&rs8FAVKA85g8&^rmeq@ z_){oWp6bYGB3c^CRp2N?ZpJVSsD@-yDESPJ+XxTFAz5OTnPCSy9Tfk*qG%O&?_Ge`qIK!_wB z?Vq5crON>!u0;SJ21HjtzA)g+V!$kj!{T@YObCWRmT^dHn4RlQBF|Hs&bPBCn zL#S~KFe}Ov@DzeaBP0DM1yu7%7Snw!6In3OAlHB}12U&H4wOp&ABv)%&^khfe2(`& zg>{i>8U&OfIy^ zf37?lFmm3t*rdy4MR49&U<$I^8mjk>^aE4b`V#);Q4!qPwT?F4;~-TYUcH}sd@bqT()Fev@l zpL=BD)tmZU2WJ%^zU!;cNeX%{?aT@7Y#d2^*ic)TbK}{mCtasP`qCy_TU(~q7*FP! z-fc=MvFQMI!g;`F1mcw<}ttpk+Cji^1 zwr=kZ*+Tb(QI?a%GUxa7_-$_+i+9rot>dy+PqYRCGE@0Z2I=F~?@R{xOV zoR?owyv1vvJC?%Khrm;O*@4DO<0$49$7osZZN6TD=fu8?tw1-6Y~l-FMcV zUSlz%NsxE;{9e6nYw~D&ckWPYsvVCK{=62_SUi}NQBG942TA z->UbFZ*GgJPQ!e$uWQTzl z^#z5c$5WO~i(k?w@Hi*iI{o?S<_r0#DYNY7Yh`0oB0A@=8E?;|N2$Af7Yz($I=nkL zWBl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;)!fzDz|h>($-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OVZUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1? zG!Lpb1-DzwaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z);J~H$iTpK*3-o? zq~g|_nf4jMfg^Po#?G0ewT*3&%f{rT-p-=AJjd?0>I(++2)sCjf%j#ozK6YtNcE%deVvz zt+*-f?cyH=xjR^MN*VV#-`;)HG*GPkNYxdk4Z$&j;;!i;${*Zo#P_?XcD+BqZ>P=C z>BI7^OZm}?8*00bhJFlva&*(#qe9cXI43_&KeEEY?O(pQYTbJ^rPYs`PjpQ;-M>BL zfM#Lv9ETHK5kjrAuDldvKgzIsa$!x}9nt(~%?E8KI%F;WIPFo2^(tMo#ea_2bHNai z??-Yn_G?W_}n~?IW}q1oO&&}$QuWHded*rN#RXrziF`BxAE7pYcmArZ?t_A zbUMF^(aAG4N;b6#GgcoF=sRy|aq#&D+apoeSY@8I#4_DpoOOLo;R!e0l)nEd zzN(cDOHTaX#LSqQGyD4ki=;_5Pp-OY?w;7dS=d>m;8-{7QpMRs*4@WA?ez2>@6mLY z>wdX_X_CuApWOGK-UaAO?eE-o{`&#VFAg>bE0Z5I?NF_fwYqoOdH4BSau@kk6Q0iB zQ>|YY)bf+>9<%)IWpDm{+CP1P!tM*|amyGt*sdx&DHFC#HHw} zs~1j-P3l>__-ytIiEW$pygRSoS;BTREw`65=iKHtW5(Aag|71=ZZ&<*%n@}qJ+SRj z>#}=OKW%%#Z?J#9oBk-4JE1@^!H=pEUc-M;OVTkqNs-}o)v z!FzP2qkE&e)neBLE7^$bEX&h1lgiI9oVWRHh4HS-wjq<`UW&|ow`Uu|1Gx@69A^FEhT?M6BsOS&Dc=5=|~u;xc7ARb6Mw<&;$T}2W|EM diff --git a/mobile/res/drawable-mdpi/device_access_location_off.png b/mobile/res/drawable-mdpi/device_access_location_off.png deleted file mode 100644 index 56eae120b2a91a8dd0940e5848a6e615782d2b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;)!fzDz`)Ja$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yuGi22r(RHE$SnZc?2=lPS(cjOR+OKs0QR(1CN{UY zxVab@Iy>Vu52`l>r&|nMaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zK4mX9 zoq>Vzrl*TzNX4x;)9rPb17(i?*68MXwke`zf{E#iR;jG3y%!e3%L6ZNT$xS zzQBL&purAC@du6BdllH&4yxW@DEA6m%FK1-py`Q5Lj|1@mg_}VdRN~Fv)se~rVZZb&~Y<@GRdU77u#GXIFlix6GX%_w9Ide{ap>9G^Qq#-T ztF1P$v_&KwdT`MxeR{k8=SaDI=?m4re>3Qtbx`!iw&Df6B@Oxgv!?!0T)*XOptry& z9!o~a?yV*oO{_sn&a9cfu(#`ZNH^o$t3JjjpC6d@a_jb>Z)si3XSXS7EnAp2p|`1W z{iT4d0;P?b_FNa|Pk$6O`=a6Vsk1IxlunsFQT%Ph2HAd#%;S0bDv77&y((1PxNFke z4H;*fg7&^|QGLg6WqYSPy0B66c}2&u`os0_53FZkX87PBuQ1Q=l_;p_^K|udS?83{ F1OP0q^@;!h diff --git a/mobile/res/drawable-mdpi/device_access_location_searching.png b/mobile/res/drawable-mdpi/device_access_location_searching.png deleted file mode 100644 index 4f4fb081e0986f4670deeebb6fb939043423499a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi;&A`CY$jQvq$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1POzUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1= zG!Lpb1-DyFaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zb_(je$-uxk$HGDa14WKkuk;i?qnfD`bg|Vjeo@=GU4~L?wniVlb<#dz(=CtPk=cS5xtd*g z&Il!H%{%YCZxY|t^82+{&0l!hojhIrd|q``ea-omA8YNWF6mt=v@MXSQ20i3)*ObH zGdOh)dk1M7Fv@>enyzjvxPD=yQO*ISGfn~zB=a8foco&hfb&VBeAojvy$6o>pDpC@ zF5qM@NEbErIM5^%<1Bmaz?Tn(zrv>HpH$m+_6hfeCgl?mKhmGvzI0>Xzr<*PJCl-U zwCPrCzO#;J&WpC3*Bh*I9VOo_%-9)vw?ZoV-E;9WUhNCl8oRT6d)FSh*tmyjXH>AE zkBI7>)+QD;?tVidj$`Lu%Jd!dusMvLYTnShO4bthIQ?Y+ImVXgO9sR`YNm3~^0 zrIyV5uAJ$f*dV^FBhkBN)#nG6esKXj&!avlyBKen*&^_Fr--|*8?WvEu%2sAlVf|> z0{ePTeO%>j*>`(F%GY<961<-4r@aYSw3T^o;`bKWUjN;Gb{*?>tkr&=llJBQhx_Uu bbPq7pnR#F1tm66uDziLY{an^LB{Ts5)}Gl{ diff --git a/mobile/res/drawable-xhdpi/action_help.png b/mobile/res/drawable-xhdpi/action_help.png deleted file mode 100644 index 243704869415096feda6d981bf0588d5e2aaf807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 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

ba? znxypT@A3XmVbZV`M@4#+#7YSx-ME4%pDP?z5hy}ogaN~fC#slUgi#n-gyDcHGeHOf zI>czU`Yf*)Ivt#9B`L&eL{rsr9<3oXn@zAvlcZ6J!37CQaS8}(K&b?jY9vaPA|(M# zk|@Cmt{O9zT2L!B!8QHPl}yU@4TA-zJ*!c|yaqL;5SRscl{9RgJQi?Ly>YH-@>rlr zxgt6kk*~G?)#?coJwLwV>%pZjuSXxX((_KxgWdIV*vVk9<5JZMgT3cou1;&nnAx!a zi?+1BU3qR=JrtO5l;760JMRe#3Eu;7Hhko)KBU>)+g_AmV2>;gIu_f*7fO1jRP5MO zbI7zl_C<9--1+X30(jH2d3_t3BfLA;c}M#z>g?xw$p^M?eaoGd+Smr|sKTxq)!vDmHsd)b^Jdzj>efxIf$Vr?=i~V&J68TOb;KzG z27(9u5Gb7MQ6#$>ZfoDZ@Iy3bH^-=t$XB|Z`<+vOOTS);bHA@#*B;cm9seY~t^xg( z|HL?>5+6Rg&s%jgp)d8eaz*441OkbY?mW4bk)^YcK< z`J86!&aaPD6wWd(k;g=+S}FBB+?BrhQr*C*TNjU9uLT!3?S0F;MeA&j8qf@k9OSa* za6GKgbrFBNyC*l!&v7+rRm61r4bGW4m*dKUv!~rDb_VuvJc3=1Bkm9V;p=yXLK-_q z^q!`w@}R4$S0pBj1i{u^uI5)I4a$jXRwC{KZU%JbGNWAOXoT@++=7`BL0FpIi z_k>bY5mm!<=J!C`nCp7F;Ken0U~YX#dbRiQg#rW1Z|}7$iScdv?b}mbr~Jos9p2A? zALlM9Ihql9pkMDH*iYX)Tc2WU>d3Dt&vQm^jm__dwi>?wZhlE`*fRc$_4B?f{0IB* ztRQ3f^uWmRl!5S2d&eP?NR-MQHho2p`0Hg9|H&h*Z=eq=w{0|YA;w*0kg zVAIv=(L6;~T4&JA@SIw>iv2IeLBH^gRFJsFA#;(VO{0))V?Ed0PnJ+tv}qw;lJM zsoaCL!I}E6E}kgAH0-8wjXSwx53#Ic7nknPk@YdB+0938M |7QRm!woyI*hWtM8 z&if2K@Fw5U`9&EJx#VyRG+%!^xvHU&TxNPX>jzJq&>bKQw)zJSO({JyV`s{&u9&su z+qyo1z1-)Yc7N!$u#=U{&r5$AJQQ#javyy3&F!q9H9XGC;}zg+F7C8{c|p#Ujj!eL bXW5|)vLfl@9nt$uzMpBTCQaR<%-`@IemDQ2 diff --git a/mobile/smartphone.css b/mobile/smartphone.css index a1f89fdd..28fc34aa 100644 --- a/mobile/smartphone.css +++ b/mobile/smartphone.css @@ -53,6 +53,7 @@ body { #chat { left:0; right:0; + top: 1px !important; bottom:30px; width: auto; } From 0f1c22cdc1cec4b5065e465a6bc01cc109849656 Mon Sep 17 00:00:00 2001 From: Jon Atkins Date: Tue, 7 May 2013 04:53:27 +0100 Subject: [PATCH 15/28] remove range circles when closing portal details --- code/portal_detail_display.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/portal_detail_display.js b/code/portal_detail_display.js index 205b80c5..0f02d879 100644 --- a/code/portal_detail_display.js +++ b/code/portal_detail_display.js @@ -95,9 +95,16 @@ window.setPortalIndicators = function(d) { ).addTo(map); else portalAccessIndicator.setLatLng(coord); - } +window.clearPortalIndicators = function() { + if(portalRangeIndicator) map.removeLayer(portalRangeIndicator); + portalRangeIndicator = null; + if(portalAccessIndicator) map.removeLayer(portalAccessIndicator); + portalAccessIndicator = null; +} + + // highlights portal with given GUID. Automatically clears highlights // on old selection. Returns false if the selected portal changed. // Returns true if it’s still the same portal that just needs an @@ -123,4 +130,5 @@ window.unselectOldPortal = function() { if(oldPortal) portalResetColor(oldPortal); selectedPortal = null; $('#portaldetails').html(''); + clearPortalIndicators(); } From 0108d1b49c44d05a63b6ae759b32e0d7bfd45136 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 14:09:30 +1000 Subject: [PATCH 16/28] Added debug menu option and started tidying up 'window' handling --- code/chat.js | 7 ++-- code/debugging.js | 17 +++++++--- code/smartphone.js | 8 ----- code/window_management.js | 30 ++++++++++++++++++ .../alerts_and_states_warning.png | Bin 0 -> 1618 bytes .../alerts_and_states_warning.png | Bin 0 -> 1362 bytes mobile/res/drawable-xhdpi/action_settings.png | Bin 0 -> 1641 bytes .../alerts_and_states_warning.png | Bin 0 -> 1813 bytes mobile/res/menu/main.xml | 7 ++-- mobile/res/values/strings.xml | 2 +- .../com/cradle/iitc_mobile/IITC_Mobile.java | 21 ++++++------ 11 files changed, 62 insertions(+), 30 deletions(-) create mode 100644 code/window_management.js create mode 100644 mobile/res/drawable-hdpi/alerts_and_states_warning.png create mode 100644 mobile/res/drawable-mdpi/alerts_and_states_warning.png create mode 100644 mobile/res/drawable-xhdpi/action_settings.png create mode 100644 mobile/res/drawable-xhdpi/alerts_and_states_warning.png diff --git a/code/chat.js b/code/chat.js index cf10a99d..7f0a2c64 100644 --- a/code/chat.js +++ b/code/chat.js @@ -522,10 +522,11 @@ window.chat.chooseAnchor = function(t) { chat.needMoreMessages(); } -window.chat.choose = function(name) { - $('#chat, #chatinput, #updatestatus').show(); +window.chat.show = function(name) { + if (!window.isSmartphone) $('#updatestatus').show(); + $('#chat, #chatinput').show(); $('#map').css('visibility', 'hidden'); - + var t = $(''+name+''); window.chat.chooseAnchor(t); } diff --git a/code/debugging.js b/code/debugging.js index 8c40a155..49091d72 100644 --- a/code/debugging.js +++ b/code/debugging.js @@ -48,16 +48,23 @@ window.debug.console = function() { $('#debugconsole').text(); } -window.debug.console.create = function() { - if($('#debugconsole').length) return; - $('#chatcontrols').append('debug'); - $('#chatcontrols a:last').click(function() { +window.debug.console.show = function() { + $('#scrollwrapper, #updatestatus').hide(); + // not displaying the map causes bugs in Leaflet + $('#map').css('visibility', 'hidden'); + $('#chat, #chatinput').show(); + window.debug.console.create(); $('#chatinput mark').css('cssText', 'color: #bbb !important').text('debug:'); $('#chat > div').hide(); $('#debugconsole').show(); $('#chatcontrols .active').removeClass('active'); $(this).addClass('active'); - }); +} + +window.debug.console.create = function() { + if($('#debugconsole').length) return; + $('#chatcontrols').append('debug'); + $('#chatcontrols a:last').click(window.debug.console.show); $('#chat').append('

'); } diff --git a/code/smartphone.js b/code/smartphone.js index 5a1700ed..c6693c1c 100644 --- a/code/smartphone.js +++ b/code/smartphone.js @@ -34,14 +34,6 @@ window.runOnSmartphonesBeforeBoot = function() { + ''); } - // this also matches the expand button, but it is hidden via CSS - $('#chatcontrols a').click(function() { - $('#scrollwrapper, #updatestatus').hide(); - // not displaying the map causes bugs in Leaflet - $('#map').css('visibility', 'hidden'); - $('#chat, #chatinput').show(); - }); - window.smartphone.mapButton = $('map').click(function() { $('#chat, #chatinput, #scrollwrapper').hide(); $('#map').css('visibility', 'visible'); diff --git a/code/window_management.js b/code/window_management.js new file mode 100644 index 00000000..2927aa4f --- /dev/null +++ b/code/window_management.js @@ -0,0 +1,30 @@ +// created to start cleaning up "window" interaction +// +window.show = function(id) { + switch(id) { + case 'full': + window.chat.show('full'); + break; + case 'compact': + window.chat.show('compact'); + break; + case 'public': + window.chat.show('public'); + break; + case 'faction': + window.chat.show('faction'); + break; + case 'debug': + window.debug.console.show(); + break; + case 'map': + window.smartphone.mapButton.click(); + break; + case 'info': + window.smartphone.sideButton.click(); + break; + default: + window.smartphone.mapButton.Click(); + break; + } +} diff --git a/mobile/res/drawable-hdpi/alerts_and_states_warning.png b/mobile/res/drawable-hdpi/alerts_and_states_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..1fefdd8bd8a8c674bd81ffb2bca82ae9acb6673b GIT binary patch literal 1618 zcmaJYsQ9`mnfX%L(4Fsk?B;}P# zt5fR~wD_W+wU(;j+mWQ>XjPyp>QsCXTOFqrB~u;IVznCt><{hE+`adHbI$o5_c+p1 z7fs^L-~j+IDLF}#!S1Mc1#sDa7Ux+lyG>`b+00ThpDEMRIG{9=c{rF%=nL=+TyHF2 za~6*WfC;lrnb}OXZi(DL60qKjfo%lEvH>7|fsN7|ig5}1(YSx zp*l*97n+hPXnbi!YNny0*dQ}P3lhM1o17IOa7GW>h!V3!Zc{)bx^njH4I>aZ0%3|3 z(5s@db?Km*q;XIJqp=25ih)uwjEPa1ST+w7q8N%`LIjPA#Zb8DOp+`an__w)$&i*pk^JXpB*2lT<)$~*A{J>-q3W%Aqg>+~YZ>9H-^xYU zVi51s{^zO3Lacwh$8qDbmvQUkX4daCYwS%mU$p`N=Tx#rnQ7}AXhmboz-Rza6~1PJ8slEs#Apm}j^1 zpqAq~y{8J?vZ{BtENR_X!V`HuEh!Za#)}4rd$y&7)%2`_Lj+FVKF(f1uzfFQB~|$g zqKpm|s1~Mn*@ui$WPW+KQ|XC_xIH-Np8AyNOJAM(u-!LNxuyQEn_KHD4eq&y+}goC z^_5!B(E$+^8MH_~=qYb_xv7HN>YCt5yW@Y29|jzD-WT%1I0CotKM8F?_B3});im3t z*zTz6ng5)$TNg_v)Vf4eoh!zE2)=U7IIqtAVj|zU{y@Ny?#aY~N1aZ=+`uOPs86zX zxrgz0C|-R225yA@_PwuLD!#8@KRG8W>?Akgv5>3TrQlNF!TTx0J9q!Ew%=CLT)^3! zn<8rNcuKTqasG^Op>ysD9z;1pr+KOa8vM_=p1^&-=7&Gh1{SUr)bN}6*NcMZ<~GXu z<3MM@$LF;Z8+=8%f|gYm?#kLq_IIB>;dkW5hsStLdzkWvbEJKx=D=&Rwyh7Ux_Zxq zJZtWly3KfK;#A)$^hc}DtDQdZ%SqK;8#_W%VkG-q#MxQB9J4)qAZhdcfXaTTefF(L z+`l)7cYD24y^(WT_P3hXc;@c@H4gvqTK~rAcynvckB>zMKU@AZFQ!g$Y(r6B(DdlY zOFjEm40qgZJg3U*q@};_3_1OcquscUPo&Cty)9o#hoc^Dzw~VL9k^}h%SF9KpC9Uf z?`Y17psvc}D+_g`{PFOvX=h&Gl;szX@@JyoY(ha z7mPha%Mrnjs?_j=;R}}?mDZUjhl;=0>d3%nUA3-Ey76t3kD;ctNv;j@WO=yHV}HwU n^W^zu`z%`IzHgoi(2{R{xf+Eh)OD%bumGAd+p literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-mdpi/alerts_and_states_warning.png b/mobile/res/drawable-mdpi/alerts_and_states_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..a39f97d4ae7cb75ea89dd4f0b747cf285174bde1 GIT binary patch literal 1362 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViq$=TJ&!pY3k$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1POzUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1= zG!Lpb1-DyFaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z{{3gSF#`kR5l9ku9 zT7rXLUX~1=zr8`pg4I@jqwO)V=c)<^?X+vW^o=EMKe%y$>72vKPq#Q{Tg3RspB6ga zCNzQddP2^}?z8IbWuAR@n|m$IUhi66Su^Qwv-F3z1rt^-J6SS&M(78gd1-2m2#f0elF{r5}E+$0qRl! literal 0 HcmV?d00001 diff --git a/mobile/res/drawable-xhdpi/action_settings.png b/mobile/res/drawable-xhdpi/action_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..09b01483454788c435acf715c57d92fc0ead0a7c GIT binary patch literal 1641 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 + android:title="@string/menu_debug"> diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 8fd875cd..3e4f40a2 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -53,5 +53,5 @@ Public Faction Info - Exit + Debug \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index f34e1fab..a08acf7b 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -239,11 +239,11 @@ public class IITC_Mobile extends Activity { // Handle item selection switch (item.getItemId()) { case android.R.id.home: - iitc_view.loadUrl("javascript: window.smartphone.mapButton.click();"); + 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.smartphone.mapButton.click();"); + iitc_view.loadUrl("javascript: window.show('map');"); actionBar.setTitle(getString(R.string.menu_map)); return true; case R.id.reload_button: @@ -281,7 +281,7 @@ public class IITC_Mobile extends Activity { return true; // get the users current location and focus it on map case R.id.locate: - iitc_view.loadUrl("javascript: window.smartphone.mapButton.click();"); + iitc_view.loadUrl("javascript: window.show('map');"); iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 13});"); actionBar.setTitle(getString(R.string.menu_map)); return true; @@ -292,27 +292,28 @@ public class IITC_Mobile extends Activity { startActivity(intent); return true; case R.id.menu_info: - iitc_view.loadUrl("javascript: window.smartphone.sideButton.click();"); + iitc_view.loadUrl("javascript: window.show('info');"); actionBar.setTitle(getString(R.string.menu_info)); return true; case R.id.menu_full: - iitc_view.loadUrl("javascript: window.chat.choose('full');"); + iitc_view.loadUrl("javascript: window.show('full');"); actionBar.setTitle(getString(R.string.menu_full)); return true; case R.id.menu_compact: - iitc_view.loadUrl("javascript: window.chat.choose('compact');"); + iitc_view.loadUrl("javascript: window.show('compact');"); actionBar.setTitle(getString(R.string.menu_compact)); return true; case R.id.menu_public: - iitc_view.loadUrl("javascript: window.chat.choose('public');"); + iitc_view.loadUrl("javascript: window.show('public');"); actionBar.setTitle(getString(R.string.menu_public)); return true; case R.id.menu_faction: - iitc_view.loadUrl("javascript: window.chat.choose('faction');"); + iitc_view.loadUrl("javascript: window.show('faction');"); actionBar.setTitle(getString(R.string.menu_faction)); return true; - case R.id.menu_exit: - super.onBackPressed(); + case R.id.menu_debug: + iitc_view.loadUrl("javascript: window.show('debug')"); + actionBar.setTitle(getString(R.string.menu_debug)); return true; default: return super.onOptionsItemSelected(item); From 1a701e5a325c36f65e0aacc9e25c58758b68848c Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 15:21:05 +1000 Subject: [PATCH 17/28] Further bugfixes related to chat/debug. --- code/chat.js | 2 +- code/debugging.js | 2 +- code/smartphone.js | 7 +++---- code/window_management.js | 2 +- mobile/smartphone.css | 9 ++++++++- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 2 +- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/code/chat.js b/code/chat.js index 7f0a2c64..8ce22b2c 100644 --- a/code/chat.js +++ b/code/chat.js @@ -480,7 +480,7 @@ window.chat.chooseAnchor = function(t) { var input = $('#chatinput input'); $('#chatcontrols .active').removeClass('active'); - t.addClass('active'); + $("#chatcontrols a:contains('" + tt + "')").addClass('active'); $('#chat > div').hide(); diff --git a/code/debugging.js b/code/debugging.js index 49091d72..7ddaa5de 100644 --- a/code/debugging.js +++ b/code/debugging.js @@ -58,7 +58,7 @@ window.debug.console.show = function() { $('#chat > div').hide(); $('#debugconsole').show(); $('#chatcontrols .active').removeClass('active'); - $(this).addClass('active'); + $("#chatcontrols a:contains('debug')").addClass('active'); } window.debug.console.create = function() { diff --git a/code/smartphone.js b/code/smartphone.js index c6693c1c..cdbabc4f 100644 --- a/code/smartphone.js +++ b/code/smartphone.js @@ -38,8 +38,8 @@ window.runOnSmartphonesBeforeBoot = function() { $('#chat, #chatinput, #scrollwrapper').hide(); $('#map').css('visibility', 'visible'); $('#updatestatus').show(); - $('.active').removeClass('active'); - $(this).addClass('active'); + $('#chatcontrols a .active').removeClass('active'); + $("#chatcontrols a:contains('map')").addClass('active'); }); window.smartphone.sideButton = $('info').click(function() { @@ -47,7 +47,7 @@ window.runOnSmartphonesBeforeBoot = function() { $('#map').css('visibility', 'hidden'); $('#scrollwrapper').show(); $('.active').removeClass('active'); - $(this).addClass('active'); + $("#chatcontrols a:contains('info')").addClass('active'); }); $('#chatcontrols').append(smartphone.mapButton).append(smartphone.sideButton); @@ -72,7 +72,6 @@ window.runOnSmartphonesAfterBoot = function() { if(!isSmartphone()) return; console.warn('running smartphone post boot stuff'); - //chat.toggle(); smartphone.mapButton.click(); // disable img full view diff --git a/code/window_management.js b/code/window_management.js index 2927aa4f..c210961b 100644 --- a/code/window_management.js +++ b/code/window_management.js @@ -24,7 +24,7 @@ window.show = function(id) { window.smartphone.sideButton.click(); break; default: - window.smartphone.mapButton.Click(); + window.smartphone.mapButton.click(); break; } } diff --git a/mobile/smartphone.css b/mobile/smartphone.css index 28fc34aa..97e70ee6 100644 --- a/mobile/smartphone.css +++ b/mobile/smartphone.css @@ -67,8 +67,15 @@ body { width: 77px; } +#chatcontrols a.active { + border-color: #FFCE00; + border-bottom-width:0px; + font-weight:bold +} - +#chatcontrols a.active + a { + border-left-color: #FFCE00 +} #sidebartoggle { display: none !important; diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index a08acf7b..9db2f61c 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -313,7 +313,7 @@ public class IITC_Mobile extends Activity { return true; case R.id.menu_debug: iitc_view.loadUrl("javascript: window.show('debug')"); - actionBar.setTitle(getString(R.string.menu_debug)); + actionBar.setTitle(getString(R.string.menu_debug)); return true; default: return super.onOptionsItemSelected(item); From 822b7df00ae7a4945a55bdcdefae62afe35cb0bd Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 15:40:15 +1000 Subject: [PATCH 18/28] Changed various action items to "ifRoom" so they aren't forced. Will be better on smaller displays. --- mobile/res/menu/main.xml | 74 +++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index 06d7bdb8..390b957b 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -4,21 +4,21 @@ android:id="@+id/menu_map" android:icon="@drawable/location_map" android:orderInCategory="20" - android:showAsAction="always" + android:showAsAction="ifRoom" android:title="@string/menu_map"> + + + + - - - - - - - - - - - - - + + + + \ No newline at end of file From 4f2cb4f6bb6e872a1a0a3be06b193344d25e2bc8 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 15:45:41 +1000 Subject: [PATCH 19/28] Removed Setting for Desktop mode. It's not compatible now. If folks really want to they can still use it via a browser. --- mobile/res/values/strings.xml | 2 -- mobile/res/xml/preferences.xml | 5 ----- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 9 ++------- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 3e4f40a2..7b991044 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -34,8 +34,6 @@ Misc Plugins Available plugins - Force desktop mode - Nice for tablets, looks awful on smartphones Display user location Show users position on map Force https diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index c667e8f0..278cb821 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -12,11 +12,6 @@ - Date: Tue, 7 May 2013 15:59:26 +1000 Subject: [PATCH 20/28] Hide zoom control on mobile version. --- code/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/boot.js b/code/boot.js index 69f89549..6ec417fb 100644 --- a/code/boot.js +++ b/code/boot.js @@ -156,7 +156,7 @@ window.setupMap = function() { window.map = new L.Map('map', $.extend(getPosition(), - {zoomControl: true} + {zoomControl: !window.isSmartphone()} )); var addLayers = {}; From 084494bec00efce006f586e58a903787dd2c4322 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 17:22:07 +1000 Subject: [PATCH 21/28] Zoom control is now only disabled on multitouch capable devices by default and can be forced on again via a preference. --- code/boot.js | 4 +++- mobile/res/values/strings.xml | 2 ++ mobile/res/xml/preferences.xml | 7 ++++++- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 2 -- .../com/cradle/iitc_mobile/IITC_WebViewClient.java | 11 +++++++++++ 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/code/boot.js b/code/boot.js index 6ec417fb..0539fa42 100644 --- a/code/boot.js +++ b/code/boot.js @@ -3,6 +3,8 @@ // created a basic framework. All of these functions should only ever // be run once. +// Used to disable on multitouch devices +window.showZoom = true; window.setupBackButton = function() { var c = window.isSmartphone() @@ -156,7 +158,7 @@ window.setupMap = function() { window.map = new L.Map('map', $.extend(getPosition(), - {zoomControl: !window.isSmartphone()} + {zoomControl: window.showZoom} )); var addLayers = {}; diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 7b991044..b8c76f70 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -34,6 +34,8 @@ Misc Plugins Available plugins + Show zoom control + Shows +/- buttons even on multitouch capable devices. Display user location Show users position on map Force https diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index 278cb821..3e1efe86 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -12,12 +12,17 @@ + - + Date: Tue, 7 May 2013 17:33:26 +1000 Subject: [PATCH 22/28] Fix status div showing above chat. --- code/chat.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/chat.js b/code/chat.js index 8ce22b2c..3f0fd91b 100644 --- a/code/chat.js +++ b/code/chat.js @@ -523,7 +523,9 @@ window.chat.chooseAnchor = function(t) { } window.chat.show = function(name) { - if (!window.isSmartphone) $('#updatestatus').show(); + window.isSmartphone + ? $('#updatestatus').hide() + : $('#updatestatus').show(); $('#chat, #chatinput').show(); $('#map').css('visibility', 'hidden'); From 935e9ab68831665713f25cba4fbac6dda399b750 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 18:15:41 +1000 Subject: [PATCH 23/28] Fixed style overriding css to hide chat control tabs. --- code/chat.js | 2 -- mobile/smartphone.css | 2 +- mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/code/chat.js b/code/chat.js index 3f0fd91b..5cd57996 100644 --- a/code/chat.js +++ b/code/chat.js @@ -518,8 +518,6 @@ window.chat.chooseAnchor = function(t) { elm.scrollTop(elm.data('needsScrollTop')); elm.data('needsScrollTop', null); } - - chat.needMoreMessages(); } window.chat.show = function(name) { diff --git a/mobile/smartphone.css b/mobile/smartphone.css index 97e70ee6..a196e850 100644 --- a/mobile/smartphone.css +++ b/mobile/smartphone.css @@ -30,7 +30,7 @@ body { #chatcontrols { height: 38px; width: 100%; - display: hidden; + display: none !important; } /* hide shrink button */ diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 9aaabd2e..be3b54f7 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -32,7 +32,6 @@ public class IITC_Mobile extends Activity { private IITC_WebView iitc_view; private boolean back_button_pressed = false; - private boolean desktop = false; private OnSharedPreferenceChangeListener listener; private String intel_url = "https://www.ingress.com/intel"; private boolean user_loc = false; @@ -45,7 +44,7 @@ public class IITC_Mobile extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + // TODO build an async task for url.openStream() in IITC_WebViewClient StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); From 4906b57f158f1501b54629ebb0112d47218bf347 Mon Sep 17 00:00:00 2001 From: Jon Benson Date: Tue, 7 May 2013 19:05:50 +1000 Subject: [PATCH 24/28] Hopefully fix whitespace issues. --- code/chat.js | 6 +-- code/debugging.js | 2 +- code/window_management.js | 52 +++++++++---------- mobile/res/values/strings.xml | 2 +- mobile/res/xml/preferences.xml | 8 +-- .../com/cradle/iitc_mobile/IITC_Mobile.java | 50 +++++++++--------- .../iitc_mobile/IITC_WebViewClient.java | 8 +-- 7 files changed, 64 insertions(+), 64 deletions(-) diff --git a/code/chat.js b/code/chat.js index 5cd57996..bfc53859 100644 --- a/code/chat.js +++ b/code/chat.js @@ -521,9 +521,9 @@ window.chat.chooseAnchor = function(t) { } window.chat.show = function(name) { - window.isSmartphone - ? $('#updatestatus').hide() - : $('#updatestatus').show(); + window.isSmartphone + ? $('#updatestatus').hide() + : $('#updatestatus').show(); $('#chat, #chatinput').show(); $('#map').css('visibility', 'hidden'); diff --git a/code/debugging.js b/code/debugging.js index 7ddaa5de..e1d92d56 100644 --- a/code/debugging.js +++ b/code/debugging.js @@ -53,7 +53,7 @@ window.debug.console.show = function() { // not displaying the map causes bugs in Leaflet $('#map').css('visibility', 'hidden'); $('#chat, #chatinput').show(); - window.debug.console.create(); + window.debug.console.create(); $('#chatinput mark').css('cssText', 'color: #bbb !important').text('debug:'); $('#chat > div').hide(); $('#debugconsole').show(); diff --git a/code/window_management.js b/code/window_management.js index c210961b..8da89133 100644 --- a/code/window_management.js +++ b/code/window_management.js @@ -1,30 +1,30 @@ // created to start cleaning up "window" interaction // window.show = function(id) { - switch(id) { - case 'full': - window.chat.show('full'); - break; - case 'compact': - window.chat.show('compact'); - break; - case 'public': - window.chat.show('public'); - break; - case 'faction': - window.chat.show('faction'); - break; - case 'debug': - window.debug.console.show(); - break; - case 'map': - window.smartphone.mapButton.click(); - break; - case 'info': - window.smartphone.sideButton.click(); - break; - default: - window.smartphone.mapButton.click(); - break; - } + switch(id) { + case 'full': + window.chat.show('full'); + break; + case 'compact': + window.chat.show('compact'); + break; + case 'public': + window.chat.show('public'); + break; + case 'faction': + window.chat.show('faction'); + break; + case 'debug': + window.debug.console.show(); + break; + case 'map': + window.smartphone.mapButton.click(); + break; + case 'info': + window.smartphone.sideButton.click(); + break; + default: + window.smartphone.mapButton.click(); + break; + } } diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index b8c76f70..beaddd48 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -45,7 +45,7 @@ If enabled, all IITC sources will be loaded from external storage of the Android device. Please copy all sources from $IITC_folder/build/mobile/ to /sdcard/IITC_Mobile/dev/. IITC source - + Chat Map Full diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index 3e1efe86..5cd6e03d 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -13,16 +13,16 @@ android:key="pref_about_cat" android:title="@string/pref_ui_cat"> - + Date: Tue, 7 May 2013 19:36:02 +1000 Subject: [PATCH 25/28] Formatted files via Eclipse to hopefully have correct spacing/ident. --- .../IITC_AboutDialogPreference.java | 26 +- .../cradle/iitc_mobile/IITC_JSInterface.java | 11 +- .../com/cradle/iitc_mobile/IITC_Mobile.java | 251 ++++++++++-------- .../com/cradle/iitc_mobile/IITC_Settings.java | 23 +- .../iitc_mobile/IITC_SettingsFragment.java | 33 ++- .../com/cradle/iitc_mobile/IITC_WebView.java | 21 +- .../iitc_mobile/IITC_WebViewClient.java | 126 +++++---- 7 files changed, 281 insertions(+), 210 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java b/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java index 23d98de1..9e33ed50 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java @@ -10,7 +10,7 @@ import android.text.method.LinkMovementMethod; import android.util.AttributeSet; import android.widget.TextView; -public class IITC_AboutDialogPreference extends DialogPreference{ +public class IITC_AboutDialogPreference extends DialogPreference { private Context context; @@ -20,11 +20,10 @@ public class IITC_AboutDialogPreference extends DialogPreference{ } /* - * start a little about-dialog - * srsly...I found no better way for clickable links in a TextView then - * using Html.fromHtml...Linkify is just broken and does not understand - * html href tags...so let's tag the @string/about_msg with CDATA and - * use Html.fromHtml(...) for clickable hrefs with tags. + * start a little about-dialog srsly...I found no better way for clickable + * links in a TextView then using Html.fromHtml...Linkify is just broken and + * does not understand html href tags...so let's tag the @string/about_msg + * with CDATA and use Html.fromHtml(...) for clickable hrefs with tags. */ @Override protected void onPrepareDialogBuilder(Builder builder) { @@ -32,14 +31,13 @@ public class IITC_AboutDialogPreference extends DialogPreference{ String about_msg = context.getText(R.string.pref_about_msg).toString(); message.setText(Html.fromHtml(about_msg)); message.setMovementMethod(LinkMovementMethod.getInstance()); - builder.setView(message) - .setTitle(R.string.about) - .setIcon(android.R.drawable.ic_dialog_info) - .setNeutralButton(R.string.close, new OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); + builder.setView(message).setTitle(R.string.about) + .setIcon(android.R.drawable.ic_dialog_info) + .setNeutralButton(R.string.close, new OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); super.onPrepareDialogBuilder(builder); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index 782ffd74..4f7510ef 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -21,7 +21,8 @@ public class IITC_JSInterface { // send geo intent for navigation apps like gmaps or waze etc... @JavascriptInterface public void intentPosLink(String lat, String lng, String portal_name) { - String uri = "geo:" + lat + "," + lng + "?q=" + lat + "," + lng + portal_name; + String uri = "geo:" + lat + "," + lng + "?q=" + lat + "," + lng + + portal_name; Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); context.startActivity(intent); @@ -30,9 +31,11 @@ public class IITC_JSInterface { // copy link to specific portal to android clipboard @JavascriptInterface public void copy(String s) { - ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipboardManager clipboard = (ClipboardManager) context + .getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Copied Text ", s); - clipboard.setPrimaryClip(clip); - Toast.makeText(context, "copied to clipboard", Toast.LENGTH_SHORT).show(); + clipboard.setPrimaryClip(clip); + Toast.makeText(context, "copied to clipboard", Toast.LENGTH_SHORT) + .show(); } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index df44503a..afde5558 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -46,70 +46,87 @@ public class IITC_Mobile extends Activity { super.onCreate(savedInstanceState); // TODO build an async task for url.openStream() in IITC_WebViewClient - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() + .permitAll().build(); StrictMode.setThreadPolicy(policy); setContentView(R.layout.activity_main); iitc_view = (IITC_WebView) findViewById(R.id.iitc_webview); actionBar = this.getActionBar(); - actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_TITLE); + actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME + | ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_TITLE); actionBar.setTitle(getString(R.string.menu_map)); actionBar.setHomeButtonEnabled(true); - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(this); listener = new OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + public void onSharedPreferenceChanged( + SharedPreferences sharedPreferences, String key) { if (key.equals("pref_user_loc")) - user_loc = sharedPreferences.getBoolean("pref_user_loc", false); + user_loc = sharedPreferences.getBoolean("pref_user_loc", + false); IITC_Mobile.this.loadUrl(intel_url); } }; sharedPref.registerOnSharedPreferenceChangeListener(listener); - // we need this one to prevent location updates to javascript when keyboard is open + // we need this one to prevent location updates to javascript when + // keyboard is open // it closes on updates - iitc_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - Rect r = new Rect(); - //r will be populated with the coordinates of your view that area still visible. - iitc_view.getWindowVisibleDisplayFrame(r); + iitc_view.getViewTreeObserver().addOnGlobalLayoutListener( + new OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Rect r = new Rect(); + // r will be populated with the coordinates of your view + // that area still visible. + iitc_view.getWindowVisibleDisplayFrame(r); - int screenHeight = iitc_view.getRootView().getHeight(); - int heightDiff = screenHeight - (r.bottom - r.top); - boolean visible = heightDiff > screenHeight / 3; - if (visible == true) { - Log.d("iitcm", "Open Keyboard..."); - IITC_Mobile.this.keyboad_open = true; - } else { - Log.d("iitcm", "Close Keyboard..."); - IITC_Mobile.this.keyboad_open = false; - } - } - }); + int screenHeight = iitc_view.getRootView().getHeight(); + int heightDiff = screenHeight - (r.bottom - r.top); + boolean visible = heightDiff > screenHeight / 3; + if (visible == true) { + Log.d("iitcm", "Open Keyboard..."); + IITC_Mobile.this.keyboad_open = true; + } else { + Log.d("iitcm", "Close Keyboard..."); + IITC_Mobile.this.keyboad_open = false; + } + } + }); // Acquire a reference to the system Location Manager - loc_mngr = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); + loc_mngr = (LocationManager) this + .getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates loc_listener = new LocationListener() { public void onLocationChanged(Location location) { - // Called when a new location is found by the network location provider. - drawMarker(location); + // Called when a new location is found by the network location + // provider. + drawMarker(location); } - public void onStatusChanged(String provider, int status, Bundle extras) {} + public void onStatusChanged(String provider, int status, + Bundle extras) { + } - public void onProviderEnabled(String provider) {} + public void onProviderEnabled(String provider) { + } - public void onProviderDisabled(String provider) {} - }; + public void onProviderDisabled(String provider) { + } + }; user_loc = sharedPref.getBoolean("pref_user_loc", false); if (user_loc == true) { - // Register the listener with the Location Manager to receive location updates - loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, loc_listener); - loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc_listener); + // Register the listener with the Location Manager to receive + // location updates + loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, + 0, 0, loc_listener); + loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, + loc_listener); } // load new iitc web view with ingress intel page @@ -125,8 +142,7 @@ public class IITC_Mobile extends Activity { Log.d("iitcm", "loading url..."); this.loadUrl(url); } - } - else { + } else { this.loadUrl(intel_url); } } @@ -142,9 +158,12 @@ public class IITC_Mobile extends Activity { iitc_view.updateCaching(); if (user_loc == true) { - // Register the listener with the Location Manager to receive location updates - loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, loc_listener); - loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc_listener); + // Register the listener with the Location Manager to receive + // location updates + loc_mngr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, + 0, 0, loc_listener); + loc_mngr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, + loc_listener); } } @@ -152,25 +171,32 @@ public class IITC_Mobile extends Activity { protected void onStop() { ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); + NetworkInfo mobile = conMan + .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI); // check if Mobile or Wifi module is available..then handle states - // TODO: theory...we do not have to check for a Wifi module...every android device should have one + // TODO: theory...we do not have to check for a Wifi module...every + // android device should have one if (mobile != null) { Log.d("iitcm", "mobile internet module detected...check states"); - if (mobile.getState() == NetworkInfo.State.CONNECTED || mobile.getState() == NetworkInfo.State.CONNECTING) { - Log.d("iitcm", "connected to mobile net...abort all running requests"); + if (mobile.getState() == NetworkInfo.State.CONNECTED + || mobile.getState() == NetworkInfo.State.CONNECTING) { + Log.d("iitcm", + "connected to mobile net...abort all running requests"); // cancel all current requests iitc_view.loadUrl("javascript: window.requests.abort()"); // set idletime to maximum...no need for more iitc_view.loadUrl("javascript: window.idleTime = 999"); - } else if (wifi.getState() == NetworkInfo.State.CONNECTED || wifi.getState() == NetworkInfo.State.CONNECTING) { - iitc_view.loadUrl("javascript: window.idleTime = 999"); + } else if (wifi.getState() == NetworkInfo.State.CONNECTED + || wifi.getState() == NetworkInfo.State.CONNECTING) { + iitc_view.loadUrl("javascript: window.idleTime = 999"); } } else { - Log.d("iitcm", "no mobile internet module detected...check wifi state"); - if (wifi.getState() == NetworkInfo.State.CONNECTED || wifi.getState() == NetworkInfo.State.CONNECTING) { + Log.d("iitcm", + "no mobile internet module detected...check wifi state"); + if (wifi.getState() == NetworkInfo.State.CONNECTED + || wifi.getState() == NetworkInfo.State.CONNECTING) { iitc_view.loadUrl("javascript: window.idleTime = 999"); } } @@ -218,7 +244,7 @@ public class IITC_Mobile extends Activity { new Handler().postDelayed(new Runnable() { @Override public void run() { - back_button_pressed=false; + back_button_pressed = false; } }, 500); } @@ -235,85 +261,90 @@ public class IITC_Mobile extends Activity { public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { - case android.R.id.home: + 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: + case R.id.menu_map : iitc_view.loadUrl("javascript: window.show('map');"); actionBar.setTitle(getString(R.string.menu_map)); return true; - case R.id.reload_button: - this.loadUrl(intel_url); + case R.id.reload_button : + this.loadUrl(intel_url); actionBar.setTitle(getString(R.string.menu_map)); - return true; - // clear cache - case R.id.cache_clear: - iitc_view.clearHistory(); - iitc_view.clearFormData(); - iitc_view.clearCache(true); - return true; - // toggle fullscreen - case R.id.toggle_fullscreen: - if (!this.fullscreen_mode) { - // get rid of action bar - this.getActionBar().hide(); - // hide notification bar - WindowManager.LayoutParams attrs = getWindow().getAttributes(); - attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; - this.getWindow().setAttributes(attrs); - this.fullscreen_mode = true; - // show a little toast for the user - Toast.makeText(this, "Press back button to exit fullscreen", Toast.LENGTH_SHORT).show(); - } - else { - // get back action bar - this.getActionBar().show(); - // show notification bar again - WindowManager.LayoutParams attrs = getWindow().getAttributes(); - attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; - this.getWindow().setAttributes(attrs); - this.fullscreen_mode = false; - } - return true; - // get the users current location and focus it on map - case R.id.locate: + return true; + // clear cache + case R.id.cache_clear : + iitc_view.clearHistory(); + iitc_view.clearFormData(); + iitc_view.clearCache(true); + return true; + // toggle fullscreen + case R.id.toggle_fullscreen : + if (!this.fullscreen_mode) { + // get rid of action bar + this.getActionBar().hide(); + // hide notification bar + WindowManager.LayoutParams attrs = getWindow() + .getAttributes(); + attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; + this.getWindow().setAttributes(attrs); + this.fullscreen_mode = true; + // show a little toast for the user + Toast.makeText(this, + "Press back button to exit fullscreen", + Toast.LENGTH_SHORT).show(); + } else { + // get back action bar + this.getActionBar().show(); + // show notification bar again + WindowManager.LayoutParams attrs = getWindow() + .getAttributes(); + attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; + this.getWindow().setAttributes(attrs); + this.fullscreen_mode = false; + } + 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: 13});"); + iitc_view + .loadUrl("javascript: window.map.locate({setView : true, maxZoom: 13});"); actionBar.setTitle(getString(R.string.menu_map)); - return true; - // start settings activity - case R.id.action_settings: - Intent intent = new Intent(this, IITC_Settings.class); - intent.putExtra("iitc_version", iitc_view.getWebViewClient().getIITCVersion()); - startActivity(intent); - return true; - case R.id.menu_info: + return true; + // start settings activity + case R.id.action_settings : + Intent intent = new Intent(this, IITC_Settings.class); + intent.putExtra("iitc_version", iitc_view.getWebViewClient() + .getIITCVersion()); + startActivity(intent); + return true; + case R.id.menu_info : iitc_view.loadUrl("javascript: window.show('info');"); - actionBar.setTitle(getString(R.string.menu_info)); + actionBar.setTitle(getString(R.string.menu_info)); return true; - case R.id.menu_full: + case R.id.menu_full : iitc_view.loadUrl("javascript: window.show('full');"); - actionBar.setTitle(getString(R.string.menu_full)); + actionBar.setTitle(getString(R.string.menu_full)); return true; - case R.id.menu_compact: + case R.id.menu_compact : iitc_view.loadUrl("javascript: window.show('compact');"); - actionBar.setTitle(getString(R.string.menu_compact)); + actionBar.setTitle(getString(R.string.menu_compact)); return true; - case R.id.menu_public: + case R.id.menu_public : iitc_view.loadUrl("javascript: window.show('public');"); - actionBar.setTitle(getString(R.string.menu_public)); + actionBar.setTitle(getString(R.string.menu_public)); return true; - case R.id.menu_faction: + case R.id.menu_faction : iitc_view.loadUrl("javascript: window.show('faction');"); - actionBar.setTitle(getString(R.string.menu_faction)); + actionBar.setTitle(getString(R.string.menu_faction)); return true; - case R.id.menu_debug: + case R.id.menu_debug : iitc_view.loadUrl("javascript: window.show('debug')"); - actionBar.setTitle(getString(R.string.menu_debug)); + actionBar.setTitle(getString(R.string.menu_debug)); return true; - default: - return super.onOptionsItemSelected(item); + default : + return super.onOptionsItemSelected(item); } } @@ -330,7 +361,7 @@ public class IITC_Mobile extends Activity { // Force mobile view. // New actions are not compatible with desktop mode private String addUrlParam(String url) { - return (url + "?vp=m"); + return (url + "?vp=m"); } // inject the iitc-script and load the intel url @@ -348,9 +379,9 @@ public class IITC_Mobile extends Activity { // should avoid gps glitches if (loc.getAccuracy() < 100) { if (keyboad_open == false) { - iitc_view.loadUrl("javascript: " + - "window.plugin.userLocation.updateLocation( " + - loc.getLatitude() + ", " + loc.getLongitude() + ");"); + iitc_view.loadUrl("javascript: " + + "window.plugin.userLocation.updateLocation( " + + loc.getLatitude() + ", " + loc.getLongitude() + ");"); } } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Settings.java b/mobile/src/com/cradle/iitc_mobile/IITC_Settings.java index 8813b2a7..f019e2ac 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Settings.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Settings.java @@ -28,18 +28,21 @@ public class IITC_Settings extends Activity { ArrayList asset_list = new ArrayList(); ArrayList asset_values = new ArrayList(); - for (int i = 0; i < asset_array.length ; i++) { + for (int i = 0; i < asset_array.length; i++) { // find user plugin name for user readable entries Scanner s = null; String src = ""; try { - s = new Scanner(am.open("plugins/" + asset_array[i])).useDelimiter("\\A"); + s = new Scanner(am.open("plugins/" + asset_array[i])) + .useDelimiter("\\A"); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } - if (s != null) src = s.hasNext() ? s.next() : ""; - String header = src.substring(src.indexOf("==UserScript=="), src.indexOf("==/UserScript==")); + if (s != null) + src = s.hasNext() ? s.next() : ""; + String header = src.substring(src.indexOf("==UserScript=="), + src.indexOf("==/UserScript==")); // remove new line comments and replace with space // this way we get double spaces instead of newline + double slash header = header.replace("\n//", " "); @@ -48,7 +51,8 @@ public class IITC_Settings extends Activity { String plugin_name = "not found"; for (int j = 0; j < attributes.length; j++) { // search for name and use the value - if (attributes[j].equals("@name")) plugin_name = attributes[j+1]; + if (attributes[j].equals("@name")) + plugin_name = attributes[j + 1]; } asset_list.add(plugin_name); // real value @@ -56,13 +60,14 @@ public class IITC_Settings extends Activity { } Bundle bundle = getIntent().getExtras(); - bundle.putStringArray("ASSETS", (String[]) asset_list.toArray(new String[0])); - bundle.putStringArray("ASSETS_VAL", (String[]) asset_values.toArray(new String[0])); + bundle.putStringArray("ASSETS", + (String[]) asset_list.toArray(new String[0])); + bundle.putStringArray("ASSETS_VAL", + (String[]) asset_values.toArray(new String[0])); settings.setArguments(bundle); // Display the fragment as the main content. getFragmentManager().beginTransaction() - .replace(android.R.id.content, settings) - .commit(); + .replace(android.R.id.content, settings).commit(); } } \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java b/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java index 5a68f307..3859a5f4 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java @@ -23,20 +23,21 @@ public class IITC_SettingsFragment extends PreferenceFragment { addPreferencesFromResource(R.xml.preferences); - //plugins + // plugins MultiSelectListPreference pref_plugins = (MultiSelectListPreference) findPreference("pref_plugins"); pref_plugins.setEntries(getArguments().getStringArray("ASSETS")); - pref_plugins.setEntryValues(getArguments().getStringArray("ASSETS_VAL")); + pref_plugins + .setEntryValues(getArguments().getStringArray("ASSETS_VAL")); // set build version ListPreference pref_build_version = (ListPreference) findPreference("pref_build_version"); PackageManager pm = getActivity().getPackageManager(); String version = "unknown"; try { - PackageInfo info = pm.getPackageInfo(getActivity().getPackageName(), 0); + PackageInfo info = pm.getPackageInfo( + getActivity().getPackageName(), 0); version = info.versionName; - } - catch (NameNotFoundException e) { + } catch (NameNotFoundException e) { e.printStackTrace(); } pref_build_version.setSummary(version); @@ -47,16 +48,20 @@ public class IITC_SettingsFragment extends PreferenceFragment { // set iitc source EditTextPreference pref_iitc_source = (EditTextPreference) findPreference("pref_iitc_source"); - pref_iitc_source.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - preference.setSummary((CharSequence) newValue); - // TODO: update iitc_version when iitc source has changed - return true; - } - }); + pref_iitc_source + .setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, + Object newValue) { + preference.setSummary((CharSequence) newValue); + // TODO: update iitc_version when iitc source has + // changed + return true; + } + }); // first init of summary - String pref_iitc_source_sum = (String) pref_iitc_source.getSummary() + pref_iitc_source.getText(); + String pref_iitc_source_sum = (String) pref_iitc_source.getSummary() + + pref_iitc_source.getText(); pref_iitc_source.setSummary(pref_iitc_source_sum); } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java index ba705db9..ba63e570 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java @@ -28,8 +28,10 @@ public class IITC_WebView extends WebView { settings.setAllowFileAccess(true); settings.setGeolocationEnabled(true); settings.setAppCacheEnabled(true); - settings.setDatabasePath(this.getContext().getApplicationInfo().dataDir + "/databases/"); - settings.setAppCachePath(this.getContext().getCacheDir().getAbsolutePath()); + settings.setDatabasePath(this.getContext().getApplicationInfo().dataDir + + "/databases/"); + settings.setAppCachePath(this.getContext().getCacheDir() + .getAbsolutePath()); // use cache if on mobile network...saves traffic this.js_interface = new IITC_JSInterface(c); this.addJavascriptInterface(js_interface, "android"); @@ -38,7 +40,8 @@ public class IITC_WebView extends WebView { // allow access by default this.setWebChromeClient(new WebChromeClient() { @Override - public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { + public void onGeolocationPermissionsShowPrompt(String origin, + GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); } }); @@ -65,13 +68,15 @@ public class IITC_WebView extends WebView { iitc_init(context); } - //---------------------------------------------------------------- + + // ---------------------------------------------------------------- @Override public void loadUrl(String url) { if (!url.startsWith("javascript:")) { // force https if enabled in settings - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(getContext()); if (sharedPref.getBoolean("pref_force_https", true)) url = url.replace("http://", "https://"); else @@ -90,8 +95,7 @@ public class IITC_WebView extends WebView { } public void updateCaching() { - if (!this.isConnectedToWifi()) - { + if (!this.isConnectedToWifi()) { Log.d("iitcm", "not connected to wifi...load tiles from cache"); settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); } else { @@ -101,7 +105,8 @@ public class IITC_WebView extends WebView { } private boolean isConnectedToWifi() { - ConnectivityManager conMan = (ConnectivityManager) getContext().getSystemService( Context.CONNECTIVITY_SERVICE ); + ConnectivityManager conMan = (ConnectivityManager) getContext() + .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return wifi.getState() == NetworkInfo.State.CONNECTED; } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java index 59a16c6a..9a32366f 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java @@ -26,8 +26,10 @@ import java.util.Set; public class IITC_WebViewClient extends WebViewClient { private static final ByteArrayInputStream style = new ByteArrayInputStream( - "body, #dashboard_container, #map_canvas { background: #000 !important; }".getBytes()); - private static final ByteArrayInputStream empty = new ByteArrayInputStream("".getBytes()); + "body, #dashboard_container, #map_canvas { background: #000 !important; }" + .getBytes()); + private static final ByteArrayInputStream empty = new ByteArrayInputStream( + "".getBytes()); private WebResourceResponse iitcjs; private String js = null; @@ -36,10 +38,11 @@ public class IITC_WebViewClient extends WebViewClient { public IITC_WebViewClient(Context c) { this.context = c; - this.iitc_path = Environment.getExternalStorageDirectory().getPath() + "/IITC_Mobile/"; + this.iitc_path = Environment.getExternalStorageDirectory().getPath() + + "/IITC_Mobile/"; try { loadIITC_JS(c); - } catch(IOException e) { + } catch (IOException e) { e.printStackTrace(); } } @@ -47,7 +50,8 @@ public class IITC_WebViewClient extends WebViewClient { public String getIITCVersion() { String header = ""; if (js != null) - header = js.substring(js.indexOf("==UserScript=="), js.indexOf("==/UserScript==")); + header = js.substring(js.indexOf("==UserScript=="), + js.indexOf("==/UserScript==")); // remove new line comments header = header.replace("\n//", ""); // get a list of key-value @@ -55,35 +59,46 @@ public class IITC_WebViewClient extends WebViewClient { String iitc_version = "not found"; for (int i = 0; i < attributes.length; i++) { // search for version and use the value - if (attributes[i].equals("@version")) iitc_version = attributes[i+1]; + if (attributes[i].equals("@version")) + iitc_version = attributes[i + 1]; } return iitc_version; } public void loadIITC_JS(Context c) throws java.io.IOException { // You are able to load the script from external source - // if a http address is given, use script from this address. else use the local script - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(c); + // if a http address is given, use script from this address. else use + // the local script + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(c); String iitc_source = sharedPref.getString("pref_iitc_source", "local"); String js = ""; - // if developer mode are enabled, load all iitc script from external storage + // if developer mode are enabled, load all iitc script from external + // storage if (sharedPref.getBoolean("pref_dev_checkbox", false)) { - js = this.fileToString(iitc_path + "dev/total-conversion-build.user.js", false); + js = this.fileToString(iitc_path + + "dev/total-conversion-build.user.js", false); if (js.equals("false")) { - Toast.makeText(context, "File " + iitc_path + - "dev/total-conversion-build.user.js not found. " + - "Disable developer mode or add iitc files " + - "to the dev folder.", Toast.LENGTH_LONG).show(); + Toast.makeText( + context, + "File " + + iitc_path + + "dev/total-conversion-build.user.js not found. " + + "Disable developer mode or add iitc files " + + "to the dev folder.", Toast.LENGTH_LONG) + .show(); return; } else { - Toast.makeText(context, "Developer mode enabled", Toast.LENGTH_SHORT).show(); + Toast.makeText(context, "Developer mode enabled", + Toast.LENGTH_SHORT).show(); } } else { // load iitc script from web or asset folder if (iitc_source.contains("http")) { URL url = new URL(iitc_source); - js = new Scanner(url.openStream(), "UTF-8").useDelimiter("\\A").next(); + js = new Scanner(url.openStream(), "UTF-8").useDelimiter("\\A") + .next(); } else { js = this.fileToString("total-conversion-build.user.js", true); } @@ -92,15 +107,14 @@ public class IITC_WebViewClient extends WebViewClient { this.js = js; PackageManager pm = context.getPackageManager(); - boolean hasMultitouch = - pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH); + boolean hasMultitouch = pm + .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH); boolean forcedZoom = sharedPref.getBoolean("pref_user_zoom", false); - if (hasMultitouch && !forcedZoom) { - js = js.replace("window.showZoom = true;", "window.showZoom = false;"); + if (hasMultitouch && !forcedZoom) { + js = js.replace("window.showZoom = true;", + "window.showZoom = false;"); } - - // need to wrap the mobile iitc.js version in a document ready. IITC // expects to be injected after the DOM has been loaded completely. // Since the mobile client injects IITC by replacing the gen_dashboard @@ -108,17 +122,15 @@ public class IITC_WebViewClient extends WebViewClient { // so it boots correctly. js = "$(document).ready(function(){" + js + "});"; - iitcjs = new WebResourceResponse( - "text/javascript", - "UTF-8", - new ByteArrayInputStream(js.getBytes()) - ); + iitcjs = new WebResourceResponse("text/javascript", "UTF-8", + new ByteArrayInputStream(js.getBytes())); }; // enable https @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { - handler.proceed() ; + public void onReceivedSslError(WebView view, SslErrorHandler handler, + SslError error) { + handler.proceed(); }; // plugins should be loaded after the main script is injected @@ -127,7 +139,8 @@ public class IITC_WebViewClient extends WebViewClient { super.onPageFinished(view, url); // get the plugin preferences - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(context); Set plugin_list = sharedPref.getStringSet("pref_plugins", null); boolean dev_enabled = sharedPref.getBoolean("pref_dev_checkbox", true); @@ -135,10 +148,11 @@ public class IITC_WebViewClient extends WebViewClient { if (plugin_list != null) { String[] plugin_array = plugin_list.toArray(new String[0]); - for(int i = 0; i < plugin_list.size(); i++) { + for (int i = 0; i < plugin_list.size(); i++) { Log.d("iitcm", "adding plugin " + plugin_array[i]); if (dev_enabled) - this.loadJS(iitc_path + "dev/plugins/" + plugin_array[i], false, view); + this.loadJS(iitc_path + "dev/plugins/" + plugin_array[i], + false, view); else this.loadJS("plugins/" + plugin_array[i], true, view); } @@ -153,20 +167,21 @@ public class IITC_WebViewClient extends WebViewClient { File[] files = directory.listFiles(); if (files != null) { for (int i = 0; i < files.length; ++i) { - if(this.loadJS(files[i].toString(), false, view)) - Log.d("iitcm", "loading additional plugin " + files[i].toString()); + if (this.loadJS(files[i].toString(), false, view)) + Log.d("iitcm", + "loading additional plugin " + files[i].toString()); } } } public void enableTracking(WebView view, boolean dev_enabled) { Log.d("iitcm", "enable tracking..."); - // load plugin from external storage if dev mode are enabled - if (dev_enabled) - this.loadJS(iitc_path + "dev/user-location.user.js", false, view); - else - // load plugin from asset folder - this.loadJS("user-location.user.js", true, view); + // load plugin from external storage if dev mode are enabled + if (dev_enabled) + this.loadJS(iitc_path + "dev/user-location.user.js", false, view); + else + // load plugin from asset folder + this.loadJS("user-location.user.js", true, view); } // read a file into a string @@ -174,7 +189,7 @@ public class IITC_WebViewClient extends WebViewClient { // if asset == true use the asset manager to open file public String fileToString(String file, boolean asset) { Scanner s = null; - String src= ""; + String src = ""; if (!asset) { File js_file = new File(file); try { @@ -196,7 +211,8 @@ public class IITC_WebViewClient extends WebViewClient { } } - if (s != null) src = s.hasNext() ? s.next() : ""; + if (s != null) + src = s.hasNext() ? s.next() : ""; return src; } @@ -208,21 +224,24 @@ public class IITC_WebViewClient extends WebViewClient { String js = fileToString(file, asset); if (js.equals("false")) return false; - else view.loadUrl("javascript:" + js); + else + view.loadUrl("javascript:" + js); return true; } - // Check every external resource if it’s okay to load it and maybe replace it + // Check every external resource if it’s okay to load it and maybe replace + // it // with our own content. This is used to block loading Niantic resources // which aren’t required and to inject IITC early into the site. // via http://stackoverflow.com/a/8274881/1684530 @Override - public WebResourceResponse shouldInterceptRequest (final WebView view, String url) { - if(url.contains("/css/common.css")) { + public WebResourceResponse shouldInterceptRequest(final WebView view, + String url) { + if (url.contains("/css/common.css")) { return new WebResourceResponse("text/css", "UTF-8", style); - } else if(url.contains("gen_dashboard.js")) { + } else if (url.contains("gen_dashboard.js")) { return this.iitcjs; - } else if(url.contains("/css/ap_icons.css") + } else if (url.contains("/css/ap_icons.css") || url.contains("/css/map_icons.css") || url.contains("/css/misc_icons.css") || url.contains("/css/style_full.css") @@ -241,13 +260,18 @@ public class IITC_WebViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.contains("ingress.com") || url.contains("appengine.google.com")) { // reload iitc if a poslink is clicked inside the app - if (url.contains("intel?ll=") || (url.contains("latE6") && url.contains("lngE6"))) { - Log.d("iitcm", "should be an internal clicked position link...reload script for: " + url); + if (url.contains("intel?ll=") + || (url.contains("latE6") && url.contains("lngE6"))) { + Log.d("iitcm", + "should be an internal clicked position link...reload script for: " + + url); ((IITC_Mobile) context).loadUrl(url); } return false; } else { - Log.d("iitcm", "no ingress intel link, start external app to load url: " + url); + Log.d("iitcm", + "no ingress intel link, start external app to load url: " + + url); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); context.startActivity(intent); return true; From 9edcdaac3db258dbdbf84c80479e2a6c50dd4cbc Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Tue, 7 May 2013 11:53:41 +0200 Subject: [PATCH 26/28] bump version number and fixed about string since the app is not completely my work anymore --- mobile/AndroidManifest.xml | 4 ++-- mobile/res/values/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 3d8e23d4..8249bf42 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="18" + android:versionName="0.3.6" > Ingress Intel Total Conversion Mobile

- by cradle

+ by cradle and contributors

Icon by Giuseppe Lucido

IITC Mobile is an optimized mobile browser for the Ingress Intel Total Conversion (IITC) userscript by breunigs. From 87c0c54a2686cd0678c3cbc10351c21d93bcdc84 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Tue, 7 May 2013 12:01:20 +0200 Subject: [PATCH 27/28] don't hide actionbar in fullscreen since we don't have iitc-tabs for control --- 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 afde5558..0ab3510b 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -222,8 +222,6 @@ public class IITC_Mobile extends Activity { public void onBackPressed() { // leave fullscreen mode if it is enabled if (fullscreen_mode) { - // get back action bar - actionBar.show(); // show notification bar again WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; @@ -282,8 +280,6 @@ public class IITC_Mobile extends Activity { // toggle fullscreen case R.id.toggle_fullscreen : if (!this.fullscreen_mode) { - // get rid of action bar - this.getActionBar().hide(); // hide notification bar WindowManager.LayoutParams attrs = getWindow() .getAttributes(); @@ -295,8 +291,6 @@ public class IITC_Mobile extends Activity { "Press back button to exit fullscreen", Toast.LENGTH_SHORT).show(); } else { - // get back action bar - this.getActionBar().show(); // show notification bar again WindowManager.LayoutParams attrs = getWindow() .getAttributes(); From e2f8c7c5cf4240fb035996bf9c34bf9d0c07041c Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Tue, 7 May 2013 16:01:23 +0200 Subject: [PATCH 28/28] enable portals, fields and links per default --- code/boot.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/boot.js b/code/boot.js index 0539fa42..fcc04011 100644 --- a/code/boot.js +++ b/code/boot.js @@ -171,20 +171,20 @@ window.setupMap = function() { var t = (i === 0 ? 'Unclaimed' : 'Level ' + i) + ' Portals'; addLayers[t] = portalsLayers[i]; // Store it in hiddenLayer to remove later - if(!isLayerGroupDisplayed(t)) hiddenLayer.push(portalsLayers[i]); + if(!isLayerGroupDisplayed(t, true)) hiddenLayer.push(portalsLayers[i]); } fieldsLayer = L.layerGroup([]); map.addLayer(fieldsLayer, true); addLayers['Fields'] = fieldsLayer; // Store it in hiddenLayer to remove later - if(!isLayerGroupDisplayed('Fields')) hiddenLayer.push(fieldsLayer); + if(!isLayerGroupDisplayed('Fields', true)) hiddenLayer.push(fieldsLayer); linksLayer = L.layerGroup([]); map.addLayer(linksLayer, true); addLayers['Links'] = linksLayer; // Store it in hiddenLayer to remove later - if(!isLayerGroupDisplayed('Links')) hiddenLayer.push(linksLayer); + if(!isLayerGroupDisplayed('Links', true)) hiddenLayer.push(linksLayer); window.layerChooser = new L.Control.Layers({ 'MapQuest OSM': views[0],