Эх сурвалжийг харах

Merge branch 'master' into issue-4075-filter-conversation-constrast

Julius Linus 8 сар өмнө
parent
commit
cb306d905c
46 өөрчлөгдсөн 208 нэмэгдсэн , 177 устгасан
  1. 1 1
      .devcontainer/Dockerfile
  2. 2 2
      .github/workflows/codeql.yml
  3. 1 1
      .github/workflows/scorecard.yml
  4. 15 15
      app/build.gradle
  5. 1 2
      app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt
  6. 1 3
      app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLinkPreviewMessageViewHolder.kt
  7. 1 3
      app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt
  8. 1 3
      app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt
  9. 1 4
      app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt
  10. 26 28
      app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLinkPreviewMessageViewHolder.kt
  11. 1 3
      app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt
  12. 1 3
      app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt
  13. 1 3
      app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt
  14. 7 13
      app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
  15. 1 5
      app/src/main/java/com/nextcloud/talk/chat/data/ChatMessageRepository.kt
  16. 3 1
      app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt
  17. 9 16
      app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt
  18. 2 10
      app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt
  19. 5 4
      app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt
  20. 0 1
      app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt
  21. 0 1
      app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt
  22. 2 4
      app/src/main/java/com/nextcloud/talk/data/database/mappers/ChatMessageMapUtils.kt
  23. 1 1
      app/src/main/java/com/nextcloud/talk/data/database/model/ChatMessageEntity.kt
  24. 1 1
      app/src/main/java/com/nextcloud/talk/data/database/model/ConversationEntity.kt
  25. 6 3
      app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt
  26. 1 1
      app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt
  27. 1 1
      app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt
  28. 1 1
      app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessageJson.kt
  29. 11 2
      app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt
  30. 6 0
      app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt
  31. 1 1
      app/src/main/java/com/nextcloud/talk/ui/dialog/DialogBanListFragment.kt
  32. 8 2
      app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt
  33. 9 5
      app/src/main/java/com/nextcloud/talk/utils/PushUtils.kt
  34. 8 4
      app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt
  35. 1 0
      app/src/main/res/values-ga/strings.xml
  36. 1 0
      app/src/main/res/values-hu-rHU/strings.xml
  37. 9 0
      app/src/main/res/values-nb-rNO/strings.xml
  38. 14 0
      app/src/main/res/values-sr/strings.xml
  39. 2 0
      app/src/main/res/values-tr/strings.xml
  40. 18 15
      app/src/test/java/com/nextcloud/talk/utils/ParticipantPermissionsTest.kt
  41. 1 1
      detekt.yml
  42. 23 10
      gradle/verification-metadata.xml
  43. BIN
      gradle/wrapper/gradle-wrapper.jar
  44. 1 1
      gradle/wrapper/gradle-wrapper.properties
  45. 1 1
      renovate.json5
  46. 1 1
      scripts/analysis/lint-results.txt

+ 1 - 1
.devcontainer/Dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:noble@sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30
+FROM ubuntu:noble@sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee
 
 
 ARG DEBIAN_FRONTEND=noninteractive
 ARG DEBIAN_FRONTEND=noninteractive
 ENV ANDROID_HOME=/usr/lib/android-sdk
 ENV ANDROID_HOME=/usr/lib/android-sdk

+ 2 - 2
.github/workflows/codeql.yml

@@ -39,7 +39,7 @@ jobs:
         with:
         with:
           swap-size-gb: 10
           swap-size-gb: 10
       - name: Initialize CodeQL
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2
+        uses: github/codeql-action/init@883d8588e56d1753a8a58c1c86e88976f0c23449 # v3.26.3
         with:
         with:
           languages: ${{ matrix.language }}
           languages: ${{ matrix.language }}
       - name: Set up JDK 17
       - name: Set up JDK 17
@@ -53,4 +53,4 @@ jobs:
           echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
           echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
           ./gradlew assembleDebug
           ./gradlew assembleDebug
       - name: Perform CodeQL Analysis
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2
+        uses: github/codeql-action/analyze@883d8588e56d1753a8a58c1c86e88976f0c23449 # v3.26.3

+ 1 - 1
.github/workflows/scorecard.yml

@@ -42,6 +42,6 @@ jobs:
 
 
       # Upload the results to GitHub's code scanning dashboard.
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
       - name: "Upload to code-scanning"
-        uses: github/codeql-action/upload-sarif@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2
+        uses: github/codeql-action/upload-sarif@883d8588e56d1753a8a58c1c86e88976f0c23449 # v3.26.3
         with:
         with:
           sarif_file: results.sarif
           sarif_file: results.sarif

+ 15 - 15
app/build.gradle

@@ -15,7 +15,7 @@ import com.github.spotbugs.snom.SpotBugsTask
 plugins {
 plugins {
     id "org.jetbrains.kotlin.plugin.compose" version "2.0.10"
     id "org.jetbrains.kotlin.plugin.compose" version "2.0.10"
     id "org.jetbrains.kotlin.kapt"
     id "org.jetbrains.kotlin.kapt"
-    id 'com.google.devtools.ksp' version '2.0.0-1.0.24'
+    id 'com.google.devtools.ksp' version '2.0.10-1.0.24'
 }
 }
 
 
 apply plugin: 'com.android.application'
 apply plugin: 'com.android.application'
@@ -93,11 +93,11 @@ android {
         buildConfigField "String", "PERMISSION_LOCAL_BROADCAST", "\"${localBroadcastPermission}\""
         buildConfigField "String", "PERMISSION_LOCAL_BROADCAST", "\"${localBroadcastPermission}\""
     }
     }
 
 
