diff --git a/.gitignore b/.gitignore index d2d07c24..af7e35cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -mobile/IngressIntelTC/bin build localbuildsettings.py *.pyc diff --git a/build.py b/build.py index 5c2e3cb9..2a3eb7d9 100755 --- a/build.py +++ b/build.py @@ -225,7 +225,7 @@ if buildMobile: 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*', 'privacy-view*')) + shutil.copytree(os.path.join(outDir,"plugins"), "mobile/assets/plugins", ignore=shutil.ignore_patterns('*.meta.js', 'force-https*', 'privacy-view*', 'speech-search*')) if buildMobile != 'copyonly': diff --git a/code/boot.js b/code/boot.js index 6c4f64c9..aa3ee313 100644 --- a/code/boot.js +++ b/code/boot.js @@ -125,13 +125,9 @@ window.setupMap = function() { //OpenStreetMap attribution - required by several of the layers osmAttribution = 'Map data © OpenStreetMap contributors'; - //OpenStreetMap tiles - we shouldn't use these by default, or even an option - https://wiki.openstreetmap.org/wiki/Tile_usage_policy - // "Heavy use (e.g. distributing an app that uses tiles from openstreetmap.org) is forbidden without prior permission from the System Administrators" - //var osmOpt = {attribution: osmAttribution, maxZoom: 18, detectRetina: true}; - //var osm = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', osmOpt); //CloudMade layers - only 500,000 tiles/month in their free plan. nowhere near enough for IITC - var cmOpt = {attribution: osmAttribution+', Imagery © CloudMade', maxZoom: 18, detectRetina: true}; + //var cmOpt = {attribution: osmAttribution+', Imagery © CloudMade', maxZoom: 18, detectRetina: true}; //var cmMin = new L.TileLayer('http://{s}.tile.cloudmade.com/{your api key here}/22677/256/{z}/{x}/{y}.png', cmOpt); //var cmMid = new L.TileLayer('http://{s}.tile.cloudmade.com/{your api key here}/999/256/{z}/{x}/{y}.png', cmOpt); diff --git a/code/geosearch.js b/code/geosearch.js index 7bd7d1ee..ab67a56c 100644 --- a/code/geosearch.js +++ b/code/geosearch.js @@ -6,24 +6,29 @@ window.setupGeosearch = function() { if((e.keyCode ? e.keyCode : e.which) != 13) return; var search = $(this).val(); - + + if ( window.search(search) ) return; + + e.preventDefault(); + }); + $('#geosearchwrapper img').click(function(){ + map.locate({setView : true, maxZoom: 13}); + }); +} + +window.search = function(search) { if (!runHooks('geoSearch', search)) { - return; + return true; } $.getJSON(NOMINATIM + encodeURIComponent(search), function(data) { - if(!data || !data[0]) return; + if(!data || !data[0]) return true; var b = data[0].boundingbox; - if(!b) return; + if(!b) return true; var southWest = new L.LatLng(b[0], b[2]), northEast = new L.LatLng(b[1], b[3]), bounds = new L.LatLngBounds(southWest, northEast); window.map.fitBounds(bounds); if(window.isSmartphone()) window.smartphone.mapButton.click(); }); - e.preventDefault(); - }); - $('#geosearchwrapper img').click(function(){ - map.locate({setView : true, maxZoom: 13});; - }); } diff --git a/code/map_data.js b/code/map_data.js index 10372b77..1edd99bc 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -29,7 +29,7 @@ window.requestData = function() { for (var x = x1; x <= x2; x++) { for (var y = y1; y <= y2; y++) { var tile_id = pointToTileId(z, x, y); - var bucket = Math.floor(x / 2) + "" + Math.floor(y / 2); + var bucket = (x % 2) + ":" + (y % 2); if (!tiles[bucket]) tiles[bucket] = []; tiles[bucket].push(generateBoundsParams( @@ -44,6 +44,7 @@ window.requestData = function() { // Reset previous result of Portal Render Limit handler portalRenderLimit.init(); + // finally send ajax requests $.each(tiles, function(ind, tls) { data = { zoom: z }; diff --git a/code/portal_detail_display_tools.js b/code/portal_detail_display_tools.js index 6fd989b2..446f141f 100644 --- a/code/portal_detail_display_tools.js +++ b/code/portal_detail_display_tools.js @@ -111,7 +111,7 @@ window.getResonatorDetails = function(d) { // rotates clockwise. So, last one is 7 (southeast). window.renderResonatorDetails = function(slot, level, nrg, dist, nick) { if(level === 0) { - var meter = ''; + var meter = ''; } else { var max = RESO_NRG[level]; var fillGrade = nrg/max*100; @@ -120,7 +120,7 @@ window.renderResonatorDetails = function(slot, level, nrg, dist, nick) { + 'level:\t' + level + '\n' + 'distance:\t' + dist + 'm\n' + 'owner:\t' + nick + '\n' - + 'octant:\t' + OCTANTS[slot]; + + 'octant:\t' + OCTANTS[slot] + ' ' + OCTANTS_ARROW[slot]; var style = 'width:'+fillGrade+'%; background:'+COLORS_LVL[level]+';'; diff --git a/main.js b/main.js index 1416fe94..217daa77 100644 --- a/main.js +++ b/main.js @@ -199,6 +199,7 @@ window.MAX_XM_PER_LEVEL = [0, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]; window.MIN_AP_FOR_LEVEL = [0, 10000, 30000, 70000, 150000, 300000, 600000, 1200000]; window.HACK_RANGE = 40; // in meters, max. distance from portal to be able to access it window.OCTANTS = ['E', 'NE', 'N', 'NW', 'W', 'SW', 'S', 'SE']; +window.OCTANTS_ARROW = ['→', '↗', '↑', '↖', '←', '↙', '↓', '↘']; window.DESTROY_RESONATOR = 75; //AP for destroying portal window.DESTROY_LINK = 187; //AP for destroying link window.DESTROY_FIELD = 750; //AP for destroying field diff --git a/mobile/.gitignore b/mobile/.gitignore index 42e4ba7c..2f94c701 100644 --- a/mobile/.gitignore +++ b/mobile/.gitignore @@ -1,11 +1,34 @@ -.classpath -.project .settings/ -bin/ -gen/ -libs/ -proguard-project.txt -local.properties assets/total-conversion-build.user.js assets/user-location.user.js assets/plugins/ + +# built application files +*.apk +*.ap_ + +# files for the dex VM +*.dex + +# Java class files +*.class + +# generated files +bin/ +gen/ +out/ + +# Local configuration file (sdk path, etc) +local.properties + +# Eclipse project files +.classpath +.project + +# IntelliJ IDEA user settings +*.iws +.idea/workspace.xml +.idea/tasks.xml + +# Proguard logs +proguard_logs/ diff --git a/mobile/.idea/.name b/mobile/.idea/.name new file mode 100644 index 00000000..d884b924 --- /dev/null +++ b/mobile/.idea/.name @@ -0,0 +1 @@ +IITC-Mobile \ No newline at end of file diff --git a/mobile/.idea/compiler.xml b/mobile/.idea/compiler.xml new file mode 100644 index 00000000..217af471 --- /dev/null +++ b/mobile/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/mobile/.idea/copyright/profiles_settings.xml b/mobile/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..3572571a --- /dev/null +++ b/mobile/.idea/copyright/profiles_settings.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mobile/.idea/encodings.xml b/mobile/.idea/encodings.xml new file mode 100644 index 00000000..e206d70d --- /dev/null +++ b/mobile/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml new file mode 100644 index 00000000..e0d90dd8 --- /dev/null +++ b/mobile/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile/.idea/modules.xml b/mobile/.idea/modules.xml new file mode 100644 index 00000000..c7429177 --- /dev/null +++ b/mobile/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mobile/.idea/scopes/scope_settings.xml b/mobile/.idea/scopes/scope_settings.xml new file mode 100644 index 00000000..922003b8 --- /dev/null +++ b/mobile/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/mobile/.idea/vcs.xml b/mobile/.idea/vcs.xml new file mode 100644 index 00000000..2e0588cc --- /dev/null +++ b/mobile/.idea/vcs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 5c3b887b..b0fa5c5a 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -1,18 +1,18 @@ + package="com.cradle.iitc_mobile" + android:versionCode="22" + android:versionName="0.4.1"> + android:targetSdkVersion="17"/> - - - - - + + + + + + android:launchMode="singleTop" + android:configChanges="orientation|keyboard|keyboardHidden|screenSize"> - - + + + + + + + + + + + + + + - - + + + + + + + android:configChanges="orientation|keyboard|keyboardHidden|screenSize"> + + + + + + + + + + + + + + diff --git a/mobile/IITC-Mobile.iml b/mobile/IITC-Mobile.iml new file mode 100644 index 00000000..57c35466 --- /dev/null +++ b/mobile/IITC-Mobile.iml @@ -0,0 +1,25 @@ + + + + + + + MANIFEST_FILE_PATH + RESOURCES_DIR_PATH + ASSETS_DIR_PATH + NATIVE_LIBS_DIR_PATH + + + + + + + + + + + + + + + diff --git a/mobile/build.gradle b/mobile/build.gradle new file mode 100644 index 00000000..2fa22689 --- /dev/null +++ b/mobile/build.gradle @@ -0,0 +1,35 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.4' + } +} +apply plugin: 'android' + +dependencies { +} + +android { + compileSdkVersion 17 + buildToolsVersion "17" + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 17 + } + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + + instrumentTest.setRoot('tests') + } +} diff --git a/mobile/mobile.iml b/mobile/mobile.iml new file mode 100644 index 00000000..25a68b77 --- /dev/null +++ b/mobile/mobile.iml @@ -0,0 +1,25 @@ + + + + + + + MANIFEST_FILE_PATH + RESOURCES_DIR_PATH + ASSETS_DIR_PATH + NATIVE_LIBS_DIR_PATH + + + + + + + + + + + + + + + diff --git a/mobile/proguard-project.txt b/mobile/proguard-project.txt new file mode 100644 index 00000000..34f9866f --- /dev/null +++ b/mobile/proguard-project.txt @@ -0,0 +1,16 @@ +# view res/xml/preferences.xml #generated:4 +-keep class com.cradle.iitc_mobile.IITC_AboutDialogPreference { (...); } + +# view AndroidManifest.xml #generated:23 +-keep class com.cradle.iitc_mobile.IITC_Mobile { (...); } + +# view AndroidManifest.xml #generated:56 +-keep class com.cradle.iitc_mobile.IITC_SearchableActivity { (...); } + +# view AndroidManifest.xml #generated:50 +-keep class com.cradle.iitc_mobile.IITC_Settings { (...); } + +# view res/layout/activity_main.xml #generated:6 +-keep class com.cradle.iitc_mobile.IITC_WebView { (...); } + +-keep class com.cradle.iitc_mobile.IITC_JSInterface { (...); } \ No newline at end of file diff --git a/mobile/res/menu/main.xml b/mobile/res/menu/main.xml index eba307b5..e203e4fb 100644 --- a/mobile/res/menu/main.xml +++ b/mobile/res/menu/main.xml @@ -1,5 +1,9 @@ - + - - + + 16dp 16dp + 640dip + 400dip + 400dip + 200dip \ No newline at end of file diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index a8ed6584..b631ba48 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -58,4 +58,6 @@ Debug Choose account to login Login failed. + Search Locations + Search \ No newline at end of file diff --git a/mobile/res/xml/searchable.xml b/mobile/res/xml/searchable.xml new file mode 100644 index 00000000..19c27279 --- /dev/null +++ b/mobile/res/xml/searchable.xml @@ -0,0 +1,8 @@ + + + diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_DeviceAccountLogin.java b/mobile/src/com/cradle/iitc_mobile/IITC_DeviceAccountLogin.java index ba0ce3d1..db9511ff 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_DeviceAccountLogin.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_DeviceAccountLogin.java @@ -153,7 +153,7 @@ public class IITC_DeviceAccountLogin implements AccountManagerCallback { if (result != null) { // authentication succeded, we can load the given url, which will redirect back to the intel map mWebView.loadUrl(result); - mActivity.loginSucceded(); + mActivity.loginSucceeded(); } else { onLoginFailed(); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java index 8aff9177..e0dc6cff 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_JSInterface.java @@ -64,6 +64,13 @@ public class IITC_JSInterface { .show(); } + // exit IITC Mobile + @JavascriptInterface + public void exitIITC() { + Log.d("iitcm","no back stack...finishing iitc"); + ((IITC_Mobile) context).finish(); + } + // get layers and list them in a dialog @JavascriptInterface public void setLayers(String base_layer, String overlay_layer) { diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 2af11b89..1f86fe77 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -4,6 +4,7 @@ import java.io.IOException; import android.app.ActionBar; import android.app.Activity; +import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -16,7 +17,6 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.os.StrictMode; import android.preference.PreferenceManager; import android.util.Log; @@ -25,6 +25,7 @@ import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; import android.webkit.WebView; +import android.widget.SearchView; import android.widget.Toast; public class IITC_Mobile extends Activity { @@ -32,7 +33,6 @@ public class IITC_Mobile extends Activity { private static final int REQUEST_LOGIN = 1; private IITC_WebView iitc_view; - private boolean back_button_pressed = false; private OnSharedPreferenceChangeListener listener; private String intel_url = "https://www.ingress.com/intel"; private boolean user_loc = false; @@ -42,6 +42,7 @@ public class IITC_Mobile extends Activity { private boolean fullscreen_actionbar = false; private ActionBar actionBar; private IITC_DeviceAccountLogin mLogin; + private MenuItem searchMenuItem; @Override protected void onCreate(Bundle savedInstanceState) { @@ -98,7 +99,7 @@ public class IITC_Mobile extends Activity { } public void onStatusChanged(String provider, int status, - Bundle extras) { + Bundle extras) { } public void onProviderEnabled(String provider) { @@ -120,8 +121,17 @@ public class IITC_Mobile extends Activity { fullscreen_actionbar = sharedPref.getBoolean("pref_fullscreen_actionbar", false); + handleIntent(getIntent(), true); + } + + @Override + protected void onNewIntent(Intent intent) { + setIntent(intent); + handleIntent(intent, false); + } + + private void handleIntent(Intent intent, boolean onCreate) { // load new iitc web view with ingress intel page - Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { Uri uri = intent.getData(); @@ -133,7 +143,15 @@ public class IITC_Mobile extends Activity { Log.d("iitcm", "loading url..."); this.loadUrl(url); } - } else { + } else if (Intent.ACTION_SEARCH.equals(action)) { + String query = intent.getStringExtra(SearchManager.QUERY); + query = query.replace("'", "''"); + final SearchView searchView = + (SearchView) searchMenuItem.getActionView(); + searchView.setQuery(query, false); + searchView.clearFocus(); + iitc_view.loadUrl("javascript:search('" + query + "');"); + } else if (onCreate){ this.loadUrl(intel_url); } } @@ -216,29 +234,21 @@ public class IITC_Mobile extends Activity { this.toggleFullscreen(); return; } - if (this.back_button_pressed) { - super.onBackPressed(); - return; - } - iitc_view.loadUrl("javascript: window.goBack();"); - this.back_button_pressed = true; - Toast.makeText(this, "Press twice to exit", Toast.LENGTH_SHORT).show(); - - // reset back button after 0.5 seconds - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - back_button_pressed = false; - } - }, 500); } @Override 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); - + // Get the SearchView and set the searchable configuration + SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); + this.searchMenuItem = menu.findItem(R.id.menu_search); + final SearchView searchView = + (SearchView) searchMenuItem.getActionView(); + // Assumes current activity is the searchable activity + searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default return true; } @@ -246,63 +256,63 @@ 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 : + case R.id.reload_button: this.loadUrl(intel_url); actionBar.setTitle(getString(R.string.menu_map)); return true; - case R.id.toggle_fullscreen : + case R.id.toggle_fullscreen: toggleFullscreen(); return true; case R.id.layer_chooser: // the getLayers function calls the setLayers method of IITC_JSInterface iitc_view.loadUrl("javascript: window.layerChooser.getLayers()"); return true; - // get the users current location and focus it on map - case R.id.locate : + // get the users current location and focus it on map + case R.id.locate: iitc_view.loadUrl("javascript: window.show('map');"); iitc_view.loadUrl("javascript: window.map.locate({setView : true, maxZoom: 15});"); actionBar.setTitle(getString(R.string.menu_map)); return true; - // start settings activity - case R.id.action_settings : + // 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 : + case R.id.menu_info: iitc_view.loadUrl("javascript: window.show('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)); 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)); 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)); 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)); 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)); return true; - default : + default: return super.onOptionsItemSelected(item); } } @@ -377,12 +387,12 @@ public class IITC_Mobile extends Activity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { - case REQUEST_LOGIN : + case REQUEST_LOGIN: // authentication activity has returned. mLogin will continue authentication mLogin.onActivityResult(resultCode, data); break; - default : + default: super.onActivityResult(requestCode, resultCode, data); } } @@ -391,7 +401,7 @@ public class IITC_Mobile extends Activity { * called by IITC_WebViewClient when the Google login form is opened. */ public void onReceivedLoginRequest(IITC_WebViewClient client, WebView view, - String realm, String account, String args) { + String realm, String account, String args) { mLogin = new IITC_DeviceAccountLogin(this, view, client); mLogin.startLogin(realm, account, args); } @@ -399,7 +409,7 @@ public class IITC_Mobile extends Activity { /** * called after successful login */ - public void loginSucceded() { + public void loginSucceeded() { // garbage collection mLogin = null; } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java index b3a752a3..2a910f2a 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebView.java @@ -26,6 +26,7 @@ public class IITC_WebView extends WebView { // init web view private void iitc_init(Context c) { + if ( this.isInEditMode() ) return; settings = this.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); diff --git a/plugins/basemap-blank-tile.png b/plugins/basemap-blank-tile.png new file mode 100644 index 00000000..a3384955 Binary files /dev/null and b/plugins/basemap-blank-tile.png differ diff --git a/plugins/basemap-blank.user.js b/plugins/basemap-blank.user.js new file mode 100644 index 00000000..955e601a --- /dev/null +++ b/plugins/basemap-blank.user.js @@ -0,0 +1,51 @@ +// ==UserScript== +// @id iitc-plugin-basemap-blank@jonatkins +// @name IITC plugin: Blank map +// @version 0.1.0.@@DATETIMEVERSION@@ +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL @@UPDATEURL@@ +// @downloadURL @@DOWNLOADURL@@ +// @description [@@BUILDNAME@@-@@BUILDDATE@@] Add a blank map layer - no roads or other features. +// @include https://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @grant none +// ==/UserScript== + +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.mapTileBlank = function() {}; + +window.plugin.mapTileBlank.addLayer = function() { + + var blankOpt = {attribution: '', maxZoom: 20}; + var blank = new L.TileLayer('@@INCLUDEIMAGE:plugins/basemap-blank-tile.png@@', blankOpt); + + layerChooser.addBaseLayer(blank, "Blank Map"); +}; + +var setup = window.plugin.mapTileBlank.addLayer; + +// 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); diff --git a/plugins/basemap-cloudmade.user.js b/plugins/basemap-cloudmade.user.js new file mode 100755 index 00000000..b6857696 --- /dev/null +++ b/plugins/basemap-cloudmade.user.js @@ -0,0 +1,102 @@ +//****************************** +//****************************** +//******** INSTRUCTIONS ******** +//****************************** +//****************************** + +// 1. Go to the www.cloudmade.com website and register an account +// 2. Get an API Key +// 3. Edit the clode below, replace YOUR_API_KEY with the API key from CloudMade.com +// 4. Reload the page +// optional: browse their map styles, add/modify any you like to the cmStyles list + +// You take your own responsibility for any API key you register and use. Please read +// any relevant terms and conditions. At the time of writing, Cloudmade offer a reasonable +// number of free requests, which should be more than enough for personal use. You could +// probably share a key with a group of people without issues, but it is your responsibility +// to remain within any terms and usage limits. + +//****************************** +//****************************** +//****************************** + + +// ==UserScript== +// @id iitc-plugin-cloudmade-maps +// @name IITC plugin: CloudMade.com maps +// @version 0.0.1 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @description TEMPLATE PLUGIN - add back the CloudMade.com map layers. YOU WILL NEED TO EDIT THIS PLUGIN BEFORE IT WILL RUN +// @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== + +function wrapper() { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + + +// PLUGIN START //////////////////////////////////////////////////////// + +window.plugin.mapTileCloudMade = function() {}; + +window.plugin.mapTileCloudMade.setup = function() { + //********************************** + //********************************** + //**** CloudMade settings start **** + //********************************** + //********************************** + + //set this to your API key - get an API key by registering at www.cloudmade.com + //e.g. var cmApiKey = '8ee2a50541944fb9bcedded5165f09d9'; + var cmApiKey = 'YOUR_API_KEY'; + + //the list of styles you'd like to see + var cmStyles = { + '999': "Midnight", + '22677': "Minimal", + '78603': "Armageddon", + }; + + //********************************** + //********************************** + //**** CloudMade settings end **** + //********************************** + //********************************** + + + if(cmApiKey=='YOUR_API_KEY') { + dialog({title: 'CloudMade.com map plugin', text: 'The CloudMade.com plugin needs manual configuration. Edit the plugin code to do this.'}); + return; + } + + var osmAttribution = 'Map data © OpenStreetMap contributors'; + var cmOpt = {attribution: osmAttribution+', Imagery © CloudMade', maxZoom: 18, apikey: cmApiKey}; + + $.each(cmStyles, function(key,value) { + cmOpt['style'] = key; + var cmMap = new L.TileLayer('http://{s}.tile.cloudmade.com/{apikey}/{style}/256/{z}/{x}/{y}.png', cmOpt); + layerChooser.addBaseLayer(cmMap, 'CloudMade '+value); + }); + +}; + +var setup = window.plugin.mapTileCloudMade.setup; + +// 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); diff --git a/plugins/basemap-opencyclemap.user.js b/plugins/basemap-opencyclemap.user.js new file mode 100644 index 00000000..a024ec00 --- /dev/null +++ b/plugins/basemap-opencyclemap.user.js @@ -0,0 +1,58 @@ +// ==UserScript== +// @id iitc-plugin-basemap-opencyclepam@jonatkins +// @name IITC plugin: OpenCycleMap.org map tiles +// @version 0.1.0.@@DATETIMEVERSION@@ +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL @@UPDATEURL@@ +// @downloadURL @@DOWNLOADURL@@ +// @description [@@BUILDNAME@@-@@BUILDDATE@@] Add the OpenCycleMap.org map tiles as an optional layer +// @include https://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @grant none +// ==/UserScript== + +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.mapTileOpenCycleMap = function() {}; + +window.plugin.mapTileOpenCycleMap.addLayer = function() { + + //the Thunderforest (OpenCycleMap) tiles are free to use - http://www.thunderforest.com/terms/ + + osmAttribution = 'Map data © OpenStreetMap'; + var ocmOpt = {attribution: 'Tiles © OpenCycleMap, '+osmAttribution, maxZoom: 18}; + var ocmCycle = new L.TileLayer('http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', ocmOpt); + var ocmTransport = new L.TileLayer('http://{s}.tile2.opencyclemap.org/transport/{z}/{x}/{y}.png', ocmOpt); + var ocmLandscape = new L.TileLayer('http://{s}.tile3.opencyclemap.org/landscape/{z}/{x}/{y}.png', ocmOpt); + + layerChooser.addBaseLayer(ocmCycle, "Thunderforest OpenCycleMap"); + layerChooser.addBaseLayer(ocmTransport, "Thunderforest Transport"); + layerChooser.addBaseLayer(ocmLandscape, "Thunderforest Landscape"); +}; + +var setup = window.plugin.mapTileOpenCycleMap.addLayer; + +// 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); diff --git a/plugins/basemap-openstreetmap.user.js b/plugins/basemap-openstreetmap.user.js new file mode 100644 index 00000000..57122fb8 --- /dev/null +++ b/plugins/basemap-openstreetmap.user.js @@ -0,0 +1,55 @@ +// ==UserScript== +// @id iitc-plugin-basemap-openstreetpam@jonatkins +// @name IITC plugin: OpenStreetMap.org map tiles +// @version 0.1.0.@@DATETIMEVERSION@@ +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL @@UPDATEURL@@ +// @downloadURL @@DOWNLOADURL@@ +// @description [@@BUILDNAME@@-@@BUILDDATE@@] Add the native OpenStreetMap.org map tiles as an optional layer +// @include https://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @grant none +// ==/UserScript== + +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.mapTileOpenStreetMap = function() {}; + +window.plugin.mapTileOpenStreetMap.addLayer = function() { + + //OpenStreetMap tiles - we shouldn't use these by default - https://wiki.openstreetmap.org/wiki/Tile_usage_policy + // "Heavy use (e.g. distributing an app that uses tiles from openstreetmap.org) is forbidden without prior permission from the System Administrators" + + osmAttribution = 'Map data © OpenStreetMap contributors'; + var osmOpt = {attribution: osmAttribution, maxZoom: 18}; + var osm = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', osmOpt); + + layerChooser.addBaseLayer(osm, "OpenStreetMap"); +}; + +var setup = window.plugin.mapTileOpenStreetMap.addLayer; + +// 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); diff --git a/plugins/draw-tools.user.js b/plugins/draw-tools.user.js index 91f9d25d..44531abf 100644 --- a/plugins/draw-tools.user.js +++ b/plugins/draw-tools.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-draw-tools@breunigs // @name IITC plugin: draw tools -// @version 0.4.0.@@DATETIMEVERSION@@ +// @version 0.4.1.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -141,7 +141,7 @@ window.plugin.drawTools.boot = function() { }); //add the layer - window.addLayerGroup('Drawn Items', window.plugin.drawTools.drawnItems); + window.addLayerGroup('Drawn Items', window.plugin.drawTools.drawnItems, true); //place created items into the specific layer diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 9aed5f10..d096a6d4 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id max-links@boombuler // @name IITC plugin: Max Links -// @version 0.3.0.@@DATETIMEVERSION@@ +// @version 0.3.1.@@DATETIMEVERSION@@ // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ // @description [@@BUILDNAME@@-@@BUILDDATE@@] Calculates how to link the portals to create the maximum number of fields. @@ -117,7 +117,7 @@ window.plugin.maxLinks.setup = function() { window.plugin.maxLinks.updateLayer(); }); window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); - window.addLayerGroup('Maximum Links', window.plugin.maxLinks.layer); + window.addLayerGroup('Maximum Links', window.plugin.maxLinks.layer, false); } var setup = window.plugin.maxLinks.setup; diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js index 3b2013f3..9fc5fdbd 100644 --- a/plugins/player-tracker.user.js +++ b/plugins/player-tracker.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-player-tracker@breunigs // @name IITC Plugin: Player tracker -// @version 0.9.3.@@DATETIMEVERSION@@ +// @version 0.9.4.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -48,7 +48,7 @@ window.plugin.playerTracker.setup = function() { }}); plugin.playerTracker.drawnTraces = new L.LayerGroup(); - window.addLayerGroup('Player Tracker', plugin.playerTracker.drawnTraces); + window.addLayerGroup('Player Tracker', plugin.playerTracker.drawnTraces, true); map.on('layeradd',function(obj) { if(obj.layer === plugin.playerTracker.drawnTraces) { diff --git a/plugins/portals-list.user.js b/plugins/portals-list.user.js index 5fe38471..7f5f0b65 100644 --- a/plugins/portals-list.user.js +++ b/plugins/portals-list.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-portals-list@teo96 // @name IITC plugin: show list of portals -// @version 0.0.12.@@DATETIMEVERSION@@ +// @version 0.0.13.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -54,9 +54,13 @@ window.plugin.portalslist.getPortals = function() { //console.log('** getPortals'); var retval=false; + var displayBounds = map.getBounds(); + window.plugin.portalslist.listPortals = []; //get portals informations from IITC $.each(window.portals, function(i, portal) { + // eliminate offscreen portals (selected, and in padding) + if(!displayBounds.contains(portal.getLatLng())) return true; retval=true; var d = portal.options.details; diff --git a/website/page/home.php b/website/page/home.php index 7bdff5c4..07a8b8e1 100644 --- a/website/page/home.php +++ b/website/page/home.php @@ -13,22 +13,21 @@ offers many more features. It is available for

