Browse Source

refactor: profile download callback (#284)

Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/284
Co-authored-by: septs <github@septs.pw>
Co-committed-by: septs <github@septs.pw>
septs 1 month ago
parent
commit
b9863e2e54

+ 4 - 8
app-common/src/main/java/im/angry/openeuicc/core/LocalProfileAssistantWrapper.kt

@@ -1,5 +1,6 @@
 package im.angry.openeuicc.core
 
+import net.typeblog.lpac_jni.ProfileDownloadInput
 import net.typeblog.lpac_jni.EuiccInfo2
 import net.typeblog.lpac_jni.LocalProfileAssistant
 import net.typeblog.lpac_jni.LocalProfileInfo
@@ -40,13 +41,8 @@ class LocalProfileAssistantWrapper(orig: LocalProfileAssistant) :
 
     override fun deleteProfile(iccid: String): Boolean = lpa.deleteProfile(iccid)
 
-    override fun downloadProfile(
-        smdp: String,
-        matchingId: String?,
-        imei: String?,
-        confirmationCode: String?,
-        callback: ProfileDownloadCallback
-    ) = lpa.downloadProfile(smdp, matchingId, imei, confirmationCode, callback)
+    override fun downloadProfile(input: ProfileDownloadInput, callback: ProfileDownloadCallback) =
+        lpa.downloadProfile(input, callback)
 
     override fun deleteNotification(seqNumber: Long): Boolean = lpa.deleteNotification(seqNumber)
 
@@ -63,4 +59,4 @@ class LocalProfileAssistantWrapper(orig: LocalProfileAssistant) :
     fun invalidateWrapper() {
         _inner = null
     }
-}
+}

+ 7 - 20
app-common/src/main/java/im/angry/openeuicc/service/EuiccChannelManagerService.kt

@@ -37,7 +37,7 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withTimeoutOrNull
 import kotlinx.coroutines.yield
-import net.typeblog.lpac_jni.ProfileDownloadCallback
+import net.typeblog.lpac_jni.ProfileDownloadInput
 
 /**
  * An Android Service wrapper for EuiccChannelManager.
@@ -379,13 +379,8 @@ class EuiccChannelManagerService : LifecycleService(), OpenEuiccContextMarker {
     }
 
     fun launchProfileDownloadTask(
-        slotId: Int,
-        portId: Int,
-        seId: EuiccChannel.SecureElementId,
-        smdp: String,
-        matchingId: String?,
-        confirmationCode: String?,
-        imei: String?
+        slotId: Int, portId: Int, seId: EuiccChannel.SecureElementId,
+        input: ProfileDownloadInput
     ): ForegroundTaskSubscriberFlow =
         launchForegroundTask(
             getString(R.string.task_profile_download),
@@ -394,18 +389,10 @@ class EuiccChannelManagerService : LifecycleService(), OpenEuiccContextMarker {
         ) {
             euiccChannelManager.beginTrackedOperation(slotId, portId, seId) {
                 euiccChannelManager.withEuiccChannel(slotId, portId, seId) { channel ->
-                    channel.lpa.downloadProfile(
-                        smdp,
-                        matchingId,
-                        imei,
-                        confirmationCode,
-                        object : ProfileDownloadCallback {
-                            override fun onStateUpdate(state: ProfileDownloadCallback.DownloadState) {
-                                if (state.progress == 0) return
-                                foregroundTaskState.value =
-                                    ForegroundTaskState.InProgress(state.progress)
-                            }
-                        })
+                    channel.lpa.downloadProfile(input) { state ->
+                        if (state.progress == 0) return@downloadProfile
+                        foregroundTaskState.value = ForegroundTaskState.InProgress(state.progress)
+                    }
                 }
 
                 preferenceRepository.notificationDownloadFlow.first()

+ 10 - 14
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardProgressFragment.kt

@@ -18,8 +18,9 @@ import im.angry.openeuicc.util.*
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
+import net.typeblog.lpac_jni.ProfileDownloadInput
+import net.typeblog.lpac_jni.ProfileDownloadState
 import net.typeblog.lpac_jni.LocalProfileAssistant
-import net.typeblog.lpac_jni.ProfileDownloadCallback
 
 class DownloadWizardProgressFragment : DownloadWizardActivity.DownloadWizardStepFragment() {
     companion object {
@@ -27,11 +28,11 @@ class DownloadWizardProgressFragment : DownloadWizardActivity.DownloadWizardStep
          * An array of LPA-side state types, mapping 1:1 to progressItems
          */
         val LPA_PROGRESS_STATES = arrayOf(
-            ProfileDownloadCallback.DownloadState.Preparing,
-            ProfileDownloadCallback.DownloadState.Connecting,
-            ProfileDownloadCallback.DownloadState.Authenticating,
-            ProfileDownloadCallback.DownloadState.Downloading,
-            ProfileDownloadCallback.DownloadState.Finalizing,
+            ProfileDownloadState.Preparing,
+            ProfileDownloadState.Connecting,
+            ProfileDownloadState.Authenticating,
+            ProfileDownloadState.Downloading,
+            ProfileDownloadState.Finalizing,
         )
     }
 
