From f4bfd2576e632dc66cb07c8a2428d5a699edc8f8 Mon Sep 17 00:00:00 2001 From: Laiteux Date: Thu, 30 Oct 2025 13:30:06 +0400 Subject: [PATCH] Add HTTP callbackURL support to /downloadProfile --- .../openeuicc/bridge/LpaBridgeProvider.java | 80 ++++++++++++++++--- 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/src/im/angry/openeuicc/bridge/LpaBridgeProvider.java b/src/im/angry/openeuicc/bridge/LpaBridgeProvider.java index 31be6cf..642c5c1 100644 --- a/src/im/angry/openeuicc/bridge/LpaBridgeProvider.java +++ b/src/im/angry/openeuicc/bridge/LpaBridgeProvider.java @@ -1,21 +1,23 @@ package im.angry.openeuicc.bridge; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.HashMap; -import java.net.URLDecoder; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.time.Instant; import java.nio.charset.*; +import java.net.URI; +import java.net.URL; +import java.net.URLDecoder; +import java.net.HttpURLConnection; -import kotlin.coroutines.Continuation; -import kotlin.coroutines.CoroutineContext; -import kotlin.coroutines.EmptyCoroutineContext; import kotlin.jvm.functions.Function2; +import kotlin.coroutines.Continuation; +import kotlin.coroutines.EmptyCoroutineContext; import kotlinx.coroutines.BuildersKt; -import kotlinx.coroutines.CoroutineScope; import android.content.ContentProvider; import android.content.ContentValues; @@ -23,16 +25,16 @@ import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; +import com.google.gson.GsonBuilder; + import im.angry.openeuicc.OpenEuiccApplication; +import im.angry.openeuicc.di.AppContainer; import im.angry.openeuicc.core.EuiccChannel; -import im.angry.openeuicc.core.EuiccChannelManager; import im.angry.openeuicc.core.DefaultEuiccChannelManager; import im.angry.openeuicc.util.UiccCardInfoCompat; import im.angry.openeuicc.util.UiccPortInfoCompat; -import im.angry.openeuicc.util.UiccPortInfoCompat; import im.angry.openeuicc.util.LPAUtilsKt; import im.angry.openeuicc.util.ActivationCode; -import im.angry.openeuicc.di.AppContainer; import net.typeblog.lpac_jni.LocalProfileInfo; import net.typeblog.lpac_jni.ProfileDownloadCallback; @@ -254,8 +256,36 @@ public class LpaBridgeProvider extends ContentProvider @Override public void onStateUpdate(ProfileDownloadCallback.DownloadState state) { - // ignored - // TODO: callbackUrl? + new Thread(() -> + { + try + { + String[] callbackUrl = new String[1]; + + // TODO: test if it works + if (tryGetArgAsString(args, "callbackUrl", callbackUrl)) + { + var url = new URI(callbackUrl[0]).toURL(); + + var data = new LinkedHashMap() + {{ + put("timestamp", Instant.now().getEpochSecond()); + put("state", state.name()); + put("progress", state.getProgress()); + put("address", address[0]); + put("matchingId", matchingId[0]); + put("confirmationCode", confirmationCode[0]); + put("imei", imei); + }}; + + httpPostAsJson(url, data); + } + } + catch (Exception ex) + { + // ignored + } + }).start(); } } ); @@ -615,4 +645,30 @@ public class LpaBridgeProvider extends ContentProvider } // endregion + + // region HTTP Helpers + + private void httpPostAsJson(URL url, Map data) throws Exception + { + String json = new GsonBuilder() + .serializeNulls() + .create() + .toJson(data); + + var httpConnection = (HttpURLConnection) url.openConnection(); + + httpConnection.setRequestMethod("POST"); + httpConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + httpConnection.setDoOutput(true); + + try (var outputStream = httpConnection.getOutputStream()) + { + outputStream.write(json.getBytes(StandardCharsets.UTF_8)); + } + + httpConnection.getInputStream().close(); + } + + // endregion + }