Latest news

-

2nd May 2013

-

-IITC version 0.11.3 has been released. This should vastly reduce the chance of getting REQUEST_FAILED errors -while scrolling/zooming the map frequently. The passcode redemption code has been updated, and there are improvements -to the URL link handling. The portals-list plugin has been updated, and bug fixes made to the -player tracker. A new plugin to show portal levels as numbers has been added too. -

-

-IITC Mobile 0.3.2 is also available. Along with the above, this includes a new option to show your current -position on the map. -

-

28th April 2013

+

22nd May 2013

-New website launched! A major revamp of the website has been made. Thanks to the various users who contributed -logos and site templates. +IITC version 0.12.0 has been released. This contains quite a few changes and new features, including +

    +
  • Portal highlighter system - and many portal highlighter plugins
  • +
  • Dialogs - can be kept open and dragged while viewing the map
  • +
  • Layers - the enabled layers are now remembered when you next load the intel site
  • +
  • Improved request limits - more improvements have been made in this area
  • +
  • Sync plugin - to sync data from the 'Keys' addon to multiple computers via Google Drive
  • +
  • ... and many other tweaks, bug fixes, etc
  • +
+IITC Mobile 0.4.0 is also released. THis has also had major work. Along with the above, it includes a +new in-app layer chooser and chat/map switcher, and authentication has been revamped to use the native +Android authentication rather than entering your password.

