Skip to content

Commit 7c55095

Browse files
committed
Release source code for 55.7 (1507)
1 parent e983980 commit 7c55095

15 files changed

Lines changed: 135 additions & 32 deletions

File tree

android/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ follow [https://changelog.md/](https://changelog.md/) guidelines.
66

77
## [Unreleased]
88

9+
## [55.7] - 2026-03-25
10+
11+
### ADDED
12+
13+
- Subsat support
14+
15+
### FIXED
16+
17+
- Repro builds
18+
919
## [55.6] - 2026-02-18
1020

1121
### FIXED

android/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ RUN sdkmanager --install "ndk;${NDK_VERSION}"
6161

6262
ENV ANDROID_NDK_HOME ${ANDROID_HOME}/ndk/${NDK_VERSION}
6363

64-
FROM rust:1.84 AS rust_builder
64+
FROM rust:1.84@sha256:738ae99a3d75623f41e6882566b4ef37e38a9840244a47efd4a0ca22e9628b88 AS rust_builder
6565

6666
ARG RUSTUP_TOOLCHAIN=nightly-2024-12-16
6767
ARG TARGETS="aarch64-unknown-linux-musl x86_64-unknown-linux-musl aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android"

android/apolloui/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ android {
101101
applicationId "io.muun.apollo"
102102
minSdk 21
103103
targetSdk 35
104-
versionCode 1506
105-
versionName "55.6"
104+
versionCode 1507
105+
versionName "55.7"
106106

107107
// Use default Proguard file, bundled with Android Gradle Plugin
108108
// See: https://issuetracker.google.com/issues/126772206

android/apolloui/src/main/java/io/muun/apollo/data/preferences/MinFeeRateRepository.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.muun.apollo.data.preferences
33
import android.content.Context
44
import io.muun.apollo.data.preferences.adapter.DoublePreferenceAdapter
55
import io.muun.apollo.data.preferences.rx.Preference
6+
import io.muun.common.Rules.OP_MINIMUM_FEE_VALUE
67
import javax.inject.Inject
78

89
// Open for mockito to mock/spy
@@ -18,7 +19,7 @@ open class MinFeeRateRepository @Inject constructor(
1819
private val preference: Preference<Double>
1920
get() = rxSharedPreferences.getObject(
2021
KEY,
21-
1.0, // Default (lowest limit) just to avoid NPE problems before RTD is pulled
22+
OP_MINIMUM_FEE_VALUE, // Default (lowest limit) just to avoid NPE problems before RTD is pulled
2223
DoublePreferenceAdapter.INSTANCE
2324
)
2425

android/apolloui/src/main/java/io/muun/apollo/domain/analytics/AnalyticsEvent.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,18 @@ sealed class AnalyticsEvent(metadataKeyValues: List<Pair<String, Any>> = listOf(
157157
class S_PASSWORD_CHANGE_START : AnalyticsEvent()
158158
class S_PASSWORD_CHANGE_END : AnalyticsEvent()
159159
class S_SEND : AnalyticsEvent()
160-
class S_SELECT_FEE : AnalyticsEvent()
160+
class S_SELECT_FEE(
161+
feeRateFastInVBytes: Double,
162+
feeRateMidInVBytes: Double,
163+
feeRateSlowInVBytes: Double,
164+
) : AnalyticsEvent(
165+
listOf(
166+
"fast" to feeRateFastInVBytes,
167+
"mid" to feeRateMidInVBytes,
168+
"slow" to feeRateSlowInVBytes
169+
)
170+
)
171+
161172
class S_MANUALLY_ENTER_FEE : AnalyticsEvent()
162173
class S_EMERGENCY_KIT_SLIDES(step: Int) : AnalyticsEvent(listOf("step" to step))
163174
class S_EMERGENCY_KIT_SAVE : AnalyticsEvent()

android/apolloui/src/main/java/io/muun/apollo/presentation/ui/fragments/manual_fee/ManualFeeFragment.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class ManualFeeFragment : SingleFragment<ManualFeePresenter>(), ManualFeeView {
9898
handleFeeRateTooHigh()
9999

100100
feeRateInSatsPerVbyte < state.minFeeRateForTarget(feeWindow.slowConfTarget) ->
101-
handleWarningFeeRateLow()
101+
handleWarningFeeRateLow(feeRateInSatsPerVbyte)
102102

103103
else -> {
104104
// All good!
@@ -146,12 +146,15 @@ class ManualFeeFragment : SingleFragment<ManualFeePresenter>(), ManualFeeView {
146146
)
147147
}
148148

149-
private fun handleWarningFeeRateLow() {
149+
private fun handleWarningFeeRateLow(feeRateInSatsPerVbyte: Double) {
150150
binding.statusMessage.setWarning(
151151
R.string.manual_fee_low_warning_message,
152152
R.string.manual_fee_low_warning_desc
153153
)
154154
binding.confirmFee.isEnabled = true // just a warning
155+
binding.confirmFee.setOnClickListener {
156+
presenter.confirmFee(feeRateInSatsPerVbyte)
157+
}
155158
}
156159

157160
private fun onHowThisWorksClick() {

android/apolloui/src/main/java/io/muun/apollo/presentation/ui/fragments/recommended_fee/RecommendedFeeFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class RecommendedFeeFragment : SingleFragment<RecommendedFeePresenter>(), Recomm
5151
@BindString(R.string.fee_options_whats_this)
5252
lateinit var whatsThisText: String
5353

54-
private var selectedFeeRateInVBytes: Double? = null // Starts with null if no rate zpre-selected
54+
private var selectedFeeRateInVBytes: Double? = null // Starts with null if no rate pre-selected
5555

5656
@State
5757
lateinit var mBitcoinUnit: BitcoinUnit

android/apolloui/src/main/java/io/muun/apollo/presentation/ui/fragments/recommended_fee/RecommendedFeePresenter.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package io.muun.apollo.presentation.ui.fragments.recommended_fee
22

33
import android.os.Bundle
4-
import io.muun.apollo.domain.analytics.AnalyticsEvent
54
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_MORE_INFO
65
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_MORE_INFO_TYPE
76
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_SELECT_FEE
87
import io.muun.apollo.domain.selector.BitcoinUnitSelector
98
import io.muun.apollo.presentation.ui.base.SingleFragmentPresenter
109
import io.muun.apollo.presentation.ui.base.di.PerFragment
10+
import newop.EditFeeState
1111
import javax.inject.Inject
1212

1313
@PerFragment
1414
class RecommendedFeePresenter @Inject constructor(
15-
private val bitcoinUnitSel: BitcoinUnitSelector
15+
private val bitcoinUnitSel: BitcoinUnitSelector,
1616
) : SingleFragmentPresenter<RecommendedFeeView, RecommendedFeeParentPresenter>() {
1717

1818
override fun setUp(arguments: Bundle) {
@@ -22,6 +22,7 @@ class RecommendedFeePresenter @Inject constructor(
2222
parentPresenter
2323
.watchEditFeeState()
2424
.doOnNext(view::setState)
25+
.doOnNext(this::reportScreen)
2526
.let(this::subscribeTo)
2627
}
2728

@@ -33,8 +34,15 @@ class RecommendedFeePresenter @Inject constructor(
3334
parentPresenter.editFeeManually()
3435
}
3536

36-
override fun getEntryEvent(): AnalyticsEvent =
37-
S_SELECT_FEE()
37+
fun reportScreen(state: EditFeeState) {
38+
// TODO this is a bit duplicated in view::setState, we could refactor a bit better
39+
val feeWindow = state.resolved.paymentContext.feeWindow
40+
val feeRateFastInVBytes = state.minFeeRateForTarget(feeWindow.fastConfTarget)
41+
val feeRateMidInVBytes = state.minFeeRateForTarget(feeWindow.mediumConfTarget)
42+
val feeRateSlowInVBytes = state.minFeeRateForTarget(feeWindow.slowConfTarget)
43+
44+
analytics.report(S_SELECT_FEE(feeRateFastInVBytes, feeRateMidInVBytes, feeRateSlowInVBytes))
45+
}
3846

3947
fun reportShowSelectFeeInfo() {
4048
analytics.report(S_MORE_INFO(S_MORE_INFO_TYPE.SELECT_FEE))

android/apolloui/src/main/java/io/muun/apollo/presentation/ui/new_operation/ConfirmStateViewModel.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,6 @@ class ConfirmStateViewModel private constructor(
4747
get() =
4848
resolved.paymentContext
4949

50-
// Yes, the impl calls a property that states fee rate is in SatsPerVByte but that is a very
51-
// long legacy naming error, that property's unit are satoshis per weight unit. Trust me, I'm
52-
// an engineer.
53-
val feeRateInSatsPerWeight: Double
54-
get() =
55-
amountInfo.feeRateInSatsPerVByte
56-
5750
val onchainFee: BitcoinAmount
5851
get() =
5952
if (validated.swapInfo == null) {

android/apolloui/src/main/java/io/muun/apollo/presentation/ui/new_operation/NewOperationActivity.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import io.muun.apollo.domain.analytics.AnalyticsEvent.S_MANUALLY_ENTER_FEE
2525
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_NEW_OP_AMOUNT
2626
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_NEW_OP_CONFIRMATION
2727
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_NEW_OP_DESCRIPTION
28-
import io.muun.apollo.domain.analytics.AnalyticsEvent.S_SELECT_FEE
2928
import io.muun.apollo.domain.analytics.NewOperationOrigin
3029
import io.muun.apollo.domain.libwallet.adapt
3130
import io.muun.apollo.domain.libwallet.destinationPubKey
@@ -576,7 +575,7 @@ class NewOperationActivity : SingleFragmentActivity<NewOperationPresenter>(),
576575
}
577576

578577
override fun goToEditFeeManually() {
579-
generateAppEvent(S_SELECT_FEE().eventId)
578+
generateAppEvent("s_select_fee")
580579
replaceFragment(ManualFeeFragment(), true)
581580
}
582581

0 commit comments

Comments
 (0)