@@ -166,13 +167,8 @@ class DownloadWizardProgressFragment : DownloadWizardActivity.DownloadWizardStep
             state.downloadStarted = true
 
             val ret = euiccChannelManagerService.launchProfileDownloadTask(
-                slotId,
-                portId,
-                seId,
-                state.smdp,
-                state.matchingId,
-                state.confirmationCode,
-                state.imei
+                slotId, portId, seId,
+                ProfileDownloadInput(state.smdp, state.matchingId, state.imei, state.confirmationCode)
             )
 
             state.downloadTaskID = ret.taskId
@@ -183,7 +179,7 @@ class DownloadWizardProgressFragment : DownloadWizardActivity.DownloadWizardStep
     private fun updateProgress(progress: Int) {
         showProgressBar(progress)
 
-        val lpaState = ProfileDownloadCallback.lookupStateFromProgress(progress)
+        val lpaState = ProfileDownloadState.lookupStateFromProgress(progress)
         val stateIndex = LPA_PROGRESS_STATES.indexOf(lpaState)
 
         if (stateIndex > 0) {

+ 1 - 4
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LocalProfileAssistant.kt

@@ -37,10 +37,7 @@ interface LocalProfileAssistant {
     fun disableProfile(iccid: String, refresh: Boolean = true): Boolean
     fun deleteProfile(iccid: String): Boolean
 
-    fun downloadProfile(
-        smdp: String, matchingId: String?, imei: String?,
-        confirmationCode: String?, callback: ProfileDownloadCallback
-    )
+    fun downloadProfile(input: ProfileDownloadInput, callback: ProfileDownloadCallback)
 
     fun deleteNotification(seqNumber: Long): Boolean
     fun handleNotification(seqNumber: Long): Boolean

+ 2 - 2
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt

@@ -31,9 +31,9 @@ internal object LpacJni {
     external fun es10bDeleteNotification(handle: Long, seqNumber: Long): Int
 
     // es9p + es10b
-    // We do not expose all of the functions because of tediousness :)
+    // We do not expose all the functions because of tediousness :)
     external fun downloadProfile(
-        handle: Long, smdp: String, matchingId: String?, imei: String?,
+        handle: Long, address: String, matchingId: String?, imei: String?,
         confirmationCode: String?, callback: ProfileDownloadCallback
     ): Int
 

+ 3 - 23
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/ProfileDownloadCallback.kt

@@ -1,25 +1,5 @@
 package net.typeblog.lpac_jni
 
-interface ProfileDownloadCallback {
-    companion object {
-        fun lookupStateFromProgress(progress: Int): DownloadState =
-            when (progress) {
-                0 -> DownloadState.Preparing
-                20 -> DownloadState.Connecting
-                40 -> DownloadState.Authenticating
-                60 -> DownloadState.Downloading
-                80 -> DownloadState.Finalizing
-                else -> throw IllegalArgumentException("Unknown state")
-            }
-    }
-
-    enum class DownloadState(val progress: Int) {
-        Preparing(0),
-        Connecting(20), // Before {server,client} authentication
-        Authenticating(40), // {server,client} authentication
-        Downloading(60), // prepare download, get bpp from es9p
-        Finalizing(80), // load bpp
-    }
-
-    fun onStateUpdate(state: DownloadState)
-}
+fun interface ProfileDownloadCallback {
+    fun onStateUpdate(state: ProfileDownloadState)
+}

+ 8 - 0
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/ProfileDownloadInput.kt

@@ -0,0 +1,8 @@
+package net.typeblog.lpac_jni
+
+data class ProfileDownloadInput(
+    val address: String,
+    val matchingId: String?,
+    val imei: String?,
+    val confirmationCode: String?
+)

+ 14 - 0
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/ProfileDownloadState.kt

@@ -0,0 +1,14 @@
+package net.typeblog.lpac_jni
+
+enum class ProfileDownloadState(val progress: Int) {
+    Preparing(0),
+    Connecting(20),  // Before {server,client} authentication
+    Authenticating(40),  // {server,client} authentication
+    Downloading(60),  // prepare download, get bpp from es9p
+    Finalizing(80); // load bpp
+
+    companion object {
+        fun lookupStateFromProgress(progress: Int) =
+            entries.first { it.progress == progress }
+    }
+}

+ 6 - 8
libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt

@@ -1,6 +1,7 @@
 package net.typeblog.lpac_jni.impl
 
 import android.util.Log
+import net.typeblog.lpac_jni.ProfileDownloadInput
 import net.typeblog.lpac_jni.ApduInterface
 import net.typeblog.lpac_jni.EuiccInfo2
 import net.typeblog.lpac_jni.HttpInterface
@@ -214,16 +215,13 @@ class LocalProfileAssistantImpl(
         LpacJni.es10cDeleteProfile(contextHandle, iccid) == 0
     }
 
-    override fun downloadProfile(
-        smdp: String, matchingId: String?, imei: String?,
-        confirmationCode: String?, callback: ProfileDownloadCallback
-    ) = lock.withLock {
+    override fun downloadProfile(input: ProfileDownloadInput, callback: ProfileDownloadCallback) = lock.withLock {
         val res = LpacJni.downloadProfile(
             contextHandle,
-            smdp,
-            matchingId,
-            imei,
-            confirmationCode,
+            input.address,
+            input.matchingId,
+            input.imei,
+            input.confirmationCode,
             callback
         )
 

+ 8 - 8
libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.c

@@ -17,35 +17,35 @@ void lpac_download_init() {
     LPAC_JNI_SETUP_ENV;
 
     jclass download_state_class = (*env)->FindClass(env,
-                                                    "net/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState");
+                                                    "net/typeblog/lpac_jni/ProfileDownloadState");
     jfieldID download_state_preparing_field = (*env)->GetStaticFieldID(env, download_state_class,
                                                                        "Preparing",
-                                                                       "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;");
+                                                                       "Lnet/typeblog/lpac_jni/ProfileDownloadState;");
     download_state_preparing = (*env)->GetStaticObjectField(env, download_state_class,
                                                             download_state_preparing_field);
     download_state_preparing = (*env)->NewGlobalRef(env, download_state_preparing);
     jfieldID download_state_connecting_field = (*env)->GetStaticFieldID(env, download_state_class,
                                                                         "Connecting",
-                                                                        "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;");
+                                                                        "Lnet/typeblog/lpac_jni/ProfileDownloadState;");
     download_state_connecting = (*env)->GetStaticObjectField(env, download_state_class,
                                                              download_state_connecting_field);
     download_state_connecting = (*env)->NewGlobalRef(env, download_state_connecting);
     jfieldID download_state_authenticating_field = (*env)->GetStaticFieldID(env,
                                                                             download_state_class,
                                                                             "Authenticating",
-                                                                            "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;");
+                                                                            "Lnet/typeblog/lpac_jni/ProfileDownloadState;");
     download_state_authenticating = (*env)->GetStaticObjectField(env, download_state_class,
                                                                  download_state_authenticating_field);
     download_state_authenticating = (*env)->NewGlobalRef(env, download_state_authenticating);
     jfieldID download_state_downloading_field = (*env)->GetStaticFieldID(env, download_state_class,
                                                                          "Downloading",
-                                                                         "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;");
+                                                                         "Lnet/typeblog/lpac_jni/ProfileDownloadState;");
     download_state_downloading = (*env)->GetStaticObjectField(env, download_state_class,
                                                               download_state_downloading_field);
     download_state_downloading = (*env)->NewGlobalRef(env, download_state_downloading);
     jfieldID download_state_finalizng_field = (*env)->GetStaticFieldID(env, download_state_class,
                                                                        "Finalizing",
-                                                                       "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;");
+                                                                       "Lnet/typeblog/lpac_jni/ProfileDownloadState;");
     download_state_finalizing = (*env)->GetStaticObjectField(env, download_state_class,
                                                              download_state_finalizng_field);
     download_state_finalizing = (*env)->NewGlobalRef(env, download_state_finalizing);
@@ -53,7 +53,7 @@ void lpac_download_init() {
     jclass download_callback_class = (*env)->FindClass(env,
                                                        "net/typeblog/lpac_jni/ProfileDownloadCallback");
     on_state_update = (*env)->GetMethodID(env, download_callback_class, "onStateUpdate",
-                                          "(Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;)V");
+                                          "(Lnet/typeblog/lpac_jni/ProfileDownloadState;)V");
 }
 
 JNIEXPORT jint JNICALL
@@ -181,4 +181,4 @@ Java_net_typeblog_lpac_1jni_LpacJni_downloadErrCodeToString(JNIEnv *env, jobject
         default:
             return toJString(env, "ES10B_ERROR_REASON_UNDEFINED");
     }
-}
+}