Compare commits

...
Sign in to create a new pull request.

36 commits
master ... jmp

Author SHA1 Message Date
c60ba8e103 JMP SIM Manager v1.2.1
This is a release only to fix F-Droid builds; no actual change to app is
made.
2025-01-26 16:30:41 -05:00
cb7d6a5fc2 jmp: Exclude dependency metadata from apks to fix F-Droid verification 2025-01-26 16:23:24 -05:00
b4ea193de2 JMP SIM Manager v1.2.0 2024-12-22 11:49:53 -05:00
654932a9f0 i18n: typo 2024-12-22 11:09:56 -05:00
a46849de40 i18n: Translate JMP-specific strings 2024-12-22 10:50:29 -05:00
0818abf71b jmp: Migrate customized text to CustomizableTextProvider 2024-12-22 10:35:54 -05:00
0673cf370a Merge remote-tracking branch 'openeuicc/master' into jmp
Conflicts:
	.forgejo/workflows/build-debug.yml
	app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt
2024-12-22 08:56:31 -05:00
e424b8eee0 JMP SIM Manager v1.1.2 2024-10-22 22:08:42 -04:00
8d76f0eeac Merge remote-tracking branch 'openeuicc/master' into jmp 2024-10-21 21:05:31 -04:00
991cd2a156 JMP SIM Manager v1.1.1 2024-09-19 21:37:30 -04:00
0e3a57f948 Merge remote-tracking branch 'openeuicc/master' into jmp
Conflicts:
	README.md
2024-09-19 20:54:02 -04:00
316abf0a3d Release v1.1.0 2024-07-25 19:42:20 -04:00
a671d8d01f res: Stress the existence of USB reader support 2024-07-21 20:22:12 -04:00
9dbebc9b5d Merge remote-tracking branch 'openeuicc/master' into jmp 2024-07-21 20:16:32 -04:00
02b23ab3db Release v1.0.0 2024-04-21 17:07:57 -04:00
5d73d4b17d workflows: Add support for bundle builds 2024-04-21 15:59:25 -04:00
0518c3efd3 Prepare F-Droid Release (yet again) 2024-04-13 15:16:25 -04:00
0d75c849f0 workflows: Save debug symbols for releases 2024-04-13 15:15:20 -04:00
28f7be0f4c app-unpriv: Set ndkVersion as well for stripping
Otherwise, the stripping step always fails in CI builds. This breaks
reproducibility as debug info contains path to NDK.
2024-04-13 15:05:34 -04:00
d588ba78c1 Ditch REPRODUCIBLE_BUILD flag and set all prefix maps unconditionally 2024-04-13 11:33:00 -04:00
a4bd4f4305 Prepare F-Droid release after correcting reproducibility 2024-04-13 10:54:03 -04:00
b112194786 workflows: Correct build reproducibility
- REPRODUCIBLE_BUILD needs to be a string
- Fetch all history to generate versionCode correctly
2024-04-13 10:51:02 -04:00
75132b917c Prepare F-Droid release 2024-04-13 08:39:52 -04:00
ee1cdc8433 fastlane: Update screenshot to match the new Logical Slot -> SIM change 2024-03-30 18:58:30 -04:00
d57f129fa1 Merge remote-tracking branch 'openeuicc/master' into jmp 2024-03-30 18:56:07 -04:00
8b2cf8cb8d jmp: Add initial fastlane metadata 2024-03-30 18:39:18 -04:00
14687acc73 jmp: Customize the timeout dialog 2024-03-30 16:47:30 -04:00
267332afa4 Merge remote-tracking branch 'openeuicc/master' into jmp 2024-03-30 16:43:32 -04:00
02ef31199b jmp: Customize source code URL 2024-03-19 20:02:22 -04:00
bcc563aa83 jmp: Customize default placeholder when eUICC is missing 2024-03-19 20:00:35 -04:00
2270e4aa53 Merge remote-tracking branch 'openeuicc/master' into jmp 2024-03-18 18:49:00 -04:00
a4c474a405 README.md: Update for JMP SIM Manager 2024-03-17 20:22:23 -04:00
85156ca77e workflows: Correct build output path 2024-03-17 20:02:33 -04:00
937af2867a workflows: Correct debug apk name 2024-03-17 19:42:17 -04:00
a379307815 jmp: Adapt forgejo workflows 2024-03-17 17:56:04 -04:00
b37c1088b0 jmp: Add new build variant and branding 2024-03-10 17:07:43 -04:00
37 changed files with 335 additions and 90 deletions

View file

@ -1,7 +1,7 @@
on:
push:
branches:
- 'master'
- 'jmp'
jobs:
build-debug:
@ -33,7 +33,10 @@ jobs:
uses: https://gitea.angry.im/actions/setup-android@v3
- name: Build Debug APKs
run: ./gradlew --no-daemon assembleDebug
run: ./gradlew --no-daemon :app-unpriv:assembleJmpDebug
- name: Build Debug Bundle
run: ./gradlew --no-daemon :app-unpriv:bundleJmpDebug
- name: Copy Artifacts
run: find . -name 'app*-debug.apk' -exec cp {} . \;

View file

