diff --git a/integrations/crowdnode/src/main/java/org/dash/wallet/integrations/crowdnode/model/CrowdNodeFeeInfo.kt b/integrations/crowdnode/src/main/java/org/dash/wallet/integrations/crowdnode/model/CrowdNodeFeeInfo.kt index bf5c265b20..b54c5d75a4 100644 --- a/integrations/crowdnode/src/main/java/org/dash/wallet/integrations/crowdnode/model/CrowdNodeFeeInfo.kt +++ b/integrations/crowdnode/src/main/java/org/dash/wallet/integrations/crowdnode/model/CrowdNodeFeeInfo.kt @@ -1,9 +1,10 @@ package org.dash.wallet.integrations.crowdnode.model import android.os.Parcelable +import com.google.gson.Gson import com.google.gson.annotations.SerializedName +import com.google.gson.reflect.TypeToken import kotlinx.parcelize.Parcelize -import kotlinx.parcelize.RawValue @Parcelize data class FeeLadder( @@ -36,7 +37,7 @@ data class FeeLadder( @Parcelize data class FeeInfo( @SerializedName("Key") val key: String, - @SerializedName("Value") val value: @RawValue List + @SerializedName("Value") val rawValue: String ) : Parcelable { companion object { const val DEFAULT_FEE = 35.0 @@ -44,7 +45,23 @@ data class FeeInfo( const val KEY_FEELADDER = "FeeLadder" const val TYPE_NORMAL = "Normal" const val TYPE_TRUSTLESS = "Trustless" - val default = FeeInfo("FeeLadder", listOf(FeeLadder("", TYPE_NORMAL, DEFAULT_AMOUNT, DEFAULT_FEE))) + const val DEFAULT_FEE_LADDER = """[ + { + \"name\":\"Up to 10 Dash and above\", + \"type\":\"Normal\", + \"amount\":10.0,\"fee\":35.0 + }, + { + \"name\":\"Trustless up to 100 Dash and above\", + \"type\":\"Trustless\", + \"amount\":100.0, + \"fee\":20.0 + } + ]""" + val default = FeeInfo(KEY_FEELADDER, DEFAULT_FEE_LADDER) + } + val value: List by lazy { + Gson().fromJson(rawValue, object : TypeToken>() {}.type) } fun getNormal() = value.find { it.type == TYPE_NORMAL } diff --git a/wallet/build.gradle b/wallet/build.gradle index 0e62185de5..4b0a57e6eb 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -80,6 +80,7 @@ dependencies { implementation 'com.squareup.moshi:moshi:1.11.0' implementation 'com.squareup.moshi:moshi-kotlin:1.11.0' implementation 'com.squareup.retrofit2:converter-moshi:2.6.4' + implementation 'org.conscrypt:conscrypt-android:2.5.2' // TLS 1.3 support for Android <= 9.0 // UI implementation "androidx.appcompat:appcompat:$appCompatVersion" diff --git a/wallet/proguard.cfg b/wallet/proguard.cfg index 805c914348..7b683d0be5 100644 --- a/wallet/proguard.cfg +++ b/wallet/proguard.cfg @@ -224,3 +224,11 @@ -keepattributes *Annotation* -keepattributes SourceFile,LineNumberTable -keep class kotlin.Metadata { *; } + +# Keep Conscrypt classes +-keep class org.conscrypt.** { *; } +-keep class com.android.org.conscrypt.** { *; } + +# Prevent obfuscation of SSL/TLS related classes +-dontwarn org.conscrypt.** +-dontwarn com.android.org.conscrypt.** \ No newline at end of file diff --git a/wallet/src/de/schildbach/wallet/WalletApplication.java b/wallet/src/de/schildbach/wallet/WalletApplication.java index 733e9b9d2e..488f5aab89 100644 --- a/wallet/src/de/schildbach/wallet/WalletApplication.java +++ b/wallet/src/de/schildbach/wallet/WalletApplication.java @@ -71,6 +71,7 @@ import org.bitcoinj.wallet.WalletProtobufSerializer; import org.bitcoinj.wallet.authentication.AuthenticationGroupExtension; import org.bitcoinj.wallet.authentication.AuthenticationKeyUsage; +import org.conscrypt.Conscrypt; import org.dash.wallet.common.AutoLogoutTimerHandler; import org.dash.wallet.common.Configuration; import org.dash.wallet.common.InteractionAwareActivity; @@ -111,6 +112,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.GeneralSecurityException; +import java.security.Security; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; @@ -334,6 +336,12 @@ private void logState() { resetBlockchainSyncProgress(); anrSupervisor = new AnrSupervisor(); anrSupervisor.start(); + + // enable TLS 1.3 support on Android 9 and lower + // Android 10 and above support TLS 1.3 by default + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { + Security.insertProviderAt(Conscrypt.newProvider(), 1); + } } private void syncExploreData() {