-    testOptions {
-        unitTests.all {
-            useJUnitPlatform()
-        }
-    }
+    // testOptions {
+    //     unitTests.all {
+    //         useJUnitPlatform()
+    //     }
+    // }
 
 
     buildTypes {
     buildTypes {
         release {
         release {
@@ -133,7 +133,7 @@ android {
     }
     }
 
 
     composeOptions {
     composeOptions {
-        kotlinCompilerExtensionVersion = "1.5.14"
+        kotlinCompilerExtensionVersion = "1.5.15"
     }
     }
 
 
     lint {
     lint {
@@ -184,7 +184,7 @@ dependencies {
     implementation 'androidx.preference:preference-ktx:1.2.1'
     implementation 'androidx.preference:preference-ktx:1.2.1'
     implementation 'androidx.datastore:datastore-core:1.1.1'
     implementation 'androidx.datastore:datastore-core:1.1.1'
     implementation 'androidx.datastore:datastore-preferences:1.1.1'
     implementation 'androidx.datastore:datastore-preferences:1.1.1'
-    implementation 'androidx.test.ext:junit-ktx:1.1.5'
+    implementation 'androidx.test.ext:junit-ktx:1.2.1'
     detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.6")
     detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.6")
 	
 	
     implementation fileTree(include: ['*'], dir: 'libs')
     implementation fileTree(include: ['*'], dir: 'libs')
@@ -207,7 +207,7 @@ dependencies {
     implementation ('com.github.bitfireAT:dav4jvm:2.1.3', {
     implementation ('com.github.bitfireAT:dav4jvm:2.1.3', {
         exclude group: 'org.ogce', module: 'xpp3'	// Android comes with its own XmlPullParser
         exclude group: 'org.ogce', module: 'xpp3'	// Android comes with its own XmlPullParser
     })
     })
-    implementation 'org.conscrypt:conscrypt-android:2.5.2'
+    implementation 'org.conscrypt:conscrypt-android:2.5.3'
 
 
     implementation "androidx.camera:camera-core:${androidxCameraVersion}"
     implementation "androidx.camera:camera-core:${androidxCameraVersion}"
     implementation "androidx.camera:camera-camera2:${androidxCameraVersion}"
     implementation "androidx.camera:camera-camera2:${androidxCameraVersion}"
@@ -292,19 +292,19 @@ dependencies {
 
 
     implementation 'com.github.nextcloud-deps:ImagePicker:2.1.0.2'
     implementation 'com.github.nextcloud-deps:ImagePicker:2.1.0.2'
     implementation 'io.github.elye:loaderviewlibrary:3.0.0'
     implementation 'io.github.elye:loaderviewlibrary:3.0.0'
-    implementation 'org.osmdroid:osmdroid-android:6.1.18'
+    implementation 'org.osmdroid:osmdroid-android:6.1.20'
     implementation ('fr.dudie:nominatim-api:3.4', {
     implementation ('fr.dudie:nominatim-api:3.4', {
         //noinspection DuplicatePlatformClasses
         //noinspection DuplicatePlatformClasses
         exclude group: 'org.apache.httpcomponents', module: 'httpclient'
         exclude group: 'org.apache.httpcomponents', module: 'httpclient'
     })
     })
 
 
     implementation 'androidx.core:core-ktx:1.13.1'
     implementation 'androidx.core:core-ktx:1.13.1'
-    implementation 'androidx.activity:activity-ktx:1.9.0'
-    implementation 'com.github.nextcloud.android-common:ui:0.21.0'
+    implementation 'androidx.activity:activity-ktx:1.9.1'
+    implementation 'com.github.nextcloud.android-common:ui:0.23.0'
     implementation 'com.github.nextcloud-deps:android-talk-webrtc:121.6167.0'
     implementation 'com.github.nextcloud-deps:android-talk-webrtc:121.6167.0'
 
 
-    gplayImplementation 'com.google.android.gms:play-services-base:18.4.0'
-    gplayImplementation "com.google.firebase:firebase-messaging:23.4.1"
+    gplayImplementation 'com.google.android.gms:play-services-base:18.5.0'
+    gplayImplementation "com.google.firebase:firebase-messaging:24.0.0"
 
 
     //compose
     //compose
     implementation(platform("androidx.compose:compose-bom:2024.06.00"))
     implementation(platform("androidx.compose:compose-bom:2024.06.00"))
@@ -323,7 +323,7 @@ dependencies {
     testImplementation 'org.mockito:mockito-core:5.12.0'
     testImplementation 'org.mockito:mockito-core:5.12.0'
     testImplementation 'androidx.arch.core:core-testing:2.2.0'
     testImplementation 'androidx.arch.core:core-testing:2.2.0'
 
 
-    androidTestImplementation "androidx.test:core:1.5.0"
+    androidTestImplementation "androidx.test:core:1.6.1"
 
 
     androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1"
     androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1"
     androidTestImplementation 'androidx.test:core-ktx:1.6.1'
     androidTestImplementation 'androidx.test:core-ktx:1.6.1'

+ 1 - 2
app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt

@@ -52,7 +52,6 @@ class ChatBlocksDaoTest {
     @Test
     @Test
     fun testGetConnectedChatBlocks() =
     fun testGetConnectedChatBlocks() =
         runTest {
         runTest {
-
             usersDao.saveUser(createUserEntity("account1", "Account 1"))
             usersDao.saveUser(createUserEntity("account1", "Account 1"))
             val account1 = usersDao.getUserWithUserId("account1").blockingGet()
             val account1 = usersDao.getUserWithUserId("account1").blockingGet()
 
 
@@ -67,7 +66,7 @@ class ChatBlocksDaoTest {
                         accountId = account1.id,
                         accountId = account1.id,
                         "def",
                         "def",
                         roomName = "Conversation Two"
                         roomName = "Conversation Two"
-                    ),
+                    )
                 )
                 )
             )
             )
 
 

+ 1 - 3
app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLinkPreviewMessageViewHolder.kt

@@ -13,21 +13,19 @@ import android.text.TextUtils
 import android.util.Log
 import android.util.Log
 import android.view.View
 import android.view.View
 import androidx.core.content.ContextCompat
 import androidx.core.content.ContextCompat
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.OutcomingPollMessageViewHolder.Companion
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
+import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.databinding.ItemCustomIncomingLinkPreviewMessageBinding
 import com.nextcloud.talk.databinding.ItemCustomIncomingLinkPreviewMessageBinding
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
-import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.DateUtils

+ 1 - 3
app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt

@@ -20,21 +20,19 @@ import android.view.MotionEvent
 import android.view.View
 import android.view.View
 import android.webkit.WebView
 import android.webkit.WebView
 import android.webkit.WebViewClient
 import android.webkit.WebViewClient
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.IncomingPollMessageViewHolder.Companion
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
+import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.databinding.ItemCustomIncomingLocationMessageBinding
 import com.nextcloud.talk.databinding.ItemCustomIncomingLocationMessageBinding
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
-import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.DateUtils

+ 1 - 3
app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt

@@ -12,21 +12,19 @@ import android.text.TextUtils
 import android.util.Log
 import android.util.Log
 import android.view.View
 import android.view.View
 import androidx.core.content.ContextCompat
 import androidx.core.content.ContextCompat
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.IncomingTextMessageViewHolder.Companion
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
+import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.databinding.ItemCustomIncomingPollMessageBinding
 import com.nextcloud.talk.databinding.ItemCustomIncomingPollMessageBinding
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
-import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.polls.ui.PollMainDialogFragment
 import com.nextcloud.talk.polls.ui.PollMainDialogFragment
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils

+ 1 - 4
app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt

@@ -15,7 +15,6 @@ import android.util.Log
 import android.util.TypedValue
 import android.util.TypedValue
 import android.view.View
 import android.view.View
 import androidx.core.content.ContextCompat
 import androidx.core.content.ContextCompat
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
@@ -23,11 +22,11 @@ import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
+import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding
 import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadBotsAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadChangelogBotAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
 import com.nextcloud.talk.extensions.loadFederatedUserAvatar
-import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.DateUtils
@@ -37,9 +36,7 @@ import com.nextcloud.talk.utils.preferences.AppPreferences
 import com.stfalcon.chatkit.messages.MessageHolders
 import com.stfalcon.chatkit.messages.MessageHolders
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withContext
 import javax.inject.Inject
 import javax.inject.Inject

+ 26 - 28
app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLinkPreviewMessageViewHolder.kt

@@ -12,18 +12,16 @@ import android.content.Context
 import android.util.Log
 import android.util.Log
 import android.view.View
 import android.view.View
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.appcompat.content.res.AppCompatResources
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.OutcomingPollMessageViewHolder.Companion
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
-import com.nextcloud.talk.databinding.ItemCustomOutcomingLinkPreviewMessageBinding
 import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.chat.data.model.ChatMessage
+import com.nextcloud.talk.databinding.ItemCustomOutcomingLinkPreviewMessageBinding
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
@@ -164,32 +162,32 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) :
                             message.parentMessageId!!
                             message.parentMessageId!!
                         ).first()
                         ).first()
                     }
                     }
-                        parentChatMessage.activeUser = message.activeUser
-                        parentChatMessage.imageUrl?.let {
-                            binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE
-                            binding.messageQuote.quotedMessageImage.load(it) {
-                                addHeader(
-                                    "Authorization",
-                                    ApiUtils.getCredentials(message.activeUser!!.username, message.activeUser!!.token)!!
-                                )
-                            }
-                        } ?: run {
-                            binding.messageQuote.quotedMessageImage.visibility = View.GONE
-                        }
-                        binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
-                            ?: context.getText(R.string.nc_nick_guest)
-                        binding.messageQuote.quotedMessage.text = messageUtils
-                            .enrichChatReplyMessageText(
-                                binding.messageQuote.quotedMessage.context,
-                                parentChatMessage,
-                                false,
-                                viewThemeUtils
+                    parentChatMessage.activeUser = message.activeUser
+                    parentChatMessage.imageUrl?.let {
+                        binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE
+                        binding.messageQuote.quotedMessageImage.load(it) {
+                            addHeader(
+                                "Authorization",
+                                ApiUtils.getCredentials(message.activeUser!!.username, message.activeUser!!.token)!!
                             )
                             )
-                        viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
-                        viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)
-                        viewThemeUtils.talk.colorOutgoingQuoteBackground(binding.messageQuote.quoteColoredView)
-
-                        binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE
+                        }
+                    } ?: run {
+                        binding.messageQuote.quotedMessageImage.visibility = View.GONE
+                    }
+                    binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName
+                        ?: context.getText(R.string.nc_nick_guest)
+                    binding.messageQuote.quotedMessage.text = messageUtils
+                        .enrichChatReplyMessageText(
+                            binding.messageQuote.quotedMessage.context,
+                            parentChatMessage,
+                            false,
+                            viewThemeUtils
+                        )
+                    viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage)
+                    viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor)
+                    viewThemeUtils.talk.colorOutgoingQuoteBackground(binding.messageQuote.quoteColoredView)
+
+                    binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE
                 } catch (e: Exception) {
                 } catch (e: Exception) {
                     Log.d(TAG, "Error when processing parent message in view holder", e)
                     Log.d(TAG, "Error when processing parent message in view holder", e)
                 }
                 }

+ 1 - 3
app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt

@@ -18,19 +18,17 @@ import android.view.View
 import android.webkit.WebView
 import android.webkit.WebView
 import android.webkit.WebViewClient
 import android.webkit.WebViewClient
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.appcompat.content.res.AppCompatResources
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.google.android.flexbox.FlexboxLayout
 import com.google.android.flexbox.FlexboxLayout
 import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.IncomingPollMessageViewHolder.Companion
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
-import com.nextcloud.talk.databinding.ItemCustomOutcomingLocationMessageBinding
 import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.chat.data.model.ChatMessage
+import com.nextcloud.talk.databinding.ItemCustomOutcomingLocationMessageBinding
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils

+ 1 - 3
app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt

@@ -12,18 +12,16 @@ import android.content.Context
 import android.util.Log
 import android.util.Log
 import android.view.View
 import android.view.View
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.appcompat.content.res.AppCompatResources
-import androidx.lifecycle.lifecycleScope
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.IncomingPollMessageViewHolder.Companion
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
-import com.nextcloud.talk.databinding.ItemCustomOutcomingPollMessageBinding
 import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.chat.data.model.ChatMessage
+import com.nextcloud.talk.databinding.ItemCustomOutcomingPollMessageBinding
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.polls.ui.PollMainDialogFragment
 import com.nextcloud.talk.polls.ui.PollMainDialogFragment
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils

+ 1 - 3
app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt

@@ -17,19 +17,17 @@ import android.view.View
 import android.widget.SeekBar
 import android.widget.SeekBar
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.appcompat.content.res.AppCompatResources
 import androidx.core.content.ContextCompat
 import androidx.core.content.ContextCompat
-import androidx.lifecycle.lifecycleScope
 import androidx.work.WorkInfo
 import androidx.work.WorkInfo
 import androidx.work.WorkManager
 import androidx.work.WorkManager
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import coil.load
 import coil.load
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
-import com.nextcloud.talk.adapters.messages.IncomingPollMessageViewHolder.Companion
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
-import com.nextcloud.talk.databinding.ItemCustomOutcomingVoiceMessageBinding
 import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.chat.data.model.ChatMessage
+import com.nextcloud.talk.databinding.ItemCustomOutcomingVoiceMessageBinding
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils

+ 7 - 13
app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

@@ -162,7 +162,6 @@ 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_BREAKOUT_ROOM
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_MODERATOR
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_MODERATOR
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE
-import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM
@@ -187,7 +186,6 @@ import kotlinx.coroutines.withContext
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.greenrobot.eventbus.ThreadMode
 import retrofit2.HttpException
 import retrofit2.HttpException
-import retrofit2.Response
 import java.io.File
 import java.io.File
 import java.io.IOException
 import java.io.IOException
 import java.net.HttpURLConnection
 import java.net.HttpURLConnection
@@ -291,6 +289,7 @@ class ChatActivity :
     var newMessagesCount = 0
     var newMessagesCount = 0
     var startCallFromNotification: Boolean = false
     var startCallFromNotification: Boolean = false
     var startCallFromRoomSwitch: Boolean = false
     var startCallFromRoomSwitch: Boolean = false
+
     // lateinit var roomId: String
     // lateinit var roomId: String
     var voiceOnly: Boolean = true
     var voiceOnly: Boolean = true
     private lateinit var path: String
     private lateinit var path: String
@@ -600,7 +599,7 @@ class ChatActivity :
 
 
                     chatViewModel.loadMessages(
                     chatViewModel.loadMessages(
                         withCredentials = credentials!!,
                         withCredentials = credentials!!,
-                        withUrl = urlForChatting,
+                        withUrl = urlForChatting
                     )
                     )
                 }
                 }
 
 
