diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml
index e0d90dd8..1c9e3220 100644
--- a/mobile/.idea/misc.xml
+++ b/mobile/.idea/misc.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml
index f535fe6b..5a40f525 100644
--- a/mobile/AndroidManifest.xml
+++ b/mobile/AndroidManifest.xml
@@ -1,8 +1,8 @@
+ android:versionCode="27"
+ android:versionName="0.4.6">
UI
Misc
- Plugins
+ IITC Plugins
Available plugins
Display user location
Show users position on map
diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml
index 57f2c2b7..09251435 100644
--- a/mobile/res/xml/preferences.xml
+++ b/mobile/res/xml/preferences.xml
@@ -42,10 +42,9 @@
android:title="@string/pref_select_iitc"
android:summary="Load IITC main script from url or use local script. Currently used source: "
android:defaultValue="local"/>
-
+
asset_list = new ArrayList();
- ArrayList asset_values = new ArrayList();
-
- 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");
- } catch (IOException e2) {
- // TODO Auto-generated catch block
- e2.printStackTrace();
- }
- if (s != null)
- src = s.hasNext() ? s.next() : "";
- String plugin_name = getPluginName(src);
- asset_list.add(plugin_name);
- // real value
- asset_values.add(asset_array[i]);
- }
-
- // load additional plugins from /IITC_Mobile/plugins/
- String iitc_path = Environment.getExternalStorageDirectory().getPath()
- + "/IITC_Mobile/";
- File directory = new File(iitc_path + "plugins/");
- File[] files = directory.listFiles();
- if (files != null) {
- Scanner s = null;
- String src = "";
- for (int i = 0; i < files.length; ++i) {
- try {
- s = new Scanner(files[i]).useDelimiter("\\A");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- Log.d("iitcm", "failed to parse file " + files[i]);
- }
- if (s != null)
- src = s.hasNext() ? s.next() : "";
- String plugin_name = getPluginName(src);
- asset_list.add("[User] " + plugin_name);
- // real value
- asset_values.add(files[i].toString());
- }
- }
+ getActionBar().setTitle("IITC Mobile Settings");
+ getActionBar().setHomeButtonEnabled(true);
+ // iitc version
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]));
settings.setArguments(bundle);
// Display the fragment as the main content.
@@ -92,30 +25,12 @@ public class IITC_Settings extends Activity {
.replace(android.R.id.content, settings).commit();
}
- // parse header for @name of plugin
- public String getPluginName(String src) {
- 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//", " ");
- // get a list of key-value...split on multiple spaces
- String[] attributes = header.split(" +");
- 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];
- }
- return plugin_name;
- }
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// exit settings when home button (iitc icon) is pressed
case android.R.id.home :
- this.finish();
+ onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java b/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java
index 3859a5f4..354af173 100644
--- a/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java
+++ b/mobile/src/com/cradle/iitc_mobile/IITC_SettingsFragment.java
@@ -3,13 +3,22 @@ package com.cradle.iitc_mobile;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.AssetManager;
import android.os.Bundle;
+import android.os.Environment;
+import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
-import android.preference.MultiSelectListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Scanner;
public class IITC_SettingsFragment extends PreferenceFragment {
@@ -24,10 +33,7 @@ public class IITC_SettingsFragment extends PreferenceFragment {
addPreferencesFromResource(R.xml.preferences);
// plugins
- MultiSelectListPreference pref_plugins = (MultiSelectListPreference) findPreference("pref_plugins");
- pref_plugins.setEntries(getArguments().getStringArray("ASSETS"));
- pref_plugins
- .setEntryValues(getArguments().getStringArray("ASSETS_VAL"));
+ setUpPluginPreferenceScreen();
// set build version
ListPreference pref_build_version = (ListPreference) findPreference("pref_build_version");
@@ -64,4 +70,117 @@ public class IITC_SettingsFragment extends PreferenceFragment {
+ pref_iitc_source.getText();
pref_iitc_source.setSummary(pref_iitc_source_sum);
}
+
+ void setUpPluginPreferenceScreen() {
+ PreferenceScreen root = (PreferenceScreen) findPreference("pref_plugins");
+ // alphabetical order
+ root.setOrderingAsAdded(false);
+ root.setPersistent(true);
+
+ // get all plugins from asset manager
+ AssetManager am = this.getActivity().getAssets();
+ String[] asset_array = null;
+ try {
+ asset_array = am.list("plugins");
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ 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");
+ } catch (IOException e2) {
+ // TODO Auto-generated catch block
+ e2.printStackTrace();
+ }
+ if (s != null)
+ src = s.hasNext() ? s.next() : "";
+ // now we have all stuff together and can build the pref screen
+ addPluginPreference(root, src, asset_array[i], false);
+ }
+
+ // load additional plugins from /IITC_Mobile/plugins/
+ String iitc_path = Environment.getExternalStorageDirectory().getPath()
+ + "/IITC_Mobile/";
+ File directory = new File(iitc_path + "plugins/");
+ File[] files = directory.listFiles();
+ if (files != null) {
+ Scanner s = null;
+ String src = "";
+ for (int i = 0; i < files.length; ++i) {
+ try {
+ s = new Scanner(files[i]).useDelimiter("\\A");
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ Log.d("iitcm", "failed to parse file " + files[i]);
+ }
+ if (s != null)
+ src = s.hasNext() ? s.next() : "";
+
+ // now we have all stuff together and can build the pref screen
+ addPluginPreference(root, src, files[i].toString(), true);
+ }
+ }
+ }
+
+ void addPluginPreference(PreferenceScreen root, String src, String plugin_key, boolean additional) {
+
+ // now parse plugin name, description and category
+ 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//", " ");
+ // get a list of key-value...split on multiple spaces
+ String[] attributes = header.split(" +");
+ String plugin_name = "not found";
+ String plugin_desc = "not found";
+ String plugin_cat = "Misc";
+ 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("@description"))
+ plugin_desc = attributes[j + 1];
+ if (attributes[j].equals("@category"))
+ plugin_cat = attributes[j + 1];
+ }
+
+ // remove IITC plugin prefix from plugin_name
+ plugin_name = plugin_name.replace("IITC Plugin: ", "");
+ plugin_name = plugin_name.replace("IITC plugin: ", "");
+
+ // add [User] tag to additional plugins
+ if (additional)
+ plugin_cat = "[User] " + plugin_cat;
+ // now we have all stuff together and can build the pref screen
+ PreferenceScreen pref_screen;
+ if (root.findPreference(plugin_cat) == null) {
+ Log.d("iitcm", "create " + plugin_cat + " and add " + plugin_name);
+ pref_screen = getPreferenceManager().createPreferenceScreen(root.getContext());
+ pref_screen.setTitle(plugin_cat);
+ pref_screen.setKey(plugin_cat);
+ // alphabetical order
+ pref_screen.setOrderingAsAdded(false);
+ pref_screen.setPersistent(true);
+ root.addPreference(pref_screen);
+ } else {
+ Log.d("iitcm", "add " + plugin_name + " to " + plugin_cat);
+ pref_screen = (PreferenceScreen) findPreference(plugin_cat);
+ }
+
+ // now build a new checkable preference for the plugin
+ CheckBoxPreference plugin_pref = new CheckBoxPreference(pref_screen.getContext());
+ plugin_pref.setKey(plugin_key);
+ plugin_pref.setTitle(plugin_name);
+ plugin_pref.setSummary(plugin_desc);
+ plugin_pref.setDefaultValue(false);
+ plugin_pref.setPersistent(true);
+ pref_screen.addPreference(plugin_pref);
+ }
}
diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java
index 4333a8ad..50ccf792 100644
--- a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java
+++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java
@@ -21,6 +21,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
+import java.util.Map;
import java.util.Scanner;
import java.util.Set;
@@ -152,23 +153,24 @@ public class IITC_WebViewClient extends WebViewClient {
Set plugin_list = sharedPref.getStringSet("pref_plugins", null);
boolean dev_enabled = sharedPref.getBoolean("pref_dev_checkbox", false);
- // iterate through all enabled plugins and load them
- if (plugin_list != null) {
- String[] plugin_array = plugin_list.toArray(new String[0]);
+ Map all_prefs = sharedPref.getAll();
- for (int i = 0; i < plugin_list.size(); i++) {
+ // iterate through all plugins
+ for(Map.Entry entry : all_prefs.entrySet()){
+ String plugin = entry.getKey();
+ if (plugin.endsWith("user.js") && entry.getValue().toString() == "true") {
// load default iitc plugins
- if (!plugin_array[i].startsWith(iitc_path)) {
- Log.d("iitcm", "adding plugin " + plugin_array[i]);
+ if (!plugin.startsWith(iitc_path)) {
+ Log.d("iitcm", "adding plugin " + plugin);
if (dev_enabled)
js += this.removePluginWrapper(iitc_path + "dev/plugins/"
- + plugin_array[i], false);
+ + plugin, false);
else
- js += this.removePluginWrapper("plugins/" + plugin_array[i], true);
- // load additional iitc plugins
+ js += this.removePluginWrapper("plugins/" + plugin, true);
+ // load additional iitc plugins
} else {
- Log.d("iitcm", "adding additional plugin " + plugin_array[i]);
- js += this.removePluginWrapper(plugin_array[i], false);
+ Log.d("iitcm", "adding additional plugin " + plugin);
+ js += this.removePluginWrapper(plugin, false);
}
}
}
diff --git a/plugins/ap-list.user.js b/plugins/ap-list.user.js
index 7a1088c5..6182ed70 100644
--- a/plugins/ap-list.user.js
+++ b/plugins/ap-list.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-ap-list@xelio
// @name IITC plugin: AP List
+// @category Info
// @version 0.5.3.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/basemap-blank.user.js b/plugins/basemap-blank.user.js
index 955e601a..29a40e1a 100644
--- a/plugins/basemap-blank.user.js
+++ b/plugins/basemap-blank.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-basemap-blank@jonatkins
// @name IITC plugin: Blank map
+// @category Map Tiles
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/basemap-cloudmade.user.js b/plugins/basemap-cloudmade.user.js
index b6857696..44181888 100644
--- a/plugins/basemap-cloudmade.user.js
+++ b/plugins/basemap-cloudmade.user.js
@@ -24,6 +24,7 @@
// ==UserScript==
// @id iitc-plugin-cloudmade-maps
// @name IITC plugin: CloudMade.com maps
+// @category Map Tiles
// @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
diff --git a/plugins/basemap-opencyclemap.user.js b/plugins/basemap-opencyclemap.user.js
index a024ec00..6203f35b 100644
--- a/plugins/basemap-opencyclemap.user.js
+++ b/plugins/basemap-opencyclemap.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-basemap-opencyclepam@jonatkins
// @name IITC plugin: OpenCycleMap.org map tiles
+// @category Map Tiles
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/basemap-openstreetmap.user.js b/plugins/basemap-openstreetmap.user.js
index 57122fb8..22519c07 100644
--- a/plugins/basemap-openstreetmap.user.js
+++ b/plugins/basemap-openstreetmap.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-basemap-openstreetpam@jonatkins
// @name IITC plugin: OpenStreetMap.org map tiles
+// @category Map Tiles
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/basemap-yandex.user.js b/plugins/basemap-yandex.user.js
index b4cbcc6f..6f914764 100644
--- a/plugins/basemap-yandex.user.js
+++ b/plugins/basemap-yandex.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-basemap-yandex@jonatkins
// @name IITC plugin: Yandex maps
+// @category Map Tiles
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/draw-tools.user.js b/plugins/draw-tools.user.js
index 44531abf..42a1672b 100644
--- a/plugins/draw-tools.user.js
+++ b/plugins/draw-tools.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-draw-tools@breunigs
// @name IITC plugin: draw tools
+// @category UI
// @version 0.4.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js
index afb9add3..04195507 100644
--- a/plugins/guess-player-levels.user.js
+++ b/plugins/guess-player-levels.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-guess-player-levels@breunigs
// @name IITC plugin: guess player level
+// @category Info
// @version 0.4.5.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/keys-on-map.user.js b/plugins/keys-on-map.user.js
index 243ac2e9..74353fa7 100644
--- a/plugins/keys-on-map.user.js
+++ b/plugins/keys-on-map.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-keys-on-map@xelio
// @name IITC plugin: Keys on map
+// @category Keys
// @version 0.2.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/keys.user.js b/plugins/keys.user.js
index 3679eca5..9ffa64c0 100644
--- a/plugins/keys.user.js
+++ b/plugins/keys.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-keys@xelio
// @name IITC plugin: Keys
+// @category Keys
// @version 0.2.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js
index d096a6d4..3a5e6b71 100644
--- a/plugins/max-links.user.js
+++ b/plugins/max-links.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id max-links@boombuler
// @name IITC plugin: Max Links
+// @category UI
// @version 0.3.1.@@DATETIMEVERSION@@
// @updateURL @@UPDATEURL@@
// @downloadURL @@DOWNLOADURL@@
diff --git a/plugins/pan-control.user.js b/plugins/pan-control.user.js
index 9e8f320d..c8a1b147 100644
--- a/plugins/pan-control.user.js
+++ b/plugins/pan-control.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-pan-control@fragger
// @name IITC plugin: pan control
+// @category Controls
// @version 0.1.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js
index 9fc5fdbd..df0e6857 100644
--- a/plugins/player-tracker.user.js
+++ b/plugins/player-tracker.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-player-tracker@breunigs
// @name IITC Plugin: Player tracker
+// @category Layer
// @version 0.9.4.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-counts.user.js b/plugins/portal-counts.user.js
index 4ef7b6d3..d5b14dc2 100644
--- a/plugins/portal-counts.user.js
+++ b/plugins/portal-counts.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-portals-count@yenky
// @name IITC plugin: Show total counts of portals
+// @category Info
// @version 0.0.8.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-can-make-level.user.js b/plugins/portal-highlighter-can-make-level.user.js
index 7a19044d..c070f24e 100644
--- a/plugins/portal-highlighter-can-make-level.user.js
+++ b/plugins/portal-highlighter-can-make-level.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-upgrade@vita10gy
// @name IITC plugin: highlight portals you can upgrade to a specific level
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-level-color.user.js b/plugins/portal-highlighter-level-color.user.js
index a690d838..e4f82b51 100644
--- a/plugins/portal-highlighter-level-color.user.js
+++ b/plugins/portal-highlighter-level-color.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-level-color@vita10gy
// @name IITC plugin: highlight portals by level color
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-missing-resonators.user.js b/plugins/portal-highlighter-missing-resonators.user.js
index 1103bf85..99ba0c6c 100644
--- a/plugins/portal-highlighter-missing-resonators.user.js
+++ b/plugins/portal-highlighter-missing-resonators.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-missing-resonators@vita10gy
// @name IITC plugin: highlight portals missing resonators
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-my-8-portals.user.js b/plugins/portal-highlighter-my-8-portals.user.js
index ea63515f..2c6f6f1a 100644
--- a/plugins/portal-highlighter-my-8-portals.user.js
+++ b/plugins/portal-highlighter-my-8-portals.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-my-8-portals@vita10gy
// @name IITC plugin: highlight my level 8's on portals
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-my-portals.user.js b/plugins/portal-highlighter-my-portals.user.js
index 505c9e4c..4aa47ad1 100644
--- a/plugins/portal-highlighter-my-portals.user.js
+++ b/plugins/portal-highlighter-my-portals.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-my-portals@vita10gy
// @name IITC plugin: highlight my portals
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-needs-recharge.user.js b/plugins/portal-highlighter-needs-recharge.user.js
index b5cd8689..ca6f11b8 100644
--- a/plugins/portal-highlighter-needs-recharge.user.js
+++ b/plugins/portal-highlighter-needs-recharge.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-needs-recharge@vita10gy
// @name IITC plugin: hightlight portals that need recharging
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-portal-ap-energy-relative.user.js b/plugins/portal-highlighter-portal-ap-energy-relative.user.js
index 02ba2a8a..9f5aebcb 100644
--- a/plugins/portal-highlighter-portal-ap-energy-relative.user.js
+++ b/plugins/portal-highlighter-portal-ap-energy-relative.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-by-ap-by-energy-relative@vita10gy
// @name IITC plugin: highlight portals by ap/energy (relative)
+// @category Highlighter
// @version 0.1.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-portal-ap-relative.user.js b/plugins/portal-highlighter-portal-ap-relative.user.js
index 5bade6b6..51e91fc8 100644
--- a/plugins/portal-highlighter-portal-ap-relative.user.js
+++ b/plugins/portal-highlighter-portal-ap-relative.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-by-ap-relative@vita10gy
// @name IITC plugin: highlight portals by ap relative
+// @category Highlighter
// @version 0.1.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-portal-ap.user.js b/plugins/portal-highlighter-portal-ap.user.js
index 0441fdc6..146cdd32 100644
--- a/plugins/portal-highlighter-portal-ap.user.js
+++ b/plugins/portal-highlighter-portal-ap.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-by-ap@vita10gy
// @name IITC plugin: highlight portals by ap
+// @category Highlighter
// @version 0.1.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-portals-my-level.user.js b/plugins/portal-highlighter-portals-my-level.user.js
index 32d1fa47..890f4685 100644
--- a/plugins/portal-highlighter-portals-my-level.user.js
+++ b/plugins/portal-highlighter-portals-my-level.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-my-level@vita10gy
// @name IITC plugin: highlight portals by my level
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-portals-upgrade.user.js b/plugins/portal-highlighter-portals-upgrade.user.js
index e8238e6f..70d9d76d 100644
--- a/plugins/portal-highlighter-portals-upgrade.user.js
+++ b/plugins/portal-highlighter-portals-upgrade.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-upgrade@vita10gy
// @name IITC plugin: highlight portals you can upgrade
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-highlighter-with-lvl8-resonators.user.js b/plugins/portal-highlighter-with-lvl8-resonators.user.js
index 7b29a018..ab2740a6 100644
--- a/plugins/portal-highlighter-with-lvl8-resonators.user.js
+++ b/plugins/portal-highlighter-with-lvl8-resonators.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-highlight-portals-with-L8-resonators@superd
// @name IITC plugin: highlight portals with L8 resonators
+// @category Highlighter
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portal-level-numbers.user.js b/plugins/portal-level-numbers.user.js
index 349c1fd0..003692f5 100644
--- a/plugins/portal-level-numbers.user.js
+++ b/plugins/portal-level-numbers.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-portal-level-numbers@rongou
// @name IITC plugin: Portal Level Numbers
+// @category Layer
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/portals-list.user.js b/plugins/portals-list.user.js
index 1b33644a..38b3023e 100644
--- a/plugins/portals-list.user.js
+++ b/plugins/portals-list.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-portals-list@teo96
// @name IITC plugin: show list of portals
+// @category Info
// @version 0.0.13.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/reso-energy-pct-in-portal-detail.user.js b/plugins/reso-energy-pct-in-portal-detail.user.js
index 226d5ced..18d1a107 100644
--- a/plugins/reso-energy-pct-in-portal-detail.user.js
+++ b/plugins/reso-energy-pct-in-portal-detail.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-reso-energy-pct-in-portal-detail@xelio
// @name IITC plugin: reso energy pct in portal detail
+// @category Info
// @version 0.1.2.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/resonator-display-zoom-level-decrease.user.js b/plugins/resonator-display-zoom-level-decrease.user.js
index d1fb272f..ed2ad45c 100644
--- a/plugins/resonator-display-zoom-level-decrease.user.js
+++ b/plugins/resonator-display-zoom-level-decrease.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-resonator-display-zoom-level-decrease@xelio
// @name IITC plugin: resonator display zoom level decrease
+// @category UI
// @version 1.0.2.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/scale-bar.user.js b/plugins/scale-bar.user.js
index 0a451357..22454414 100644
--- a/plugins/scale-bar.user.js
+++ b/plugins/scale-bar.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-scale-bar@breunigs
// @name IITC plugin: scale bar
+// @category UI
// @version 0.1.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/scoreboard.user.js b/plugins/scoreboard.user.js
index ddd8de61..8bd68d40 100644
--- a/plugins/scoreboard.user.js
+++ b/plugins/scoreboard.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-scoreboard@vita10gy
// @name IITC plugin: show a localized scoreboard.
+// @category Info
// @version 0.1.8.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/show-address.user.js b/plugins/show-address.user.js
index 488159bd..fb0b8260 100644
--- a/plugins/show-address.user.js
+++ b/plugins/show-address.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-show-address@vita10gy
// @name IITC plugin: show portal address in sidebar
+// @category Info
// @version 0.2.2.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js
index c2809e7f..914417be 100644
--- a/plugins/show-portal-weakness.user.js
+++ b/plugins/show-portal-weakness.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-show-portal-weakness@vita10gy
// @name IITC plugin: show portal weakness
+// @category Highlighter
// @version 0.7.0.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/sync.user.js b/plugins/sync.user.js
index 248da344..c6c34e02 100644
--- a/plugins/sync.user.js
+++ b/plugins/sync.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-sync@xelio
// @name IITC plugin: Sync
+// @category Keys
// @version 0.2.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
diff --git a/plugins/zoom-slider.user.js b/plugins/zoom-slider.user.js
index 01e4269e..e25eea9f 100644
--- a/plugins/zoom-slider.user.js
+++ b/plugins/zoom-slider.user.js
@@ -1,6 +1,7 @@
// ==UserScript==
// @id iitc-plugin-zoom-slider@fragger
// @name IITC plugin: zoom slider
+// @category Controls
// @version 0.1.1.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@