summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xStoneIsland/config.xml1
-rw-r--r--StoneIsland/package-lock.json5
-rw-r--r--StoneIsland/package.json4
-rwxr-xr-xStoneIsland/platforms/android/AndroidManifest.xml1
-rwxr-xr-xStoneIsland/platforms/android/android.json30
-rw-r--r--StoneIsland/platforms/android/assets/www/cordova_plugins.js153
-rw-r--r--StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/android/sim.js11
-rw-r--r--StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/sim.js8
-rwxr-xr-xStoneIsland/platforms/android/platform_www/cordova_plugins.js19
-rw-r--r--StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/android/sim.js11
-rw-r--r--StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/sim.js8
-rw-r--r--StoneIsland/platforms/android/res/xml/config.xml3
-rw-r--r--StoneIsland/platforms/android/src/com/pbakondy/Sim.java264
-rw-r--r--StoneIsland/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist4
-rwxr-xr-xStoneIsland/platforms/ios/Stone Island.xcodeproj/project.pbxproj7
-rw-r--r--StoneIsland/platforms/ios/Stone Island.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist2
-rw-r--r--StoneIsland/platforms/ios/Stone Island.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstatebin41982 -> 40452 bytes
-rw-r--r--StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.h9
-rw-r--r--StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.m55
-rwxr-xr-xStoneIsland/platforms/ios/Stone Island/config.xml3
-rw-r--r--StoneIsland/platforms/ios/frameworks.json2
-rw-r--r--StoneIsland/platforms/ios/ios.json18
-rw-r--r--StoneIsland/platforms/ios/platform_www/cordova_plugins.js11
-rw-r--r--StoneIsland/platforms/ios/platform_www/plugins/cordova-plugin-sim/www/sim.js8
-rw-r--r--StoneIsland/platforms/ios/www/cordova_plugins.js11
-rw-r--r--StoneIsland/platforms/ios/www/plugins/cordova-plugin-sim/www/sim.js8
-rwxr-xr-xStoneIsland/plugins/android.json3
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/CHANGELOG.md41
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/LICENSE21
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/README.md311
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/package.json73
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/plugin.xml85
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/src/android/com/pbakondy/Sim.java264
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.h9
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.m55
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/src/wp/Sim.cs74
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/tests/plugin.xml11
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/tests/tests.js48
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/www/android/sim.js8
-rw-r--r--StoneIsland/plugins/cordova-plugin-sim/www/sim.js5
-rwxr-xr-xStoneIsland/plugins/fetch.json8
-rw-r--r--StoneIsland/plugins/ios.json3
42 files changed, 1664 insertions, 11 deletions
diff --git a/StoneIsland/config.xml b/StoneIsland/config.xml
index 010c3c7e..cb666644 100755
--- a/StoneIsland/config.xml
+++ b/StoneIsland/config.xml
@@ -83,4 +83,5 @@
<plugin name="phonegap-plugin-push" spec="^1.9.2">
<variable name="SENDER_ID" value="85075801930" />
</plugin>
+ <plugin name="cordova-plugin-sim" spec="^1.3.3" />
</widget>
diff --git a/StoneIsland/package-lock.json b/StoneIsland/package-lock.json
index 3ddc93a0..1c538962 100644
--- a/StoneIsland/package-lock.json
+++ b/StoneIsland/package-lock.json
@@ -1306,6 +1306,11 @@
"resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-1.3.3.tgz",
"integrity": "sha1-DqmqXBEkz3y9b4T4KKVCy9JKhRg="
},
+ "cordova-plugin-sim": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-sim/-/cordova-plugin-sim-1.3.3.tgz",
+ "integrity": "sha1-QoZjMHfYhX5kVP4GmHB9CMaK2Ik="
+ },
"cordova-plugin-splashscreen": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-4.0.3.tgz",
diff --git a/StoneIsland/package.json b/StoneIsland/package.json
index e5bd4d5b..523d71e9 100644
--- a/StoneIsland/package.json
+++ b/StoneIsland/package.json
@@ -14,6 +14,7 @@
"cordova-plugin-geolocation": "~2.4.0",
"cordova-plugin-inappbrowser": "~1.5.0",
"cordova-plugin-network-information": "~1.3.0",
+ "cordova-plugin-sim": "^1.3.3",
"cordova-plugin-splashscreen": "~4.0.0",
"cordova-plugin-statusbar": "^2.2.3",
"cordova-plugin-whitelist": "1",
@@ -49,7 +50,8 @@
"ionic-plugin-keyboard": {},
"phonegap-plugin-push": {
"SENDER_ID": "85075801930"
- }
+ },
+ "cordova-plugin-sim": {}
},
"platforms": [
"android",
diff --git a/StoneIsland/platforms/android/AndroidManifest.xml b/StoneIsland/platforms/android/AndroidManifest.xml
index 75322df7..59ddcea4 100755
--- a/StoneIsland/platforms/android/AndroidManifest.xml
+++ b/StoneIsland/platforms/android/AndroidManifest.xml
@@ -55,4 +55,5 @@
<uses-permission android:name="${applicationId}.permission.PushHandlerActivity" />
<permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<permission android:name="${applicationId}.permission.PushHandlerActivity" android:protectionLevel="signature" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest>
diff --git a/StoneIsland/platforms/android/android.json b/StoneIsland/platforms/android/android.json
index 3e69085c..5dc54401 100755
--- a/StoneIsland/platforms/android/android.json
+++ b/StoneIsland/platforms/android/android.json
@@ -55,6 +55,10 @@
{
"xml": "<feature name=\"PushNotification\"><param name=\"android-package\" value=\"com.adobe.phonegap.push.PushPlugin\" /></feature>",
"count": 1
+ },
+ {
+ "xml": "<feature name=\"Sim\"><param name=\"android-package\" value=\"com.pbakondy.Sim\" /></feature>",
+ "count": 1
}
]
}
@@ -146,6 +150,10 @@
{
"xml": "<uses-feature android:name=\"android.hardware.location.gps\" />",
"count": 1
+ },
+ {
+ "xml": "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
+ "count": 1
}
],
"/manifest/application/activity": [
@@ -235,6 +243,9 @@
"phonegap-plugin-push": {
"SENDER_ID": "85075801930",
"PACKAGE_NAME": "us.okfoc.stoneisland"
+ },
+ "cordova-plugin-sim": {
+ "PACKAGE_NAME": "us.okfoc.stoneisland"
}
},
"dependent_plugins": {},
@@ -351,6 +362,22 @@
"clobbers": [
"PushNotification"
]
+ },
+ {
+ "id": "cordova-plugin-sim.Sim",
+ "file": "plugins/cordova-plugin-sim/www/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
+ },
+ {
+ "id": "cordova-plugin-sim.SimAndroid",
+ "file": "plugins/cordova-plugin-sim/www/android/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
}
],
"plugin_metadata": {
@@ -367,6 +394,7 @@
"cordova-plugin-statusbar": "2.2.3",
"cordova-plugin-app-name": "1.0.4",
"cordova-plugin-splashscreen": "4.0.3",
- "phonegap-plugin-push": "1.9.2"
+ "phonegap-plugin-push": "1.9.2",
+ "cordova-plugin-sim": "1.3.3"
}
} \ No newline at end of file
diff --git a/StoneIsland/platforms/android/assets/www/cordova_plugins.js b/StoneIsland/platforms/android/assets/www/cordova_plugins.js
new file mode 100644
index 00000000..770bd946
--- /dev/null
+++ b/StoneIsland/platforms/android/assets/www/cordova_plugins.js
@@ -0,0 +1,153 @@
+cordova.define('cordova/plugin_list', function(require, exports, module) {
+module.exports = [
+ {
+ "file": "plugins/cordova-plugin-inappbrowser/www/inappbrowser.js",
+ "id": "cordova-plugin-inappbrowser.inappbrowser",
+ "pluginId": "cordova-plugin-inappbrowser",
+ "clobbers": [
+ "cordova.InAppBrowser.open",
+ "window.open"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js",
+ "id": "cordova-plugin-x-socialsharing.SocialSharing",
+ "pluginId": "cordova-plugin-x-socialsharing",
+ "clobbers": [
+ "window.plugins.socialsharing"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-customurlscheme/www/android/LaunchMyApp.js",
+ "id": "cordova-plugin-customurlscheme.LaunchMyApp",
+ "pluginId": "cordova-plugin-customurlscheme",
+ "clobbers": [
+ "window.plugins.launchmyapp"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-device/www/device.js",
+ "id": "cordova-plugin-device.device",
+ "pluginId": "cordova-plugin-device",
+ "clobbers": [
+ "device"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-network-information/www/network.js",
+ "id": "cordova-plugin-network-information.network",
+ "pluginId": "cordova-plugin-network-information",
+ "clobbers": [
+ "navigator.connection",
+ "navigator.network.connection"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-network-information/www/Connection.js",
+ "id": "cordova-plugin-network-information.Connection",
+ "pluginId": "cordova-plugin-network-information",
+ "clobbers": [
+ "Connection"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-dialogs/www/notification.js",
+ "id": "cordova-plugin-dialogs.notification",
+ "pluginId": "cordova-plugin-dialogs",
+ "merges": [
+ "navigator.notification"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-dialogs/www/android/notification.js",
+ "id": "cordova-plugin-dialogs.notification_android",
+ "pluginId": "cordova-plugin-dialogs",
+ "merges": [
+ "navigator.notification"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-geolocation/www/android/geolocation.js",
+ "id": "cordova-plugin-geolocation.geolocation",
+ "pluginId": "cordova-plugin-geolocation",
+ "clobbers": [
+ "navigator.geolocation"
+ ]
+ },
+ {
+ "file": "plugins/cordova-plugin-geolocation/www/PositionError.js",
+ "id": "cordova-plugin-geolocation.PositionError",
+ "pluginId": "cordova-plugin-geolocation",
+ "runs": true
+ },
+ {
+ "file": "plugins/ionic-plugin-keyboard/www/android/keyboard.js",
+ "id": "ionic-plugin-keyboard.keyboard",
+ "pluginId": "ionic-plugin-keyboard",
+ "clobbers": [
+ "cordova.plugins.Keyboard"
+ ],
+ "runs": true
+ },
+ {
+ "id": "cordova-plugin-statusbar.statusbar",
+ "file": "plugins/cordova-plugin-statusbar/www/statusbar.js",
+ "pluginId": "cordova-plugin-statusbar",
+ "clobbers": [
+ "window.StatusBar"
+ ]
+ },
+ {
+ "id": "cordova-plugin-splashscreen.SplashScreen",
+ "file": "plugins/cordova-plugin-splashscreen/www/splashscreen.js",
+ "pluginId": "cordova-plugin-splashscreen",
+ "clobbers": [
+ "navigator.splashscreen"
+ ]
+ },
+ {
+ "id": "phonegap-plugin-push.PushNotification",
+ "file": "plugins/phonegap-plugin-push/www/push.js",
+ "pluginId": "phonegap-plugin-push",
+ "clobbers": [
+ "PushNotification"
+ ]
+ },
+ {
+ "id": "cordova-plugin-sim.Sim",
+ "file": "plugins/cordova-plugin-sim/www/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
+ },
+ {
+ "id": "cordova-plugin-sim.SimAndroid",
+ "file": "plugins/cordova-plugin-sim/www/android/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
+ }
+];
+module.exports.metadata =
+// TOP OF METADATA
+{
+ "cordova-plugin-inappbrowser": "1.5.0",
+ "cordova-plugin-x-socialsharing": "5.1.3",
+ "cordova-plugin-customurlscheme": "4.2.0",
+ "cordova-plugin-whitelist": "1.3.0",
+ "cordova-plugin-device": "1.1.3",
+ "cordova-plugin-network-information": "1.3.0",
+ "cordova-plugin-dialogs": "1.3.0",
+ "cordova-plugin-compat": "1.1.0",
+ "cordova-plugin-geolocation": "2.4.0",
+ "ionic-plugin-keyboard": "2.2.1",
+ "cordova-plugin-statusbar": "2.2.3",
+ "cordova-plugin-app-name": "1.0.4",
+ "cordova-plugin-splashscreen": "4.0.3",
+ "phonegap-plugin-push": "1.9.2",
+ "cordova-plugin-sim": "1.3.3"
+};
+// BOTTOM OF METADATA
+}); \ No newline at end of file
diff --git a/StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/android/sim.js b/StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/android/sim.js
new file mode 100644
index 00000000..5813054f
--- /dev/null
+++ b/StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/android/sim.js
@@ -0,0 +1,11 @@
+cordova.define("cordova-plugin-sim.SimAndroid", function(require, exports, module) {
+module.exports = {
+ hasReadPermission: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'hasReadPermission', []);
+ },
+ requestReadPermission: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'requestReadPermission', []);
+ }
+};
+
+});
diff --git a/StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/sim.js b/StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/sim.js
new file mode 100644
index 00000000..ccc52e54
--- /dev/null
+++ b/StoneIsland/platforms/android/assets/www/plugins/cordova-plugin-sim/www/sim.js
@@ -0,0 +1,8 @@
+cordova.define("cordova-plugin-sim.Sim", function(require, exports, module) {
+module.exports = {
+ getSimInfo: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'getSimInfo', []);
+ }
+};
+
+});
diff --git a/StoneIsland/platforms/android/platform_www/cordova_plugins.js b/StoneIsland/platforms/android/platform_www/cordova_plugins.js
index 8f70abd6..770bd946 100755
--- a/StoneIsland/platforms/android/platform_www/cordova_plugins.js
+++ b/StoneIsland/platforms/android/platform_www/cordova_plugins.js
@@ -112,6 +112,22 @@ module.exports = [
"clobbers": [
"PushNotification"
]
+ },
+ {
+ "id": "cordova-plugin-sim.Sim",
+ "file": "plugins/cordova-plugin-sim/www/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
+ },
+ {
+ "id": "cordova-plugin-sim.SimAndroid",
+ "file": "plugins/cordova-plugin-sim/www/android/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
}
];
module.exports.metadata =
@@ -130,7 +146,8 @@ module.exports.metadata =
"cordova-plugin-statusbar": "2.2.3",
"cordova-plugin-app-name": "1.0.4",
"cordova-plugin-splashscreen": "4.0.3",
- "phonegap-plugin-push": "1.9.2"
+ "phonegap-plugin-push": "1.9.2",
+ "cordova-plugin-sim": "1.3.3"
};
// BOTTOM OF METADATA
}); \ No newline at end of file
diff --git a/StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/android/sim.js b/StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/android/sim.js
new file mode 100644
index 00000000..5813054f
--- /dev/null
+++ b/StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/android/sim.js
@@ -0,0 +1,11 @@
+cordova.define("cordova-plugin-sim.SimAndroid", function(require, exports, module) {
+module.exports = {
+ hasReadPermission: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'hasReadPermission', []);
+ },
+ requestReadPermission: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'requestReadPermission', []);
+ }
+};
+
+});
diff --git a/StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/sim.js b/StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/sim.js
new file mode 100644
index 00000000..ccc52e54
--- /dev/null
+++ b/StoneIsland/platforms/android/platform_www/plugins/cordova-plugin-sim/www/sim.js
@@ -0,0 +1,8 @@
+cordova.define("cordova-plugin-sim.Sim", function(require, exports, module) {
+module.exports = {
+ getSimInfo: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'getSimInfo', []);
+ }
+};
+
+});
diff --git a/StoneIsland/platforms/android/res/xml/config.xml b/StoneIsland/platforms/android/res/xml/config.xml
index 9f4cb684..43132082 100644
--- a/StoneIsland/platforms/android/res/xml/config.xml
+++ b/StoneIsland/platforms/android/res/xml/config.xml
@@ -74,4 +74,7 @@
<feature name="PushNotification">
<param name="android-package" value="com.adobe.phonegap.push.PushPlugin" />
</feature>
+ <feature name="Sim">
+ <param name="android-package" value="com.pbakondy.Sim" />
+ </feature>
</widget>
diff --git a/StoneIsland/platforms/android/src/com/pbakondy/Sim.java b/StoneIsland/platforms/android/src/com/pbakondy/Sim.java
new file mode 100644
index 00000000..df3542f7
--- /dev/null
+++ b/StoneIsland/platforms/android/src/com/pbakondy/Sim.java
@@ -0,0 +1,264 @@
+// MCC and MNC codes on Wikipedia
+// http://en.wikipedia.org/wiki/Mobile_country_code
+
+// Mobile Network Codes (MNC) for the international identification plan for public networks and subscriptions
+// http://www.itu.int/pub/T-SP-E.212B-2014
+
+// class TelephonyManager
+// http://developer.android.com/reference/android/telephony/TelephonyManager.html
+// https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/TelephonyManager.java
+
+// permissions
+// http://developer.android.com/training/permissions/requesting.html
+
+// Multiple SIM Card Support
+// https://developer.android.com/about/versions/android-5.1.html
+
+// class SubscriptionManager
+// https://developer.android.com/reference/android/telephony/SubscriptionManager.html
+// https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/SubscriptionManager.java
+
+// class SubscriptionInfo
+// https://developer.android.com/reference/android/telephony/SubscriptionInfo.html
+// https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/SubscriptionInfo.java
+
+// Cordova Permissions API
+// https://cordova.apache.org/docs/en/latest/guide/platforms/android/plugin.html#android-permissions
+
+package com.pbakondy;
+
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PluginResult;
+import org.apache.cordova.LOG;
+
+import org.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.Manifest;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import java.util.List;
+
+public class Sim extends CordovaPlugin {
+ private static final String LOG_TAG = "CordovaPluginSim";
+
+
+ private static final String GET_SIM_INFO = "getSimInfo";
+ private static final String HAS_READ_PERMISSION = "hasReadPermission";
+ private static final String REQUEST_READ_PERMISSION = "requestReadPermission";
+
+ private CallbackContext callback;
+
+ @SuppressLint("HardwareIds")
+ @Override
+ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
+ callback = callbackContext;
+
+ if (GET_SIM_INFO.equals(action)) {
+ Context context = this.cordova.getActivity().getApplicationContext();
+
+ TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+
+ // dual SIM detection with SubscriptionManager API
+ // requires API 22
+ // requires permission READ_PHONE_STATE
+ JSONArray sims = null;
+ Integer phoneCount = null;
+ Integer activeSubscriptionInfoCount = null;
+ Integer activeSubscriptionInfoCountMax = null;
+
+ try {
+ // TelephonyManager.getPhoneCount() requires API 23
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+ phoneCount = manager.getPhoneCount();
+ }
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
+
+ if (simPermissionGranted(Manifest.permission.READ_PHONE_STATE)) {
+
+ SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ activeSubscriptionInfoCount = subscriptionManager.getActiveSubscriptionInfoCount();
+ activeSubscriptionInfoCountMax = subscriptionManager.getActiveSubscriptionInfoCountMax();
+
+ sims = new JSONArray();
+
+ List<SubscriptionInfo> subscriptionInfos = subscriptionManager.getActiveSubscriptionInfoList();
+ for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+
+ CharSequence carrierName = subscriptionInfo.getCarrierName();
+ String countryIso = subscriptionInfo.getCountryIso();
+ int dataRoaming = subscriptionInfo.getDataRoaming(); // 1 is enabled ; 0 is disabled
+ CharSequence displayName = subscriptionInfo.getDisplayName();
+ String iccId = subscriptionInfo.getIccId();
+ int mcc = subscriptionInfo.getMcc();
+ int mnc = subscriptionInfo.getMnc();
+ String number = subscriptionInfo.getNumber();
+ int simSlotIndex = subscriptionInfo.getSimSlotIndex();
+ int subscriptionId = subscriptionInfo.getSubscriptionId();
+
+ boolean networkRoaming = subscriptionManager.isNetworkRoaming(simSlotIndex);
+
+ String deviceId = null;
+ // TelephonyManager.getDeviceId(slotId) requires API 23
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+ deviceId = manager.getDeviceId(simSlotIndex);
+ }
+
+ JSONObject simData = new JSONObject();
+
+ simData.put("carrierName", carrierName.toString());
+ simData.put("displayName", displayName.toString());
+ simData.put("countryCode", countryIso);
+ simData.put("mcc", mcc);
+ simData.put("mnc", mnc);
+ simData.put("isNetworkRoaming", networkRoaming);
+ simData.put("isDataRoaming", (dataRoaming == 1));
+ simData.put("simSlotIndex", simSlotIndex);
+ simData.put("phoneNumber", number);
+ if (deviceId != null) {
+ simData.put("deviceId", deviceId);
+ }
+ simData.put("simSerialNumber", iccId);
+ simData.put("subscriptionId", subscriptionId);
+
+ sims.put(simData);
+
+ }
+ }
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ String phoneNumber = null;
+ String countryCode = manager.getSimCountryIso();
+ String simOperator = manager.getSimOperator();
+ String carrierName = manager.getSimOperatorName();
+
+ String deviceId = null;
+ String deviceSoftwareVersion = null;
+ String simSerialNumber = null;
+ String subscriberId = null;
+
+ int callState = manager.getCallState();
+ int dataActivity = manager.getDataActivity();
+ int networkType = manager.getNetworkType();
+ int phoneType = manager.getPhoneType();
+ int simState = manager.getSimState();
+
+ boolean isNetworkRoaming = manager.isNetworkRoaming();
+
+ if (simPermissionGranted(Manifest.permission.READ_PHONE_STATE)) {
+ phoneNumber = manager.getLine1Number();
+ deviceId = manager.getDeviceId();
+ deviceSoftwareVersion = manager.getDeviceSoftwareVersion();
+ simSerialNumber = manager.getSimSerialNumber();
+ subscriberId = manager.getSubscriberId();
+ }
+
+ String mcc = "";
+ String mnc = "";
+
+ if (simOperator.length() >= 3) {
+ mcc = simOperator.substring(0, 3);
+ mnc = simOperator.substring(3);
+ }
+
+ JSONObject result = new JSONObject();
+
+ result.put("carrierName", carrierName);
+ result.put("countryCode", countryCode);
+ result.put("mcc", mcc);
+ result.put("mnc", mnc);
+
+ result.put("callState", callState);
+ result.put("dataActivity", dataActivity);
+ result.put("networkType", networkType);
+ result.put("phoneType", phoneType);
+ result.put("simState", simState);
+
+ result.put("isNetworkRoaming", isNetworkRoaming);
+
+ if (phoneCount != null) {
+ result.put("phoneCount", (int)phoneCount);
+ }
+ if (activeSubscriptionInfoCount != null) {
+ result.put("activeSubscriptionInfoCount", (int)activeSubscriptionInfoCount);
+ }
+ if (activeSubscriptionInfoCountMax != null) {
+ result.put("activeSubscriptionInfoCountMax", (int)activeSubscriptionInfoCountMax);
+ }
+
+ if (simPermissionGranted(Manifest.permission.READ_PHONE_STATE)) {
+ result.put("phoneNumber", phoneNumber);
+ result.put("deviceId", deviceId);
+ result.put("deviceSoftwareVersion", deviceSoftwareVersion);
+ result.put("simSerialNumber", simSerialNumber);
+ result.put("subscriberId", subscriberId);
+ }
+
+ if (sims != null && sims.length() != 0) {
+ result.put("cards", sims);
+ }
+
+ callbackContext.success(result);
+
+ return true;
+ } else if (HAS_READ_PERMISSION.equals(action)) {
+ hasReadPermission();
+ return true;
+ } else if (REQUEST_READ_PERMISSION.equals(action)) {
+ requestReadPermission();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void hasReadPermission() {
+ this.callback.sendPluginResult(new PluginResult(PluginResult.Status.OK,
+ simPermissionGranted(Manifest.permission.READ_PHONE_STATE)));
+ }
+
+ private void requestReadPermission() {
+ requestPermission(Manifest.permission.READ_PHONE_STATE);
+ }
+
+ private boolean simPermissionGranted(String type) {
+ if (Build.VERSION.SDK_INT < 23) {
+ return true;
+ }
+ return cordova.hasPermission(type);
+ }
+
+ private void requestPermission(String type) {
+ LOG.i(LOG_TAG, "requestPermission");
+ if (!simPermissionGranted(type)) {
+ cordova.requestPermission(this, 12345, type);
+ } else {
+ this.callback.success();
+ }
+ }
+
+ @Override
+ public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException
+ {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ this.callback.success();
+ } else {
+ this.callback.error("Permission denied");
+ }
+ }
+}
diff --git a/StoneIsland/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist b/StoneIsland/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
index 4bc8d36e..54b0db05 100644
--- a/StoneIsland/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/StoneIsland/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,12 +7,12 @@
<key>Cordova.xcscheme</key>
<dict>
<key>orderHint</key>
- <integer>3</integer>
+ <integer>4</integer>
</dict>
<key>CordovaLib.xcscheme</key>
<dict>
<key>orderHint</key>
- <integer>2</integer>
+ <integer>3</integer>
</dict>
</dict>
</dict>
diff --git a/StoneIsland/platforms/ios/Stone Island.xcodeproj/project.pbxproj b/StoneIsland/platforms/ios/Stone Island.xcodeproj/project.pbxproj
index d3f7acd2..a637a063 100755
--- a/StoneIsland/platforms/ios/Stone Island.xcodeproj/project.pbxproj
+++ b/StoneIsland/platforms/ios/Stone Island.xcodeproj/project.pbxproj
@@ -5,7 +5,6 @@
};
objectVersion = 46;
objects = {
-
/* Begin PBXBuildFile section */
0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0207DA571B56EA530066E2B4 /* Images.xcassets */; };
0A9D8E7D77FD4C27B4DD2393 /* CDVNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 2923E526CC8E4009B2DA8D64 /* CDVNotification.m */; };
@@ -39,6 +38,7 @@
CE8687FA42EA49F2936AA5E4 /* CDVConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 669C0562CA3E4A2E9E6898D6 /* CDVConnection.m */; };
EE95056671E844C9921729AE /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AAB41973FB4238B7AD4D85 /* AudioToolbox.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
EFF00C22294FE756DED28A81 /* libPods-Stone Island.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78CB957A0B40BA339C669D53 /* libPods-Stone Island.a */; };
+ 52A4EAACA1F34D6EBEED78A3 /* Sim.m in Sources */ = {isa = PBXBuildFile; fileRef = DCFA1E58FE794CA6BE2A4834 /* Sim.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -125,6 +125,8 @@
EDA99B42F1E147FCA8824E6E /* CoreLocation.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
F840E1F0165FE0F500CFE078 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = config.xml; path = "Stone Island/config.xml"; sourceTree = "<group>"; };
F9D019AC51834C309501EAF5 /* CDVReachability.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = CDVReachability.h; path = "cordova-plugin-network-information/CDVReachability.h"; sourceTree = "<group>"; };
+ DCFA1E58FE794CA6BE2A4834 /* Sim.m */ = {isa = PBXFileReference; name = "Sim.m"; path = "cordova-plugin-sim/Sim.m"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; explicitFileType = undefined; includeInIndex = 0; };
+ 3782AD713ACA4C098142F2DA /* Sim.h */ = {isa = PBXFileReference; name = "Sim.h"; path = "cordova-plugin-sim/Sim.h"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; explicitFileType = undefined; includeInIndex = 0; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -286,6 +288,8 @@
C85567A8F35F40C99D7AE117 /* PushPlugin.m */,
CEF393D5749347098BED6D82 /* AppDelegate+notification.h */,
4B1911CDF0454542977ECE35 /* PushPlugin.h */,
+ DCFA1E58FE794CA6BE2A4834 /* Sim.m */,
+ 3782AD713ACA4C098142F2DA /* Sim.h */,
);
name = Plugins;
path = "Stone Island/Plugins";
@@ -478,6 +482,7 @@
54D2276159A643C0842544DC /* IonicKeyboard.m in Sources */,
A842514FAE364263A91C9664 /* AppDelegate+notification.m in Sources */,
17B84E5E1F2E4D699B41A450 /* PushPlugin.m in Sources */,
+ 52A4EAACA1F34D6EBEED78A3 /* Sim.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/StoneIsland/platforms/ios/Stone Island.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist b/StoneIsland/platforms/ios/Stone Island.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
index d744b66e..371cb20d 100644
--- a/StoneIsland/platforms/ios/Stone Island.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/StoneIsland/platforms/ios/Stone Island.xcodeproj/xcuserdata/user.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,7 +7,7 @@
<key>Stone Island.xcscheme</key>
<dict>
<key>orderHint</key>
- <integer>3</integer>
+ <integer>2</integer>
</dict>
</dict>
</dict>
diff --git a/StoneIsland/platforms/ios/Stone Island.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate b/StoneIsland/platforms/ios/Stone Island.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate
index 55bb151c..f43c8bf2 100644
--- a/StoneIsland/platforms/ios/Stone Island.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate
+++ b/StoneIsland/platforms/ios/Stone Island.xcworkspace/xcuserdata/user.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.h b/StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.h
new file mode 100644
index 00000000..d14ff264
--- /dev/null
+++ b/StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.h
@@ -0,0 +1,9 @@
+#import <Cordova/CDV.h>
+#import <CoreTelephony/CTCarrier.h>
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+
+@interface Sim : CDVPlugin
+
+- (void)getSimInfo:(CDVInvokedUrlCommand*)command;
+
+@end
diff --git a/StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.m b/StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.m
new file mode 100644
index 00000000..49d70eac
--- /dev/null
+++ b/StoneIsland/platforms/ios/Stone Island/Plugins/cordova-plugin-sim/Sim.m
@@ -0,0 +1,55 @@
+// MCC and MNC codes on Wikipedia
+// http://en.wikipedia.org/wiki/Mobile_country_code
+
+// Mobile Network Codes (MNC) for the international identification plan for public networks and subscriptions
+// http://www.itu.int/pub/T-SP-E.212B-2014
+
+// class CTCarrier
+// https://developer.apple.com/reference/coretelephony/ctcarrier?language=objc
+
+#import "Sim.h"
+#import <Cordova/CDV.h>
+#import <Foundation/Foundation.h>
+#import <CoreTelephony/CTCarrier.h>
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+
+@implementation Sim
+
+- (void)getSimInfo:(CDVInvokedUrlCommand*)command
+{
+ CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
+ CTCarrier *carrier = [netinfo subscriberCellularProvider];
+
+ BOOL allowsVOIPResult = [carrier allowsVOIP];
+ NSString *carrierNameResult = [carrier carrierName];
+ NSString *carrierCountryResult = [carrier isoCountryCode];
+ NSString *carrierCodeResult = [carrier mobileCountryCode];
+ NSString *carrierNetworkResult = [carrier mobileNetworkCode];
+
+ if (!carrierNameResult) {
+ carrierNameResult = @"";
+ }
+ if (!carrierCountryResult) {
+ carrierCountryResult = @"";
+ }
+ if (!carrierCodeResult) {
+ carrierCodeResult = @"";
+ }
+ if (!carrierNetworkResult) {
+ carrierNetworkResult = @"";
+ }
+
+ NSDictionary *simData = [NSDictionary dictionaryWithObjectsAndKeys:
+ @(allowsVOIPResult), @"allowsVOIP",
+ carrierNameResult, @"carrierName",
+ carrierCountryResult, @"countryCode",
+ carrierCodeResult, @"mcc",
+ carrierNetworkResult, @"mnc",
+ nil];
+
+ CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:simData];
+
+ [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+}
+
+@end
diff --git a/StoneIsland/platforms/ios/Stone Island/config.xml b/StoneIsland/platforms/ios/Stone Island/config.xml
index 81ddacaf..c7a3a817 100755
--- a/StoneIsland/platforms/ios/Stone Island/config.xml
+++ b/StoneIsland/platforms/ios/Stone Island/config.xml
@@ -109,4 +109,7 @@
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="ShowSplashScreenSpinner" value="false" />
<preference name="AutoHideSplashScreen" value="true" />
+ <feature name="Sim">
+ <param name="ios-package" value="Sim" />
+ </feature>
</widget>
diff --git a/StoneIsland/platforms/ios/frameworks.json b/StoneIsland/platforms/ios/frameworks.json
index 8c96a67b..0a971c69 100644
--- a/StoneIsland/platforms/ios/frameworks.json
+++ b/StoneIsland/platforms/ios/frameworks.json
@@ -2,7 +2,7 @@
"AudioToolbox.framework": 1,
"CoreLocation.framework": 1,
"SystemConfiguration.framework": 1,
- "CoreTelephony.framework": 1,
+ "CoreTelephony.framework": 2,
"Social.framework": 1,
"MessageUI.framework": 1,
"AddressBook.framework": 1,
diff --git a/StoneIsland/platforms/ios/ios.json b/StoneIsland/platforms/ios/ios.json
index a801018b..e7fc56d1 100644
--- a/StoneIsland/platforms/ios/ios.json
+++ b/StoneIsland/platforms/ios/ios.json
@@ -101,6 +101,10 @@
{
"xml": "<feature name=\"PushNotification\"><param name=\"ios-package\" value=\"PushPlugin\" /></feature>",
"count": 1
+ },
+ {
+ "xml": "<feature name=\"Sim\"><param name=\"ios-package\" value=\"Sim\" /></feature>",
+ "count": 1
}
]
}
@@ -172,6 +176,9 @@
"phonegap-plugin-push": {
"SENDER_ID": "85075801930",
"PACKAGE_NAME": "us.okfoc.stoneisland"
+ },
+ "cordova-plugin-sim": {
+ "PACKAGE_NAME": "us.okfoc.stoneisland"
}
},
"dependent_plugins": {},
@@ -298,6 +305,14 @@
"clobbers": [
"PushNotification"
]
+ },
+ {
+ "id": "cordova-plugin-sim.Sim",
+ "file": "plugins/cordova-plugin-sim/www/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
}
],
"plugin_metadata": {
@@ -314,6 +329,7 @@
"cordova-plugin-whitelist": "1.3.0",
"cordova-plugin-x-socialsharing": "5.1.3",
"ionic-plugin-keyboard": "2.2.1",
- "phonegap-plugin-push": "1.9.2"
+ "phonegap-plugin-push": "1.9.2",
+ "cordova-plugin-sim": "1.3.3"
}
} \ No newline at end of file
diff --git a/StoneIsland/platforms/ios/platform_www/cordova_plugins.js b/StoneIsland/platforms/ios/platform_www/cordova_plugins.js
index e6ad8b23..32af05ac 100644
--- a/StoneIsland/platforms/ios/platform_www/cordova_plugins.js
+++ b/StoneIsland/platforms/ios/platform_www/cordova_plugins.js
@@ -122,6 +122,14 @@ module.exports = [
"clobbers": [
"PushNotification"
]
+ },
+ {
+ "id": "cordova-plugin-sim.Sim",
+ "file": "plugins/cordova-plugin-sim/www/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
}
];
module.exports.metadata =
@@ -140,7 +148,8 @@ module.exports.metadata =
"cordova-plugin-whitelist": "1.3.0",
"cordova-plugin-x-socialsharing": "5.1.3",
"ionic-plugin-keyboard": "2.2.1",
- "phonegap-plugin-push": "1.9.2"
+ "phonegap-plugin-push": "1.9.2",
+ "cordova-plugin-sim": "1.3.3"
};
// BOTTOM OF METADATA
}); \ No newline at end of file
diff --git a/StoneIsland/platforms/ios/platform_www/plugins/cordova-plugin-sim/www/sim.js b/StoneIsland/platforms/ios/platform_www/plugins/cordova-plugin-sim/www/sim.js
new file mode 100644
index 00000000..ccc52e54
--- /dev/null
+++ b/StoneIsland/platforms/ios/platform_www/plugins/cordova-plugin-sim/www/sim.js
@@ -0,0 +1,8 @@
+cordova.define("cordova-plugin-sim.Sim", function(require, exports, module) {
+module.exports = {
+ getSimInfo: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'getSimInfo', []);
+ }
+};
+
+});
diff --git a/StoneIsland/platforms/ios/www/cordova_plugins.js b/StoneIsland/platforms/ios/www/cordova_plugins.js
index e6ad8b23..32af05ac 100644
--- a/StoneIsland/platforms/ios/www/cordova_plugins.js
+++ b/StoneIsland/platforms/ios/www/cordova_plugins.js
@@ -122,6 +122,14 @@ module.exports = [
"clobbers": [
"PushNotification"
]
+ },
+ {
+ "id": "cordova-plugin-sim.Sim",
+ "file": "plugins/cordova-plugin-sim/www/sim.js",
+ "pluginId": "cordova-plugin-sim",
+ "merges": [
+ "window.plugins.sim"
+ ]
}
];
module.exports.metadata =
@@ -140,7 +148,8 @@ module.exports.metadata =
"cordova-plugin-whitelist": "1.3.0",
"cordova-plugin-x-socialsharing": "5.1.3",
"ionic-plugin-keyboard": "2.2.1",
- "phonegap-plugin-push": "1.9.2"
+ "phonegap-plugin-push": "1.9.2",
+ "cordova-plugin-sim": "1.3.3"
};
// BOTTOM OF METADATA
}); \ No newline at end of file
diff --git a/StoneIsland/platforms/ios/www/plugins/cordova-plugin-sim/www/sim.js b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-sim/www/sim.js
new file mode 100644
index 00000000..ccc52e54
--- /dev/null
+++ b/StoneIsland/platforms/ios/www/plugins/cordova-plugin-sim/www/sim.js
@@ -0,0 +1,8 @@
+cordova.define("cordova-plugin-sim.Sim", function(require, exports, module) {
+module.exports = {
+ getSimInfo: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'getSimInfo', []);
+ }
+};
+
+});
diff --git a/StoneIsland/plugins/android.json b/StoneIsland/plugins/android.json
index 13cf41ff..e9460be9 100755
--- a/StoneIsland/plugins/android.json
+++ b/StoneIsland/plugins/android.json
@@ -51,6 +51,9 @@
"phonegap-plugin-push": {
"SENDER_ID": "85075801930",
"PACKAGE_NAME": "us.okfoc.stoneisland"
+ },
+ "cordova-plugin-sim": {
+ "PACKAGE_NAME": "us.okfoc.stoneisland"
}
},
"dependent_plugins": {
diff --git a/StoneIsland/plugins/cordova-plugin-sim/CHANGELOG.md b/StoneIsland/plugins/cordova-plugin-sim/CHANGELOG.md
new file mode 100644
index 00000000..e7e882da
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/CHANGELOG.md
@@ -0,0 +1,41 @@
+# Changelog
+
+## v1.3.3
+
+- Android: Adjust required API levels
+- iOS: add CoreTelephony imports
+- docs: Ionic 2 Usage
+- docs: API level 25 codes
+
+## v1.3.2
+
+- Android: use Cordova Permissions API
+- Android: drop Android Support Library requirement
+
+## v1.3.1
+
+- Android: callbacks for requestReadPermission()
+
+## v1.3.0
+
+- add multiple SIM support on Android
+
+## v1.2.1
+
+- separate Android-related javascript methods
+
+## v1.2.0
+
+- handle Android API 23 Permissions
+
+## v1.1.0
+
+- add new properties on Android
+
+## v1.0.1
+
+- rename plugin to follow new cordova plugin naming conventions
+
+## v1.0.0
+
+- initial release
diff --git a/StoneIsland/plugins/cordova-plugin-sim/LICENSE b/StoneIsland/plugins/cordova-plugin-sim/LICENSE
new file mode 100644
index 00000000..ec5a3987
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Peter Bakondy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. \ No newline at end of file
diff --git a/StoneIsland/plugins/cordova-plugin-sim/README.md b/StoneIsland/plugins/cordova-plugin-sim/README.md
new file mode 100644
index 00000000..3963368f
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/README.md
@@ -0,0 +1,311 @@
+# cordova-plugin-sim
+
+[![npm](https://img.shields.io/npm/v/cordova-plugin-sim.svg)](https://www.npmjs.com/package/cordova-plugin-sim)
+[![Code Climate](https://codeclimate.com/github/pbakondy/cordova-plugin-sim/badges/gpa.svg)](https://codeclimate.com/github/pbakondy/cordova-plugin-sim)
+![Platform](https://img.shields.io/badge/platform-android%20%7C%20ios%20%7C%20windows-lightgrey.svg)
+[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R7STJ6V2PNEMA)
+
+This is a cordova plugin to get data from the SIM card like the carrier name, mcc, mnc and country code and other system dependent additional info.
+
+
+## Installation
+
+```
+cordova plugin add cordova-plugin-sim
+```
+
+## Supported Platforms
+
+- Android
+- iOS
+- Windows Phone 7 and 8
+
+
+## Usage
+
+```js
+document.addEventListener("deviceready", onDeviceReady, false);
+
+function onDeviceReady() {
+ window.plugins.sim.getSimInfo(successCallback, errorCallback);
+}
+
+function successCallback(result) {
+ console.log(result);
+}
+
+function errorCallback(error) {
+ console.log(error);
+}
+
+// Android only: check permission
+function hasReadPermission() {
+ window.plugins.sim.hasReadPermission(successCallback, errorCallback);
+}
+
+// Android only: request permission
+function requestReadPermission() {
+ window.plugins.sim.requestReadPermission(successCallback, errorCallback);
+}
+```
+
+The plugin returns a JSON object. Return values:
+
+* `carrierName`: String - the Service Provider Name (SPN)
+* `countryCode`: String - the ISO country code equivalent for the SIM provider's country code
+* `mcc`: String - the MCC (mobile country code) of the provider of the SIM
+* `mnc`: String - the MNC (mobile network code) of the provider of the SIM
+
+Field carrierName may remain empty, dependent on the mobile provider.
+
+On Windows Phone access to countryCode, MCC and MNC is not made provided (returns empty string).
+
+You can extract country and carrier data from MCC and MNC codes, read further on [Wikipedia](http://en.wikipedia.org/wiki/Mobile_country_code) and [ITU-T](http://www.itu.int/pub/T-SP-E.212B-2014).
+
+You can find the name of mobile provider using [mcc-mnc-list](https://www.npmjs.com/package/mcc-mnc-list) npm package.
+
+### Ionic 2 Usage
+
+```typescript
+import { Sim } from 'ionic-native';
+
+Sim.getSimInfo().then(
+ (info) => console.log('Sim info: ', info),
+ (err) => console.log('Unable to get sim info: ', err)
+);
+
+Sim.hasReadPermission().then(
+ (info) => console.log('Has permission:', info)
+);
+
+Sim.requestReadPermission().then(
+ () => console.log('Permission granted'),
+ () => console.log('Permission denied')
+);
+```
+
+Required: [ionic-native](https://www.npmjs.com/package/ionic-native) v2.2.13
+
+See [Ionic Native documentation](https://ionicframework.com/docs/v2/native/sim/).
+
+## Android Quirks
+
+### Under the hood
+
+This plugin uses two different Android APIs to receive SIM data:
+- `TelephonyManager` (since API level 1)
+- `SubscriptionManager` (since API level 22)
+
+Since Android 6 (API level 23) a few methods of `TelephonyManager` require permission `READ_PHONE_STATE`.
+
+All methods of `SubscriptionManager` require permission `READ_PHONE_STATE`.
+
+`SubscriptionManager` is able to access multiple SIM data. The return object of this cordova plugin provides the details of the available sim cards in an array (`cards`).
+
+### Return object
+
+
+- `carrierName`: {String} Service Provider Name (SPN)
+- `countryCode`: {String} ISO country code equivalent for the SIM provider's country code
+- `mcc`: {String} MCC (mobile country code) of the provider of the SIM
+- `mnc`: {String} MNC (mobile network code) of the provider of the SIM
+- `callState`: {Number} call state (cellular) on the device
+- `dataActivity`: {Number} type of activity on a data connection (cellular)
+- `networkType`: {Number} the NETWORK_TYPE_xxxx for current data connection
+- `phoneType`: {Number} device phone type. This indicates the type of radio used to transmit voice calls
+- `simState`: {Number} the state of the device SIM card
+- `isNetworkRoaming`: {Boolean} true if the device is considered roaming on the current network, for GSM purposes
+- `phoneCount`: {Number} the number of phones available. Returns 0 if none of voice, sms, data is not supported. Returns 1 for Single standby mode (Single SIM functionality). Returns 2 for Dual standby mode (Dual SIM functionality)
+- `activeSubscriptionInfoCount`: {Number} [`READ_PHONE_STATE`] the current number of active subscriptions
+- `activeSubscriptionInfoCountMax`: {Number} [`READ_PHONE_STATE`] the maximum number of active subscriptions
+- `phoneNumber`: {String} [`READ_PHONE_STATE`] - phone number string for line 1, for example, the [MSISDN](http://en.wikipedia.org/wiki/MSISDN) for a GSM phone <sup>1</sup>
+- `deviceId`: {String} [`READ_PHONE_STATE`] the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones
+- `deviceSoftwareVersion`: {String} [`READ_PHONE_STATE`] the software version number for the device, for example, the IMEI/SV for GSM phones
+- `simSerialNumber`: {String} [`READ_PHONE_STATE`] the serial number of the SIM, if applicable
+- `subscriberId`: {String} [`READ_PHONE_STATE`] the unique subscriber ID, for example, the IMSI for a GSM phone
+- `cards`: {Array} [`READ_PHONE_STATE`] List of SIM cards
+ - `carrierName`: {String} the name displayed to the user that identifies Subscription provider name
+ - `displayName`: {String} the name displayed to the user that identifies this subscription
+ - `countryCode`: {String} the ISO country code
+ - `mcc`: {String} MCC (mobile country code) of the provider of the SIM
+ - `mnc`: {String} MNC (mobile network code) of the provider of the SIM
+ - `isNetworkRoaming`: {Boolean} Returns true if the device is considered roaming on the current network for a subscription
+ - `isDataRoaming`: {Boolean} the data roaming state for this subscription
+ - `simSlotIndex`: {Number} the slot index of this Subscription's SIM card
+ - `phoneNumber`: {String} the number of this subscription
+ - `deviceId`: {String} the unique device ID of a subscription, for example, the IMEI for GSM and the MEID for CDMA phones
+ - `simSerialNumber`: {String} ICC ID
+ - `subscriptionId`: {String} Subscription Identifier, this is a device unique number
+
+
+<sup>1)</sup> Notice: the content of phoneNumber is unreliable (see [this](http://stackoverflow.com/questions/7922734/getting-reliable-msisdn-from-android-phone-voicemailnumber-line1number) and [this](http://stackoverflow.com/questions/25861064/retrieving-line1-number-from-telephonymanager-in-android) article).
+Sometimes phoneNumber is only an empty string.
+
+### Android Emulator results
+
+```js
+{
+ "carrierName": "Android",
+ "countryCode": "us",
+ "mcc": "310",
+ "mnc": "260",
+ "phoneNumber": "15555215554",
+ "deviceId": "0000000000000000",
+ "simSerialNumber": "89014103211118510720",
+ "subscriberId": "310260000000000",
+ "callState": 0,
+ "dataActivity": 0,
+ "networkType": 3,
+ "phoneType": 1,
+ "simState": 5,
+ "isNetworkRoaming": false
+}
+```
+
+### List of Call State Codes and Meanings
+
+| Code | Constant | Meaning
+|-----:|:------------------------------|--------
+| 0 | `CALL_STATE_IDLE` | No activity
+| 1 | `CALL_STATE_RINGING` | Ringing. A new call arrived and is ringing or waiting. In the latter case, another call is already active.
+| 2 | `CALL_STATE_OFFHOOK` | Off-hook. At least one call exists that is dialing, active, or on hold, and no calls are ringing or waiting.
+
+
+### List of Data Activity Codes and Meanings
+
+| Code | Constant | Meaning
+|-----:|:------------------------------|--------
+| 0 | `DATA_ACTIVITY_NONE` | No traffic.
+| 1 | `DATA_ACTIVITY_IN` | Currently receiving IP PPP traffic.
+| 2 | `DATA_ACTIVITY_OUT` | Currently sending IP PPP traffic.
+| 3 | `DATA_ACTIVITY_INOUT` | Currently both sending and receiving IP PPP traffic.
+| 4 | `DATA_ACTIVITY_DORMANT` | Data connection is active, but physical link is down
+
+
+### List of Network Type Codes and Meanings
+
+| Code | Constant | Meaning
+|-----:|:------------------------------|--------
+| 0 | `NETWORK_TYPE_UNKNOWN` | unknown
+| 1 | `NETWORK_TYPE_GPRS` | GPRS
+| 2 | `NETWORK_TYPE_EDGE` | EDGE
+| 3 | `NETWORK_TYPE_UMTS` | UMTS
+| 4 | `NETWORK_TYPE_CDMA` | CDMA: Either IS95A or IS95B
+| 5 | `NETWORK_TYPE_EVDO_0` | EVDO revision 0
+| 6 | `NETWORK_TYPE_EVDO_A` | EVDO revision A
+| 7 | `NETWORK_TYPE_1xRTT` | 1xRTT
+| 8 | `NETWORK_TYPE_HSDPA` | HSDPA
+| 9 | `NETWORK_TYPE_HSUPA` | HSUPA
+| 10 | `NETWORK_TYPE_HSPA` | HSPA
+| 11 | `NETWORK_TYPE_IDEN` | iDen
+| 12 | `NETWORK_TYPE_EVDO_B` | EVDO revision B
+| 13 | `NETWORK_TYPE_LTE` | LTE
+| 14 | `NETWORK_TYPE_EHRPD` | eHRPD
+| 15 | `NETWORK_TYPE_HSPAP` | HSPA+
+| 16 | `NETWORK_TYPE_GSM` | GSM
+| 17 | `NETWORK_TYPE_TD_SCDMA` | TD-SCDMA
+| 18 | `NETWORK_TYPE_IWLAN` | IWLAN
+
+
+### List of Phone Type Codes and Meanings
+
+| Code | Constant | Meaning
+|-----:|:------------------------------|--------
+| 0 | `PHONE_TYPE_NONE` | none
+| 1 | `PHONE_TYPE_GSM` | GSM
+| 2 | `PHONE_TYPE_CDMA` | CDMA
+| 3 | `PHONE_TYPE_SIP` | SIP
+
+
+### List of SIM State Codes and Meanings
+
+| Code | Constant | Meaning
+|-----:|:------------------------------|--------
+| 0 | `SIM_STATE_UNKNOWN` | Unknown. Signifies that the SIM is in transition between states. For example, when the user inputs the SIM pin under PIN_REQUIRED state, a query for sim status returns this state before turning to SIM_STATE_READY.
+| 1 | `SIM_STATE_ABSENT` | No SIM card is available in the device
+| 2 | `SIM_STATE_PIN_REQUIRED` | Locked: requires the user's SIM PIN to unlock
+| 3 | `SIM_STATE_PUK_REQUIRED` | Locked: requires the user's SIM PUK to unlock
+| 4 | `SIM_STATE_NETWORK_LOCKED` | Locked: requires a network PIN to unlock
+| 5 | `SIM_STATE_READY` | Ready
+
+### Android 6.0 Permissions
+
+Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app.
+
+If the device is running Android 6.0 or higher, **and** your app's target SDK is 23 or higher: The app has to list the permissions in the manifest, **and** it must request each dangerous permission it needs while the app is running. The user can grant or deny each permission, and the app can continue to run with limited capabilities even if the user denies a permission request.
+
+Note: Beginning with Android 6.0 (API level 23), users can revoke permissions from any app at any time, even if the app targets a lower API level. You should test your app to verify that it behaves properly when it's missing a needed permission, regardless of what API level your app targets.
+
+```js
+// check permission
+function hasReadPermission() {
+ window.plugins.sim.hasReadPermission(successCallback, errorCallback);
+}
+
+// request permission
+function requestReadPermission() {
+ window.plugins.sim.requestReadPermission(successCallback, errorCallback);
+}
+```
+
+This plugin needs `READ_PHONE_STATE` permission for getting the following values:
+
+* `phoneNumber`
+* `deviceId`
+* `deviceSoftwareVersion`
+* `simSerialNumber`
+* `subscriberId`
+* `activeSubscriptionInfoCount`
+* `activeSubscriptionInfoCountMax`
+* multiple SIM card data
+
+Wiki: [How to test permissions](https://github.com/pbakondy/cordova-plugin-sim/wiki/Testing-Android-API-23-Permissions)
+
+### Build conflict with `phonegap-facebook-plugin`
+
+Android SDK uses Gradle build tool to create Android builds. `phonegap-facebook-plugin` does not implement `android-support-v4` dependency the recommended way, Gradle is not able to resolve the dependencies. The build process will fail.
+
+I suggest to use another plugin for facebook usage:
+
+- https://github.com/Telerik-Verified-Plugins/Facebook
+- https://github.com/jeduan/cordova-plugin-facebook4
+
+
+## iOS Quirks
+
+Additional return value:
+
+* `allowsVOIP`: Boolean - indicates if the carrier allows VoIP calls to be made on its network
+
+### iOS Emulator results
+
+```js
+{
+ "carrierName": "",
+ "countryCode": "",
+ "mcc": "",
+ "mnc": "",
+ "allowsVOIP": false
+}
+```
+
+## Windows Phone Quirks
+
+Additional return values:
+
+* `isCellularDataEnabled`: Boolean - indicates whether the network is cellular data enabled
+* `isCellularDataRoamingEnabled`: Boolean - indicates whether the network allows data roaming
+* `isNetworkAvailable`: Boolean - indicates whether the network interface is available
+* `isWiFiEnabled`: Boolean - indicates whether the network is Wi-Fi enabled
+
+
+## Author
+
+#### Peter Bakondy
+
+- https://github.com/pbakondy
+
+
+## LICENSE
+
+**cordova-plugin-sim** is licensed under the MIT Open Source license. For more information, see the LICENSE file in this repository.
diff --git a/StoneIsland/plugins/cordova-plugin-sim/package.json b/StoneIsland/plugins/cordova-plugin-sim/package.json
new file mode 100644
index 00000000..990a1e7f
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/package.json
@@ -0,0 +1,73 @@
+{
+ "_from": "cordova-plugin-sim",
+ "_id": "cordova-plugin-sim@1.3.3",
+ "_inBundle": false,
+ "_integrity": "sha1-QoZjMHfYhX5kVP4GmHB9CMaK2Ik=",
+ "_location": "/cordova-plugin-sim",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "tag",
+ "registry": true,
+ "raw": "cordova-plugin-sim",
+ "name": "cordova-plugin-sim",
+ "escapedName": "cordova-plugin-sim",
+ "rawSpec": "",
+ "saveSpec": null,
+ "fetchSpec": "latest"
+ },
+ "_requiredBy": [
+ "#USER",
+ "/"
+ ],
+ "_resolved": "https://registry.npmjs.org/cordova-plugin-sim/-/cordova-plugin-sim-1.3.3.tgz",
+ "_shasum": "4286633077d8857e6454fe0698707d08c68ad889",
+ "_spec": "cordova-plugin-sim",
+ "_where": "/Users/user/Sites/stone-island/StoneIsland",
+ "author": {
+ "name": "Peter Bakondy"
+ },
+ "bugs": {
+ "url": "https://github.com/pbakondy/cordova-plugin-sim/issues"
+ },
+ "bundleDependencies": false,
+ "cordova": {
+ "id": "cordova-plugin-sim",
+ "platforms": [
+ "android",
+ "ios",
+ "wp7",
+ "wp8",
+ "windows"
+ ]
+ },
+ "deprecated": false,
+ "description": "A plugin to get the device's SIM data (carrier name, mcc mnc, country code, telephonenumber, imei, etc)",
+ "engines": [
+ {
+ "name": "cordova",
+ "version": ">=3.0.0"
+ }
+ ],
+ "homepage": "https://github.com/pbakondy/cordova-plugin-sim#readme",
+ "keywords": [
+ "cordova",
+ "sim",
+ "uicc",
+ "carrier",
+ "mcc",
+ "mnc",
+ "telephonenumber",
+ "imei",
+ "ecosystem:cordova",
+ "cordova-android",
+ "cordova-ios",
+ "cordova-windows"
+ ],
+ "license": "MIT",
+ "name": "cordova-plugin-sim",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/pbakondy/cordova-plugin-sim.git"
+ },
+ "version": "1.3.3"
+}
diff --git a/StoneIsland/plugins/cordova-plugin-sim/plugin.xml b/StoneIsland/plugins/cordova-plugin-sim/plugin.xml
new file mode 100644
index 00000000..835cdfee
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/plugin.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ id="cordova-plugin-sim"
+ version="1.3.3">
+ <name>SIM</name>
+ <description>A plugin to get the device's SIM data (carrier name, mcc mnc, country code, telephonenumber, imei, etc)</description>
+ <license>MIT</license>
+ <keywords>cordova,sim,carrier,mcc,mnc,telephonenumber</keywords>
+ <repo>https://github.com/pbakondy/cordova-plugin-sim</repo>
+ <issue>https://github.com/pbakondy/cordova-plugin-sim/issues</issue>
+
+ <engines>
+ <engine name="cordova" version=">=3.0.0"/>
+ <engine name="cordova-android" version=">=5.0.0"/>
+ </engines>
+
+ <js-module src="www/sim.js" name="Sim">
+ <merges target="window.plugins.sim" />
+ </js-module>
+
+ <!-- android -->
+ <platform name="android">
+ <config-file target="res/xml/config.xml" parent="/*">
+ <feature name="Sim">
+ <param name="android-package" value="com.pbakondy.Sim"/>
+ </feature>
+ </config-file>
+
+ <config-file target="AndroidManifest.xml" parent="/*">
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ </config-file>
+
+ <source-file src="src/android/com/pbakondy/Sim.java" target-dir="src/com/pbakondy" />
+
+ <js-module src="www/android/sim.js" name="SimAndroid">
+ <merges target="window.plugins.sim" />
+ </js-module>
+ </platform>
+
+ <!-- ios -->
+ <platform name="ios">
+ <config-file target="config.xml" parent="/*">
+ <feature name="Sim">
+ <param name="ios-package" value="Sim" />
+ </feature>
+ </config-file>
+
+ <header-file src="src/ios/Sim.h"/>
+ <source-file src="src/ios/Sim.m"/>
+
+ <framework src="CoreTelephony.framework"/>
+ </platform>
+
+ <!-- wp7 -->
+ <platform name="wp7">
+ <config-file target="config.xml" parent="/*">
+ <feature name="Sim">
+ <param name="wp-package" value="Sim"/>
+ </feature>
+ </config-file>
+
+ <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
+ <Capability Name="ID_CAP_NETWORKING" />
+ </config-file>
+
+ <source-file src="src/wp/Sim.cs" />
+ </platform>
+
+ <!-- wp8 -->
+ <platform name="wp8">
+ <config-file target="config.xml" parent="/*">
+ <feature name="Sim">
+ <param name="wp-package" value="Sim"/>
+ </feature>
+ </config-file>
+
+ <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
+ <Capability Name="ID_CAP_NETWORKING" />
+ </config-file>
+
+ <source-file src="src/wp/Sim.cs" />
+ </platform>
+
+</plugin>
diff --git a/StoneIsland/plugins/cordova-plugin-sim/src/android/com/pbakondy/Sim.java b/StoneIsland/plugins/cordova-plugin-sim/src/android/com/pbakondy/Sim.java
new file mode 100644
index 00000000..df3542f7
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/src/android/com/pbakondy/Sim.java
@@ -0,0 +1,264 @@
+// MCC and MNC codes on Wikipedia
+// http://en.wikipedia.org/wiki/Mobile_country_code
+
+// Mobile Network Codes (MNC) for the international identification plan for public networks and subscriptions
+// http://www.itu.int/pub/T-SP-E.212B-2014
+
+// class TelephonyManager
+// http://developer.android.com/reference/android/telephony/TelephonyManager.html
+// https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/TelephonyManager.java
+
+// permissions
+// http://developer.android.com/training/permissions/requesting.html
+
+// Multiple SIM Card Support
+// https://developer.android.com/about/versions/android-5.1.html
+
+// class SubscriptionManager
+// https://developer.android.com/reference/android/telephony/SubscriptionManager.html
+// https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/SubscriptionManager.java
+
+// class SubscriptionInfo
+// https://developer.android.com/reference/android/telephony/SubscriptionInfo.html
+// https://github.com/android/platform_frameworks_base/blob/master/telephony/java/android/telephony/SubscriptionInfo.java
+
+// Cordova Permissions API
+// https://cordova.apache.org/docs/en/latest/guide/platforms/android/plugin.html#android-permissions
+
+package com.pbakondy;
+
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PluginResult;
+import org.apache.cordova.LOG;
+
+import org.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.Manifest;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import java.util.List;
+
+public class Sim extends CordovaPlugin {
+ private static final String LOG_TAG = "CordovaPluginSim";
+
+
+ private static final String GET_SIM_INFO = "getSimInfo";
+ private static final String HAS_READ_PERMISSION = "hasReadPermission";
+ private static final String REQUEST_READ_PERMISSION = "requestReadPermission";
+
+ private CallbackContext callback;
+
+ @SuppressLint("HardwareIds")
+ @Override
+ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
+ callback = callbackContext;
+
+ if (GET_SIM_INFO.equals(action)) {
+ Context context = this.cordova.getActivity().getApplicationContext();
+
+ TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+
+ // dual SIM detection with SubscriptionManager API
+ // requires API 22
+ // requires permission READ_PHONE_STATE
+ JSONArray sims = null;
+ Integer phoneCount = null;
+ Integer activeSubscriptionInfoCount = null;
+ Integer activeSubscriptionInfoCountMax = null;
+
+ try {
+ // TelephonyManager.getPhoneCount() requires API 23
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+ phoneCount = manager.getPhoneCount();
+ }
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
+
+ if (simPermissionGranted(Manifest.permission.READ_PHONE_STATE)) {
+
+ SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+ activeSubscriptionInfoCount = subscriptionManager.getActiveSubscriptionInfoCount();
+ activeSubscriptionInfoCountMax = subscriptionManager.getActiveSubscriptionInfoCountMax();
+
+ sims = new JSONArray();
+
+ List<SubscriptionInfo> subscriptionInfos = subscriptionManager.getActiveSubscriptionInfoList();
+ for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+
+ CharSequence carrierName = subscriptionInfo.getCarrierName();
+ String countryIso = subscriptionInfo.getCountryIso();
+ int dataRoaming = subscriptionInfo.getDataRoaming(); // 1 is enabled ; 0 is disabled
+ CharSequence displayName = subscriptionInfo.getDisplayName();
+ String iccId = subscriptionInfo.getIccId();
+ int mcc = subscriptionInfo.getMcc();
+ int mnc = subscriptionInfo.getMnc();
+ String number = subscriptionInfo.getNumber();
+ int simSlotIndex = subscriptionInfo.getSimSlotIndex();
+ int subscriptionId = subscriptionInfo.getSubscriptionId();
+
+ boolean networkRoaming = subscriptionManager.isNetworkRoaming(simSlotIndex);
+
+ String deviceId = null;
+ // TelephonyManager.getDeviceId(slotId) requires API 23
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+ deviceId = manager.getDeviceId(simSlotIndex);
+ }
+
+ JSONObject simData = new JSONObject();
+
+ simData.put("carrierName", carrierName.toString());
+ simData.put("displayName", displayName.toString());
+ simData.put("countryCode", countryIso);
+ simData.put("mcc", mcc);
+ simData.put("mnc", mnc);
+ simData.put("isNetworkRoaming", networkRoaming);
+ simData.put("isDataRoaming", (dataRoaming == 1));
+ simData.put("simSlotIndex", simSlotIndex);
+ simData.put("phoneNumber", number);
+ if (deviceId != null) {
+ simData.put("deviceId", deviceId);
+ }
+ simData.put("simSerialNumber", iccId);
+ simData.put("subscriptionId", subscriptionId);
+
+ sims.put(simData);
+
+ }
+ }
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ String phoneNumber = null;
+ String countryCode = manager.getSimCountryIso();
+ String simOperator = manager.getSimOperator();
+ String carrierName = manager.getSimOperatorName();
+
+ String deviceId = null;
+ String deviceSoftwareVersion = null;
+ String simSerialNumber = null;
+ String subscriberId = null;
+
+ int callState = manager.getCallState();
+ int dataActivity = manager.getDataActivity();
+ int networkType = manager.getNetworkType();
+ int phoneType = manager.getPhoneType();
+ int simState = manager.getSimState();
+
+ boolean isNetworkRoaming = manager.isNetworkRoaming();
+
+ if (simPermissionGranted(Manifest.permission.READ_PHONE_STATE)) {
+ phoneNumber = manager.getLine1Number();
+ deviceId = manager.getDeviceId();
+ deviceSoftwareVersion = manager.getDeviceSoftwareVersion();
+ simSerialNumber = manager.getSimSerialNumber();
+ subscriberId = manager.getSubscriberId();
+ }
+
+ String mcc = "";
+ String mnc = "";
+
+ if (simOperator.length() >= 3) {
+ mcc = simOperator.substring(0, 3);
+ mnc = simOperator.substring(3);
+ }
+
+ JSONObject result = new JSONObject();
+
+ result.put("carrierName", carrierName);
+ result.put("countryCode", countryCode);
+ result.put("mcc", mcc);
+ result.put("mnc", mnc);
+
+ result.put("callState", callState);
+ result.put("dataActivity", dataActivity);
+ result.put("networkType", networkType);
+ result.put("phoneType", phoneType);
+ result.put("simState", simState);
+
+ result.put("isNetworkRoaming", isNetworkRoaming);
+
+ if (phoneCount != null) {
+ result.put("phoneCount", (int)phoneCount);
+ }
+ if (activeSubscriptionInfoCount != null) {
+ result.put("activeSubscriptionInfoCount", (int)activeSubscriptionInfoCount);
+ }
+ if (activeSubscriptionInfoCountMax != null) {
+ result.put("activeSubscriptionInfoCountMax", (int)activeSubscriptionInfoCountMax);
+ }
+
+ if (simPermissionGranted(Manifest.permission.READ_PHONE_STATE)) {
+ result.put("phoneNumber", phoneNumber);
+ result.put("deviceId", deviceId);
+ result.put("deviceSoftwareVersion", deviceSoftwareVersion);
+ result.put("simSerialNumber", simSerialNumber);
+ result.put("subscriberId", subscriberId);
+ }
+
+ if (sims != null && sims.length() != 0) {
+ result.put("cards", sims);
+ }
+
+ callbackContext.success(result);
+
+ return true;
+ } else if (HAS_READ_PERMISSION.equals(action)) {
+ hasReadPermission();
+ return true;
+ } else if (REQUEST_READ_PERMISSION.equals(action)) {
+ requestReadPermission();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void hasReadPermission() {
+ this.callback.sendPluginResult(new PluginResult(PluginResult.Status.OK,
+ simPermissionGranted(Manifest.permission.READ_PHONE_STATE)));
+ }
+
+ private void requestReadPermission() {
+ requestPermission(Manifest.permission.READ_PHONE_STATE);
+ }
+
+ private boolean simPermissionGranted(String type) {
+ if (Build.VERSION.SDK_INT < 23) {
+ return true;
+ }
+ return cordova.hasPermission(type);
+ }
+
+ private void requestPermission(String type) {
+ LOG.i(LOG_TAG, "requestPermission");
+ if (!simPermissionGranted(type)) {
+ cordova.requestPermission(this, 12345, type);
+ } else {
+ this.callback.success();
+ }
+ }
+
+ @Override
+ public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException
+ {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ this.callback.success();
+ } else {
+ this.callback.error("Permission denied");
+ }
+ }
+}
diff --git a/StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.h b/StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.h
new file mode 100644
index 00000000..d14ff264
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.h
@@ -0,0 +1,9 @@
+#import <Cordova/CDV.h>
+#import <CoreTelephony/CTCarrier.h>
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+
+@interface Sim : CDVPlugin
+
+- (void)getSimInfo:(CDVInvokedUrlCommand*)command;
+
+@end
diff --git a/StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.m b/StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.m
new file mode 100644
index 00000000..49d70eac
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/src/ios/Sim.m
@@ -0,0 +1,55 @@
+// MCC and MNC codes on Wikipedia
+// http://en.wikipedia.org/wiki/Mobile_country_code
+
+// Mobile Network Codes (MNC) for the international identification plan for public networks and subscriptions
+// http://www.itu.int/pub/T-SP-E.212B-2014
+
+// class CTCarrier
+// https://developer.apple.com/reference/coretelephony/ctcarrier?language=objc
+
+#import "Sim.h"
+#import <Cordova/CDV.h>
+#import <Foundation/Foundation.h>
+#import <CoreTelephony/CTCarrier.h>
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+
+@implementation Sim
+
+- (void)getSimInfo:(CDVInvokedUrlCommand*)command
+{
+ CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
+ CTCarrier *carrier = [netinfo subscriberCellularProvider];
+
+ BOOL allowsVOIPResult = [carrier allowsVOIP];
+ NSString *carrierNameResult = [carrier carrierName];
+ NSString *carrierCountryResult = [carrier isoCountryCode];
+ NSString *carrierCodeResult = [carrier mobileCountryCode];
+ NSString *carrierNetworkResult = [carrier mobileNetworkCode];
+
+ if (!carrierNameResult) {
+ carrierNameResult = @"";
+ }
+ if (!carrierCountryResult) {
+ carrierCountryResult = @"";
+ }
+ if (!carrierCodeResult) {
+ carrierCodeResult = @"";
+ }
+ if (!carrierNetworkResult) {
+ carrierNetworkResult = @"";
+ }
+
+ NSDictionary *simData = [NSDictionary dictionaryWithObjectsAndKeys:
+ @(allowsVOIPResult), @"allowsVOIP",
+ carrierNameResult, @"carrierName",
+ carrierCountryResult, @"countryCode",
+ carrierCodeResult, @"mcc",
+ carrierNetworkResult, @"mnc",
+ nil];
+
+ CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:simData];
+
+ [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+}
+
+@end
diff --git a/StoneIsland/plugins/cordova-plugin-sim/src/wp/Sim.cs b/StoneIsland/plugins/cordova-plugin-sim/src/wp/Sim.cs
new file mode 100644
index 00000000..d6e5c9db
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/src/wp/Sim.cs
@@ -0,0 +1,74 @@
+// DeviceNetworkInformation
+// https://msdn.microsoft.com/en-us/library/windows/apps/microsoft.phone.net.networkinformation.devicenetworkinformation(v=vs.105).aspx
+//
+// TODO http://stackoverflow.com/a/21879531
+
+using System;
+using Microsoft.Phone.Net.NetworkInformation;
+
+namespace WPCordovaClassLib.Cordova.Commands
+{
+ public class Sim : BaseCommand
+ {
+ public void getSimInfo(string notused)
+ {
+
+ string res = String.Format("\"carrierName\":\"{0}\",\"countryCode\":\"\",\"mcc\":\"\",\"mnc\":\"\",\"isCellularDataEnabled\":\"{1}\",\"isCellularDataRoamingEnabled\":\"{2}\",\"isNetworkAvailable\":\"{3}\",\"isWiFiEnabled\":\"{4}\"",
+ this.CellularMobileOperator,
+ this.IsCellularDataEnabled,
+ this.IsCellularDataRoamingEnabled,
+ this.IsNetworkAvailable,
+ this.IsWiFiEnabled);
+
+ res = "{" + res + "}";
+
+ DispatchCommandResult(new PluginResult(PluginResult.Status.OK, res));
+ }
+
+ // Gets the name of the cellular mobile operator.
+ public string CellularMobileOperator
+ {
+ get
+ {
+ return DeviceNetworkInformation.CellularMobileOperator;
+ }
+ }
+
+ // Gets a value indicating whether the network is cellular data enabled.
+ public bool IsCellularDataEnabled
+ {
+ get
+ {
+ return DeviceNetworkInformation.IsCellularDataEnabled;
+ }
+ }
+
+ // Gets a value indicating whether the network allows data roaming.
+ public bool IsCellularDataRoamingEnabled
+ {
+ get
+ {
+ return DeviceNetworkInformation.IsCellularDataRoamingEnabled;
+ }
+ }
+
+ // Gets a value indicating whether the network is available.
+ public bool IsNetworkAvailable
+ {
+ get
+ {
+ return DeviceNetworkInformation.IsNetworkAvailable;
+ }
+ }
+
+ // Gets a value indicating whether the network is Wi-Fi enabled.
+ public bool IsWiFiEnabled
+ {
+ get
+ {
+ return DeviceNetworkInformation.IsWiFiEnabled;
+ }
+ }
+
+ }
+}
diff --git a/StoneIsland/plugins/cordova-plugin-sim/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-sim/tests/plugin.xml
new file mode 100644
index 00000000..02418c85
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/tests/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
+ xmlns:rim="http://www.blackberry.com/ns/widgets"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ id="cordova-plugin-sim-tests"
+ version="1.1.0">
+ <name>Cordova SIM Plugin Tests</name>
+ <license>MIT</license>
+
+ <js-module src="tests.js" name="tests"/>
+</plugin>
diff --git a/StoneIsland/plugins/cordova-plugin-sim/tests/tests.js b/StoneIsland/plugins/cordova-plugin-sim/tests/tests.js
new file mode 100644
index 00000000..f962fd5e
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/tests/tests.js
@@ -0,0 +1,48 @@
+exports.defineAutoTests = function() {
+ describe('SIM Information (window.plugins.sim)', function () {
+ it('should exist', function() {
+ expect(window.plugins.sim).toBeDefined();
+ });
+
+ it('should contain getSimInfo that is a function', function() {
+ expect(window.plugins.sim.getSimInfo).toBeDefined();
+ expect(typeof window.plugins.sim.getSimInfo).toBe('function');
+ });
+
+ });
+};
+
+exports.defineManualTests = function(contentEl, createActionButton) {
+ var logMessage = function (message, color) {
+ var log = document.getElementById('info');
+ var logLine = document.createElement('div');
+ if (color) {
+ logLine.style.color = color;
+ }
+ logLine.innerHTML = message;
+ log.appendChild(logLine);
+ };
+
+ var clearLog = function () {
+ var log = document.getElementById('info');
+ log.innerHTML = '';
+ };
+
+ var device_tests = '<h3>Press Dump SIM button to get SIM information</h3>' +
+ '<div id="dump_sim"></div>' +
+ 'Expected result: Status box will get updated with SIM info. (i.e. carrierName, countryCode, etc)';
+
+ contentEl.innerHTML = '<div id="info"></div>' + device_tests;
+
+ createActionButton('Dump SIM', function() {
+ clearLog();
+ window.plugins.sim.getSimInfo(
+ function(result) {
+ logMessage(JSON.stringify(result));
+ },
+ function(error) {
+ logMessage(JSON.stringify(error));
+ }
+ );
+ }, 'dump_sim');
+};
diff --git a/StoneIsland/plugins/cordova-plugin-sim/www/android/sim.js b/StoneIsland/plugins/cordova-plugin-sim/www/android/sim.js
new file mode 100644
index 00000000..bc709fc2
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/www/android/sim.js
@@ -0,0 +1,8 @@
+module.exports = {
+ hasReadPermission: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'hasReadPermission', []);
+ },
+ requestReadPermission: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'requestReadPermission', []);
+ }
+};
diff --git a/StoneIsland/plugins/cordova-plugin-sim/www/sim.js b/StoneIsland/plugins/cordova-plugin-sim/www/sim.js
new file mode 100644
index 00000000..66c16933
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-sim/www/sim.js
@@ -0,0 +1,5 @@
+module.exports = {
+ getSimInfo: function(successCallback, errorCallback) {
+ cordova.exec(successCallback, errorCallback, 'Sim', 'getSimInfo', []);
+ }
+};
diff --git a/StoneIsland/plugins/fetch.json b/StoneIsland/plugins/fetch.json
index 74ba0266..8a3ea6e4 100755
--- a/StoneIsland/plugins/fetch.json
+++ b/StoneIsland/plugins/fetch.json
@@ -114,5 +114,13 @@
},
"is_top_level": true,
"variables": {}
+ },
+ "cordova-plugin-sim": {
+ "source": {
+ "type": "registry",
+ "id": "cordova-plugin-sim"
+ },
+ "is_top_level": true,
+ "variables": {}
}
} \ No newline at end of file
diff --git a/StoneIsland/plugins/ios.json b/StoneIsland/plugins/ios.json
index 7cfe33d1..8dd1067c 100644
--- a/StoneIsland/plugins/ios.json
+++ b/StoneIsland/plugins/ios.json
@@ -48,6 +48,9 @@
"phonegap-plugin-push": {
"SENDER_ID": "85075801930",
"PACKAGE_NAME": "us.okfoc.stoneisland"
+ },
+ "cordova-plugin-sim": {
+ "PACKAGE_NAME": "us.okfoc.stoneisland"
}
},
"dependent_plugins": {