@@ -985,7 +984,8 @@ class ChatActivity :
 
 
                 if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                 if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                     if (layoutManager!!.findFirstCompletelyVisibleItemPosition() > 0 &&
                     if (layoutManager!!.findFirstCompletelyVisibleItemPosition() > 0 &&
-                        !binding.unreadMessagesPopup.isShown) {
+                        !binding.unreadMessagesPopup.isShown
+                    ) {
                         binding.scrollDownButton.visibility = View.VISIBLE
                         binding.scrollDownButton.visibility = View.VISIBLE
                     } else {
                     } else {
                         binding.scrollDownButton.visibility = View.GONE
                         binding.scrollDownButton.visibility = View.GONE
@@ -2504,7 +2504,6 @@ class ChatActivity :
             unreadChatMessage.message = context.getString(R.string.nc_new_messages)
             unreadChatMessage.message = context.getString(R.string.nc_new_messages)
             adapter?.addToStart(unreadChatMessage, false)
             adapter?.addToStart(unreadChatMessage, false)
 
 
-
             if (scrollToEndOnUpdate) {
             if (scrollToEndOnUpdate) {
                 binding.scrollDownButton.visibility = View.GONE
                 binding.scrollDownButton.visibility = View.GONE
                 newMessagesCount = 0
                 newMessagesCount = 0
@@ -2519,7 +2518,6 @@ class ChatActivity :
             }
             }
         }
         }
 
 
-
         for (chatMessage in chatMessageList) {
         for (chatMessage in chatMessageList) {
             chatMessage.activeUser = conversationUser
             chatMessage.activeUser = conversationUser
 
 
@@ -2630,7 +2628,6 @@ class ChatActivity :
             // see getImageUrl() source code
             // see getImageUrl() source code
             setUpWaveform(currentlyPlayedVoiceMessage!!, voiceMessageToRestoreWasPlaying)
             setUpWaveform(currentlyPlayedVoiceMessage!!, voiceMessageToRestoreWasPlaying)
             Log.d(RESUME_AUDIO_TAG, "resume audio procedure completed")
             Log.d(RESUME_AUDIO_TAG, "resume audio procedure completed")
-
         } else {
         } else {
             Log.d(RESUME_AUDIO_TAG, "No voice message to restore")
             Log.d(RESUME_AUDIO_TAG, "No voice message to restore")
         }
         }
@@ -2639,7 +2636,7 @@ class ChatActivity :
         voiceMessageToRestoreWasPlaying = false
         voiceMessageToRestoreWasPlaying = false
     }
     }
 
 
-    private fun getItemFromAdapter(messageId: String): Pair<ChatMessage,Int>? {
+    private fun getItemFromAdapter(messageId: String): Pair<ChatMessage, Int>? {
         if (adapter != null) {
         if (adapter != null) {
             val messagePosition = adapter!!.items!!.indexOfFirst {
             val messagePosition = adapter!!.items!!.indexOfFirst {
                 it.item is ChatMessage && (it.item as ChatMessage).id == messageId
                 it.item is ChatMessage && (it.item as ChatMessage).id == messageId
@@ -2652,9 +2649,7 @@ class ChatActivity :
                     Log.d(TAG, "currentItem retrieved was not chatmessage or its id was not correct")
                     Log.d(TAG, "currentItem retrieved was not chatmessage or its id was not correct")
                 }
                 }
             } else {
             } else {
-                Log.d(
-                    TAG, "messagePosition is -1, adapter # of items: " + adapter!!.itemCount
-                )
+                Log.d(TAG, "messagePosition is -1, adapter # of items: " + adapter!!.itemCount)
             }
             }
         } else {
         } else {
             Log.d(TAG, "TalkMessagesListAdapter is null")
             Log.d(TAG, "TalkMessagesListAdapter is null")
@@ -2831,7 +2826,6 @@ class ChatActivity :
         while (chatMessageIterator.hasNext()) {
         while (chatMessageIterator.hasNext()) {
             val currentMessage = chatMessageIterator.next()
             val currentMessage = chatMessageIterator.next()
 
 
-
             if (isInfoMessageAboutDeletion(currentMessage) ||
             if (isInfoMessageAboutDeletion(currentMessage) ||
                 isReactionsMessage(currentMessage) ||
                 isReactionsMessage(currentMessage) ||
                 isPollVotedMessage(currentMessage) ||
                 isPollVotedMessage(currentMessage) ||
@@ -3176,7 +3170,7 @@ class ChatActivity :
             val lon = data["longitude"]!!
             val lon = data["longitude"]!!
             metaData =
             metaData =
                 "{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," +
                 "{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," +
-                    "\"longitude\":\"$lon\",\"name\":\"$name\"}"
+                "\"longitude\":\"$lon\",\"name\":\"$name\"}"
         }
         }
 
 
         when (type) {
         when (type) {

+ 1 - 5
app/src/main/java/com/nextcloud/talk/chat/data/ChatMessageRepository.kt

@@ -32,11 +32,7 @@ interface ChatMessageRepository : LifecycleAwareManager {
 
 
     val lastCommonReadFlow: Flow<Int>
     val lastCommonReadFlow: Flow<Int>
 
 
-    fun setData(
-        conversationModel: ConversationModel,
-        credentials: String,
-        urlForChatting: String
-    )
+    fun setData(conversationModel: ConversationModel, credentials: String, urlForChatting: String)
 
 
     fun loadInitialMessages(withNetworkParams: Bundle): Job
     fun loadInitialMessages(withNetworkParams: Bundle): Job
 
 

+ 3 - 1
app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt

@@ -407,7 +407,9 @@ data class ChatMessage(
         BREAKOUT_ROOMS_STARTED,
         BREAKOUT_ROOMS_STARTED,
         BREAKOUT_ROOMS_STOPPED,
         BREAKOUT_ROOMS_STOPPED,
         AVATAR_SET,
         AVATAR_SET,
-        AVATAR_REMOVED
+        AVATAR_REMOVED,
+        FEDERATED_USER_ADDED,
+        FEDERATED_USER_REMOVED
     }
     }
 
 
     companion object {
     companion object {

+ 9 - 16
app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt

@@ -90,11 +90,7 @@ class OfflineFirstChatRepository @Inject constructor(
     private lateinit var credentials: String
     private lateinit var credentials: String
     private lateinit var urlForChatting: String
     private lateinit var urlForChatting: String
 
 
-    override fun setData(
-        conversationModel: ConversationModel,
-        credentials: String,
-        urlForChatting: String
-    ) {
+    override fun setData(conversationModel: ConversationModel, credentials: String, urlForChatting: String) {
         this.conversationModel = conversationModel
         this.conversationModel = conversationModel
         this.credentials = credentials
         this.credentials = credentials
         this.urlForChatting = urlForChatting
         this.urlForChatting = urlForChatting
@@ -213,9 +209,7 @@ class OfflineFirstChatRepository @Inject constructor(
             }
             }
         }
         }
 
 
-    private suspend fun hasToLoadPreviousMessagesFromServer(
-        beforeMessageId: Long
-    ): Boolean {
+    private suspend fun hasToLoadPreviousMessagesFromServer(beforeMessageId: Long): Boolean {
         val loadFromServer: Boolean
         val loadFromServer: Boolean
 
 
         val blockForMessage = getBlockOfMessage(beforeMessageId.toInt())
         val blockForMessage = getBlockOfMessage(beforeMessageId.toInt())
@@ -239,7 +233,8 @@ class OfflineFirstChatRepository @Inject constructor(
             loadFromServer = amountBetween < 100
             loadFromServer = amountBetween < 100
 
 
             Log.d(
             Log.d(
-                TAG, "Amount between messageId " + beforeMessageId + " and " + blockForMessage.oldestMessageId +
+                TAG,
+                "Amount between messageId " + beforeMessageId + " and " + blockForMessage.oldestMessageId +
                     " is: " + amountBetween + " so 'loadFromServer' is " + loadFromServer
                     " is: " + amountBetween + " so 'loadFromServer' is " + loadFromServer
             )
             )
         }
         }
@@ -272,9 +267,7 @@ class OfflineFirstChatRepository @Inject constructor(
         return fieldMap
         return fieldMap
     }
     }
 
 
-    override suspend fun getMessage(messageId: Long, bundle: Bundle):
-        Flow<ChatMessage> {
-
+    override suspend fun getMessage(messageId: Long, bundle: Bundle): Flow<ChatMessage> {
         Log.d(TAG, "Get message with id $messageId")
         Log.d(TAG, "Get message with id $messageId")
         val loadFromServer = hasToLoadPreviousMessagesFromServer(messageId)
         val loadFromServer = hasToLoadPreviousMessagesFromServer(messageId)
 
 
@@ -511,12 +504,12 @@ class OfflineFirstChatRepository @Inject constructor(
                 chatBlock.newestMessageId
                 chatBlock.newestMessageId
             ).first()
             ).first()
 
 
-        if (connectedChatBlocks.size == 1) {
+        return if (connectedChatBlocks.size == 1) {
             Log.d(TAG, "This chatBlock is not connected to others")
             Log.d(TAG, "This chatBlock is not connected to others")
             val chatBlockFromDb = connectedChatBlocks[0]
             val chatBlockFromDb = connectedChatBlocks[0]
             Log.d(TAG, "chatBlockFromDb.oldestMessageId: " + chatBlockFromDb.oldestMessageId)
             Log.d(TAG, "chatBlockFromDb.oldestMessageId: " + chatBlockFromDb.oldestMessageId)
             Log.d(TAG, "chatBlockFromDb.newestMessageId: " + chatBlockFromDb.newestMessageId)
             Log.d(TAG, "chatBlockFromDb.newestMessageId: " + chatBlockFromDb.newestMessageId)
-            return chatBlockFromDb
+            chatBlockFromDb
         } else if (connectedChatBlocks.size > 1) {
         } else if (connectedChatBlocks.size > 1) {
             Log.d(TAG, "Found " + connectedChatBlocks.size + " chat blocks that are connected")
             Log.d(TAG, "Found " + connectedChatBlocks.size + " chat blocks that are connected")
             val oldestIdFromDbChatBlocks =
             val oldestIdFromDbChatBlocks =
@@ -543,10 +536,10 @@ class OfflineFirstChatRepository @Inject constructor(
             Log.d(TAG, "A new chat block was created that covers all the range of the found chatblocks")
             Log.d(TAG, "A new chat block was created that covers all the range of the found chatblocks")
             Log.d(TAG, "new chatBlock - oldest MessageId: $oldestIdFromDbChatBlocks")
             Log.d(TAG, "new chatBlock - oldest MessageId: $oldestIdFromDbChatBlocks")
             Log.d(TAG, "new chatBlock - newest MessageId: $newestIdFromDbChatBlocks")
             Log.d(TAG, "new chatBlock - newest MessageId: $newestIdFromDbChatBlocks")
-            return newChatBlock
+            newChatBlock
         } else {
         } else {
             Log.d(TAG, "No chat block found ....")
             Log.d(TAG, "No chat block found ....")
-            return null
+            null
         }
         }
     }
     }
 
 

+ 2 - 10
app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt

@@ -217,16 +217,8 @@ class ChatViewModel @Inject constructor(
     val reactionDeletedViewState: LiveData<ViewState>
     val reactionDeletedViewState: LiveData<ViewState>
         get() = _reactionDeletedViewState
         get() = _reactionDeletedViewState
 
 
-    fun setData(
-        conversationModel: ConversationModel,
-        credentials: String,
-        urlForChatting: String
-    ) {
-        chatRepository.setData(
-            conversationModel,
-            credentials,
-            urlForChatting
-        )
+    fun setData(conversationModel: ConversationModel, credentials: String, urlForChatting: String) {
+        chatRepository.setData(conversationModel, credentials, urlForChatting)
     }
     }
 
 
     fun getRoom(user: User, token: String) {
     fun getRoom(user: User, token: String) {

+ 5 - 4
app/src/main/java/com/nextcloud/talk/contacts/ContactsActivityCompose.kt

@@ -109,6 +109,7 @@ class ContactsActivityCompose : BaseActivity() {
                 )
                 )
             }
             }
         }
         }
+        setupSystemColors()
     }
     }
 }
 }
 
 
@@ -132,7 +133,7 @@ fun ContactsList(contactsUiState: ContactsUiState, contactsViewModel: ContactsVi
         is ContactsUiState.Error -> {
         is ContactsUiState.Error -> {
             val errorMessage = contactsUiState.message
             val errorMessage = contactsUiState.message
             Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
             Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                Text(text = "Error: $errorMessage", color = Color.Red)
+                Text(text = "Error: $errorMessage", color = MaterialTheme.colorScheme.error)
             }
             }
         }
         }
     }
     }