@ -1,6 +1,6 @@
on:
push:
tags: '*'
tags: 'jmp-v*'
jobs:
release:
@ -31,17 +31,23 @@ jobs:
- name: Setup Android SDK
uses: https://gitea.angry.im/actions/setup-android@v3
- name: Build Release APK (Unprivileged / EasyEUICC only)
run: ./gradlew --no-daemon :app-unpriv:assembleRelease
- name: Build Release APK
run: ./gradlew --no-daemon :app-unpriv:assembleJmpRelease
- name: Build Release Bundle
run: ./gradlew --no-daemon :app-unpriv:bundleJmpRelease
- name: Copy Debug Symbols to Release Path
run: cp app-unpriv/build/outputs/native-debug-symbols/release/native-debug-symbols.zip app-unpriv/build/outputs/apk/release/
run: cp app-unpriv/build/outputs/native-debug-symbols/jmpRelease/native-debug-symbols.zip app-unpriv/build/outputs/apk/jmp/release/
- name: Copy Bundle to Release Path
run: cp app-unpriv/build/outputs/bundle/jmpRelease/app-unpriv-jmp-release.aab app-unpriv/build/outputs/apk/jmp/release/
- name: Create Release
uses: https://gitea.angry.im/actions/forgejo-release@v1
with:
direction: upload
release-dir: app-unpriv/build/outputs/apk/release
release-dir: app-unpriv/build/outputs/apk/jmp/release
url: https://gitea.angry.im
token: ${{ secrets.FORGEJO_TOKEN }}
# Release details are expected to be edited manually

1
.idea/.name generated Normal file
View file

@ -0,0 +1 @@
OpenEUICC

1
LAST_RELEASE_VERCODE Normal file
View file

@ -0,0 +1 @@
294

View file

