Skip to content

Commit 3367a36

Browse files
committed
Merge branch 'master' into mainnet
2 parents 052e01d + 2605303 commit 3367a36

File tree

125 files changed

+2842
-1355
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+2842
-1355
lines changed

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
2-
lightningkmp = "1.10.2"
3-
secp256k1 = "0.17.3" # keep in check with lightning-kmp secp version
2+
lightningkmp = "1.10.4"
3+
secp256k1 = "0.18.0" # keep in check with lightning-kmp secp version
44

55
kotlin = "2.1.10"
66
ktor = "3.1.0"

phoenix-android/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ android {
2626
applicationId = "fr.acinq.phoenix.mainnet"
2727
minSdk = 26
2828
targetSdk = 35
29-
versionCode = 105
30-
versionName = "2.6.1"
29+
versionCode = 106
30+
versionName = gitCommitHash()
3131
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
3232
}
3333

phoenix-android/src/androidTest/kotlin/fr/acinq/phoenix/utils/ConverterTest.kt renamed to phoenix-android/src/androidTest/kotlin/fr/acinq/phoenix/utils/AmountFormatterTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package fr.acinq.phoenix.utils
1818

1919
import fr.acinq.lightning.utils.msat
20-
import fr.acinq.phoenix.android.utils.Converter.toMilliSatoshi
20+
import fr.acinq.phoenix.android.utils.converters.AmountFormatter.toMilliSatoshi
2121
import fr.acinq.phoenix.data.BitcoinUnit
2222
import junit.framework.Assert.assertEquals
2323
import org.junit.Test
2424