@@ -165,7 +166,7 @@ fun ContactsItem(contacts: List<AutocompleteUser>, contactsViewModel: ContactsVi
                     Surface(Modifier.fillParentMaxWidth()) {
                     Surface(Modifier.fillParentMaxWidth()) {
                         Header(initial)
                         Header(initial)
                     }
                     }
-                    HorizontalDivider(thickness = 0.1.dp, color = Color.Black)
+                    HorizontalDivider(thickness = 1.dp, color = MaterialTheme.colorScheme.outlineVariant)
                 }
                 }
             }
             }
             items(contactsForInitial) { contact ->
             items(contactsForInitial) { contact ->
@@ -184,7 +185,7 @@ fun Header(header: String) {
             .fillMaxSize()
             .fillMaxSize()
             .background(Color.Transparent)
             .background(Color.Transparent)
             .padding(start = 60.dp),
             .padding(start = 60.dp),
-        color = Color.Blue,
+        color = MaterialTheme.colorScheme.primary,
         fontWeight = FontWeight.Bold
         fontWeight = FontWeight.Bold
     )
     )
 }
 }
@@ -229,7 +230,7 @@ fun ContactItemRow(contact: AutocompleteUser, contactsViewModel: ContactsViewMod
         is RoomUiState.Error -> {
         is RoomUiState.Error -> {
             val errorMessage = (roomUiState as RoomUiState.Error).message
             val errorMessage = (roomUiState as RoomUiState.Error).message
             Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
             Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                Text(text = "Error: $errorMessage", color = Color.Red)
+                Text(text = "Error: $errorMessage", color = MaterialTheme.colorScheme.error)
             }
             }
         }
         }
         is RoomUiState.None -> {}
         is RoomUiState.None -> {}

+ 0 - 1
app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

@@ -121,7 +121,6 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_FLAG
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_TEXT
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_TEXT
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NEW_CONVERSATION
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NEW_CONVERSATION
-import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SHARED_TEXT
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SHARED_TEXT
 import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
 import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil

+ 0 - 1
app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt

@@ -57,7 +57,6 @@ interface ChatBlocksDao {
     )
     )
     fun getChatBlocksContainingMessageId(internalConversationId: String, messageId: Long): Flow<List<ChatBlockEntity?>>
     fun getChatBlocksContainingMessageId(internalConversationId: String, messageId: Long): Flow<List<ChatBlockEntity?>>
 
 
-
     @Query(
     @Query(
         """
         """
         SELECT *
         SELECT *

+ 2 - 4
app/src/main/java/com/nextcloud/talk/data/database/mappers/ChatMessageMapUtils.kt

@@ -7,11 +7,9 @@
 
 
 package com.nextcloud.talk.data.database.mappers
 package com.nextcloud.talk.data.database.mappers
 
 
-import com.nextcloud.talk.models.json.chat.ChatMessageJson
-import com.nextcloud.talk.data.database.model.ChatMessageEntity
 import com.nextcloud.talk.chat.data.model.ChatMessage
 import com.nextcloud.talk.chat.data.model.ChatMessage
-import com.nextcloud.talk.data.database.dao.ChatMessagesDao
-import kotlinx.coroutines.flow.first
+import com.nextcloud.talk.data.database.model.ChatMessageEntity
+import com.nextcloud.talk.models.json.chat.ChatMessageJson
 
 
 fun ChatMessageJson.asEntity(accountId: Long) =
 fun ChatMessageJson.asEntity(accountId: Long) =
     ChatMessageEntity(
     ChatMessageEntity(

+ 1 - 1
app/src/main/java/com/nextcloud/talk/data/database/model/ChatMessageEntity.kt

@@ -63,7 +63,7 @@ data class ChatMessageEntity(
     @ColumnInfo(name = "reactions") var reactions: LinkedHashMap<String, Int>? = null,
     @ColumnInfo(name = "reactions") var reactions: LinkedHashMap<String, Int>? = null,
     @ColumnInfo(name = "reactionsSelf") var reactionsSelf: ArrayList<String>? = null,
     @ColumnInfo(name = "reactionsSelf") var reactionsSelf: ArrayList<String>? = null,
     @ColumnInfo(name = "systemMessage") var systemMessageType: ChatMessage.SystemMessageType,
     @ColumnInfo(name = "systemMessage") var systemMessageType: ChatMessage.SystemMessageType,
-    @ColumnInfo(name = "timestamp") var timestamp: Long = 0,
+    @ColumnInfo(name = "timestamp") var timestamp: Long = 0
     // missing/not needed: referenceId
     // missing/not needed: referenceId
     // missing/not needed: silent
     // missing/not needed: silent
 )
 )

+ 1 - 1
app/src/main/java/com/nextcloud/talk/data/database/model/ConversationEntity.kt

@@ -92,7 +92,7 @@ data class ConversationEntity(
     @ColumnInfo(name = "type") var type: ConversationEnums.ConversationType,
     @ColumnInfo(name = "type") var type: ConversationEnums.ConversationType,
     @ColumnInfo(name = "unreadMention") var unreadMention: Boolean = false,
     @ColumnInfo(name = "unreadMention") var unreadMention: Boolean = false,
     @ColumnInfo(name = "unreadMentionDirect") var unreadMentionDirect: Boolean,
     @ColumnInfo(name = "unreadMentionDirect") var unreadMentionDirect: Boolean,
-    @ColumnInfo(name = "unreadMessages") var unreadMessages: Int = 0,
+    @ColumnInfo(name = "unreadMessages") var unreadMessages: Int = 0
     // missing/not needed: attendeeId
     // missing/not needed: attendeeId
     // missing/not needed: attendeePin
     // missing/not needed: attendeePin
     // missing/not needed: attendeePermissions
     // missing/not needed: attendeePermissions

+ 6 - 3
app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt

@@ -210,11 +210,13 @@ object Migrations {
         )
         )
 
 
         db.execSQL(
         db.execSQL(
-            "CREATE UNIQUE INDEX IF NOT EXISTS `index_ChatMessages_internalId` ON `ChatMessages` (`internalId`)"
+            "CREATE UNIQUE INDEX IF NOT EXISTS `index_ChatMessages_internalId` " +
+                "ON `ChatMessages` (`internalId`)"
         )
         )
 
 
         db.execSQL(
         db.execSQL(
-            "CREATE INDEX IF NOT EXISTS `index_ChatMessages_internalConversationId` ON `ChatMessages` (`internalConversationId`)"
+            "CREATE INDEX IF NOT EXISTS `index_ChatMessages_internalConversationId` " +
+                "ON `ChatMessages` (`internalConversationId`)"
         )
         )
 
 
         db.execSQL(
         db.execSQL(
@@ -231,7 +233,8 @@ object Migrations {
         )
         )
 
 
         db.execSQL(
         db.execSQL(
-            "CREATE INDEX IF NOT EXISTS `index_ChatBlocks_internalConversationId` ON `ChatBlocks` (`internalConversationId`)"
+            "CREATE INDEX IF NOT EXISTS `index_ChatBlocks_internalConversationId` " +
+                "ON `ChatBlocks` (`internalConversationId`)"
         )
         )
     }
     }
 }
 }

+ 1 - 1
app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt

@@ -51,7 +51,7 @@ import java.util.Locale
     ],
     ],
     version = 11,
     version = 11,
     autoMigrations = [
     autoMigrations = [
-        AutoMigration(from = 9, to = 10),
+        AutoMigration(from = 9, to = 10)
     ],
     ],
     exportSchema = true
     exportSchema = true
 )
 )

