Skip to content

Commit 7487f6c

Browse files
committed
Merge branch 'master' into mainnet
2 parents 5267876 + c4325d8 commit 7487f6c

File tree

53 files changed

+12461
-5693
lines changed

Some content is hidden

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

53 files changed

+12461
-5693
lines changed

.langtool/timestamps.android.json

Lines changed: 4647 additions & 2945 deletions
Large diffs are not rendered by default.

.langtool/timestamps.ios.json

Lines changed: 3059 additions & 276 deletions
Large diffs are not rendered by default.

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[versions]
2-
lightningkmp = "1.11.0"
2+
lightningkmp = "1.11.1"
33
secp256k1 = "0.21.0" # keep in check with lightning-kmp secp version
44

55
kotlin = "2.2.10"

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 = 36
29-
versionCode = 110
30-
versionName = "2.7.0"
29+
versionCode = 111
30+
versionName = gitCommitHash()
3131
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
3232
}
3333

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

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import fr.acinq.phoenix.android.navigation.navigateToPaymentDetails
5757
import fr.acinq.phoenix.android.navigation.paymentsNavGraph
5858
import fr.acinq.phoenix.android.navigation.settingsNavGraph
5959
import fr.acinq.phoenix.android.navigation.walletInfoNavGraph
60+
import fr.acinq.phoenix.android.utils.PhoenixAndroidTheme
6061
import fr.acinq.phoenix.android.utils.appBackground
6162
import fr.acinq.phoenix.android.utils.datastore.getBitcoinUnits
6263
import fr.acinq.phoenix.android.utils.datastore.getFiatCurrencies
@@ -95,46 +96,48 @@ fun AppRoot(
9596
LocalFiatCurrencies provides fiatCurrencies.value,
9697
LocalShowInFiat provides isAmountInFiat.value,
9798
) {
98-
Box(modifier = Modifier.fillMaxSize()) {
99-
Column(
100-
modifier = Modifier
101-
.background(appBackground())
102-
.fillMaxSize()
103-
.padding(top = WindowInsets.statusBars.asPaddingValues().calculateTopPadding())
104-
) {
105-
NavHost(
106-
navController = navController,
107-
startDestination = "${Screen.Startup.route}?next={next}",
108-
enterTransition = { EnterTransition.None },
109-
exitTransition = { ExitTransition.None },
99+
PhoenixAndroidTheme {
100+
Box(modifier = Modifier.fillMaxSize()) {
101+
Column(
102+
modifier = Modifier
103+
.background(appBackground())
104+
.fillMaxSize()
105+
.padding(top = WindowInsets.statusBars.asPaddingValues().calculateTopPadding())
110106
) {
111-
baseNavGraph(navController, appViewModel)
112-
// nav graphs below depends on the business, and will redirect to /startup if no wallet is active
113-
navigation(startDestination = Screen.BusinessNavGraph.Home.route, route = Screen.BusinessNavGraph.route) {
114-
settingsNavGraph(navController, appViewModel)
115-
homeNavGraph(navController, appViewModel)
116-
paymentsNavGraph(navController, appViewModel)
117-
walletInfoNavGraph(navController, appViewModel)
118-
channelsNavGraph(navController, appViewModel)
107+
NavHost(
108+
navController = navController,
109+
startDestination = "${Screen.Startup.route}?next={next}",
110+
enterTransition = { EnterTransition.None },
111+
exitTransition = { ExitTransition.None },
112+
) {
113+
baseNavGraph(navController, appViewModel)
114+
// nav graphs below depends on the business, and will redirect to /startup if no wallet is active
115+
navigation(startDestination = Screen.BusinessNavGraph.Home.route, route = Screen.BusinessNavGraph.route) {
116+
settingsNavGraph(navController, appViewModel)
117+
homeNavGraph(navController, appViewModel)
118+
paymentsNavGraph(navController, appViewModel)
119+
walletInfoNavGraph(navController, appViewModel)
120+
channelsNavGraph(navController, appViewModel)
121+
}
119122
}
120123
}
121-
}
122124

123-
val lastCompletedPayment = business?.paymentsManager?.lastCompletedPayment?.collectAsState()
124-
lastCompletedPayment?.value?.let { payment ->
125-
LaunchedEffect(key1 = payment.id) {
126-
val completedAt = payment.completedAt
127-
val showPaymentOnCurrentRoute = navController.currentDestination?.route == Screen.BusinessNavGraph.Home.route
128-
|| navController.currentDestination?.route == Screen.BusinessNavGraph.Receive.route
129-
if (showPaymentOnCurrentRoute && (completedAt != null && (currentTimestampMillis() - completedAt) < 5.seconds.inWholeMilliseconds)) {
130-
navigateToPaymentDetails(navController, id = payment.id, isFromEvent = true)
125+
val lastCompletedPayment = business?.paymentsManager?.lastCompletedPayment?.collectAsState()
126+
lastCompletedPayment?.value?.let { payment ->
127+
LaunchedEffect(key1 = payment.id) {
128+
val completedAt = payment.completedAt
129+
val showPaymentOnCurrentRoute = navController.currentDestination?.route == Screen.BusinessNavGraph.Home.route
130+
|| navController.currentDestination?.route == Screen.BusinessNavGraph.Receive.route
131+
if (showPaymentOnCurrentRoute && (completedAt != null && (currentTimestampMillis() - completedAt) < 5.seconds.inWholeMilliseconds)) {
132+
navigateToPaymentDetails(navController, id = payment.id, isFromEvent = true)
133+
}
131134
}
132135
}
133-
}
134136

135-
val isUpgradeRequired = business?.peerManager?.upgradeRequired?.collectAsState(false)
136-
if (isUpgradeRequired?.value == true) {
137-
UpgradeRequiredBlockingDialog()
137+
val isUpgradeRequired = business?.peerManager?.upgradeRequired?.collectAsState(false)
138+
if (isUpgradeRequired?.value == true) {
139+
UpgradeRequiredBlockingDialog()
140+
}
138141
}
139142
}
140143
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import fr.acinq.phoenix.android.components.nfc.NfcStateRepository
3838
import fr.acinq.phoenix.android.navigation.Screen
3939
import fr.acinq.phoenix.android.services.HceService
4040
import fr.acinq.phoenix.android.services.PaymentsForegroundService
41-
import fr.acinq.phoenix.android.utils.PhoenixAndroidTheme
4241
import fr.acinq.phoenix.android.utils.nfc.NfcReaderCallback
4342
import fr.acinq.phoenix.managers.AppConnectionsDaemon
4443
import kotlinx.coroutines.CoroutineScope
@@ -88,9 +87,7 @@ class MainActivity : AppCompatActivity() {
8887
setContent {
8988
navController = rememberNavController()
9089
navController?.let {
91-
PhoenixAndroidTheme {
92-
AppRoot(it, appViewModel)
93-
}
90+
AppRoot(it, appViewModel)
9491
}
9592
}
9693
}

phoenix-android/src/main/kotlin/fr/acinq/phoenix/android/settings/DisplayPrefsView.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import fr.acinq.phoenix.android.LocalFiatCurrencies
3131
import fr.acinq.phoenix.android.LocalUserPrefs
3232
import fr.acinq.phoenix.android.R
3333
import fr.acinq.phoenix.android.WalletId
34+
import fr.acinq.phoenix.android.application
3435
import fr.acinq.phoenix.android.components.TextWithIcon
3536
import fr.acinq.phoenix.android.components.layouts.Card
3637
import fr.acinq.phoenix.android.components.layouts.DefaultScreenHeader
@@ -136,6 +137,7 @@ private fun FiatCurrencyPreference(business: PhoenixBusiness, walletId: WalletId
136137

137138
@Composable
138139
private fun UserThemePreference(userPrefs: UserPrefs, scope: CoroutineScope) {
140+
val globalPrefs = application.globalPrefs
139141
var prefEnabled by remember { mutableStateOf(true) }
140142
val preferences = UserTheme.entries.map {
141143
PreferenceItem(it, title = it.label())
@@ -151,6 +153,7 @@ private fun UserThemePreference(userPrefs: UserPrefs, scope: CoroutineScope) {
151153
prefEnabled = false
152154
scope.launch {
153155
userPrefs.saveUserTheme(it.item)
156+
globalPrefs.saveFallbackTheme(it.item)
154157
prefEnabled = true
155158
}
156159
}

phoenix-android/src/main/kotlin/fr/acinq/phoenix/android/startup/StartupView.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ fun StartupView(
147147
mutableStateOf(
148148
when {
149149
forceWalletId != null -> availableWallets[forceWalletId]
150+
desiredWalletId != null -> availableWallets[desiredWalletId]
150151
!startWalletImmediately -> null
151152
availableWallets.size == 1 -> availableWallets.entries.firstOrNull()?.value
152-
desiredWalletId != null -> availableWallets[desiredWalletId]
153153
startWalletImmediately -> availableWallets[defaultWallet.value]
154154
else -> null
155155
}
@@ -334,6 +334,12 @@ private fun BoxScope.LoadWallet(
334334
goToWalletSelector: (() -> Unit)?
335335
) {
336336
val context = LocalContext.current
337+
val globalPrefs = application.globalPrefs
338+
339+
LaunchedEffect(userWallet.walletId) {
340+
val userPrefs = DataStoreManager.loadUserPrefsForWallet(context, userWallet.walletId)
341+
globalPrefs.saveFallbackTheme(userPrefs.getUserTheme.first())
342+
}
337343

338344
val isScreenLockRequired = produceState<Boolean?>(initialValue = null, key1 = userWallet) {
339345
val userPrefs = DataStoreManager.loadUserPrefsForWallet(context, userWallet.walletId)

phoenix-android/src/main/kotlin/fr/acinq/phoenix/android/utils/Theme.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import androidx.compose.runtime.Composable
3434
import androidx.compose.runtime.CompositionLocalProvider
3535
import androidx.compose.runtime.LaunchedEffect
3636
import androidx.compose.runtime.collectAsState
37+
import androidx.compose.runtime.getValue
3738
import androidx.compose.ui.geometry.Offset
3839
import androidx.compose.ui.graphics.Brush
3940
import androidx.compose.ui.graphics.Color
@@ -45,6 +46,7 @@ import androidx.compose.ui.unit.sp
4546
import com.google.accompanist.systemuicontroller.rememberSystemUiController
4647
import fr.acinq.phoenix.android.LocalTheme
4748
import fr.acinq.phoenix.android.LocalUserPrefs
49+
import fr.acinq.phoenix.android.application
4850
import fr.acinq.phoenix.android.isDarkTheme
4951
import fr.acinq.phoenix.android.utils.extensions.findActivitySafe
5052

@@ -213,7 +215,9 @@ private val shapes = Shapes(
213215

214216
@Composable
215217
fun PhoenixAndroidTheme(content: @Composable () -> Unit) {
216-
val userTheme = LocalUserPrefs.current?.getUserTheme?.collectAsState(initial = UserTheme.SYSTEM)?.value ?: UserTheme.SYSTEM
218+
val fallbackUserTheme by application.globalPrefs.getFallbackTheme.collectAsState(UserTheme.SYSTEM)
219+
val userTheme = LocalUserPrefs.current?.getUserTheme?.collectAsState(initial = fallbackUserTheme)?.value ?: fallbackUserTheme
220+
217221
val systemUiController = rememberSystemUiController()
218222

219223
CompositionLocalProvider(

phoenix-android/src/main/kotlin/fr/acinq/phoenix/android/utils/datastore/GlobalPrefs.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import fr.acinq.phoenix.android.BaseWalletId
3030
import fr.acinq.phoenix.android.EmptyWalletId
3131
import fr.acinq.phoenix.android.R
3232
import fr.acinq.phoenix.android.WalletId
33+
import fr.acinq.phoenix.android.utils.UserTheme
3334
import kotlinx.coroutines.flow.Flow
3435
import kotlinx.coroutines.flow.catch
3536
import kotlinx.coroutines.flow.first
@@ -66,6 +67,8 @@ class GlobalPrefs(private val data: DataStore<Preferences>) {
6667
private val SHOW_INTRO = booleanPreferencesKey("SHOW_INTRO")
6768
private val LAST_USED_APP_CODE = intPreferencesKey("LAST_USED_APP_CODE")
6869
private val SHOW_RELEASE_NOTES_SINCE = intPreferencesKey("SHOW_RELEASE_NOTES_SINCE")
70+
71+
private val APP_THEME_FALLBACK = stringPreferencesKey("APP_THEME_FALLBACK")
6972
}
7073

7174
/**
@@ -125,6 +128,10 @@ class GlobalPrefs(private val data: DataStore<Preferences>) {
125128
suspend fun saveShowReleaseNoteSinceCode(code: Int?) = data.edit {
126129
if (code == null) it.remove(SHOW_RELEASE_NOTES_SINCE) else it[SHOW_RELEASE_NOTES_SINCE] = code
127130
}
131+
132+
/** Fallback theme used when no wallet theme is available yet. Set to the theme used by last active wallet. */
133+
val getFallbackTheme: Flow<UserTheme> = safeData.map { UserTheme.safeValueOf(it[APP_THEME_FALLBACK]) }
134+
suspend fun saveFallbackTheme(theme: UserTheme) = data.edit { it[APP_THEME_FALLBACK] = theme.name }
128135
}
129136

130137
@Serializable

0 commit comments

Comments
 (0)