Older news diff --git a/website/page/mobile.php b/website/page/mobile.php index 51a8cbe3..a5af10dc 100644 --- a/website/page/mobile.php +++ b/website/page/mobile.php @@ -26,7 +26,6 @@ install from the link below.

IITC Mobile is still in the early stages of development. Many things do not yet work right. Major known issues are:

    -
  1. The layer chooser selects the first map layer every time it's opened.
  2. Some plugins do not work well, or at all, at this time.
  3. Serious issues exist on Android 4.0 devices. details.
  4. diff --git a/website/page/news.php b/website/page/news.php index 9084745f..fdec6933 100644 --- a/website/page/news.php +++ b/website/page/news.php @@ -1,5 +1,21 @@

    News

    +

    22nd May 2013

    +

    +IITC version 0.12.0 has been released. This contains quite a few changes and new features, including +

      +
    • Portal highlighter system - and many portal highlighter plugins
    • +
    • Dialogs - can be kept open and dragged while viewing the map
    • +
    • Layers - the enabled layers are now remembered when you next load the intel site
    • +
    • Improved request limits - more improvements have been made in this area
    • +
    • Sync plugin - to sync data from the 'Keys' addon to multiple computers via Google Drive
    • +
    • ... and many other tweaks, bug fixes, etc
    • +
    +IITC Mobile 0.4.0 is also released. THis has also had major work. Along with the above, it includes a +new in-app layer chooser and chat/map switcher, and authentication has been revamped to use the native +Android authentication rather than entering your password. +

    +

    2nd May 2013

    IITC version 0.11.3 has been released. This should vastly reduce the chance of getting REQUEST_FAILED errors