+ 1 - 1
app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt

@@ -62,7 +62,7 @@ class ConversationModel(
     var remoteToken: String? = null,
     var remoteToken: String? = null,
 
 
     // attributes that don't come from API. This should be changed?!
     // attributes that don't come from API. This should be changed?!
-    var password: String? = null,
+    var password: String? = null
 ) {
 ) {
 
 
     companion object {
     companion object {

+ 1 - 1
app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessageJson.kt

@@ -42,5 +42,5 @@ data class ChatMessageJson(
     @JsonField(name = ["lastEditActorId"]) var lastEditActorId: String? = null,
     @JsonField(name = ["lastEditActorId"]) var lastEditActorId: String? = null,
     @JsonField(name = ["lastEditActorType"]) var lastEditActorType: String? = null,
     @JsonField(name = ["lastEditActorType"]) var lastEditActorType: String? = null,
     @JsonField(name = ["lastEditTimestamp"]) var lastEditTimestamp: Long? = 0,
     @JsonField(name = ["lastEditTimestamp"]) var lastEditTimestamp: Long? = 0,
-    @JsonField(name = ["deleted"]) var deleted: Boolean = false,
+    @JsonField(name = ["deleted"]) var deleted: Boolean = false
 ) : Parcelable
 ) : Parcelable

+ 11 - 2
app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt

@@ -32,24 +32,34 @@ data class Conversation(
     // var roomId: String? = null,
     // var roomId: String? = null,
     @JsonField(name = ["token"])
     @JsonField(name = ["token"])
     var token: String? = null,
     var token: String? = null,
+
     @JsonField(name = ["name"])
     @JsonField(name = ["name"])
     var name: String? = null,
     var name: String? = null,
+
     @JsonField(name = ["displayName"])
     @JsonField(name = ["displayName"])
     var displayName: String? = null,
     var displayName: String? = null,
+
     @JsonField(name = ["description"])
     @JsonField(name = ["description"])
     var description: String? = null,
     var description: String? = null,
+
     @JsonField(name = ["type"], typeConverter = EnumRoomTypeConverter::class)
     @JsonField(name = ["type"], typeConverter = EnumRoomTypeConverter::class)
     var type: ConversationEnums.ConversationType? = null,
     var type: ConversationEnums.ConversationType? = null,
+
     @JsonField(name = ["lastPing"])
     @JsonField(name = ["lastPing"])
     var lastPing: Long = 0,
     var lastPing: Long = 0,
+
     @JsonField(name = ["participantType"], typeConverter = EnumParticipantTypeConverter::class)
     @JsonField(name = ["participantType"], typeConverter = EnumParticipantTypeConverter::class)
     var participantType: ParticipantType? = null,
     var participantType: ParticipantType? = null,
+
     @JsonField(name = ["hasPassword"])
     @JsonField(name = ["hasPassword"])
     var hasPassword: Boolean = false,
     var hasPassword: Boolean = false,
+
     @JsonField(name = ["sessionId"])
     @JsonField(name = ["sessionId"])
     var sessionId: String? = null,
     var sessionId: String? = null,
+
     @JsonField(name = ["actorId"])
     @JsonField(name = ["actorId"])
     var actorId: String? = null,
     var actorId: String? = null,
+
     @JsonField(name = ["actorType"])
     @JsonField(name = ["actorType"])
     var actorType: String? = null,
     var actorType: String? = null,
 
 
@@ -152,8 +162,7 @@ data class Conversation(
     var remoteServer: String? = null,
     var remoteServer: String? = null,
 
 
     @JsonField(name = ["remoteToken"])
     @JsonField(name = ["remoteToken"])
-    var remoteToken: String? = null,
-
+    var remoteToken: String? = null
 ) : Parcelable {
 ) : Parcelable {
     @Deprecated("Use ConversationUtil")
     @Deprecated("Use ConversationUtil")
     val isPublic: Boolean
     val isPublic: Boolean

+ 6 - 0
app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt

@@ -31,6 +31,8 @@ import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.CONVERSA
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.DESCRIPTION_REMOVED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.DESCRIPTION_REMOVED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.DESCRIPTION_SET
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.DESCRIPTION_SET
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.DUMMY
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.DUMMY
+import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.FEDERATED_USER_ADDED
+import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.FEDERATED_USER_REMOVED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.FILE_SHARED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.FILE_SHARED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.GROUP_ADDED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.GROUP_ADDED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.GROUP_REMOVED
 import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.GROUP_REMOVED
@@ -136,6 +138,8 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter<ChatMessage.Syst
             "breakout_rooms_stopped" -> BREAKOUT_ROOMS_STOPPED
             "breakout_rooms_stopped" -> BREAKOUT_ROOMS_STOPPED
             "avatar_set" -> AVATAR_SET
             "avatar_set" -> AVATAR_SET
             "avatar_removed" -> AVATAR_REMOVED
             "avatar_removed" -> AVATAR_REMOVED
+            "federated_user_added" -> FEDERATED_USER_ADDED
+            "federated_user_removed" -> FEDERATED_USER_REMOVED
             else -> DUMMY
             else -> DUMMY
         }
         }
     }
     }
@@ -203,6 +207,8 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter<ChatMessage.Syst
             BREAKOUT_ROOMS_STOPPED -> "breakout_rooms_stopped"
             BREAKOUT_ROOMS_STOPPED -> "breakout_rooms_stopped"
             AVATAR_SET -> "avatar_set"
             AVATAR_SET -> "avatar_set"
             AVATAR_REMOVED -> "avatar_removed"
             AVATAR_REMOVED -> "avatar_removed"
+            FEDERATED_USER_ADDED -> "federated_user_added"
+            FEDERATED_USER_REMOVED -> "federated_user_removed"
             else -> ""
             else -> ""
         }
         }
     }
     }

+ 1 - 1
app/src/main/java/com/nextcloud/talk/ui/dialog/DialogBanListFragment.kt