25-
class ConverterTest {
25+
class AmountFormatterTest {
2626
@Test
2727
fun test_double_to_msat_rounding() {
2828
// 1 msat

phoenix-android/src/main/kotlin/fr/acinq/phoenix/android/Ambients.kt

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ import androidx.navigation.NavController
2525
import fr.acinq.phoenix.PhoenixBusiness
2626
import fr.acinq.phoenix.android.utils.UserTheme
2727
import fr.acinq.phoenix.android.utils.datastore.InternalDataRepository
28+
import fr.acinq.phoenix.android.utils.datastore.PreferredBitcoinUnits
2829
import fr.acinq.phoenix.android.utils.datastore.UserPrefsRepository
2930
import fr.acinq.phoenix.controllers.ControllerFactory
3031
import fr.acinq.phoenix.data.*
32+
import fr.acinq.phoenix.managers.AppConfigurationManager
3133

3234

3335
typealias CF = ControllerFactory
@@ -36,9 +38,9 @@ val LocalTheme = staticCompositionLocalOf { UserTheme.SYSTEM }
3638
val LocalBusiness = staticCompositionLocalOf<PhoenixBusiness?> { null }
3739
val LocalControllerFactory = staticCompositionLocalOf<ControllerFactory?> { null }
3840
val LocalNavController = staticCompositionLocalOf<NavController?> { null }
39-
val LocalBitcoinUnit = compositionLocalOf { BitcoinUnit.Sat }
40-
val LocalFiatCurrency = compositionLocalOf { FiatCurrency.USD }
41-
val LocalExchangeRates = compositionLocalOf<List<ExchangeRate>> { listOf() }
41+
val LocalBitcoinUnits = compositionLocalOf { PreferredBitcoinUnits(primary = BitcoinUnit.Sat) }
42+
val LocalFiatCurrencies = compositionLocalOf { AppConfigurationManager.PreferredFiatCurrencies(primary = FiatCurrency.USD, others = emptyList()) }
43+
val LocalExchangeRatesMap = compositionLocalOf<Map<FiatCurrency, ExchangeRate.BitcoinPriceRate>> { emptyMap() }
4244
val LocalShowInFiat = compositionLocalOf { false }
4345
val isDarkTheme: Boolean
4446
@Composable
@@ -50,27 +52,11 @@ val navController: NavController
5052

5153
val preferredAmountUnit: CurrencyUnit
5254
@Composable
53-
get() = if (LocalShowInFiat.current) LocalFiatCurrency.current else LocalBitcoinUnit.current
55+
get() = if (LocalShowInFiat.current) LocalFiatCurrencies.current.primary else LocalBitcoinUnits.current.primary
5456

55-
val fiatRate: ExchangeRate.BitcoinPriceRate?
57+
val primaryFiatRate: ExchangeRate.BitcoinPriceRate?
5658
@Composable
57-
get() = LocalFiatCurrency.current.let { prefFiat ->
58-
return when (val rate = LocalExchangeRates.current.find { it.fiatCurrency == prefFiat }) {
59-
is ExchangeRate.BitcoinPriceRate -> rate
60-
is ExchangeRate.UsdPriceRate -> {
61-
(LocalExchangeRates.current.find { it.fiatCurrency == FiatCurrency.USD } as? ExchangeRate.BitcoinPriceRate)?.let { usdRate ->
62-
// create a BTC/Fiat price rate using the USD/BTC rate and the Fiat/USD rate.
63-
ExchangeRate.BitcoinPriceRate(
64-
fiatCurrency = rate.fiatCurrency,
65-
price = rate.price * usdRate.price,
66-
source = rate.source,
67-
timestampMillis = rate.timestampMillis
68-
)
69-
}
70-
}
71-
else -> null
72-
}
73-
}
59+
get() = LocalFiatCurrencies.current.primary.let { prefFiat -> LocalExchangeRatesMap.current[prefFiat] }
7460

7561
val internalData: InternalDataRepository
7662
@Composable

phoenix-android/src/main/kotlin/fr/acinq/phoenix/android/AppView.kt

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import androidx.compose.runtime.LaunchedEffect
4545
import androidx.compose.runtime.collectAsState
4646
import androidx.compose.runtime.getValue
4747
import androidx.compose.runtime.livedata.observeAsState
48+
import androidx.compose.runtime.produceState
4849
import androidx.compose.runtime.remember
4950
import androidx.compose.ui.Alignment
5051
import androidx.compose.ui.Modifier
@@ -114,10 +115,13 @@ import fr.acinq.phoenix.android.settings.walletinfo.SwapInWallet
114115
import fr.acinq.phoenix.android.settings.walletinfo.WalletInfoView
115116
import fr.acinq.phoenix.android.startup.StartupView
116117
import fr.acinq.phoenix.android.utils.appBackground
118+
import fr.acinq.phoenix.android.utils.datastore.PreferredBitcoinUnits
117119
import fr.acinq.phoenix.android.utils.extensions.findActivitySafe
118120
import fr.acinq.phoenix.android.utils.logger
119121
import fr.acinq.phoenix.data.BitcoinUnit
122+
import fr.acinq.phoenix.data.ExchangeRate
120123
import fr.acinq.phoenix.data.FiatCurrency
124+
import fr.acinq.phoenix.managers.AppConfigurationManager
121125
import io.ktor.http.encodeURLParameter
122126
import kotlinx.coroutines.flow.filterNotNull
123127
import kotlinx.coroutines.flow.first
@@ -145,17 +149,35 @@ fun AppView(
145149

146150
val context = LocalContext.current
147151
val isAmountInFiat = userPrefs.getIsAmountInFiat.collectAsState(false)
148-
val fiatCurrency = userPrefs.getFiatCurrency.collectAsState(initial = FiatCurrency.USD)
149-
val bitcoinUnit = userPrefs.getBitcoinUnit.collectAsState(initial = BitcoinUnit.Sat)
152+
val bitcoinUnits = userPrefs.getBitcoinUnits.collectAsState(initial = PreferredBitcoinUnits(primary = BitcoinUnit.Sat))
153+
val fiatCurrencies = userPrefs.getFiatCurrencies.collectAsState(initial = AppConfigurationManager.PreferredFiatCurrencies(primary = FiatCurrency.USD, others = emptyList()))
150154
val fiatRates by business.currencyManager.ratesFlow.collectAsState(emptyList())
155+
val fiatRatesMap by produceState(initialValue = emptyMap<FiatCurrency, ExchangeRate.BitcoinPriceRate>(), key1 = fiatRates) {
156+
val usdPriceRate = fiatRates.filterIsInstance<ExchangeRate.BitcoinPriceRate>().firstOrNull { it.fiatCurrency == FiatCurrency.USD }
157+
value = if (usdPriceRate != null) {
158+
fiatRates.associate { rate ->
159+
rate.fiatCurrency to when (rate) {
160+
is ExchangeRate.BitcoinPriceRate -> rate
161+
is ExchangeRate.UsdPriceRate -> ExchangeRate.BitcoinPriceRate(
162+
fiatCurrency = rate.fiatCurrency,
163+
price = rate.price * usdPriceRate.price,
164+
source = rate.source,
165+
timestampMillis = rate.timestampMillis
166+
)
167+
}
168+
}
169+
} else {
170+
emptyMap()
171+
}
172+
}
151173

152174
CompositionLocalProvider(
153175
LocalBusiness provides business,
154176
LocalControllerFactory provides business.controllers,
155177
LocalNavController provides navController,
156-
LocalExchangeRates provides fiatRates,
157-
LocalBitcoinUnit provides bitcoinUnit.value,
158-
LocalFiatCurrency provides fiatCurrency.value,
178+
LocalExchangeRatesMap provides fiatRatesMap,
179+
LocalBitcoinUnits provides bitcoinUnits.value,
180+
LocalFiatCurrencies provides fiatCurrencies.value,
159181
LocalShowInFiat provides isAmountInFiat.value,
160182
) {
161183
// we keep a view model storing payments so that we don't have to fetch them every time
@@ -456,7 +478,6 @@ fun AppView(
456478
LiquidityPolicyView(
457479
onBackClick = { navController.popBackStack() },
458480
onAdvancedClick = { navController.navigate(Screen.AdvancedLiquidityPolicy.route) },
459-
onRequestLiquidityClick = { navController.navigate(Screen.LiquidityRequest.route) },
460481
)
461482
}
462483
composable(Screen.LiquidityRequest.route, deepLinks = listOf(navDeepLink { uriPattern ="phoenix:requestliquidity" })) {

0 commit comments

Comments
 (0)