diff --git a/README.md b/README.md
index 8bd80b0..de33ccb 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,10 @@
[
](https://f-droid.org/packages/com.nextcloud.talk2/)
+ [
](https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22com.nextcloud.talk2%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fnextcloud%2Ftalk-android%22%2C%22author%22%3A%22nextcloud%22%2C%22name%22%3A%22Talk%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Atrue%2C%5C%22sortMethodChoice%5C%22%3A%5C%22date%5C%22%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22releaseTitleAsVersion%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5Enextcloud.*%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22Nextcloud%20Talk%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Atrue%7D%22%2C%22overrideSource%22%3Anull%7D)
+
Please note that Notifications won't work with the F-Droid version due to missing Google Play Services.
@@ -112,4 +116,4 @@ If you have problems to receive talk notifications on your android phone, please
## Remarks :scroll:
-Google Play and the Google Play logo are trademarks of Google Inc.
\ No newline at end of file
+Google Play and the Google Play logo are trademarks of Google Inc.
diff --git a/app/build.gradle b/app/build.gradle
index 90e1578..c510cbb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -39,8 +39,8 @@ android {
// mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable)
// xx .xxx .xx .xx
- versionCode 230000005
- versionName "23.0.0 Alpha 05"
+ versionCode 230000009
+ versionName "23.0.0 Alpha 09"
flavorDimensions "default"
renderscriptTargetApi = 19
@@ -158,7 +158,7 @@ kapt {
ext {
androidxCameraVersion = "1.5.0"
coilKtVersion = "2.7.0"
- daggerVersion = "2.57.1"
+ daggerVersion = "2.57.2"
emojiVersion = "1.6.0"
fidoVersion = "4.1.0-patch2"
lifecycleVersion = '2.9.4'
@@ -169,7 +169,7 @@ ext {
prismVersion = "2.0.0"
retrofit2Version = "3.0.0"
roomVersion = "2.8.0"
- workVersion = "2.10.4"
+ workVersion = "2.10.5"
espressoVersion = "3.7.0"
androidxTestVersion = "1.5.0"
media3_version = "1.8.0"
@@ -186,12 +186,12 @@ configurations.configureEach {
dependencies {
implementation "androidx.room:room-testing-android:${roomVersion}"
- implementation 'androidx.compose.foundation:foundation-layout:1.9.1'
+ implementation 'androidx.compose.foundation:foundation-layout:1.9.2'
spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.14.0'
spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.14'
detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.8")
- implementation("androidx.compose.runtime:runtime:1.9.1")
+ implementation("androidx.compose.runtime:runtime:1.9.2")
implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.datastore:datastore-core:1.1.7'
implementation 'androidx.datastore:datastore-preferences:1.1.7'
@@ -316,7 +316,7 @@ dependencies {
implementation 'com.github.nextcloud-deps:android-talk-webrtc:132.6834.0'
gplayImplementation 'com.google.android.gms:play-services-base:18.8.0'
- gplayImplementation "com.google.firebase:firebase-messaging:25.0.0"
+ gplayImplementation "com.google.firebase:firebase-messaging:25.0.1"
//compose
implementation(platform("androidx.compose:compose-bom:2025.09.00"))
@@ -328,18 +328,18 @@ dependencies {
//tests
testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4'
- androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.9.1")
+ androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.9.2")
debugImplementation("androidx.compose.ui:ui-test-manifest")
testImplementation 'junit:junit:4.13.2'
- testImplementation 'org.mockito:mockito-core:5.19.0'
+ testImplementation 'org.mockito:mockito-core:5.20.0'
testImplementation 'androidx.arch.core:core-testing:2.2.0'
androidTestImplementation "androidx.test:core:1.7.0"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2"
androidTestImplementation 'androidx.test:core-ktx:1.7.0'
- androidTestImplementation 'org.mockito:mockito-android:5.19.0'
+ androidTestImplementation 'org.mockito:mockito-android:5.20.0'
androidTestImplementation "androidx.work:work-testing:${workVersion}"
// Espresso core
androidTestImplementation ("androidx.test.espresso:espresso-core:$espressoVersion", {
@@ -360,7 +360,7 @@ dependencies {
testImplementation 'org.junit.vintage:junit-vintage-engine:5.13.4' // DO NOT REMOVE
testImplementation "androidx.room:room-testing:${roomVersion}"
testImplementation("com.squareup.okhttp3:mockwebserver:$okhttpVersion")
- testImplementation("com.google.dagger:hilt-android-testing:2.57.1")
+ testImplementation("com.google.dagger:hilt-android-testing:2.57.2")
testImplementation("org.robolectric:robolectric:4.16")
}
diff --git a/app/src/main/java/com/nextcloud/talk/account/WebViewLoginActivity.kt b/app/src/main/java/com/nextcloud/talk/account/WebViewLoginActivity.kt
index 0d52529..e2fcb5a 100644
--- a/app/src/main/java/com/nextcloud/talk/account/WebViewLoginActivity.kt
+++ b/app/src/main/java/com/nextcloud/talk/account/WebViewLoginActivity.kt
@@ -1,7 +1,7 @@
/*
* Nextcloud Talk - Android Client
*
- * SPDX-FileCopyrightText: 2025 Your Name
+ * SPDX-FileCopyrightText: 2025 Julius Linus
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.nextcloud.talk.account
diff --git a/app/src/main/java/com/nextcloud/talk/account/viewmodels/BrowserLoginActivityViewModel.kt b/app/src/main/java/com/nextcloud/talk/account/viewmodels/BrowserLoginActivityViewModel.kt
index b76b27c..e9560c5 100644
--- a/app/src/main/java/com/nextcloud/talk/account/viewmodels/BrowserLoginActivityViewModel.kt
+++ b/app/src/main/java/com/nextcloud/talk/account/viewmodels/BrowserLoginActivityViewModel.kt
@@ -1,7 +1,7 @@
/*
* Nextcloud Talk - Android Client
*
- * SPDX-FileCopyrightText: 2025 Your Name
+ * SPDX-FileCopyrightText: 2025 Julius Linus
* SPDX-License-Identifier: GPL-3.0-or-later
*/
diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt
index 4211aa2..a0cf017 100644
--- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt
+++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt
@@ -277,7 +277,8 @@ interface NcApiCoroutines {
suspend fun getContextOfChatMessage(
@Header("Authorization") authorization: String,
@Url url: String,
- @Query("limit") limit: Int
+ @Query("limit") limit: Int,
+ @Query("threadId") threadId: Int?
): ChatOverall
@GET
diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
index 6477727..aecdd39 100644
--- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
+++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
@@ -65,6 +65,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.ComposeView
import androidx.coordinatorlayout.widget.CoordinatorLayout
+import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.content.PermissionChecker
import androidx.core.content.PermissionChecker.PERMISSION_GRANTED
@@ -134,6 +135,8 @@ import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.chat.viewmodels.ChatViewModel
import com.nextcloud.talk.chat.viewmodels.MessageInputViewModel
+import com.nextcloud.talk.contextchat.ContextChatView
+import com.nextcloud.talk.contextchat.ContextChatViewModel
import com.nextcloud.talk.conversationinfo.ConversationInfoActivity
import com.nextcloud.talk.conversationinfo.viewmodel.ConversationInfoViewModel
import com.nextcloud.talk.conversationlist.ConversationsListActivity
@@ -168,7 +171,6 @@ import com.nextcloud.talk.ui.PlaybackSpeed
import com.nextcloud.talk.ui.PlaybackSpeedControl
import com.nextcloud.talk.ui.StatusDrawable
import com.nextcloud.talk.ui.bottom.sheet.ProfileBottomSheet
-import com.nextcloud.talk.ui.dialog.ContextChatCompose
import com.nextcloud.talk.ui.dialog.DateTimeCompose
import com.nextcloud.talk.ui.dialog.FileAttachmentPreviewFragment
import com.nextcloud.talk.ui.dialog.MessageActionsDialog
@@ -203,6 +205,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FILE_PATHS
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_BREAKOUT_ROOM
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_MODERATOR
+import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_OPENED_VIA_NOTIFICATION
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH
@@ -246,7 +249,6 @@ import java.util.Locale
import java.util.concurrent.ExecutionException
import javax.inject.Inject
import kotlin.math.roundToInt
-import androidx.core.content.ContextCompat
@Suppress("TooManyFunctions")
@AutoInjector(NextcloudTalkApplication::class)
@@ -287,6 +289,7 @@ class ChatActivity :
lateinit var chatViewModel: ChatViewModel
lateinit var conversationInfoViewModel: ConversationInfoViewModel
+ lateinit var contextChatViewModel: ContextChatViewModel
lateinit var messageInputViewModel: MessageInputViewModel
private var chatMenu: Menu? = null
@@ -323,28 +326,27 @@ class ChatActivity :
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
executeIfResultOk(it) { intent ->
runBlocking {
- val id = intent?.getStringExtra(MessageSearchActivity.RESULT_KEY_MESSAGE_ID)
- id?.let {
- startContextChatWindowForMessage(id)
+ val messageId = intent?.getStringExtra(MessageSearchActivity.RESULT_KEY_MESSAGE_ID)
+ val threadId = intent?.getStringExtra(MessageSearchActivity.RESULT_KEY_THREAD_ID)
+ messageId?.let {
+ startContextChatWindowForMessage(messageId, threadId)
}
}
}
}
- private fun startContextChatWindowForMessage(id: String?) {
+ private fun startContextChatWindowForMessage(messageId: String?, threadId: String?) {
binding.genericComposeView.apply {
- val shouldDismiss = mutableStateOf(false)
setContent {
- val bundle = bundleOf()
- bundle.putString(BundleKeys.KEY_CREDENTIALS, credentials!!)
- bundle.putString(BundleKeys.KEY_BASE_URL, conversationUser!!.baseUrl)
- bundle.putString(KEY_ROOM_TOKEN, roomToken)
- bundle.putString(BundleKeys.KEY_MESSAGE_ID, id)
- bundle.putString(
- KEY_CONVERSATION_NAME,
- currentConversation!!.displayName
+ contextChatViewModel.getContextForChatMessages(
+ credentials = credentials!!,
+ baseUrl = conversationUser!!.baseUrl!!,
+ token = roomToken,
+ threadId = threadId,
+ messageId = messageId!!,
+ title = currentConversation!!.displayName
)
- ContextChatCompose(bundle).GetDialogView(shouldDismiss, context)
+ ContextChatView(context, contextChatViewModel)
}
}
Log.d(TAG, "Should open something else")
@@ -366,6 +368,7 @@ class ChatActivity :
var sessionIdAfterRoomJoined: String? = null
lateinit var roomToken: String
var conversationThreadId: Long? = null
+ var openedViaNotification: Boolean = false
var conversationThreadInfo: ThreadInfo? = null
var conversationUser: User? = null
lateinit var spreedCapabilities: SpreedCapability
@@ -408,12 +411,11 @@ class ChatActivity :
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
- if (isChatThread()) {
+ if (!openedViaNotification && isChatThread()) {
isEnabled = false
onBackPressedDispatcher.onBackPressed()
} else {
val intent = Intent(this@ChatActivity, ConversationsListActivity::class.java)
- intent.putExtras(Bundle())
startActivity(intent)
}
}
@@ -514,6 +516,8 @@ class ChatActivity :
conversationInfoViewModel = ViewModelProvider(this, viewModelFactory)[ConversationInfoViewModel::class.java]
+ contextChatViewModel = ViewModelProvider(this, viewModelFactory)[ContextChatViewModel::class.java]
+
val urlForChatting = ApiUtils.getUrlForChat(chatApiVersion, conversationUser?.baseUrl, roomToken)
val credentials = ApiUtils.getCredentials(conversationUser!!.username, conversationUser!!.token)
chatViewModel.initData(
@@ -592,6 +596,8 @@ class ChatActivity :
null
}
+ openedViaNotification = extras?.getBoolean(KEY_OPENED_VIA_NOTIFICATION) ?: false
+
sharedText = extras?.getString(BundleKeys.KEY_SHARED_TEXT).orEmpty()
Log.d(TAG, " roomToken = $roomToken")
@@ -4431,7 +4437,7 @@ class ChatActivity :
}
if (!foundMessage) {
Log.d(TAG, "quoted message with id " + parentMessage.id + " was not found in adapter")
- startContextChatWindowForMessage(parentMessage.id)
+ startContextChatWindowForMessage(parentMessage.id, conversationThreadId.toString())
}
}
diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/ChatMessageRepository.kt b/app/src/main/java/com/nextcloud/talk/chat/data/ChatMessageRepository.kt
index e8dadd3..2b4399f 100644
--- a/app/src/main/java/com/nextcloud/talk/chat/data/ChatMessageRepository.kt
+++ b/app/src/main/java/com/nextcloud/talk/chat/data/ChatMessageRepository.kt
@@ -1,7 +1,7 @@
/*
* Nextcloud Talk - Android Client
*
- * SPDX-FileCopyrightText: 2024 Your Name
+ * SPDX-FileCopyrightText: 2025 Marcel Hibbe
* SPDX-License-Identifier: GPL-3.0-or-later
*/
diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt
index 637cf5d..5dcdfe3 100644
--- a/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt
+++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt
@@ -74,7 +74,8 @@ interface ChatNetworkDataSource {
baseUrl: String,
token: String,
messageId: String,
- limit: Int
+ limit: Int,
+ threadId: Int?
): List
suspend fun getOpenGraph(credentials: String, baseUrl: String, extractedLinkToPreview: String): Reference?
suspend fun unbindRoom(credentials: String, baseUrl: String, roomToken: String): GenericOverall
diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt
index 057472f..6bb6836 100644
--- a/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt
+++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt
@@ -198,10 +198,11 @@ class RetrofitChatNetwork(private val ncApi: NcApi, private val ncApiCoroutines:
baseUrl: String,
token: String,
messageId: String,
- limit: Int
+ limit: Int,
+ threadId: Int?
): List {
val url = ApiUtils.getUrlForChatMessageContext(baseUrl, token, messageId)
- return ncApiCoroutines.getContextOfChatMessage(credentials, url, limit).ocs?.data ?: listOf()
+ return ncApiCoroutines.getContextOfChatMessage(credentials, url, limit, threadId).ocs?.data ?: listOf()
}
override suspend fun getOpenGraph(
diff --git a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt
index 7b8f6dc..5d05189 100644
--- a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt
+++ b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt
@@ -35,7 +35,6 @@ import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.domain.ReactionAddedModel
import com.nextcloud.talk.models.domain.ReactionDeletedModel
import com.nextcloud.talk.models.json.capabilities.SpreedCapability
-import com.nextcloud.talk.models.json.chat.ChatMessageJson
import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage
import com.nextcloud.talk.models.json.conversations.RoomOverall
import com.nextcloud.talk.models.json.generic.GenericOverall
@@ -171,10 +170,6 @@ class ChatViewModel @Inject constructor(
val voiceMessagePlaybackSpeedPreferences: LiveData