diff --git a/android/app/build.gradle b/android/app/build.gradle index 7b1f5bc..d6ab402 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -95,7 +95,7 @@ android { applicationId "com.minibits_wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 58024 + versionCode 58025 versionName "0.2.0" } @@ -159,7 +159,7 @@ android { def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = - defaultConfig.versionCode * 1000 + versionCodes.get(abi) + defaultConfig.versionCode * 1000 + versionCodes.get(abi) } } @@ -177,14 +177,18 @@ dependencies { implementation jscFlavor } - // Fetch request hang issue - // define a BOM and its version - implementation(platform("com.squareup.okhttp3:okhttp-bom:5.0.0-alpha.12")) - - // define any required OkHttp artifacts without version + // Minibits: Fetch requests hanging issue - not used for now, does not work with custom DNS selector IPV4_FIRST strategy + /* implementation(platform("com.squareup.okhttp3:okhttp-bom:5.0.0-alpha.12")) + implementation("com.squareup.okhttp3:okhttp") - implementation("com.squareup.okhttp3:logging-interceptor") - implementation("com.squareup.okhttp3:okhttp-urlconnection") + implementation("com.squareup.okhttp3:logging-interceptor") + + configurations.all { + resolutionStrategy { + force "com.squareup.okhttp3:okhttp:5.0.0-alpha.12" + force "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.12" + } + }*/ } // code-push diff --git a/android/app/src/main/java/com/minibits_wallet/CorePlaneOkHttpClientFactory.kt b/android/app/src/main/java/com/minibits_wallet/CorePlaneOkHttpClientFactory.kt new file mode 100644 index 0000000..70adbef --- /dev/null +++ b/android/app/src/main/java/com/minibits_wallet/CorePlaneOkHttpClientFactory.kt @@ -0,0 +1,36 @@ +package com.minibits_wallet + +import android.util.Log +import com.facebook.react.modules.network.OkHttpClientProvider +import com.facebook.react.modules.network.OkHttpClientFactory +import okhttp3.OkHttp +import okhttp3.OkHttpClient +import okhttp3.EventListener +import okhttp3.Call +import java.net.InetSocketAddress +import java.net.Proxy +import java.util.concurrent.TimeUnit + +class CorePlaneOkHttpClientFactory : OkHttpClientFactory { + override fun createNewNetworkModuleClient(): OkHttpClient { + val okHttpVersion = OkHttp.VERSION + Log.d("OkHttpFactory", "Using OkHttp version: $okHttpVersion") + + return OkHttpClientProvider.createClientBuilder() + .dns(CorePlaneOkHttpDNSSelector(CorePlaneOkHttpDNSSelector.IPvMode.IPV4_FIRST)) + /* .eventListener(object : EventListener() { + override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) { + Log.d("OkHttpNetwork", "Connecting to ${inetSocketAddress.address}") + } + }) + .addInterceptor { chain -> + val request = chain.request() + Log.d("OkHttpFactory", "Sending request: ${request.url}") + val response = chain.proceed(request) + Log.d("OkHttpFactory", "Received response: ${response.code} from ${response.request.url}") + response + } */ + .connectTimeout(10, TimeUnit.SECONDS) + .build() + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/minibits_wallet/CorePlaneOkHttpDNSSelector.kt b/android/app/src/main/java/com/minibits_wallet/CorePlaneOkHttpDNSSelector.kt new file mode 100644 index 0000000..bbaf774 --- /dev/null +++ b/android/app/src/main/java/com/minibits_wallet/CorePlaneOkHttpDNSSelector.kt @@ -0,0 +1,52 @@ +package com.minibits_wallet + +import okhttp3.Dns +import java.net.Inet4Address +import java.net.Inet6Address +import java.net.InetAddress +import android.util.Log + +class CorePlaneOkHttpDNSSelector(private val mode: IPvMode) : Dns { + + enum class IPvMode(val code: String) { + SYSTEM("system"), + IPV6_FIRST("ipv6"), + IPV4_FIRST("ipv4"), + IPV6_ONLY("ipv6only"), + IPV4_ONLY("ipv4only"); + + companion object { + @JvmStatic + fun fromString(ipMode: String): IPvMode = + values().find { it.code == ipMode } ?: throw IllegalArgumentException("Unknown value: $ipMode") + } + } + + override fun lookup(hostname: String): List { + var addresses = try { + Dns.SYSTEM.lookup(hostname) + } catch (e: Exception) { + Log.e("OkHttpFactory", "DNS lookup failed for $hostname", e) + throw e + } + + // Log the raw DNS result before filtering + // Log.d("OkHttpFactory", "Raw DNS lookup for $hostname -> ${addresses.joinToString(", ")}") + + val sortedAddresses = when (mode) { + IPvMode.IPV6_FIRST -> addresses.sortedByDescending { it is Inet6Address } // IPv6 before IPv4 + IPvMode.IPV4_FIRST -> addresses.sortedByDescending { it is Inet4Address } // IPv4 before IPv6 + IPvMode.IPV6_ONLY -> addresses.filter { it is Inet6Address } + IPvMode.IPV4_ONLY -> addresses.filter { it is Inet4Address } + IPvMode.SYSTEM -> addresses + } + + if (sortedAddresses.isEmpty()) { + throw RuntimeException("No resolved sortedAddresses for $hostname with mode $mode") + } + + // Log.d("OkHttpFactory", "DNS lookup for $hostname -> ${sortedAddresses.joinToString(", ")}") + + return sortedAddresses + } +} diff --git a/android/app/src/main/java/com/minibits_wallet/MainApplication.kt b/android/app/src/main/java/com/minibits_wallet/MainApplication.kt index f47847b..7c77086 100644 --- a/android/app/src/main/java/com/minibits_wallet/MainApplication.kt +++ b/android/app/src/main/java/com/minibits_wallet/MainApplication.kt @@ -11,6 +11,7 @@ import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.react.soloader.OpenSourceMergedSoMapping import com.facebook.soloader.SoLoader +import com.facebook.react.modules.network.OkHttpClientProvider import com.microsoft.codepush.react.CodePush class MainApplication : Application(), ReactApplication { @@ -45,6 +46,9 @@ class MainApplication : Application(), ReactApplication { override fun onCreate() { super.onCreate() SoLoader.init(this, OpenSourceMergedSoMapping) + + OkHttpClientProvider.setOkHttpClientFactory(CorePlaneOkHttpClientFactory()) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // If you opted-in for the New Architecture, we load the native entry point for this app. load()