@ -1,85 +1,11 @@
<img src="https://gitea.angry.im/PeterCxy/OpenEUICC/media/branch/master/art/OpenEUICCBG.svg" width="512" height="300">
JMP SIM Manager
---
A fully free and open-source Local Profile Assistant implementation for Android devices.
This is a soft fork and branded version of [OpenEUICC](https://gitea.angry.im/PeterCxy/OpenEUICC) for the purpose of the [JMP eSIM Adapter](https://jmp.chat/esim-adapter).
There are two variants of this project:
The eSIM Adapter is a removable eSIM chip that enables the use of downloaded eSIM profiles on any device with a modem. New profiles can be downloaded with the JMP SIM Manager on an Android device, or through a PC/SC smart card reader plugged into the Android device. [lpac](https://github.com/estkme-group/lpac) is available for use on a Linux/Windows/macOS PC.
- OpenEUICC: The full-fledged privileged variant.
- Due to its privilege requirement, OpenEUICC must be placed inside `/system/priv-app` and be signed with the platform certificate.
- The preferred way to including OpenEUICC in a system image is to [build it along with AOSP](#building-aosp).
- __Note__: When privileged, OpenEUICC supports any eUICC chip that implements the SGP.22 standard, internal or external. However, there is __no guarantee__ that external (removable) eSIMs actually follow the standard. Please __DO NOT__ submit bug reports for non-functioning removable eSIMs. They are __NOT__ officially supported unless they also support / are supported by EasyEUICC, the unprivileged variant.
- EasyEUICC: Unprivileged version that can run as a user app.
- This version supports two modes of operation:
1. Inserted, removable eSIMs: Due to obvious security requirements, EasyEUICC is only able to access eSIM chips whose [ARF/ARA](https://source.android.com/docs/core/connect/uicc#arf) contains the hash of EasyEUICC's signing certificate.
2. USB CCID Card Readers: Only `T=0` readers that use the standard [USB CCID protocol](https://en.wikipedia.org/wiki/CCID_(protocol)) are supported. In this mode, EasyEUICC can access any eSIM chip loaded in the card reader regardless of their ARF/ARA, as long as they implement the [SGP.22 standard](https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf).
- Prebuilt release-mode EasyEUICC apks can be downloaded [here](https://gitea.angry.im/PeterCxy/OpenEUICC/releases)
- For removable eSIM chip vendors: to have your chip supported by official builds of EasyEUICC when inserted, include the ARA-M hash `2A2FA878BC7C3354C2CF82935A5945A3EDAE4AFA`
__This project is Free Software licensed under GNU GPL v3, WITHOUT the "or later" clause.__ Any modification and derivative work __MUST__ be released under the SAME license, which means, at the very least, that the source code __MUST__ be available upon request.
__If you are releasing a modification of this app, you are kindly asked to make changes to at least the app name and package name.__
Building (Gradle)
===
Make sure you have all submodules cloned and updated by running
```shell
git submodule update --init
```
A file `keystore.properties` is required in the root directory. Template:
```ini
storePassword=my-store-password
keyPassword=my-password
keyAlias=my-key
unprivKeyPassword=my-unpriv-password
unprivKeyAlias=my-unpriv-key
storeFile=/path/to/android/keystore
```
Note that you must have a Java-compatible keystore generated first.
To build the privileged OpenEUICC:
```shell
./gradlew :app:assembleRelease
```
For EasyEUICC:
```shell
./gradlew :app-unpriv:assembleRelease
```
Building (AOSP)
===
There are two ways to include OpenEUICC in your AOSP-based system image:
1. Include this project and its [dependencies](https://gitea.angry.im/PeterCxy/android_prebuilts_openeuicc-deps) inside the AOSP tree.
- If inclusion in `manifest.xml` is required, remember to set the `sync-s` option to clone submodules.
- The module name is `OpenEUICC`. You can include it in `PRODUCT_PACKAGES`, or simply build it standalone using `mm`.
- Compilation of this project is **only** tested against the latest AOSP release version. The app itself should be compatible with older AOSP versions, but the source may not compile against an older AOSP source tree.
2. If compilation against AOSP source tree is not possible, consider [building with gradle](#building-gradle) and import the apk as a prebuilt.
- No official `Android.bp` is provided for this case but it should be straightforward to write.
- You might want to include `privapp_whitelist_im.angry.openeuicc.xml` as well.
FAQs
===
- Q: Do you provide prebuilt binaries for OpenEUICC?
- A: Debug-mode APKs are available continuously as an artifact of the [Actions](https://gitea.angry.im/PeterCxy/OpenEUICC/actions) CI used by this project. However, these debug-mode APKs are **not** intended for inclusion inside system images, nor are they supported by the developer in any sense. If you are a custom ROM developer, either include the entire OpenEUICC repository in your AOSP source tree, or generate an APK using `gradle` and import that as a prebuilt system app. Note that you might want `privapp_whitelist_im.angry.openeuicc.xml` as well.
- Q: AOSP's Settings app seems to be confused by OpenEUICC (for example, disabling / enabling profiles from the Networks page do not work properly)
- A: When your device has internal eSIM chip(s) __and__ you have inserted a removable eSIM chip, the Settings app can misbehave since it was never designed for this scenario. __Please prefer using OpenEUICC's own management interface whenever possible.__ In the future, there might be an option to exclude removable SIMs from being reported to the Android system.
- Q: Can EasyEUICC manage my phone's internal eSIM?
- A: No. For EasyEUICC to work, the eSIM chip MUST proactively grant access via its ARA-M field.
- Q: Removable eSIMs? Are they a joke?
- A: No, even though the name "removable embedded SIM" can sound like an oxymoron. In fact, there can be many advantages to these chips compared to fully embedded ones. For example, the ability to transfer eSIM profiles without carrier support or approval, or the ability to use eSIM on devices that do not and may never get the support, such as Wi-Fi hotspots.
Releases can be found in the [release page](https://gitea.angry.im/jmp-sim/jmp-sim-manager/releases).
Copyright
===

View file

@ -32,6 +32,16 @@ android {
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
flavorDimensions += "variant"
productFlavors {
create("jmp") {
dimension = "variant"
applicationId = "chat.jmp.simmanager"
// See: Signing.kt
signingConfig = signingConfigs.getByName("config")
isDefault = true
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
@ -39,6 +49,10 @@ android {
kotlinOptions {
jvmTarget = "1.8"
}
dependenciesInfo {
// Disable dependency metadata -- breaks compatibility with F-Droid
includeInApk = false
}
}
dependencies {

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
tools:replace="android:icon,android:roundIcon,android:name"
android:name="im.angry.openeuicc.JmpSimManagerApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher_jmp"
android:roundIcon="@mipmap/ic_launcher_jmp"
android:label="@string/app_name"
android:supportsRtl="true"
android:localeConfig="@xml/locale_config"
android:theme="@style/Theme.OpenEUICC" />
</manifest>

View file

@ -0,0 +1,9 @@
package im.angry.openeuicc
import im.angry.openeuicc.di.JmpAppContainer
class JmpSimManagerApplication : UnprivilegedOpenEuiccApplication() {
override val appContainer by lazy {
JmpAppContainer(this)
}
}

View file

@ -0,0 +1,13 @@
package im.angry.openeuicc.di
import android.content.Context
class JmpAppContainer(context: Context) : UnprivilegedAppContainer(context) {
override val uiComponentFactory by lazy {
JmpUiComponentFactory()
}
override val customizableTextProvider by lazy {
JmpCustomizableTextProvider(context)
}
}

View file

@ -0,0 +1,12 @@
package im.angry.openeuicc.di
import android.content.Context
import im.angry.easyeuicc.R
class JmpCustomizableTextProvider(private val context: Context) :
UnprivilegedCustomizableTextProvider(context) {
override val noEuiccExplanation: String
get() = context.getString(R.string.no_euicc_jmp)
override val profileSwitchingTimeoutMessage: String
get() = context.getString(R.string.enable_disable_timeout_jmp)
}

View file

@ -0,0 +1,9 @@
package im.angry.openeuicc.di
import androidx.fragment.app.Fragment
import im.angry.openeuicc.ui.JmpNoEuiccPlaceholderFragment
class JmpUiComponentFactory : UnprivilegedUiComponentFactory() {
override fun createNoEuiccPlaceholderFragment(): Fragment =
JmpNoEuiccPlaceholderFragment()
}

View file

@ -0,0 +1,39 @@
package im.angry.openeuicc.ui
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import im.angry.easyeuicc.R
class JmpNoEuiccPlaceholderFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(
R.layout.fragment_no_euicc_placeholder_jmp,
container,
false
)
view.findViewById<View>(R.id.compatibility_check).setOnClickListener {
startActivity(Intent(requireContext(), CompatibilityCheckActivity::class.java))
}
view.findViewById<View>(R.id.purchase_esim).setOnClickListener {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(getString(R.string.purchase_sim_url))
)
)
}
return view
}
}

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="96dp"
android:height="96dp"
android:viewportHeight="100"
android:viewportWidth="100">
<path
android:pathData="M1,1 H99 V99 H1Z"
android:strokeColor="?android:attr/colorAccent"
android:strokeWidth="2">
<aapt:attr name="android:fillColor">
<gradient
android:endColor="#130036"
android:endX="50"
android:endY="99"
android:startColor="#7401CF"
android:startX="50"
android:startY="1"
android:type="linear" />
</aapt:attr>
</path>
</vector>

View file

@ -0,0 +1,54 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="210dp"
android:height="210dp"
android:viewportWidth="210"
android:viewportHeight="210">
<path
android:pathData="m95.17,55.853 l-29.489,29.489v58.977c0,2.703 0.962,5.016 2.887,6.941 1.925,1.925 4.24,2.887 6.943,2.887h58.977c2.703,0 5.018,-0.963 6.943,-2.887 1.925,-1.925 2.887,-4.238 2.887,-6.941V65.681c0,-2.703 -0.962,-5.016 -2.887,-6.941 -1.925,-1.925 -4.24,-2.887 -6.943,-2.887z"
android:strokeWidth="6.38014"
android:fillColor="#00000000"
android:strokeColor="#ffffff"/>
<path
android:pathData="m74.928,88.813c-2.065,4.027 -2.065,9.301 -2.065,19.845L72.863,112.425c0,10.544 0,15.819 2.065,19.845 1.816,3.543 4.715,6.423 8.279,8.228 1.245,0.629 2.606,1.068 4.203,1.369 0.85,0.161 1.456,0.915 1.434,1.775l-0.092,3.919c-0.016,0.726 0.866,1.102 1.386,0.589l4.111,-4.078c1.001,-0.992 2.36,-1.547 3.776,-1.539 1.567,0.016 3.275,0.016 5.151,0.016l3.789,0c10.61,0 15.917,0 19.969,-2.052 3.564,-1.805 6.463,-4.686 8.28,-8.228 2.065,-4.027 2.065,-9.301 2.065,-19.845l0,-3.766c0,-10.544 0,-15.819 -2.065,-19.845C133.397,85.271 130.498,82.39 126.934,80.585 122.882,78.533 117.575,78.533 106.965,78.533l-3.789,0c-10.61,0 -15.917,0 -19.969,2.052 -3.564,1.805 -6.463,4.686 -8.279,8.228z"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:startY="78.53296"
android:startX="105.070526"
android:endY="140.1298"
android:endX="105.070526"
android:type="linear">
<item android:offset="0" android:color="#FF93D2FF"/>
<item android:offset="0.229167" android:color="#FF4A9BD5"/>
<item android:offset="0.7188" android:color="#FF398BD7"/>
<item android:offset="1" android:color="#FF1960CC"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="m133.604,102.178c-2.77,-2.157 -6.732,-3.68 -11.453,-4.396 -0.9,-0.137 -1.816,0.104 -2.527,0.666 -0.709,0.562 -1.149,1.39 -1.21,2.289L117.351,116.109c-0.025,0.349 -0.514,0.349 -0.539,0.001L115.527,98.559c-0.126,-1.984 -1.621,-3.55 -3.646,-3.812 -2.039,-0.264 -3.903,0.88 -4.536,2.784 -0.021,0.06 -0.039,0.122 -0.055,0.182l-2.943,11.245c-0.156,0.594 -0.952,0.615 -1.139,0.03L99.778,98.186c-0.597,-1.909 -2.503,-3.118 -4.534,-2.875 -2.029,0.243 -3.573,1.864 -3.67,3.865l-0.598,13.168c-0.015,0.334 -0.475,0.361 -0.529,0.033L88.57,101.029c-0.293,-1.783 -1.997,-3.001 -3.798,-2.718 -1.804,0.283 -3.026,1.958 -2.73,3.743l2.693,16.277c0.293,2.377 -0.431,4.01 -1.941,4.369 -1.382,0.328 -3.305,-0.487 -4.267,-3.052 -0.64,-1.7 -2.545,-2.572 -4.258,-1.952 -1.712,0.62 -2.586,2.5 -1.95,4.195 1.72,4.584 5.305,6.921 8.8,7.339 1.115,0.132 2.22,0.071 3.252,-0.176 1.957,-0.466 3.83,-1.625 5.153,-3.445 0.275,-0.379 0.857,-0.148 0.836,0.327l-0.106,2.352c-0.075,1.665 1.249,3.076 2.957,3.158 1.71,0.074 3.155,-1.208 3.231,-2.873l0.731,-16.087c0.017,-0.381 0.527,-0.453 0.643,-0.091l2.295,7.229c0.521,1.664 2.064,2.799 3.843,2.837 0.014,-0 0.029,-0 0.041,-0 1.8,0.018 3.378,-1.088 3.933,-2.753 0.021,-0.06 0.037,-0.122 0.055,-0.182l1.745,-6.665c0.099,-0.372 0.619,-0.32 0.647,0.065l1.182,16.147c0.115,1.571 1.444,2.778 3.029,2.811 0.093,0.002 0.186,0.001 0.281,-0.005 1.706,-0.115 2.99,-1.554 2.867,-3.217 -0.025,-0.35 0.33,-0.578 0.625,-0.41 0.413,0.237 0.884,0.386 1.392,0.421 0.064,0.004 0.131,0.006 0.196,0.008 1.712,0.019 3.157,-1.285 3.277,-2.995l0.318,-4.59c0.037,-0.53 0.438,-0.952 0.945,-1 9.346,-0.858 13.079,-5.544 13.384,-9.605 0.224,-3.045 -1.287,-5.994 -4.264,-8.31zM125.167,113.511c-0.571,0.088 -1.075,-0.399 -1.034,-0.999l0.443,-6.428c0.044,-0.612 0.63,-1.022 1.188,-0.824 3.937,1.398 5.701,3.444 5.606,4.736 -0.091,1.235 -2.084,2.87 -6.204,3.514z"
android:fillColor="#013255"
android:fillAlpha="0.2"/>
<path
android:pathData="m134.639,100.182c-2.894,-2.156 -7.036,-3.677 -11.971,-4.39 -0.941,-0.137 -1.898,0.105 -2.642,0.667 -0.742,0.563 -1.201,1.391 -1.267,2.29l-1.118,15.373c-0.026,0.349 -0.537,0.349 -0.563,0.001L115.743,96.572c-0.131,-1.984 -1.693,-3.549 -3.81,-3.81 -2.131,-0.263 -4.081,0.882 -4.743,2.787 -0.022,0.06 -0.041,0.122 -0.058,0.182l-3.082,11.247c-0.163,0.594 -0.995,0.615 -1.191,0.03L99.278,96.207c-0.624,-1.909 -2.616,-3.117 -4.739,-2.873 -2.121,0.244 -3.736,1.866 -3.839,3.867l-0.631,13.168c-0.016,0.333 -0.497,0.361 -0.553,0.033L87.56,99.055c-0.306,-1.783 -2.086,-3 -3.97,-2.717 -1.886,0.284 -3.164,1.959 -2.856,3.744l2.807,16.276c0.305,2.377 -0.453,4.01 -2.032,4.37 -1.445,0.329 -3.455,-0.486 -4.459,-3.05 -0.669,-1.699 -2.66,-2.571 -4.45,-1.95 -1.79,0.621 -2.705,2.501 -2.041,4.196 1.796,4.583 5.543,6.919 9.196,7.335 1.165,0.132 2.321,0.07 3.4,-0.178 2.046,-0.467 4.005,-1.627 5.389,-3.448 0.288,-0.379 0.896,-0.149 0.873,0.327L89.306,126.313c-0.079,1.665 1.304,3.076 3.09,3.156 1.788,0.073 3.299,-1.209 3.379,-2.874l0.772,-16.088c0.018,-0.381 0.551,-0.454 0.672,-0.092l2.396,7.228c0.544,1.663 2.156,2.798 4.016,2.835 0.015,-0 0.03,-0 0.042,-0 1.882,0.017 3.533,-1.09 4.113,-2.755 0.022,-0.06 0.039,-0.122 0.058,-0.182l1.828,-6.666c0.103,-0.372 0.647,-0.32 0.676,0.065l1.228,16.146c0.119,1.571 1.508,2.778 3.166,2.81 0.097,0.001 0.194,0 0.294,-0.006 1.783,-0.116 3.126,-1.556 2.999,-3.218 -0.026,-0.35 0.345,-0.578 0.654,-0.41 0.431,0.237 0.924,0.386 1.455,0.42 0.067,0.004 0.137,0.006 0.205,0.008 1.79,0.018 3.301,-1.286 3.427,-2.997l0.335,-4.591c0.039,-0.53 0.458,-0.953 0.989,-1 9.771,-0.862 13.676,-5.551 13.996,-9.611 0.237,-3.045 -1.343,-5.993 -4.454,-8.308zM125.813,111.52c-0.597,0.088 -1.123,-0.398 -1.08,-0.998L125.2,104.093c0.046,-0.612 0.66,-1.022 1.242,-0.824 4.115,1.397 5.959,3.442 5.859,4.734 -0.096,1.235 -2.18,2.871 -6.488,3.517z"
android:fillColor="#013255"
android:fillAlpha="0.15"/>
<path
android:pathData="m134.722,99.167c-2.899,-2.15 -7.046,-3.666 -11.988,-4.378 -0.943,-0.136 -1.901,0.105 -2.646,0.666 -0.743,0.561 -1.203,1.387 -1.268,2.283l-1.121,15.33c-0.026,0.348 -0.538,0.348 -0.564,0.001l-1.336,-17.502c-0.131,-1.978 -1.695,-3.539 -3.815,-3.8 -2.134,-0.263 -4.087,0.879 -4.75,2.779 -0.022,0.06 -0.041,0.122 -0.058,0.182l-3.087,11.216c-0.163,0.592 -0.997,0.613 -1.193,0.03l-3.585,-10.77c-0.625,-1.904 -2.619,-3.108 -4.746,-2.864 -2.124,0.243 -3.742,1.861 -3.845,3.856l-0.633,13.132c-0.016,0.333 -0.498,0.36 -0.554,0.033l-1.959,-11.316c-0.306,-1.778 -2.089,-2.992 -3.975,-2.709 -1.889,0.283 -3.169,1.954 -2.86,3.734l2.81,16.231c0.305,2.371 -0.454,3.999 -2.035,4.358 -1.447,0.328 -3.46,-0.484 -4.466,-3.041 -0.67,-1.695 -2.663,-2.564 -4.456,-1.945 -1.793,0.619 -2.709,2.495 -2.044,4.184 1.799,4.57 5.551,6.899 9.209,7.314 1.167,0.132 2.325,0.07 3.405,-0.178 2.049,-0.466 4.011,-1.623 5.397,-3.438 0.288,-0.378 0.897,-0.148 0.875,0.326l-0.112,2.345c-0.08,1.66 1.306,3.067 3.094,3.147 1.79,0.073 3.304,-1.206 3.384,-2.866l0.774,-16.043c0.018,-0.38 0.552,-0.452 0.673,-0.092l2.399,7.208c0.544,1.659 2.159,2.79 4.022,2.827 0.015,-0 0.03,-0 0.042,-0 1.885,0.017 3.538,-1.087 4.119,-2.748 0.022,-0.06 0.039,-0.122 0.058,-0.182l1.831,-6.648c0.103,-0.371 0.648,-0.319 0.677,0.065l1.229,16.101c0.119,1.567 1.51,2.77 3.17,2.802 0.097,0.001 0.195,0 0.295,-0.006 1.786,-0.116 3.131,-1.551 3.003,-3.21 -0.026,-0.349 0.346,-0.577 0.655,-0.409 0.432,0.236 0.925,0.385 1.457,0.419 0.067,0.004 0.137,0.006 0.205,0.008 1.792,0.018 3.306,-1.283 3.432,-2.988l0.335,-4.578c0.039,-0.529 0.459,-0.95 0.99,-0.998 9.785,-0.86 13.696,-5.536 14.017,-9.585 0.237,-3.036 -1.345,-5.977 -4.459,-8.285zM125.883,110.474c-0.598,0.088 -1.125,-0.397 -1.082,-0.996l0.468,-6.41c0.046,-0.611 0.66,-1.019 1.244,-0.822 4.121,1.393 5.967,3.432 5.866,4.72 -0.096,1.231 -2.183,2.864 -6.497,3.507z"
android:fillColor="#ffffff"/>
<path
android:pathData="m134.722,99.167c-2.898,-2.15 -7.046,-3.666 -11.988,-4.378 -0.943,-0.136 -1.901,0.105 -2.646,0.666 -0.743,0.561 -1.203,1.387 -1.268,2.283l-1.121,15.33c-0.026,0.348 -0.538,0.348 -0.564,0.001l-1.336,-17.502c-0.131,-1.978 -1.695,-3.539 -3.815,-3.8 -2.134,-0.263 -4.087,0.879 -4.75,2.779 -0.022,0.06 -0.041,0.122 -0.058,0.182l-3.087,11.216c-0.163,0.592 -0.997,0.613 -1.193,0.03l-3.585,-10.77c-0.624,-1.904 -2.619,-3.108 -4.746,-2.864 -2.124,0.243 -3.742,1.861 -3.845,3.856l-0.633,13.132c-0.016,0.333 -0.498,0.36 -0.554,0.033l-1.959,-11.316c-0.306,-1.778 -2.089,-2.992 -3.975,-2.709 -1.889,0.283 -3.169,1.954 -2.86,3.734l2.81,16.231c0.305,2.371 -0.454,3.999 -2.035,4.358 -1.447,0.328 -3.46,-0.484 -4.466,-3.041 -0.67,-1.695 -2.663,-2.564 -4.456,-1.945 -1.793,0.619 -2.709,2.495 -2.044,4.184 1.799,4.57 5.551,6.899 9.209,7.314 1.167,0.132 2.325,0.07 3.405,-0.178 2.049,-0.466 4.011,-1.623 5.397,-3.438 0.288,-0.378 0.897,-0.148 0.875,0.326l-0.112,2.345c-0.08,1.66 1.306,3.067 3.094,3.147 1.79,0.073 3.304,-1.206 3.384,-2.866l0.774,-16.043c0.018,-0.38 0.552,-0.452 0.673,-0.092l2.399,7.208c0.545,1.659 2.159,2.79 4.022,2.827 0.015,-0 0.03,-0 0.042,-0 1.885,0.017 3.538,-1.087 4.119,-2.748 0.022,-0.06 0.039,-0.122 0.058,-0.182l1.831,-6.648c0.103,-0.371 0.648,-0.319 0.677,0.065l1.229,16.101c0.119,1.567 1.51,2.77 3.17,2.802 0.097,0.001 0.195,0 0.295,-0.006 1.786,-0.116 3.131,-1.551 3.003,-3.21 -0.026,-0.349 0.346,-0.577 0.655,-0.409 0.432,0.236 0.925,0.385 1.457,0.419 0.067,0.004 0.137,0.006 0.205,0.008 1.792,0.018 3.306,-1.283 3.432,-2.988l0.335,-4.578c0.039,-0.529 0.459,-0.95 0.99,-0.998 9.786,-0.86 13.697,-5.536 14.017,-9.585 0.237,-3.036 -1.345,-5.977 -4.46,-8.285zM125.882,110.474c-0.598,0.088 -1.125,-0.397 -1.081,-0.996l0.468,-6.41c0.046,-0.611 0.661,-1.019 1.244,-0.822 4.121,1.393 5.967,3.432 5.867,4.72 -0.096,1.231 -2.183,2.864 -6.497,3.507z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="91.803"
android:startX="104.54753"
android:endY="128.90585"
android:endX="104.94141"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#3D8DCDFC"/>
</gradient>
</aapt:attr>
</path>
</vector>

View file

@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="210dp"
android:height="210dp"
android:viewportWidth="210"
android:viewportHeight="210">
<path
android:pathData="M94.373,52.662 L62.492,84.064v60.254c0,3.46 1.368,6.745 3.82,9.197 2.453,2.453 5.739,3.822 9.199,3.822h58.977c3.46,0 6.746,-1.369 9.199,-3.822 2.452,-2.452 3.82,-5.737 3.82,-9.197L147.508,65.682c0,-3.46 -1.368,-6.745 -3.82,-9.197 -2.453,-2.453 -5.739,-3.822 -9.199,-3.822zM96.492,59.043h37.996c1.946,0 3.291,0.556 4.688,1.953 1.397,1.397 1.953,2.74 1.953,4.686v78.637c0,1.946 -0.556,3.288 -1.953,4.686 -1.397,1.397 -2.742,1.953 -4.688,1.953L75.512,150.957c-1.946,0 -3.291,-0.556 -4.688,-1.953 -1.397,-1.397 -1.953,-2.74 -1.953,-4.686L68.871,86.662Z"
android:strokeWidth="0"
android:fillColor="#000000"
android:strokeColor="#00000000"/>
<path
android:pathData="M103.176,78.533C92.566,78.533 87.259,78.534 83.207,80.586C79.643,82.391 76.744,85.27 74.928,88.813C72.863,92.839 72.863,98.114 72.863,108.658L72.863,112.424C72.863,113.247 72.872,113.844 72.873,114.605C74.589,114.163 76.412,115.012 77.047,116.619C78.053,119.176 80.067,119.988 81.514,119.66C83.095,119.301 83.854,117.672 83.549,115.301L80.738,99.07C80.43,97.29 81.709,95.619 83.598,95.336C85.484,95.053 87.268,96.267 87.574,98.045L89.533,109.361C89.589,109.688 90.07,109.661 90.086,109.328L90.719,96.195C90.822,94.2 92.44,92.583 94.564,92.34C96.691,92.097 98.686,93.302 99.311,95.205L102.895,105.975C103.09,106.558 103.924,106.537 104.088,105.945L107.176,94.729C107.193,94.669 107.211,94.607 107.232,94.547C107.896,92.647 109.848,91.505 111.982,91.768C114.102,92.028 115.666,93.59 115.797,95.568L117.135,113.07C117.161,113.417 117.671,113.416 117.697,113.068L118.818,97.738C118.884,96.842 119.345,96.016 120.088,95.455C120.833,94.894 121.792,94.653 122.734,94.789C127.677,95.501 131.823,97.018 134.721,99.168C135.733,99.918 136.566,100.738 137.244,101.604C137.145,95.529 136.755,91.82 135.213,88.813C133.397,85.27 130.498,82.391 126.934,80.586C122.882,78.534 117.574,78.533 106.965,78.533L103.176,78.533zM126.293,102.199C125.784,102.154 125.31,102.534 125.27,103.068L124.801,109.479C124.757,110.077 125.285,110.563 125.883,110.475C130.196,109.831 132.283,108.198 132.379,106.967C132.48,105.678 130.635,103.639 126.514,102.246C126.441,102.221 126.366,102.206 126.293,102.199zM96.871,109.143C96.72,109.163 96.581,109.275 96.572,109.465L95.799,125.508C95.719,127.168 94.206,128.448 92.416,128.375C90.628,128.295 89.241,126.887 89.32,125.227L89.434,122.883C89.456,122.409 88.847,122.179 88.559,122.557C87.173,124.372 85.211,125.528 83.162,125.994C82.081,126.241 80.923,126.303 79.756,126.172C77.349,125.899 74.907,124.791 73.002,122.768C73.2,126.957 73.688,129.851 74.928,132.27C76.744,135.812 79.643,138.693 83.207,140.498C84.452,141.127 85.813,141.566 87.41,141.867C88.26,142.029 88.867,142.782 88.846,143.643L88.754,147.563C88.738,148.289 89.619,148.664 90.139,148.15L94.25,144.072C95.251,143.08 96.61,142.527 98.025,142.535C99.592,142.551 101.3,142.551 103.176,142.551L106.965,142.551C117.574,142.551 122.882,142.55 126.934,140.498C130.498,138.693 133.397,135.812 135.213,132.27C137.278,128.243 137.279,122.968 137.279,112.424L137.279,111.916C135.219,114.403 131.38,116.491 125.164,117.037C124.633,117.085 124.213,117.506 124.174,118.035L123.838,122.613C123.711,124.319 122.199,125.62 120.406,125.602C120.339,125.6 120.269,125.598 120.201,125.594C119.669,125.56 119.176,125.412 118.744,125.176C118.435,125.008 118.064,125.235 118.09,125.584C118.217,127.242 116.872,128.677 115.086,128.793C114.986,128.799 114.89,128.8 114.793,128.799C113.133,128.767 111.74,127.565 111.621,125.998L110.393,109.896C110.364,109.512 109.82,109.461 109.717,109.832L107.885,116.479C107.865,116.538 107.85,116.602 107.828,116.662C107.247,118.323 105.594,119.425 103.709,119.408C103.697,119.408 103.681,119.41 103.666,119.41C101.804,119.373 100.189,118.241 99.645,116.582L97.246,109.373C97.186,109.193 97.022,109.122 96.871,109.143z"
android:strokeWidth="0.642739"
android:fillColor="#000000"/>
</vector>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/no_euicc_placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:gravity="center"
android:text="@string/no_euicc_jmp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/compatibility_check"
android:text="@string/compatibility_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/no_euicc_placeholder"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/purchase_esim"
android:text="@string/purchase_esim"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/compatibility_check"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<foreground android:drawable="@drawable/ic_launcher_jmp_foreground"/>
<background android:drawable="@drawable/ic_launcher_jmp_background"/>
<monochrome android:drawable="@drawable/ic_launcher_jmp_monochrome"/>
</adaptive-icon>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="no_euicc_jmp">このデバイスで JMP eSIM Adapter を見つかりません。JMP eSIM Adapter をデバイスに挿入、または USB リーダーに経由し接続してください。</string>
<string name="purchase_esim">JMP eSIM Adapter を購入</string>
<string name="enable_disable_timeout_jmp">eSIM チップがプロファイルの切り替えの待機中にタイムアウトしました。 SIM ツールキットの Tools -> Reboot を選択し、eSIM Adapter をリフレッシュしてください。</string>
</resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="no_euicc_jmp">没有在此设备上发现 JMP eSIM Adapter。请将其插入本设备或 USB 读卡器。</string>
<string name="purchase_esim">购入 JMP eSIM Adapter</string>
<string name="enable_disable_timeout_jmp">等待 eSIM 芯片切换配置文件超时。请使用 SIM Toolkit 中的 Tools -> Reboot 手动刷新 eSIM Adapter。</string>
</resources>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">JMP SIM Manager</string>
<string name="no_euicc_jmp">No JMP eSIM Adapter found on this device. Insert one into the device or through a USB card reader.</string>
<string name="purchase_esim">Buy JMP eSIM Adapter</string>
<string name="purchase_sim_url" translatable="false">https://jmp.chat/esim-adapter</string>
<string name="pref_info_source_code_url" translatable="false">https://gitea.angry.im/jmp-sim/jmp-sim-manager</string>
<string name="enable_disable_timeout_jmp">Timed out waiting for the eSIM chip to switch profiles. Please manually refresh the eSIM adapter by going to SIM Toolkit, and select Tools -> Reboot.</string>
</resources>

View file

@ -7,7 +7,7 @@ import im.angry.openeuicc.util.*
import kotlinx.coroutines.runBlocking
import kotlin.system.exitProcess
class UnprivilegedOpenEuiccApplication : OpenEuiccApplication() {
open class UnprivilegedOpenEuiccApplication : OpenEuiccApplication() {
override val appContainer by lazy {
UnprivilegedAppContainer(this)
}

View file

@ -2,7 +2,7 @@ package im.angry.openeuicc.di
import android.content.Context
class UnprivilegedAppContainer(context: Context) : DefaultAppContainer(context) {
open class UnprivilegedAppContainer(context: Context) : DefaultAppContainer(context) {
override val uiComponentFactory by lazy {
UnprivilegedUiComponentFactory()
}

View file

@ -3,7 +3,7 @@ package im.angry.openeuicc.di
import android.content.Context
import im.angry.easyeuicc.R
class UnprivilegedCustomizableTextProvider(private val context: Context) :
open class UnprivilegedCustomizableTextProvider(private val context: Context) :
DefaultCustomizableTextProvider(context) {
override fun formatInternalChannelName(logicalSlotId: Int): String =
context.getString(R.string.channel_name_format_unpriv, logicalSlotId)

View file

@ -7,7 +7,7 @@ import im.angry.openeuicc.ui.UnprivilegedEuiccManagementFragment
import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment
import im.angry.openeuicc.ui.UnprivilegedSettingsFragment
class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
open class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
override fun createEuiccManagementFragment(slotId: Int, portId: Int): EuiccManagementFragment =
UnprivilegedEuiccManagementFragment.newInstance(slotId, portId)

View file

@ -0,0 +1 @@
Initial public release of JMP SIM Manager.

View file

@ -0,0 +1 @@
Initial Google Play + F-Droid release of JMP SIM Manager.

View file

@ -0,0 +1,3 @@
- Added support for USB card readers (standard T=0 CCID protocol required)
- UI improvements (partially to accomodate USB readers)
- Fixed numerous crashes and stability issues

View file

@ -0,0 +1 @@
Fix JNI crash on armv7 (32 bit) devices

View file

@ -0,0 +1,3 @@
- Fixes compatibility on some devices which require slower APDU commands (e.g. Google Pixel series)
- Optimize long-running tasks (downloading, switching, etc.) to rely on true background services
- Miscellaneous bugfixes

View file

@ -0,0 +1,4 @@
- Brand new eSIM download wizard, with more detailed download progress and error diagnosis.
- New menu option inside the main UI which brings up detailed information about each eSIM adapter, including their EID, free NVRAM space etc.
- i18n translation for zh_CN and ja_JP (inherited from contribution to OpenEUICC)
- Many miscellaneous bugfixes and improvements, including ones for USB readers.

View file

@ -0,0 +1,4 @@
- Brand new eSIM download wizard, with more detailed download progress and error diagnosis.
- New menu option inside the main UI which brings up detailed information about each eSIM adapter, including their EID, free NVRAM space etc.
- i18n translation for zh_CN and ja_JP (inherited from contribution to OpenEUICC)
- Many miscellaneous bugfixes and improvements, including ones for USB readers.

View file

@ -0,0 +1,5 @@
JMP SIM Manager is a fully free and open-source companion app for the JMP eSIM Adapter. The JMP eSIM Adapter is a removable eSIM chip that enables any device, not just those with included eSIM chips, to make use of downloadable eSIMs.
JMP SIM Manager provides management features such as adding, deleting, enabling, and disabling eSIM profiles for the adapter, and is the easiest option to manage your eSIM Adapter on compatible Android host devices. The manager app is <strong>not</strong> required once a profile has been downloaded and enabled on the adapter. In other words, you can use a compatible Android device to download your eSIM profile of choice onto the adapter, and then insert the adapter into any device -- Wi-Fi hotspots, dumb phones, laptops -- and the adapter will simply appear as a regular SIM card to those devices.
This app also includes a quick compatibility check to determine whether your Android device can be used to manage a JMP eSIM Adapter. Although the eSIM Adapter will work with almost any device once an eSIM profile is loaded, management requires some specific features that may not be present on a small percentage of Android devices. However, even if your Android device is deemed incompatible, you can still manage the adapter from another Android device, using a PC/SC reader on a PC, or, as a final fallback, through the SIM Toolkit menu along with a self-hostable remote server to handle TLS termination.

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View file

@ -0,0 +1 @@
Companion app for the JMP eSIM Adapter

View file

@ -0,0 +1 @@
JMP SIM Manager

14
prepare_release.sh Executable file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -e
new_version=$(($(git rev-list --first-parent --count HEAD) + 1))
echo "New version code will be: ${new_version}"
echo "${new_version}" > ./LAST_RELEASE_VERCODE
changelog_path="./fastlane/metadata/android/en-US/changelogs"
mkdir -p ${changelog_path}
changelog_file="${changelog_path}/${new_version}.txt"
echo "Creating new changelog: ${changelog_file}"
touch "${changelog_file}"
echo "Please populate the changelog above, then create ONE commit, and tag the release."