Merge branch 'gh-pages' of github.com:breunigs/ingress-intel-total-conversion into gh-pages

This commit is contained in:
Stefan Breunig 2013-03-07 13:05:03 +01:00
commit e12279cc1f
42 changed files with 424 additions and 791 deletions

110
README.md
View File

@ -1,112 +1,4 @@
ingress intel total conversion (IITC) ingress intel total conversion (IITC)
===================================== =====================================
Its annoying to extend the intel page with new features because the minified code makes it hard to grasp whats going on. Also, one has to play catch up each time Niantic put up a new version because all the variables might get new names. # [Documentation moved to the wiki. Please see there!](https://github.com/breunigs/ingress-intel-total-conversion/wiki#head)
So instead, heres a userscript that starts from scratch (click to zoom):
[![Screenshot of the total conversion in Johannesburg](https://iitcserv.appspot.com/screenshots/screen_small.png)](https://iitcserv.appspot.com/screenshots/screen.png)
Features / User Guide
---------------------
You already know you want it, why add a feature list here? Instead, [**read the user guide** for tricks and less obvious features](https://github.com/breunigs/ingress-intel-total-conversion/tree/gh-pages/USERGUIDE.md). If you have questions, the user guide will also likely answer them.
IITC can be [extended with the use of plugins](https://github.com/breunigs/ingress-intel-total-conversion/tree/gh-pages/plugins), so have a look at those if you want (or need) more.
Install
-------
Current version is 0.7.8. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md).
[**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js)
### Firefox
- Install [Greasemonkey](https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/) or [Scriptish](https://addons.mozilla.org/en-US/firefox/addon/scriptish/).
- Click install link: [install](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js)
- Confirm security question.
- Reload page.
*NoScript:* To make the script work whitelist at least these domains: `ingress.com github.com leafletjs.com googleapis.com`. If you want to see the cool font also whitelist `googleusercontent.com`.
### Chrome
- Install [Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo/details).
- Click install link: [install](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js)
- **Now beware:** a OK/cancel dialog pops up. It **does not** allow you to cancel the installation. Choose **OK** to install the script with Tampermonkey.
- Confirm once again.
- Reload page.
*Note:* Tampermonkey is optional. However, it offers auto-update, shows correct version numbers and installing user scripts is much easier. If you have installed the scripts directly into Chrome before, I recommend you switch to Tampermonkey. To do so, uninstall the IITC scripts and click each install link again. Follow the procedure explained above.
### Opera
- Download the script: [download](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js)
- put it into your user_js folder (thats `~/.opera/user_js` on Unix). If you cant find it [see Operas docs](http://www.opera.com/docs/userjs/using/#writingscripts).
- [visit `opera:config` and check `UserJavaScriptonHTTPS` or click here to take you there](opera:config#UserPrefs|UserJavaScriptonHTTPS).
- click save on the bottom of the settings page
- reload the Intel Map, no need to restart Opera
*Note*: You need to update the scripts manually.
[**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js)
Reporting Issues
----------------
[tutorial / guide / please read / **free candy**](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md#how-do-i-report-bugs)
How can I help? // Contribution
-------------------------------
First of all, its very nice you want to help. There are several equally important ways you can. Some require a technical background and some dont:
- **answering help requests:** often people are asking how to do specific things in bug reports or are asking for things that already exist. Kindly point them to what theyre looking for and maybe consider updating the user guide, if it lacks on that topic.
- **asking for more information:** Sometimes a bug report contains barely enough information to grasp whats going on. Ask the reporter for the parts that you believe might be helpful, like the browser used. Similarily, if someone requests a feature make sure the description is accurate. Depending on the request, a concrete proposal on how to display this to the user might be helpful.
- **finding bugs / regressions:** If you are closer to the development of IITC, its usually easier for you to spot misbehaviours or bugs that have been recently introduces. Opening tickets for those, ideally with a step by step guide to reproduce the issue is very helpful.
- **hacking / sending patches:** Of course, if you want to contribute source code to the project thats fine as well. Please [read HACKING.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md).
**So far, these people have contributed:**
[Bananeweizen](https://github.com/Bananeweizen),
[blakjakau](https://github.com/blakjakau),
[boombuler](https://github.com/boombuler),
[cmrn](https://github.com/cmrn),
[epf](https://github.com/epf),
[Fragger](https://github.com/Fragger),
[integ3r](https://github.com/integ3r),
[j16sdiz](https://github.com/j16sdiz),
[JasonMillward](https://github.com/JasonMillward),
[jonatkins](https://github.com/jonatkins),
[Merovius](https://github.com/Merovius),
[mledoze](https://github.com/mledoze),
[OshiHidra](https://github.com/OshiHidra),
[phoenixsong6](https://github.com/phoenixsong6),
[Pirozek](https://github.com/Pirozek),
[saithis](https://github.com/saithis),
[Scrool](https://github.com/Scrool),
[sorgo](https://github.com/sorgo),
[tpenner](https://github.com/tpenner),
[vita10gy](https://github.com/vita10gy),
[Xelio](https://github.com/Xelio),
[ZauberNerd](https://github.com/ZauberNerd),
[waynn](https://github.com/waynn)
Attribution & License
---------------------
This project is licensed under the permissive ISC license. Parts imported from other projects remain under their respective licenses:
- [autolink-js by Bryan Woods; MIT](https://github.com/bryanwoods/autolink-js)
- [load.js by Chris O'Hara; MIT](https://github.com/chriso/load.js)
- [leaflet.js; custom license (but appears free)](http://leafletjs.com/)
- [leaflet.draw.js; by jacobtoye; MIT](https://github.com/Leaflet/Leaflet.draw)
- [`leaflet_google.js` by Pavel Shramov; same as Leaftlet](https://github.com/shramov/leaflet-plugins) (modified, though)
- [jquery.qrcode.js by Jerome Etienne; MIT](https://github.com/jeromeetienne/jquery-qrcode)
- [oms.min.js by George MacKerron; MIT](https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet)
- StackOverflow-CopyPasta is attributed in the source; [CC-Wiki](https://creativecommons.org/licenses/by-sa/3.0/)
- all Ingress/Niantic related stuff obviously remains non-free and is still copyrighted by Niantic/Google

View File

@ -1,165 +1,4 @@
Userguide USER DOCUMENTATION MOVED
========= ====
table of contents: [All user documentation has been moved to the wiki. Please see there!](https://github.com/breunigs/ingress-intel-total-conversion/wiki/Userguide-\(Main-Vanilla-IITC\))
- [Installation](#installation)
- [General Usage](#general-usage)
- [Chat](#chat)
- [Map Display](#map-display)
- [Map Status / Updates](#map-status--updates)
- [Sidebar](#sidebar)
- [Bugs and help requests](#reporting-bugs--i-need-more-help)
- [Nightly Builds](#nightly-builds)
Installation
------------
[See main README.md file for browser specific instructions](https://github.com/breunigs/ingress-intel-total-conversion#install).
General Usage
-------------
- many things have more information in tooltips. Let your cursor rest over stuff to show the tooltip. *Hint:* your cursor changes into a question mark / help cursor if theres a tooltip available.
- single left click on portals to show details.
- double left click on portals to zoom in to them.
Chat
----
The chat is split up into several categories. It usually only shows messages for the current map view. It may lag behind if Niantics servers are slow. It also has a minimum radius of six km. This means that even if you zoom in very much, it will still show messages from a larger area around you.
**The chat categories are:**
- full: shows all automated messages *(23:57 \<apj\> destroyed an L3 Resonator on Two Spikes)*
- compact: shows only the latest automated message per user
- public: shows user generated public messages (both Enlightened and Resistance can read it)
- faction: shows messages for own faction (e.g. only Resistance can read Resistance messages)
**Posting messages:**
- You can post in the faction and public categories only.
- Your message will be tagged with the coordinates in the center of the map.
- Your zoom level does not matter. Zooming out will not show your messages to more users.
Map Display
-----------
You can customize many aspects of how the map is rendered in the layer chooser.
**Layer Chooser:**
The layer chooser is available from the icon in the top right corner, left of the sidebar. The top entries are background maps and you can only have one of them active at a time. The entries on the bottom can be displayed in any combination you like. *Hint:* (NIGHLTY ONLY) Modifier-click an entry to quickly hide all other layers. The modifier may be either of these: shift, ctrl, alt, meta. Modifier-click the entry again to select all layers.
**Background / Street Map / Base Layer:**
All these refer to the same thing. The base layer is stored across sessions. The default one uses OpenStreetMap data with a style that resembles the default Ingress one. There are other styles available.
The layers from Google Maps are available as well. Google requires that their maps are only displayed with their tools. Therefore they cannot be as tightly integrated as the OpenStreetMap ones. Thats the reason why they lag behind when zooming or dragging the map.
**Portals:**
You can filter portals by level. Select the ones you want to see in the layer chooser. If lower level portals are striked-through, this means you need to zoom in further to see them. This is a server limitation, not one in IITC. Your settings are discarded after a reload.
**Resonators:**
Resonators are shown at their actual positions if you zoom in close enough. They become lighter the less energy they have left. They are color coded to show their level.
**Fields / Links:**
They are handled the same way portals are, see above.
**Other:**
When you select a portal its outer ring becomes red. Theres also a small yellow circle around it which depicts the hack range. You need to be in hack range to hack the portal or upgrade its resonators or mods.
If you are zoomed out quite a bit, theres a larger red circle. This is the link range. Only portals within this link range can be linked while standing at the selected portal. [Click the range in the sidebar to zoom to link range for the selected portal](#random-details).
**Note** that plugins may also add themselves to the layer chooser.
Map Status / Updates
--------------------
It shows if there are operations currently pending. This includes chat updates as well as map data requests. Updates happen every 45s to 90s, depending on how far zoomed in you are. Zoom in closer for faster updates.
It also shows which portals are being loaded/shown. Zoom in to see lower level portals. This is a limit of both the server and IITC. The server will only send low level portals if zoomed in enough. IITC will only show low level portals if there are few enough to not hit the render limit. The render limit is required, otherwise the map would be veryslow. Portals levels that cannot be shown are also striked through in the layer chooser.
**Failures:** If a data request failed, it is retried once. Only if the retry fails as well, a “failure” message is shown in the map status. You can either wait for the next automatic update or move the map a little. Also try to zoom in to request less data, which makes it less likely that the servers fail. The failure counter is reset on the next auto update or if you move the map.
**Render Limit:** The script tries to stay responsive. If too much data needs to be rendered, this cannot be guaranteed. Instead it will simply stop drawing portals/links/fields and show “render limit” in the map status. Zoom in to solve this.
Sidebar
-------
The sidebar is mainly used to show game stats and portal details. However, it also allows you to perform certain actions.
### General usage:
- single click a portal to show details about it in the sidebar.
- the portal information is updated automatically, as long as the selected portal is kept in view and you do not zoom out too much.
- the sidebar may be collapsed. Click the triangle button that stands out at the left hand side.
- the sidebar **can be scrolled** if your screen is too small. Use your scroll wheel.
- almost everything has tooltips. See [General usage](#general-usage) above.
### Details:
Starting from the top, the sidebar shows this information:
#### logged in user, global MU, search
- Details about you, the logged in user. This is only updated if you reload the page. This is a limitation of Ingress, not IITC.
- it shows your current level followed by your nickname
- hovering over your nickname allows you to sign out (NIGHTLY ONLY)
- to the right, it shows to percentages. The upper one, e.g. “XM: 37%” tells you how much your XM bar is filled. The lower one, e.g. “level: 37%“ tells you that you have gathered 37% of the AP required for the next level. It shows “max level” if you have reached max level.
- the tooltip mainly shows you absolute numbers instead of percentages. It also shows how many invites you have.
- The next bar is a visual representation of global MindUnits (MU) per faction. It is updated every now and then. The tooltip shows the absolute MU count per faction.
- Search Location: You can search for continents, countries, cities or street addresses. If there is at least one result your are taken to the most likely immediately. There is no feedback if the entered location was not found. Rule of thumb: if it takes longer than three seconds, try again. [Read about supported formats in the user guide for this service](https://wiki.openstreetmap.org/wiki/Nominatim).
#### Portal details.
- Portal name, may be abbreviated by the server if its too long.
- Portal image. Can be clicked to show the full image. The tooltip shows street address and postal code for the portal. It may also show attribution data for the portal image, if available.
- Portal level is located in the upper right corner and may overlay the image.
- Portal mods are shown in right below the portal image. An empty box means that this slot is free and no mod is installed. Otherwise the name of the installed mod is displayed. The color depends on the rare-ness of the mod. Each slot has its own tooltip that shows mod specific details and who installed it.
##### “random details”
“Random Details” are displayed in four columns. The outer ones show the data while the inner ones are the titles.
- owner: who deployed the first resonator after it has been neutral/unclaimed.
- since: when was the first resonator deployed after it has been neutral/unclaimed. The reasonators decay every 24hrs from capture. Move the cursor over it to show the full date time.
- range: shows how far links made from this portal can be. Click on the value to zoom out to link range. The red circle shows how far links may reach.
- energy: shows current and maximum energy if fully charged. The tooltip contains the exact numbers.
- links: shows incoming and outgoing links. The tooltip explains the icons.
- reso dist: shows the average distance the resonators have to the portal.
- fields: how many fields are connected to this portal
- AP Gain: estimate of how many AP you gain if you take down this portal and deploy resonators of your own faction. Tooltip breaks this number down into parts.
##### Resonators
The nickname to the left and right show who deployed this resonator. The bars in the middle indicate the charge of each resonator. The color depends on the level, which is also shown in the bar. The tooltip repeats some of that data along with other details. The top left resonator is the north one, top right is north east and so on. They are roughly ordered like they appear on a normal map:
```
N NE
NW E
W SE
SW S
```
#### portal related links
- Portal link: use it show others a portal. IITC users will automatically zoomed to the location and shown portal details as soon as theyre available. Vanilla map users will only be zoomed to location.
- Report issue: redirects you to Niantic report issue page. Allows you to copy all required information before going there.
- poslinks: Shows you a QR-Code containing the geolocation of the portal as well as a link for Google Maps and Openstreetmap. If your QR-Code App supports GEO-codes (most do) you can scan it and pass the portal location directly to a routing-app.
#### Redeeming, General Links and functions
- Redeem code: allows you to redeem codes to receive goodies. If you copied them from the Internet, they are probably invalid already.
- Toolbox: plugins may add links here. The default ones are:
- permalink. use it to show your current map view to others. Does not select a portal. Works with the normal intel map, too.
- IITCs page. Visit our homepage. Be in awe. Drool.
Reporting Bugs / I need more help
---------------------------------
[Please read the “how do I report bugs” here](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md#how-do-i-report-bugs).
Nightly Builds
--------------
You can always find the latest nightly build under this URL: [https://iitcserv.appspot.com/iitc-nightly/iitc-nightly-latest.user.js](https://iitcserv.appspot.com/iitc-nightly/iitc-nightly-latest.user.js). Note that it does *not* update to nightly, but to the next release version instead. In other words, you are always lead back to main unless you manually install the nightly version each time. [You can find older nightly builds in the same folder](https://iitcserv.appspot.com/iitc-nightly/), which may be useful if you want to track down when something broke for you (called “bisecting”).

9
mobile/.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
.classpath
.project
.settings/
assets/
bin/
gen/
libs/
proguard-project.txt
local.properties

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cradle.iitc_mobile"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ingress_iitc"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.cradle.iitc_mobile.IITC_Mobile"
android:theme="@android:style/Theme.NoTitleBar"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>AppTemplate</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jakbox.ingressTC"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="14" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:hardwareAccelerated="false"
android:largeHeap="false"
android:debuggable="true">
<activity
android:label="@string/app_name"
android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

File diff suppressed because one or more lines are too long

View File

@ -1,6 +0,0 @@
/** Automatically generated file. DO NOT MODIFY */
package com.jakbox.ingressTC;
public final class BuildConfig {
public final static boolean DEBUG = true;
}

View File

@ -1,27 +0,0 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.jakbox.ingressTC;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class raw {
public static final int loader=0x7f040000;
}
public static final class string {
public static final int app_name=0x7f050000;
public static final int first_page=0x7f050001;
public static final int jakboxBootLoader=0x7f050002;
}
}

View File

@ -1,40 +0,0 @@
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/first_page" />
</LinearLayout>

View File

@ -1,13 +0,0 @@
function rebuildUI() {
if(window.UIDone == true) { return; }
if(!document.getElementById("map_canvas")) {
setTimeout(rebuildUI, 50);
return;
} else {
window.UIDone = true;
}
window.console.log(window.deviceID);
window.loadJS("http://mathphys.fsk.uni-heidelberg.de:8000/test.js")
//window.Android.TCReady();
}
rebuildUI();

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Ingress Intel Total Conversion</string>
<string name="first_page">Connecting to Ingress Intel Map ... </string>
<string name="jakboxBootLoader">
bootLoader = function() {
if(document.getElementById(\"map_canvas\")) {
window.stop();
document.body.innerHTML = "";
} else {
setTimeout(bootLoader, 50);
}
};
setTimeout(bootLoader, 5);
</string>
</resources>

View File

@ -1,149 +0,0 @@
/********************************************************************************
Ingress Intel Total Converion - Mobile & Tablet
Android WebView wrapper/loader for iitc (ingress intel total conversion)
iitc source @ https://github.com/breunigs/ingress-intel-total-conversion
Original Author: Jason Grima - jason@jakbox.net
*********************************************************************************/
package com.jakbox.ingressTC;
import android.app.*;
import android.os.*;
import android.content.Context;
import android.view.*;
import android.widget.*;
import android.webkit.*;
import android.provider.Settings.Secure;
import android.util.Log;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.lang.StringBuffer;
public class MainActivity extends Activity
{
WebView web; // webview to hold the ingress site (and login etc)
WebView splash; // splash screen, just a bit of pretty
MyChrome chrome; // for logging, progress, etc
MyClient client; // for controlling the webview's
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE); // hide the app title bar, Xeen requested
super.onCreate(savedInstanceState);
// little animated title/splash page for IngressIntelTC
// separate webview so we can be loading stuff in the background
JSInterface js = new JSInterface(this, this); //js.setActivity(this);
this.splash = new WebView(this);
splash.getSettings().setJavaScriptEnabled(true); // because we use JS to trigger the CSS animation
splash.getSettings().setAllowFileAccess(true); // because the splash page is store in the apk
splash.getSettings().setAllowFileAccessFromFileURLs(true); // in case we add more scripts/images to the splash page
splash.loadUrl("file:///android_asset/js/ingressSplash.html"); // there is is!
splash.addJavascriptInterface(js, "android");
setContentView(splash);
// righto, load the the website (ingress.com/intel) with a bunch of permissions that may/or not be needed
this.web = new WebView(this);
this.client = new MyClient();
web.setWebViewClient(this.client);
web.getSettings().setJavaScriptEnabled(true);
web.getSettings().setGeolocationEnabled(true);
web.getSettings().setAllowFileAccess(true);
web.getSettings().setAllowFileAccessFromFileURLs(true);
web.getSettings().setDatabaseEnabled(true);
web.getSettings().setDomStorageEnabled(true);
web.getSettings().setGeolocationEnabled(true);
this.chrome = new MyChrome(); // the chrome let's us get console and progress feedback from the page
web.setWebChromeClient(this.chrome);
web.addJavascriptInterface(js, "android"); // ready to go
}
public void onRestoreInstanceState(Bundle state) {
this.splash.restoreState(state);
this.web.restoreState(state);
}
public void onSaveInstanceState(Bundle state) {
this.splash.saveState(state);
this.web.saveState(state);
}
public void showWeb() { setContentView(web); splash.destroy(); Log.d("com.jakbox.ingressTC", "Flipping to web/ingress view"); }
public void showSplash() { setContentView(splash); web.destroy(); Log.d("com.jakbox.ingressTC", "Flipping to splash/loading"); }
final class JSInterface {
Context context; MainActivity act;
public JSInterface (Context c, MainActivity a) { this.context = c; this.act = a; }
public void setActivity(MainActivity a) { this.act = a; }
// the @JavascriptInterface is needed for 4.2 devices to access this
@JavascriptInterface
public void pageReady(int ready) {
if(ready != 0) {
// the loader reports we're good to go, switch to ingress webview
this.act.runOnUiThread(new Runnable() {
public void run() { showWeb(); }
});
} else {
// the loader reports we're not ready, switch to splash page
this.act.runOnUiThread(new Runnable() {
public void run() { showSplash(); }
});
}
}
@JavascriptInterface
public void loadBehind(final String url) {
this.act.runOnUiThread(new Runnable() {
public void run() {
Log.d("com.jakbox.ingressTC", "Loading (Ingress?) website in back webview");
web.loadUrl(url); /* push the url to the webview */ }
});
}
}
private class MyClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView web, String Url) {
return false;
}
@Override
public void onPageFinished(WebView web, String Url) {
// here we conditionally load some external javascript
Log.d("com.jakbox.ingressTC", "Page loading, injecting IITC JS");
if(web.getUrl().contains("ingress.com/intel")) {
// if NOT ingress, we may have been redirected to the google auth/login page
web.loadUrl("javascript: window.stop(); ");
// first stop the page from loading too much
web.loadUrl("javascript: window.deviceID='"+Secure.getString(getContentResolver(), Secure.ANDROID_ID)+"'; ");
// create a JS loader on the page
web.loadUrl("javascript: if(!window.loadJS) { window.loadJS = function(scr) { var s = document.createElement('script'); s.src = scr+(scr.indexOf('file:///')==-1?'?ts="+System.currentTimeMillis()+"':''); s.type = 'text/javascript'; s.async = true; var st = document.getElementsByTagName('script')[0]; st.parentNode.insertBefore(s, st); } };");
// actually hijack the page... if it's the right page... let the loader deal with that
// should pull this loader into a local resource, maybe...
// running it from the web for now ...
web.loadUrl("javascript: if(!window.hijacked) { window.loadJS('http://mathphys.fsk.uni-heidelberg.de:8000/bootstrap.js'); window.hijacked = true;}");
}
}
}
private class MyChrome extends WebChromeClient {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
// Always grant permission since the app itself requires location
// permission and the user has therefore already granted it
callback.invoke(origin, true, false);
}
public boolean onConsoleMessage(ConsoleMessage cm) {
// log window.console stuff into the syslog for ADB output
Log.d("com.jakbox.ingressTC", cm.message() + " -- "
+ (cm.sourceId()==null?"main document":cm.sourceId())
+ ":Line " + cm.lineNumber() );
return true;
}
}
}

View File

@ -43,10 +43,10 @@ How do I…?
- **Login:** on tablets, this should just work. On smartphones youll see a black screen with some blue lines. This is the normal Ingress login page and you need to scroll to see the login button. - **Login:** on tablets, this should just work. On smartphones youll see a black screen with some blue lines. This is the normal Ingress login page and you need to scroll to see the login button.
- **Clear Data/Cache:** Open app launcher and find the IITCM icon. Press-and-hold and then drag it to “App Info” on the top right of the screen. Theres a “clear data” and “clear cache” button. - **Clear Data/Cache:** Open app launcher and find the IITCM icon. Press-and-hold and then drag it to “App Info” on the top right of the screen. Theres a “clear data” and “clear cache” button.
- **Logout:** Not possible from within the app. See *Clear Data/Cache* and use “clear data”. - **Logout:** Not possible from within the app. See *Clear Data/Cache* and use “clear data”.
- **Reload:** Not possible from within the app. Instead, open your recent applications and force close IITCM. It should reload after restarting. - **Reload:** Settings -> Reload IITC.
- **“Your account has not been enabled to play Ingress“**: See *Reload*. - **“Your account has not been enabled to play Ingress“**: See *Reload*.
- **Install:** You can find this out yourself. If you dont know how, then please wait for a more polished version of IITCM. - **Install:** You can find this out yourself. If you dont know how, then please wait for a more polished version of IITCM.
- **Update:** You can check if theres a new APK build by looking at the [apk_version](https://github.com/breunigs/ingress-intel-total-conversion/raw/gh-pages/mobile/apk_version file)[.](https://mathphys.fsk.uni-heidelberg.de/~stefan/test/IngressIntelTC.apk) It contains the date of the last update. The app uses the latest IITC hourly build automatically. You may need to clear your cache to force a reload, see *Clear Data/Cache*. Also note that the dot after “apk_version” is the download link to the APK. - **Update:** You can check if theres a new APK build by looking at [our appspot](https://iitcserv.appspot.com/mobile/). It contains the date of the last update. The app uses the latest IITC hourly build automatically. You may need to clear your cache to force a reload, see *Clear Data/Cache*.
How does this basically work? How does this basically work?
----------------------------- -----------------------------
@ -66,10 +66,17 @@ Debugging IITC(M) **before** it has booted requires the Android Developer Tools.
Building the APK Building the APK
---------------- ----------------
No idea. Please write docs and send patches. - **Eclipse:** Just import this project and klick the build button.
- **ant:**
Set the ANDROID_HOME environment variable
`export ANDROID_HOME=/path/to/android_sdk`
Build the project with ant
`ant debug`
Download APK Download APK
------------ ------------
https://iitcserv.appspot.com/mobile/IITC-Mobile-latest.apk
Well, glad you read to the end. Enjoy and send patches, bug reports, postcards and love. (If you are wondering where the download link is, Im wondering if you have actually read the page.) Well, glad you read to the end. Enjoy and send patches, bug reports, postcards and love. (If you are wondering where the download link is, Im wondering if you have actually read the page.)

View File

@ -1 +0,0 @@
0.1-2013-02-23

59
mobile/bootstrap.js vendored
View File

@ -1,59 +0,0 @@
var rebuidAttemptCount=0;
var iitcReadyCount=0;
var iitcURL;
function rebuildUI() {
// this is sub-optimal, but we need a way to know if we're on a login page, or the real page.
if(document.getElementById('dashboard_container')) {
var dash = document.getElementById('dashboard_container');
// dashboard is there, not conclusive
if(dash.childNodes[0].innerHTML == 'Welcome to Ingress') {
// not really 'ready', but the user needs the page for login purposes
android.pageReady(1);
return;
} else if(!document.getElementById('map_canvas')) {
// not loaded yet? we'll wait
if(rebuidAttemptCount < 10) { // wait up to 5 seconds, then assume failure and show the page
setTimeout(rebuildUI, 500);
rebuidAttemptCount++;
if(window.console) { console.log('Looking for Ingress Intel UI elements: ' + rebuidAttemptCount); }
return;
} else {
if(window.console) { console.log('Something is wrong, flipping views'); }
android.pageReady(1);
return;
}
} else {
window.UIDone = true;
}
window.console.log(window.deviceID);
window.console.log(navigator.userAgent);
switch(window.deviceID) {
case '41ddb619ea1fe75a': // blakjakau - TABLET
iitcURL = 'http://mathphys.fsk.uni-heidelberg.de:8000/test.js';
break;
case 'f30c2cce86c1c7': // breunigs
iitcURL = 'http://mathphys.fsk.uni-heidelberg.de:8000/test.js';
break;
default:
iitcURL = 'http://mathphys.fsk.uni-heidelberg.de:8000/test.js';
}
window.loadJS(iitcURL); // load iitc and let it do its thing.
window.iitcReadyTimer = setInterval(function() {
if(window.iitcLoaded == true || iitcReadyCount > 10) {
//wait up to 10 seconds from calling iitc to fliping the webviews
//if for some reason iitc isn't loading, the user will just get the vanila ingres.com/intel experience
try {
android.pageReady(1); // tell the app to flip the webviews
clearInterval(window.iitcReadyTimer); // and we're done.
} catch(e) { if(window.console) { console.log(e.message); } }
}
iitcReadyCount++;
}, 500);
}
}
rebuildUI();

92
mobile/build.xml Normal file
View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="IITC_Mobile" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- if sdk.dir was not set from one of the property file, then
get it from the ANDROID_HOME env var.
This must be done before we load project.properties since
the proguard config can use sdk.dir -->
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<!--
Import per project custom build rules if present at the root of the project.
This is the place to put custom intermediary targets such as:
-pre-build
-pre-compile
-post-compile (This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir})
-post-package
-post-build
-pre-clean
-->
<import file="custom_rules.xml" optional="true" />
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

6
mobile/lint.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="SetJavaScriptEnabled">
<ignore path="src/com/cradle/ittc_mobile/iitc_webview.java" />
</issue>
</lint>

View File

@ -3,9 +3,12 @@
# #
# This file must be checked in Version Control Systems. # This file must be checked in Version Control Systems.
# #
# To customize properties used by the Ant build system use, # To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your # "ant.properties", and override values to adapt the script to your
# project structure. # project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target. # Project target.
target=android-10 target=android-17

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<com.cradle.iitc_mobile.IITC_WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

7
mobile/res/menu/main.xml Normal file
View File

@ -0,0 +1,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/reload_button"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/reload"></item>
</menu>

View File

@ -0,0 +1,8 @@
<resources>
<!--
Customize dimensions originally defined in res/values/dimens.xml (such as
screen margins) for sw600dp devices (e.g. 7" tablets) here.
-->
</resources>

View File

@ -0,0 +1,9 @@
<resources>
<!--
Customize dimensions originally defined in res/values/dimens.xml (such as
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
-->
<dimen name="activity_horizontal_margin">128dp</dimen>
</resources>

View File

@ -0,0 +1,11 @@
<resources>
<!--
Base application theme for API 11+. This theme completely replaces
AppBaseTheme from res/values/styles.xml on API 11+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
<!-- API 11 theme customizations can go here. -->
</style>
</resources>

View File

@ -0,0 +1,12 @@
<resources>
<!--
Base application theme for API 14+. This theme completely replaces
AppBaseTheme from BOTH res/values/styles.xml and
res/values-v11/styles.xml on API 14+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
</style>
</resources>

View File

@ -0,0 +1,7 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">IITC mobile</string>
<string name="action_settings">Settings</string>
<string name="reload">Reload IITC</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
</resources>

View File

@ -0,0 +1,92 @@
package com.cradle.iitc_mobile;
import com.cradle.iitc_mobile.R;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.webkit.WebChromeClient;
import android.widget.Toast;
public class IITC_Mobile extends Activity {
private IITC_WebView iitc_view;
private boolean back_button_pressed = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// we do not want to reload our page every time we switch orientations...
// so restore state if activity was already created
if(savedInstanceState != null) {
((IITC_WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}
else {
// load new iitc web view with ingress intel page
iitc_view= (IITC_WebView) findViewById(R.id.webview);
iitc_view.setWebChromeClient(new WebChromeClient());
iitc_view.loadUrl("https://www.ingress.com/intel");
// listen to touches (think we need this)
iitc_view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
back_button_pressed = false;
// return false to indicate, that we don't consumed this event. this leads
// to the execution of our touch event
return false;
}
});
}
}
// save instance state to avoid reloading on orientation change
@Override
protected void onSaveInstanceState(Bundle outState) {
iitc_view.saveState(outState);
}
// we want a self defined behavior on resume
@Override
protected void onResume() {
super.onResume();
this.back_button_pressed = false;
}
// we want a self defined behavior for the back button
@Override
public void onBackPressed() {
if (this.back_button_pressed) {
super.onBackPressed();
return;
}
this.back_button_pressed = true;
Toast.makeText(this, "Press twice to exit", Toast.LENGTH_SHORT).show();
}
@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);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.reload_button:
iitc_view.reload();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

View File

@ -0,0 +1,46 @@
package com.cradle.iitc_mobile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebSettings;
import android.webkit.WebView;
@SuppressLint("SetJavaScriptEnabled")
public class IITC_WebView extends WebView {
private WebSettings settings;
private IITC_WebViewClient webclient;
// init web view
private void iitc_init() {
settings = this.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
settings.setAllowFileAccess(true);
webclient = new IITC_WebViewClient();
this.setWebViewClient(webclient);
}
// constructors -------------------------------------------------
public IITC_WebView(Context context) {
super(context);
iitc_init();
}
public IITC_WebView(Context context, AttributeSet attrs) {
super(context, attrs);
iitc_init();
}
public IITC_WebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
iitc_init();
}
//----------------------------------------------------------------
}

View File

@ -0,0 +1,37 @@
package com.cradle.iitc_mobile;
import android.net.http.SslError;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class IITC_WebViewClient extends WebViewClient {
// enable https
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed() ;
};
// injecting IITC when page is loaded
@Override
public void onPageFinished(WebView web, String Url) {
Log.d("loading finish", web.getUrl());
if (web.getUrl().contains("ingress.com/intel") && !web.getUrl().contains("accounts")) {
// first check for cookies, than inject javascript
// this enables the user to login if necessary
CookieManager cm = CookieManager.getInstance();
final String cookie = cm.getCookie("https://www.ingress.com/intel");
if(cookie != null) {
web.loadUrl("javascript: (function() { "
+ "var script=document.createElement('script');"
+ "script.type='text/javascript';"
+ "script.src='https://iitcserv.appspot.com/iitc-nightly/iitc-nightly-latest.user.js';"
+ "document.getElementsByTagName('head').item(0).appendChild(script);"
+ "})()");
}
}
}
}

View File

@ -1,30 +1,9 @@
Plugins USER DOCUMENTATION MOVED!
======= =========================
Install [The plugins list has been moved to the wiki. Please see there!](https://github.com/breunigs/ingress-intel-total-conversion/wiki/Plugins)
-------
Plugins are installed the same way the total conversion script is. Please see there for specific instructions for your browser.
Available Plugins
-----------------
- [**Compute AP Stats**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute-ap-stats.user.js) Shows the potential AP an agent could obtain by destroying and rebuilding all the portals in the current zoom area.
- [**Draw Tools**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js) allows to draw circles and lines on the map to aid you with planning your next big field. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_draw_tools.png)
- [**Guess Player Level**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js) looks for the highest placed resonator per player in the current view to guess the player level.
- [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. Red, needs energy and shields. Orange, only needs energy (either recharge or resonators). Yellow, only needs shields.
- [**Max-Links**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_max_links.png)
- [**Player Tracker**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js) Draws trails for user actions in the last hour. At the last known location theres a tooltip that shows the data in a table. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_player_tracker.png).
- [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs.
- [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier.
- [**Resonator Energy in Portal Detail**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/reso-energy-pct-in-portal-detail.user.js) Resonator energy in percent is displayed in the portal detals.
- [**Scale Bar**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/scale-bar.user.js) Shows a scale bar in the top left corner. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_scale_bar.png)
- [**Show Portal Address**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-address.user.js) Shows portal address in the side panel.
### available only with the development version
[Read HACKING.md file](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md#hacking) to learn how to build the development version yourself. If **and only if** [you have read how to report bugs](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md#how-do-i-report-bugs), you may beta test the [nightly](https://www.dropbox.com/sh/lt9p0s40kt3cs6m/3xzpyiVBnF) version.
What follows is developer documentation only.