From b67d85f4f5474e461178d156d462781041f22c2b Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Sat, 22 Mar 2025 02:34:48 +0700 Subject: [PATCH] android, desktop: compose 1.8.0-beta01 + Kotlin 2.1.20 + compileSdk 35 --- .gitignore | 1 + apps/multiplatform/android/build.gradle.kts | 3 ++- apps/multiplatform/common/build.gradle.kts | 3 ++- .../kotlin/chat/simplex/common/model/ChatModel.kt | 5 ++++- .../chat/simplex/common/views/chat/ChatItemsLoader.kt | 3 ++- .../chat/simplex/common/views/helpers/ProcessedErrors.kt | 1 + .../networkAndServers/AdvancedNetworkSettings.kt | 4 ++-- .../simplex/common/platform/ScrollableColumn.desktop.kt | 4 ++-- apps/multiplatform/desktop/build.gradle.kts | 5 +++-- apps/multiplatform/gradle.properties | 6 +++--- apps/multiplatform/gradle/wrapper/gradle-wrapper.properties | 6 +++--- apps/multiplatform/settings.gradle.kts | 1 + 12 files changed, 26 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 645b55ec9d..4560272980 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,4 @@ website/package-lock.json website/.cache website/test/stubs-layout-cache/_includes/*.js apps/android/app/release +apps/multiplatform/.kotlin/sessions diff --git a/apps/multiplatform/android/build.gradle.kts b/apps/multiplatform/android/build.gradle.kts index 8fc9d104d2..82a74a30bb 100644 --- a/apps/multiplatform/android/build.gradle.kts +++ b/apps/multiplatform/android/build.gradle.kts @@ -5,10 +5,11 @@ plugins { id("org.jetbrains.compose") kotlin("android") id("org.jetbrains.kotlin.plugin.serialization") + id("org.jetbrains.kotlin.plugin.compose") } android { - compileSdk = 34 + compileSdk = 35 defaultConfig { applicationId = "chat.simplex.app" diff --git a/apps/multiplatform/common/build.gradle.kts b/apps/multiplatform/common/build.gradle.kts index 345a75b1e7..3bf0926c8c 100644 --- a/apps/multiplatform/common/build.gradle.kts +++ b/apps/multiplatform/common/build.gradle.kts @@ -3,6 +3,7 @@ plugins { id("org.jetbrains.compose") id("com.android.library") id("org.jetbrains.kotlin.plugin.serialization") + id("org.jetbrains.kotlin.plugin.compose") id("dev.icerock.mobile.multiplatform-resources") id("com.github.gmazzo.buildconfig") version "5.3.5" } @@ -125,7 +126,7 @@ kotlin { android { namespace = "chat.simplex.common" - compileSdk = 34 + compileSdk = 35 sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdk = 26 diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 13cdc9f19a..c208317759 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -26,6 +26,8 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.sync.Mutex import kotlin.collections.removeAll as remAll import kotlinx.datetime.* +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import kotlinx.datetime.TimeZone import kotlinx.serialization.* import kotlinx.serialization.descriptors.* @@ -2798,7 +2800,8 @@ fun MutableState>.removeLastAndNotify(contentTag: Ms value = SnapshotStateList().apply { addAll(value) val remIndex = lastIndex - val rem = removeLast() + // note: removeLast() produce NoSuchMethodError on Android but removeLastOrNull() works + val rem = removeLastOrNull() ?: return removed = Triple(rem.id, remIndex, rem.isRcvNew) } chatModel.chatItemsChangesListenerForContent(contentTag)?.removed(listOf(removed), value) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemsLoader.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemsLoader.kt index 385bf42397..059e3ad324 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemsLoader.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemsLoader.kt @@ -327,7 +327,8 @@ private fun removeDuplicatesAndUpperSplits( if (idsToTrim.last().isNotEmpty()) { // it has some elements to trim from currently visible range which means the items shouldn't be trimmed // Otherwise, the last set would be empty - idsToTrim.removeLast() + // note: removeLast() produce NoSuchMethodError on Android but removeLastOrNull() works + idsToTrim.removeLastOrNull() } val allItemsToDelete = idsToTrim.flatten() if (allItemsToDelete.isNotEmpty()) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ProcessedErrors.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ProcessedErrors.kt index 5fa097fb6b..3d21cfaf0f 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ProcessedErrors.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ProcessedErrors.kt @@ -58,6 +58,7 @@ class ProcessedErrors (val interval: Long) { text = generalGetString(MR.strings.agent_internal_error_desc).format(error.internalErr), ) } + else -> {} } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/AdvancedNetworkSettings.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/AdvancedNetworkSettings.kt index e85d88c5f8..dc1257b533 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/AdvancedNetworkSettings.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/AdvancedNetworkSettings.kt @@ -32,7 +32,7 @@ import chat.simplex.res.MR import java.text.DecimalFormat @Composable -fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> Unit, close: () -> Unit) { +fun ModalData.AdvancedNetworkSettingsView(showModal: (@Composable ModalData.() -> Unit) -> Unit, close: () -> Unit) { val currentRemoteHost by remember { chatModel.currentRemoteHost } val developerTools = remember { appPrefs.developerTools.get() } @@ -201,7 +201,7 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U updateSessionMode: (TransportSessionMode) -> Unit, updateSMPProxyMode: (SMPProxyMode) -> Unit, updateSMPProxyFallback: (SMPProxyFallback) -> Unit, - showModal: (ModalData.() -> Unit) -> Unit, + showModal: (@Composable ModalData.() -> Unit) -> Unit, resetDisabled: Boolean, reset: () -> Unit, saveDisabled: Boolean, diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/ScrollableColumn.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/ScrollableColumn.desktop.kt index 7a2a1dff0a..696e0efde8 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/ScrollableColumn.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/ScrollableColumn.desktop.kt @@ -93,7 +93,7 @@ actual fun LazyColumnWithScrollBar( } val modifier = if (fillMaxSize) Modifier.fillMaxSize().then(modifier) else modifier Box(Modifier.copyViewToAppBar(remember { appPrefs.appearanceBarsBlurRadius.state }.value, LocalAppBarHandler.current?.graphicsLayer).nestedScroll(connection)) { - LazyColumn(modifier.then(scrollModifier), state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content) + LazyColumn(modifier.then(scrollModifier), state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content = content) ScrollBar(reverseLayout, state, scrollBarAlpha, scrollJob, scrollBarDraggingState, additionalBarOffset, additionalTopBar, chatBottomBar) } } @@ -138,7 +138,7 @@ actual fun LazyColumnWithScrollBarNoAppBar( // (only first visible row is useful because LazyColumn doesn't have absolute scroll position, only relative to row) val scrollBarDraggingState = remember { mutableStateOf(false) } Box(contentAlignment = containerAlignment) { - LazyColumn(modifier.then(scrollModifier), state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content) + LazyColumn(modifier.then(scrollModifier), state, contentPadding, reverseLayout, verticalArrangement, horizontalAlignment, flingBehavior, userScrollEnabled, content = content) Box(if (maxHeight?.value != null) Modifier.height(maxHeight.value).fillMaxWidth() else Modifier.fillMaxSize(), contentAlignment = Alignment.CenterEnd) { DesktopScrollBar(rememberScrollbarAdapter(state), Modifier.fillMaxHeight(), scrollBarAlpha, scrollJob, reverseLayout, scrollBarDraggingState) } diff --git a/apps/multiplatform/desktop/build.gradle.kts b/apps/multiplatform/desktop/build.gradle.kts index e39ba48a0b..60ff535e88 100644 --- a/apps/multiplatform/desktop/build.gradle.kts +++ b/apps/multiplatform/desktop/build.gradle.kts @@ -1,9 +1,10 @@ +import org.gradle.internal.extensions.stdlib.toDefaultLowerCase import org.jetbrains.compose.desktop.application.dsl.TargetFormat -import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly plugins { kotlin("multiplatform") id("org.jetbrains.compose") + id("org.jetbrains.kotlin.plugin.compose") id("io.github.tomtzook.gradle-cmake") version "1.2.2" } @@ -89,7 +90,7 @@ compose { } } } - val os = System.getProperty("os.name", "generic").toLowerCaseAsciiOnly() + val os = System.getProperty("os.name", "generic").toDefaultLowerCase() if (os.contains("mac") || os.contains("win")) { packageName = "SimpleX" } else { diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 09095de72e..30e4685a69 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -30,9 +30,9 @@ android.version_code=279 desktop.version_name=6.3 desktop.version_code=96 -kotlin.version=1.9.23 -gradle.plugin.version=8.2.0 -compose.version=1.7.0 +kotlin.version=2.1.20 +gradle.plugin.version=8.7.0 +compose.version=1.8.0-beta01 # Choose sqlite or postgres backend database.backend=sqlite diff --git a/apps/multiplatform/gradle/wrapper/gradle-wrapper.properties b/apps/multiplatform/gradle/wrapper/gradle-wrapper.properties index 4e4a6a3f29..6183001f7b 100644 --- a/apps/multiplatform/gradle/wrapper/gradle-wrapper.properties +++ b/apps/multiplatform/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Feb 14 14:23:51 GMT 2022 +#Fri Mar 21 20:38:56 ICT 2025 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/apps/multiplatform/settings.gradle.kts b/apps/multiplatform/settings.gradle.kts index ba047edf1e..40446f1958 100644 --- a/apps/multiplatform/settings.gradle.kts +++ b/apps/multiplatform/settings.gradle.kts @@ -12,6 +12,7 @@ pluginManagement { id("com.android.application").version(extra["gradle.plugin.version"] as String) id("com.android.library").version(extra["gradle.plugin.version"] as String) id("org.jetbrains.compose").version(extra["compose.version"] as String) + id("org.jetbrains.kotlin.plugin.compose").version(extra["kotlin.version"] as String) id("org.jetbrains.kotlin.plugin.serialization").version(extra["kotlin.version"] as String) } }