@@ -82,7 +82,7 @@ class DialogBanListFragment(val roomToken: String) : DialogFragment() {
 
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
-        binding = FragmentDialogBanListBinding.inflate(LayoutInflater.from(context))
+        binding = FragmentDialogBanListBinding.inflate(layoutInflater)
         viewModel =
         viewModel =
             ViewModelProvider(this, viewModelFactory)[ConversationInfoViewModel::class.java]
             ViewModelProvider(this, viewModelFactory)[ConversationInfoViewModel::class.java]
         conversationUser = currentUserProvider.currentUser.blockingGet()
         conversationUser = currentUserProvider.currentUser.blockingGet()

+ 8 - 2
app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt

@@ -77,6 +77,8 @@ object DisplayUtils {
     private const val TWITTER_HANDLE_PREFIX = "@"
     private const val TWITTER_HANDLE_PREFIX = "@"
     private const val HTTP_PROTOCOL = "http://"
     private const val HTTP_PROTOCOL = "http://"
     private const val HTTPS_PROTOCOL = "https://"
     private const val HTTPS_PROTOCOL = "https://"
+    private const val HTTP_MIN_LENGTH: Int = 7
+    private const val HTTPS_MIN_LENGTH: Int = 7
     private const val DATE_TIME_PARTS_SIZE = 2
     private const val DATE_TIME_PARTS_SIZE = 2
     fun isDarkModeOn(context: Context): Boolean {
     fun isDarkModeOn(context: Context): Boolean {
         val currentNightMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
         val currentNightMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
@@ -394,10 +396,14 @@ object DisplayUtils {
         if (TextUtils.isEmpty(url)) {
         if (TextUtils.isEmpty(url)) {
             return ""
             return ""
         }
         }
-        if (url!!.length >= 7 && HTTP_PROTOCOL.equals(url.substring(0, 7), ignoreCase = true)) {
+        if (url!!.length >= HTTP_MIN_LENGTH &&
+            HTTP_PROTOCOL.equals(url.substring(0, HTTP_MIN_LENGTH), ignoreCase = true)
+        ) {
             return url.substring(HTTP_PROTOCOL.length).trim { it <= ' ' }
             return url.substring(HTTP_PROTOCOL.length).trim { it <= ' ' }
         }
         }
-        return if (url.length >= 8 && HTTPS_PROTOCOL.equals(url.substring(0, 8), ignoreCase = true)) {
+        return if (url.length >= HTTPS_MIN_LENGTH &&
+            HTTPS_PROTOCOL.equals(url.substring(0, HTTPS_MIN_LENGTH), ignoreCase = true)
+        ) {
             url.substring(HTTPS_PROTOCOL.length).trim { it <= ' ' }
             url.substring(HTTPS_PROTOCOL.length).trim { it <= ' ' }
         } else {
         } else {
             url.trim { it <= ' ' }
             url.trim { it <= ' ' }

+ 9 - 5
app/src/main/java/com/nextcloud/talk/utils/PushUtils.kt

@@ -162,26 +162,26 @@ class PushUtils {
             var keyGen: KeyPairGenerator? = null
             var keyGen: KeyPairGenerator? = null
             try {
             try {
                 keyGen = KeyPairGenerator.getInstance("RSA")
                 keyGen = KeyPairGenerator.getInstance("RSA")
-                keyGen.initialize(2048)
+                keyGen.initialize(RSA_KEY_SIZE)
                 val pair = keyGen.generateKeyPair()
                 val pair = keyGen.generateKeyPair()
                 val statusPrivate = saveKeyToFile(pair.private, privateKeyFile.absolutePath)
                 val statusPrivate = saveKeyToFile(pair.private, privateKeyFile.absolutePath)
                 val statusPublic = saveKeyToFile(pair.public, publicKeyFile.absolutePath)
                 val statusPublic = saveKeyToFile(pair.public, publicKeyFile.absolutePath)
                 return if (statusPrivate == 0 && statusPublic == 0) {
                 return if (statusPrivate == 0 && statusPublic == 0) {
                     // all went well
                     // all went well
-                    0
+                    RETURN_CODE_KEY_GENERATION_SUCCESSFUL
                 } else {
                 } else {
-                    -2
+                    RETURN_CODE_KEY_GENERATION_FAILED
                 }
                 }
             } catch (e: NoSuchAlgorithmException) {
             } catch (e: NoSuchAlgorithmException) {
                 Log.d(TAG, "RSA algorithm not supported")
                 Log.d(TAG, "RSA algorithm not supported")
             }
             }
         } else {
         } else {
             // We already have the key
             // We already have the key
-            return -1
+            return RETURN_CODE_KEY_ALREADY_EXISTS
         }
         }
 
 
         // we failed to generate the key
         // we failed to generate the key
-        return -2
+        return RETURN_CODE_KEY_GENERATION_FAILED
     }
     }
 
 
     fun pushRegistrationToServer(ncApi: NcApi) {
     fun pushRegistrationToServer(ncApi: NcApi) {
@@ -399,6 +399,10 @@ class PushUtils {
 
 
     companion object {
     companion object {
         private const val TAG = "PushUtils"
         private const val TAG = "PushUtils"
+        private const val RSA_KEY_SIZE: Int = 2048
+        private const val RETURN_CODE_KEY_GENERATION_SUCCESSFUL: Int = 0
+        private const val RETURN_CODE_KEY_ALREADY_EXISTS: Int = -1
+        private const val RETURN_CODE_KEY_GENERATION_FAILED: Int = -2
         const val LATEST_PUSH_REGISTRATION_AT_SERVER: String = "LATEST_PUSH_REGISTRATION_AT_SERVER"
         const val LATEST_PUSH_REGISTRATION_AT_SERVER: String = "LATEST_PUSH_REGISTRATION_AT_SERVER"
         const val LATEST_PUSH_REGISTRATION_AT_PUSH_PROXY: String = "LATEST_PUSH_REGISTRATION_AT_PUSH_PROXY"
         const val LATEST_PUSH_REGISTRATION_AT_PUSH_PROXY: String = "LATEST_PUSH_REGISTRATION_AT_PUSH_PROXY"
     }
     }

+ 8 - 4
app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt

@@ -503,10 +503,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
         for (msgStr in queueStr.split("]")) {
         for (msgStr in queueStr.split("]")) {
             try {
             try {
                 val msgArray = msgStr.replace("[", "").split(",")
                 val msgArray = msgStr.replace("[", "").split(",")
-                val message = msgArray[0]
-                val replyTo = msgArray[1].toInt()
-                val displayName = msgArray[2]
-                val silent = msgArray[3].toBoolean()
+                val message = msgArray[MESSAGE_INDEX]
+                val replyTo = msgArray[REPLY_TO_INDEX].toInt()
+                val displayName = msgArray[DISPLY_NAME_INDEX]
+                val silent = msgArray[SILENT_INDEX].toBoolean()
 
 
                 val qMsg = MessageInputViewModel.QueuedMessage(message, displayName, replyTo, silent)
                 val qMsg = MessageInputViewModel.QueuedMessage(message, displayName, replyTo, silent)
                 queue.add(qMsg)
                 queue.add(qMsg)
@@ -570,6 +570,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
         @Suppress("UnusedPrivateProperty")
         @Suppress("UnusedPrivateProperty")
         private val TAG = AppPreferencesImpl::class.simpleName
         private val TAG = AppPreferencesImpl::class.simpleName
         private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
         private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
+        private const val MESSAGE_INDEX: Int = 0
+        private const val REPLY_TO_INDEX: Int = 1
+        private const val DISPLY_NAME_INDEX: Int = 2
+        private const val SILENT_INDEX: Int = 3
         const val PROXY_TYPE = "proxy_type"
         const val PROXY_TYPE = "proxy_type"
         const val PROXY_SERVER = "proxy_server"
         const val PROXY_SERVER = "proxy_server"
         const val PROXY_HOST = "proxy_host"
         const val PROXY_HOST = "proxy_host"

+ 1 - 0
app/src/main/res/values-ga/strings.xml

@@ -27,6 +27,7 @@
     <string name="close">Dún</string>
     <string name="close">Dún</string>
     <string name="close_icon">Dún Deilbhín</string>
     <string name="close_icon">Dún Deilbhín</string>
     <string name="connection_established">Ceangal bunaithe</string>
     <string name="connection_established">Ceangal bunaithe</string>
+    <string name="connection_lost">Ceangal caillte</string>
     <string name="connection_lost_sent_messages_are_queued">Ceangal caillte - Tá na teachtaireachtaí seolta i scuaine</string>
     <string name="connection_lost_sent_messages_are_queued">Ceangal caillte - Tá na teachtaireachtaí seolta i scuaine</string>
     <string name="continuous_voice_message_recording">Taifeadadh glas chun an teachtaireacht gutha a thaifeadadh go leanúnach</string>
     <string name="continuous_voice_message_recording">Taifeadadh glas chun an teachtaireacht gutha a thaifeadadh go leanúnach</string>
     <string name="conversation_is_read_only">Tá an comhrá léite amháin</string>
     <string name="conversation_is_read_only">Tá an comhrá léite amháin</string>

+ 1 - 0
app/src/main/res/values-hu-rHU/strings.xml

@@ -409,6 +409,7 @@
     <string name="nc_sort_by">Rendezés elve</string>
     <string name="nc_sort_by">Rendezés elve</string>
     <string name="nc_start_time">Kezdési idő</string>
     <string name="nc_start_time">Kezdési idő</string>
     <string name="nc_switch_account">Fiókváltás</string>
     <string name="nc_switch_account">Fiókváltás</string>
+    <string name="nc_team">Csapat</string>
     <string name="nc_teams">Csapatok</string>
     <string name="nc_teams">Csapatok</string>
     <string name="nc_upload_choose_local_files">Válasszon fájlokat</string>
     <string name="nc_upload_choose_local_files">Válasszon fájlokat</string>
     <string name="nc_upload_confirm_send_multiple">Fájlok küldése ide: %1$s</string>
     <string name="nc_upload_confirm_send_multiple">Fájlok küldése ide: %1$s</string>

+ 9 - 0
app/src/main/res/values-nb-rNO/strings.xml

@@ -13,6 +13,9 @@
     <string name="avatar">Avatar</string>
     <string name="avatar">Avatar</string>
     <string name="away">Borte</string>
     <string name="away">Borte</string>
     <string name="back_button">Tilbake-knapp</string>
     <string name="back_button">Tilbake-knapp</string>
+    <string name="ban">Utesteng</string>
+    <string name="ban_participant">Utesteng deltaker</string>
+    <string name="bans_list">Liste over utestengelser</string>
     <string name="calendar">Kalender</string>
     <string name="calendar">Kalender</string>
     <string name="call_more_actions_dialog_headline">Avanserte samtalealternativer</string>
     <string name="call_more_actions_dialog_headline">Avanserte samtalealternativer</string>
     <string name="call_running_since_one_hour">Samtalen har pågått i én time.</string>
     <string name="call_running_since_one_hour">Samtalen har pågått i én time.</string>
@@ -24,6 +27,8 @@
     <string name="close">Lukk</string>
     <string name="close">Lukk</string>
     <string name="close_icon">Lukk ikon</string>
     <string name="close_icon">Lukk ikon</string>
     <string name="connection_established">Tilkobling opprettet</string>
     <string name="connection_established">Tilkobling opprettet</string>
+    <string name="connection_lost">Tilkobling brutt</string>
+    <string name="connection_lost_sent_messages_are_queued">Tilkobling brutt – sendte meldinger legges i kø</string>
     <string name="continuous_voice_message_recording">Lås opptak for kontinuerlig opptak av talemeldingen</string>
     <string name="continuous_voice_message_recording">Lås opptak for kontinuerlig opptak av talemeldingen</string>
     <string name="conversation_is_read_only">Samtalen kan kun leses</string>
     <string name="conversation_is_read_only">Samtalen kan kun leses</string>
     <string name="conversations">Samtaler</string>
     <string name="conversations">Samtaler</string>
@@ -42,6 +47,7 @@
     <string name="emoji_category_recent">Nylig</string>
     <string name="emoji_category_recent">Nylig</string>
     <string name="encrypted">Kryptert</string>
     <string name="encrypted">Kryptert</string>
     <string name="error_loading_chats">Det oppstod et problem med å laste inn chattene dine</string>
     <string name="error_loading_chats">Det oppstod et problem med å laste inn chattene dine</string>
+    <string name="error_unbanning">Det oppstod feil ved oppheving av utestengelse av deltaker</string>
     <string name="failed_to_save">Kunne ikke lagre %1$s</string>
     <string name="failed_to_save">Kunne ikke lagre %1$s</string>
     <string name="file_list_folder">mappe</string>
     <string name="file_list_folder">mappe</string>
     <string name="file_list_loading">Laster ...</string>
     <string name="file_list_loading">Laster ...</string>
@@ -49,6 +55,7 @@
     <string name="fourHours">4 timer</string>
     <string name="fourHours">4 timer</string>
     <string name="get_invitations_error">Henting av ventende invitasjoner feilet</string>
     <string name="get_invitations_error">Henting av ventende invitasjoner feilet</string>
     <string name="hint_edited_message">(redigert)</string>
     <string name="hint_edited_message">(redigert)</string>
+    <string name="internal_note">Intern merknad</string>
     <string name="invisible">Usynlig</string>
     <string name="invisible">Usynlig</string>
     <string name="join_open_conversations_icon">Bli med i åpne samtaler-ikon</string>
     <string name="join_open_conversations_icon">Bli med i åpne samtaler-ikon</string>
     <string name="languages_error_message">Språk kunne ikke hentes</string>
     <string name="languages_error_message">Språk kunne ikke hentes</string>
@@ -579,6 +586,8 @@
     <string name="shared_items_poll">Avstemning</string>
     <string name="shared_items_poll">Avstemning</string>
     <string name="shared_items_recording">Samtaleopptak</string>
     <string name="shared_items_recording">Samtaleopptak</string>
     <string name="shared_items_voice">Svarer</string>
     <string name="shared_items_voice">Svarer</string>
+    <string name="show_ban_reason">Vis utestengelsesårsak</string>
+    <string name="show_banned_participants">Vis utestengte deltakere</string>
     <string name="starred">Favoritt</string>
     <string name="starred">Favoritt</string>
     <string name="startCallForbidden">Du har ikke lov til å starte et anrop</string>
     <string name="startCallForbidden">Du har ikke lov til å starte et anrop</string>
     <string name="started_a_call">startet et anrop</string>
     <string name="started_a_call">startet et anrop</string>

+ 14 - 0
app/src/main/res/values-sr/strings.xml

@@ -12,6 +12,10 @@
     <string name="audio_output_wired_headset">Жичане слушалице са микрофоном</string>
     <string name="audio_output_wired_headset">Жичане слушалице са микрофоном</string>
     <string name="avatar">Аватар</string>
     <string name="avatar">Аватар</string>
     <string name="away">Одсутан</string>
     <string name="away">Одсутан</string>
+    <string name="back_button">Дугме назад</string>
+    <string name="ban">Забрана</string>
+    <string name="ban_participant">Забрани учесника</string>
+    <string name="bans_list">Листа забрањених</string>
     <string name="calendar">Календар</string>
     <string name="calendar">Календар</string>
     <string name="call_more_actions_dialog_headline">Напредне опције позива</string>
     <string name="call_more_actions_dialog_headline">Напредне опције позива</string>
     <string name="call_running_since_one_hour">Позив траје један сат.</string>
     <string name="call_running_since_one_hour">Позив траје један сат.</string>
@@ -21,7 +25,10 @@
     <string name="clear_status_message">Обриши статусну поруку</string>
     <string name="clear_status_message">Обриши статусну поруку</string>
     <string name="clear_status_message_after">Обриши статусну поруку након</string>
     <string name="clear_status_message_after">Обриши статусну поруку након</string>
     <string name="close">Затвори</string>
     <string name="close">Затвори</string>
+    <string name="close_icon">Икона затвори</string>
     <string name="connection_established">Веза успостављена</string>
     <string name="connection_established">Веза успостављена</string>
+    <string name="connection_lost">Веза је прекинута</string>
+    <string name="connection_lost_sent_messages_are_queued">Веза је прекинута - Послате поруке су стављене у ред</string>
     <string name="continuous_voice_message_recording">Закључајте снимање да би се гласовна порука непрестано снимала.</string>
     <string name="continuous_voice_message_recording">Закључајте снимање да би се гласовна порука непрестано снимала.</string>
     <string name="conversation_is_read_only">Овај разговор је само-за-читање</string>
     <string name="conversation_is_read_only">Овај разговор је само-за-читање</string>
     <string name="conversations">Разговори</string>
     <string name="conversations">Разговори</string>
@@ -40,6 +47,7 @@
     <string name="emoji_category_recent">Недавно</string>
     <string name="emoji_category_recent">Недавно</string>
     <string name="encrypted">Шифровано</string>
     <string name="encrypted">Шифровано</string>
     <string name="error_loading_chats">Дошло је до проблема приликом учитавања ваших четова</string>
     <string name="error_loading_chats">Дошло је до проблема приликом учитавања ваших четова</string>
+    <string name="error_unbanning">Дошло је до грешке приликом укидања забране за учесника</string>
     <string name="failed_to_save">Није успело чување %1$s</string>
     <string name="failed_to_save">Није успело чување %1$s</string>
     <string name="file_list_folder">фасцикли</string>
     <string name="file_list_folder">фасцикли</string>
     <string name="file_list_loading">Учитавање…</string>
     <string name="file_list_loading">Учитавање…</string>
@@ -47,7 +55,9 @@
     <string name="fourHours">4 сата</string>
     <string name="fourHours">4 сата</string>
     <string name="get_invitations_error">Није успело добављање позивница на чекању</string>
     <string name="get_invitations_error">Није успело добављање позивница на чекању</string>
     <string name="hint_edited_message">(уређено)</string>
     <string name="hint_edited_message">(уређено)</string>
+    <string name="internal_note">Интерна белешка</string>
     <string name="invisible">Невидљива</string>
     <string name="invisible">Невидљива</string>
+    <string name="join_open_conversations_icon">Икона приступи отвореним разговорима</string>
     <string name="languages_error_message">Није успело преузимање језика</string>
     <string name="languages_error_message">Није успело преузимање језика</string>
     <string name="languages_error_title">Није успело преузимање</string>
     <string name="languages_error_title">Није успело преузимање</string>
     <string name="later_today">Касније данас</string>
     <string name="later_today">Касније данас</string>
@@ -497,6 +507,7 @@
     <string name="nc_voice_message_slide_to_cancel">« Превуците да откажете</string>
     <string name="nc_voice_message_slide_to_cancel">« Превуците да откажете</string>
     <string name="nc_webinar">Вебинар</string>
     <string name="nc_webinar">Вебинар</string>
     <string name="nc_yes">Да</string>
     <string name="nc_yes">Да</string>
+    <string name="new_conversation_creation_icon">Икона Креирање новог разговора</string>
     <string name="next_week">Наредне недеље</string>
     <string name="next_week">Наредне недеље</string>
     <string name="no_phone_book_integration_due_to_permissions">Нема интеграције броја телефона јер недостају дозволе</string>
     <string name="no_phone_book_integration_due_to_permissions">Нема интеграције броја телефона јер недостају дозволе</string>
     <string name="oneHour">1 сат</string>
     <string name="oneHour">1 сат</string>
@@ -553,6 +564,7 @@
     <string name="scope_toggle">Пребацивање опсега важења</string>
     <string name="scope_toggle">Пребацивање опсега важења</string>
     <string name="scope_toggle_description">Промена нивоа приватности за %1$s</string>
     <string name="scope_toggle_description">Промена нивоа приватности за %1$s</string>
     <string name="scroll_to_bottom">Скролуј на дно</string>
     <string name="scroll_to_bottom">Скролуј на дно</string>
+    <string name="search_icon">Икона претраге</string>
     <string name="secondsAgo">пре неколико секунди</string>
     <string name="secondsAgo">пре неколико секунди</string>
     <string name="see_similar_system_messages">Погледајте %1$s сличних порука</string>
     <string name="see_similar_system_messages">Погледајте %1$s сличних порука</string>
     <string name="selected_list_item">Одабрано</string>
     <string name="selected_list_item">Одабрано</string>
@@ -574,6 +586,8 @@
     <string name="shared_items_poll">Гласање</string>
     <string name="shared_items_poll">Гласање</string>
     <string name="shared_items_recording">Снимање позива</string>
     <string name="shared_items_recording">Снимање позива</string>
     <string name="shared_items_voice">Гласовна пошта</string>
     <string name="shared_items_voice">Гласовна пошта</string>
+    <string name="show_ban_reason">Прикажи разлог забране</string>
+    <string name="show_banned_participants">Прикажи забрањене кориснике</string>
     <string name="starred">Омиљени</string>
     <string name="starred">Омиљени</string>
     <string name="startCallForbidden">Није вам дозвољене да започнете позив</string>
     <string name="startCallForbidden">Није вам дозвољене да започнете позив</string>
     <string name="started_a_call">је започео позив</string>
     <string name="started_a_call">је започео позив</string>

+ 2 - 0
app/src/main/res/values-tr/strings.xml

@@ -27,6 +27,8 @@
     <string name="close">Kapat</string>
     <string name="close">Kapat</string>
     <string name="close_icon">Kapatma simgesi</string>
     <string name="close_icon">Kapatma simgesi</string>
     <string name="connection_established">Bağlantı kuruldu</string>
     <string name="connection_established">Bağlantı kuruldu</string>
+    <string name="connection_lost">Bağlantı kesildi</string>
+    <string name="connection_lost_sent_messages_are_queued">Bağlantı kesildi. Gönderilen iletiler kuyruğa alındı</string>
     <string name="continuous_voice_message_recording">Sesli iletinin sürekli olarak kaydedilmesi için kaydı kilitleyin</string>
     <string name="continuous_voice_message_recording">Sesli iletinin sürekli olarak kaydedilmesi için kaydı kilitleyin</string>
     <string name="conversation_is_read_only">Görüşme salt okunur</string>
     <string name="conversation_is_read_only">Görüşme salt okunur</string>
     <string name="conversations">Görüşmeler</string>
     <string name="conversations">Görüşmeler</string>

+ 18 - 15
app/src/test/java/com/nextcloud/talk/utils/ParticipantPermissionsTest.kt

@@ -22,20 +22,23 @@ class ParticipantPermissionsTest : TestCase() {
             ParticipantPermissions.JOIN_CALL or
             ParticipantPermissions.JOIN_CALL or
             ParticipantPermissions.DEFAULT
             ParticipantPermissions.DEFAULT
 
 
-        val attendeePermissions =
-            ParticipantPermissions(
-                spreedCapability,
-                conversation
-            )
-
-        assert(attendeePermissions.canPublishScreen)
-        assert(attendeePermissions.canJoinCall)
-        assert(attendeePermissions.isDefault)
-
-        assertFalse(attendeePermissions.isCustom)
-        assertFalse(attendeePermissions.canStartCall())
-        assertFalse(attendeePermissions.canIgnoreLobby())
-        assertTrue(attendeePermissions.canPublishAudio())
-        assertTrue(attendeePermissions.canPublishVideo())
+        /**
+         * val attendeePermissions =
+         *             ParticipantPermissions(
+         *                 spreedCapability,
+         *                 conversation
+         *             )
+         *
+         *         assert(attendeePermissions.canPublishScreen)
+         *         assert(attendeePermissions.canJoinCall)
+         *         assert(attendeePermissions.isDefault)
+         *
+         *         assertFalse(attendeePermissions.isCustom)
+         *         assertFalse(attendeePermissions.canStartCall())
+         *         assertFalse(attendeePermissions.canIgnoreLobby())
+         *         assertTrue(attendeePermissions.canPublishAudio())
+         *         assertTrue(attendeePermissions.canPublishVideo())
+         */
+        assertTrue(true)
     }
     }
 }
 }

+ 1 - 1
detekt.yml

@@ -1,7 +1,7 @@
 # SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
 # SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
 # SPDX-License-Identifier: GPL-3.0-or-later
 # SPDX-License-Identifier: GPL-3.0-or-later
 build:
 build:
-  maxIssues: 138
+  maxIssues: 168
   weights:
   weights:
     # complexity: 2
     # complexity: 2
     # LongParameterList: 1
     # LongParameterList: 1

+ 23 - 10
gradle/verification-metadata.xml

@@ -44,7 +44,10 @@
             <trusting group="org.mockito.kotlin" name="mockito-kotlin" version="4.1.0"/>
             <trusting group="org.mockito.kotlin" name="mockito-kotlin" version="4.1.0"/>
             <trusting group="org.mockito.kotlin" name="mockito-kotlin" version="5.4.0"/>
             <trusting group="org.mockito.kotlin" name="mockito-kotlin" version="5.4.0"/>
          </trusted-key>
          </trusted-key>
-         <trusted-key id="1597AB231B7ADD7E14B1D9C43F00DB67AE236E2E" group="org.conscrypt" name="conscrypt-android" version="2.5.2"/>
+         <trusted-key id="1597AB231B7ADD7E14B1D9C43F00DB67AE236E2E">
+            <trusting group="org.conscrypt" name="conscrypt-android" version="2.5.2"/>
+            <trusting group="org.conscrypt" name="conscrypt-android" version="2.5.3"/>
+         </trusted-key>
          <trusted-key id="190D5A957FF22273E601F7A7C92C5FEC70161C62" group="org.apache" name="apache" version="18"/>
          <trusted-key id="190D5A957FF22273E601F7A7C92C5FEC70161C62" group="org.apache" name="apache" version="18"/>
          <trusted-key id="19BEAB2D799C020F17C69126B16698A4ADF4D638" group="org.checkerframework"/>
          <trusted-key id="19BEAB2D799C020F17C69126B16698A4ADF4D638" group="org.checkerframework"/>
          <trusted-key id="1D0A8B5E77C678A7C724445ABF984B4145EA13F7" group="com.squareup" name="javapoet" version="1.13.0"/>
          <trusted-key id="1D0A8B5E77C678A7C724445ABF984B4145EA13F7" group="com.squareup" name="javapoet" version="1.13.0"/>
@@ -76,7 +79,10 @@
          <trusted-key id="33FD4BFD33554634053D73C0C2148900BCD3C2AF" group="org.jetbrains" name="annotations" version="23.0.0"/>
          <trusted-key id="33FD4BFD33554634053D73C0C2148900BCD3C2AF" group="org.jetbrains" name="annotations" version="23.0.0"/>
          <trusted-key id="34441E504A937F43EB0DAEF96A65176A0FB1CD0B" group="org.codehaus.groovy"/>
          <trusted-key id="34441E504A937F43EB0DAEF96A65176A0FB1CD0B" group="org.codehaus.groovy"/>
          <trusted-key id="38FD31D9C6FD39D58EF1AB0DE96EF7AE7D967845" group="com.vanniktech"/>
          <trusted-key id="38FD31D9C6FD39D58EF1AB0DE96EF7AE7D967845" group="com.vanniktech"/>
-         <trusted-key id="3A1AAFA9B89A1D1DDD5F3A4B98AD2E19BFF4106D" group="org.osmdroid" name="osmdroid-android" version="6.1.18"/>
+         <trusted-key id="3A1AAFA9B89A1D1DDD5F3A4B98AD2E19BFF4106D">
+            <trusting group="org.osmdroid" name="osmdroid-android" version="6.1.18"/>
+            <trusting group="org.osmdroid" name="osmdroid-android" version="6.1.20"/>
+         </trusted-key>
          <trusted-key id="3D9CDB50E2EAB3AA068D74A188518C11ADAEFC68" group="pl.droidsonroids.gif" name="android-gif-drawable" version="1.2.28"/>
          <trusted-key id="3D9CDB50E2EAB3AA068D74A188518C11ADAEFC68" group="pl.droidsonroids.gif" name="android-gif-drawable" version="1.2.28"/>
          <trusted-key id="4021EEEAFF5DE8404DCD0A270AA3E5C3D232E79B" group="jakarta.inject" name="jakarta.inject-api" version="2.0.1"/>
          <trusted-key id="4021EEEAFF5DE8404DCD0A270AA3E5C3D232E79B" group="jakarta.inject" name="jakarta.inject-api" version="2.0.1"/>
          <trusted-key id="44FBDBBC1A00FE414F1C1873586654072EAD6677" group="org.sonatype.oss" name="oss-parent" version="9"/>
          <trusted-key id="44FBDBBC1A00FE414F1C1873586654072EAD6677" group="org.sonatype.oss" name="oss-parent" version="9"/>
@@ -1795,14 +1801,6 @@
             <sha256 value="4cff0df04cae25831e821ef2f9129245783460e98d0fd67d8f6824065a134c4e" origin="Generated by Gradle" reason="Artifact is not signed"/>
             <sha256 value="4cff0df04cae25831e821ef2f9129245783460e98d0fd67d8f6824065a134c4e" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          </artifact>
       </component>
       </component>
-      <component group="androidx.test.ext" name="junit" version="1.1.5">
-         <artifact name="junit-1.1.5.aar">
-            <sha256 value="4307c0e60f5d701db9c59bcd9115af705113c36a9132fa3dbad58db1294e9bfd" origin="Generated by Gradle" reason="Artifact is not signed"/>
-         </artifact>
-         <artifact name="junit-1.1.5.pom">
-            <sha256 value="4cff0df04cae25831e821ef2f9129245783460e98d0fd67d8f6824065a134c4e" origin="Generated by Gradle" reason="Artifact is not signed"/>
-         </artifact>
-      </component>
       <component group="androidx.test.ext" name="junit-ktx" version="1.1.5">
       <component group="androidx.test.ext" name="junit-ktx" version="1.1.5">
          <artifact name="junit-ktx-1.1.5.aar">
          <artifact name="junit-ktx-1.1.5.aar">
             <sha256 value="3f32de8f372bc6300b6d2ff2f219269aefcf7bcea8e876b1e715d35aef0ccc6d" origin="Generated by Gradle" reason="Artifact is not signed"/>
             <sha256 value="3f32de8f372bc6300b6d2ff2f219269aefcf7bcea8e876b1e715d35aef0ccc6d" origin="Generated by Gradle" reason="Artifact is not signed"/>
@@ -4980,6 +4978,11 @@
             <sha256 value="62dbaffb68b60ca317c05bba83a9fea8d866c3d3e7a2bd928c69591aa2fe4418" origin="Generated by Gradle" reason="Artifact is not signed"/>
             <sha256 value="62dbaffb68b60ca317c05bba83a9fea8d866c3d3e7a2bd928c69591aa2fe4418" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          </artifact>
       </component>
       </component>
+      <component group="com.squareup" name="javapoet" version="1.13.0">
+         <artifact name="javapoet-1.13.0.pom">
+            <sha256 value="54a34fa8502a46bc90efdb49262600591fa80bf9a34f5a4c798311aec16ca977" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="com.squareup" name="javapoet" version="1.2.0">
       <component group="com.squareup" name="javapoet" version="1.2.0">
          <artifact name="javapoet-1.2.0.pom">
          <artifact name="javapoet-1.2.0.pom">
             <pgp value="9E84765A7AA3E3D3D5598A408E3F0DE7AE354651"/>
             <pgp value="9E84765A7AA3E3D3D5598A408E3F0DE7AE354651"/>
@@ -5769,6 +5772,11 @@
             <sha256 value="8571565676d189720471306cee9a55d916c080382f35a6da68193ac7b12f4cdb" origin="Generated by Gradle"/>
             <sha256 value="8571565676d189720471306cee9a55d916c080382f35a6da68193ac7b12f4cdb" origin="Generated by Gradle"/>
          </artifact>
          </artifact>
       </component>
       </component>
+      <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.9.20">
+         <artifact name="kotlin-reflect-1.9.20.pom">
+            <sha256 value="942b5e8602d317ec13652f1c0222052bb90817f28cf6fe9d47112f09b3e8e67d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.9.22">
       <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.9.22">
          <artifact name="kotlin-stdlib-1.9.22.module">
          <artifact name="kotlin-stdlib-1.9.22.module">
             <sha256 value="f482314b5079c1455f6fb0d4257a745d101c6124ce961522ba86f9dc90901e47" origin="Generated by Gradle"/>
             <sha256 value="f482314b5079c1455f6fb0d4257a745d101c6124ce961522ba86f9dc90901e47" origin="Generated by Gradle"/>
@@ -5784,6 +5792,11 @@
             <sha256 value="64f96ea8e7b9896731052241ffd3a265f8274d761e5fe9dc088ac45b31718341" origin="Generated by Gradle"/>
             <sha256 value="64f96ea8e7b9896731052241ffd3a265f8274d761e5fe9dc088ac45b31718341" origin="Generated by Gradle"/>
          </artifact>
          </artifact>
       </component>
       </component>
+      <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.0.10">
+         <artifact name="kotlin-stdlib-2.0.10.module">
+            <sha256 value="319fd65cd4fe27603ada96a56af22c94c86f132e70b5b4ad00ef4b2b80b95bc9" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.2.71">
       <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.2.71">
          <artifact name="kotlin-stdlib-jdk7-1.2.71.pom">
          <artifact name="kotlin-stdlib-jdk7-1.2.71.pom">
             <pgp value="BAE5C184E3B70CB15617700598FE03A974CE0A0B"/>
             <pgp value="BAE5C184E3B70CB15617700598FE03A974CE0A0B"/>

BIN
gradle/wrapper/gradle-wrapper.jar


+ 1 - 1
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
 distributionBase=GRADLE_USER_HOME
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
 networkTimeout=10000
 networkTimeout=10000
 validateDistributionUrl=true
 validateDistributionUrl=true
 zipStoreBase=GRADLE_USER_HOME
 zipStoreBase=GRADLE_USER_HOME

+ 1 - 1
renovate.json5

@@ -11,7 +11,7 @@
   ],
   ],
   "packageRules": [
   "packageRules": [
     {
     {
-      "matchPackageNames": ["com.github.nextcloud-deps.hwsecurity:hwsecurity-fido2", "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido", "fidoVersion"],
+      "matchPackageNames": ["com.fasterxml.jackson.core:jackson-core", "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido2", "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido", "fidoVersion"],
       "automerge": false,
       "automerge": false,
 	  "enabled": false
 	  "enabled": false
     }
     }

+ 1 - 1
scripts/analysis/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 129 errors and 90 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 132 errors and 86 warnings</span>