Merge branch 'master' into issue-4072-federated-accept-message-should-be-system

This commit is contained in:
Julius Linus 2024-08-21 08:24:27 -05:00 committed by GitHub
commit 1c52acc95d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
53 changed files with 209 additions and 173 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 { // testOptions {
unitTests.all { // unitTests.all {
useJUnitPlatform() // 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 'androidx.activity:activity-ktx:1.9.1'
implementation 'com.github.nextcloud.android-common:ui:0.21.0' 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.android.gms:play-services-base:18.5.0'
gplayImplementation "com.google.firebase:firebase-messaging:23.4.1" 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'

View File

@ -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"
), )
) )
) )

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.activeUser = message.activeUser
parentChatMessage.imageUrl?.let { parentChatMessage.imageUrl?.let {
binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE
binding.messageQuote.quotedMessageImage.load(it) { binding.messageQuote.quotedMessageImage.load(it) {
addHeader( addHeader(
"Authorization", "Authorization",
ApiUtils.getCredentials(message.activeUser!!.username, message.activeUser!!.token)!! 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
) )
viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) }
viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) } ?: run {
viewThemeUtils.talk.colorOutgoingQuoteBackground(binding.messageQuote.quoteColoredView) 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 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)
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -289,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
@ -598,7 +599,7 @@ class ChatActivity :
chatViewModel.loadMessages( chatViewModel.loadMessages(
withCredentials = credentials!!, withCredentials = credentials!!,
withUrl = urlForChatting, withUrl = urlForChatting
) )
} }
@ -983,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
@ -2502,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
@ -2517,7 +2518,6 @@ class ChatActivity :
} }
} }
for (chatMessage in chatMessageList) { for (chatMessage in chatMessageList) {
chatMessage.activeUser = conversationUser chatMessage.activeUser = conversationUser
@ -2628,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")
} }
@ -2637,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
@ -2650,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( Log.d(TAG, "messagePosition is -1, adapter # of items: " + adapter!!.itemCount)
TAG, "messagePosition is -1, adapter # of items: " + adapter!!.itemCount
)
} }
} else { } else {
Log.d(TAG, "TalkMessagesListAdapter is null") Log.d(TAG, "TalkMessagesListAdapter is null")
@ -2829,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) ||
@ -3174,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) {

View File

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

View File

@ -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( override fun setData(conversationModel: ConversationModel, credentials: String, urlForChatting: String) {
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( private suspend fun hasToLoadPreviousMessagesFromServer(beforeMessageId: Long): Boolean {
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): override suspend fun getMessage(messageId: Long, bundle: Bundle): Flow<ChatMessage> {
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
} }
} }

View File

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

View File

@ -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 -> {}

View File

@ -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

View File

@ -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 *

View File

@ -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 com.nextcloud.talk.data.database.model.ChatMessageEntity
import kotlinx.coroutines.flow.first import com.nextcloud.talk.models.json.chat.ChatMessageJson
fun ChatMessageJson.asEntity(accountId: Long) = fun ChatMessageJson.asEntity(accountId: Long) =
ChatMessageEntity( ChatMessageEntity(

View File

@ -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
) )

View File

@ -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

View File

@ -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`)"
) )
} }
} }

View File

@ -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
) )

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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 <= ' ' }

View File

@ -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"
} }

View File

@ -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 message = msgArray[MESSAGE_INDEX]
val replyTo = msgArray[1].toInt() val replyTo = msgArray[REPLY_TO_INDEX].toInt()
val displayName = msgArray[2] val displayName = msgArray[DISPLY_NAME_INDEX]
val silent = msgArray[3].toBoolean() 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"

View File

@ -27,6 +27,7 @@
<string name="close">إغلاق</string> <string name="close">إغلاق</string>
<string name="close_icon">أيقونة الإغلاق</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="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>

View File

@ -27,6 +27,7 @@
<string name="close">Close</string> <string name="close">Close</string>
<string name="close_icon">Close Icon</string> <string name="close_icon">Close Icon</string>
<string name="connection_established">Connection established</string> <string name="connection_established">Connection established</string>
<string name="connection_lost">Connection lost</string>
<string name="connection_lost_sent_messages_are_queued">Connection lost - Sent messages are queued</string> <string name="connection_lost_sent_messages_are_queued">Connection lost - Sent messages are queued</string>
<string name="continuous_voice_message_recording">Lock recording for continuously recording of the voice message</string> <string name="continuous_voice_message_recording">Lock recording for continuously recording of the voice message</string>
<string name="conversation_is_read_only">Conversation is read only</string> <string name="conversation_is_read_only">Conversation is read only</string>

View File

@ -27,6 +27,7 @@
<string name="close">Schließen</string> <string name="close">Schließen</string>
<string name="close_icon">Schließen-Symbol</string> <string name="close_icon">Schließen-Symbol</string>
<string name="connection_established">Verbindung hergestellt</string> <string name="connection_established">Verbindung hergestellt</string>
<string name="connection_lost">Verbindung verloren</string>
<string name="connection_lost_sent_messages_are_queued">Verbindung verloren - Gesendete Nachrichten der Warteschlange hinzugefügt</string> <string name="connection_lost_sent_messages_are_queued">Verbindung verloren - Gesendete Nachrichten der Warteschlange hinzugefügt</string>
<string name="continuous_voice_message_recording">Aufnahme sperren für kontinuierliche Aufzeichnung der Sprachnachricht</string> <string name="continuous_voice_message_recording">Aufnahme sperren für kontinuierliche Aufzeichnung der Sprachnachricht</string>
<string name="conversation_is_read_only">Unterhaltung ist schreibgeschützt</string> <string name="conversation_is_read_only">Unterhaltung ist schreibgeschützt</string>

View File

@ -161,6 +161,8 @@
<string name="nc_dialog_outdated_client_description">The app is too old and no longer supported by this server. Please update.</string> <string name="nc_dialog_outdated_client_description">The app is too old and no longer supported by this server. Please update.</string>
<string name="nc_dialog_outdated_client_option_update">به‌روز رسانی</string> <string name="nc_dialog_outdated_client_option_update">به‌روز رسانی</string>
<string name="nc_dialog_reauth_or_delete">Do you want to reauthorize or delete this account?</string> <string name="nc_dialog_reauth_or_delete">Do you want to reauthorize or delete this account?</string>
<string name="nc_dialog_save_to_storage_no">خیر</string>
<string name="nc_dialog_save_to_storage_yes">بله</string>
<string name="nc_display_name_not_fetched">امکان دریافت نام وجود ندارد. درحال لغو</string> <string name="nc_display_name_not_fetched">امکان دریافت نام وجود ندارد. درحال لغو</string>
<string name="nc_display_name_not_stored">"امکان ذخیره نام وجود ندارد، درحال لغو "</string> <string name="nc_display_name_not_stored">"امکان ذخیره نام وجود ندارد، درحال لغو "</string>
<string name="nc_edit_message">ویرایش</string> <string name="nc_edit_message">ویرایش</string>
@ -403,6 +405,7 @@
<string name="nc_sort_by">مرتب‌سازی بر اساس</string> <string name="nc_sort_by">مرتب‌سازی بر اساس</string>
<string name="nc_start_time">زمان شروع</string> <string name="nc_start_time">زمان شروع</string>
<string name="nc_switch_account">تعویض حساب</string> <string name="nc_switch_account">تعویض حساب</string>
<string name="nc_team">تیم</string>
<string name="nc_upload_choose_local_files">Choose files</string> <string name="nc_upload_choose_local_files">Choose files</string>
<string name="nc_upload_confirm_send_multiple">Send these files to %1$s?</string> <string name="nc_upload_confirm_send_multiple">Send these files to %1$s?</string>
<string name="nc_upload_confirm_send_single">Send this file to %1$s?</string> <string name="nc_upload_confirm_send_single">Send this file to %1$s?</string>

View File

@ -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>

View File

@ -27,6 +27,7 @@
<string name="close">Pechar</string> <string name="close">Pechar</string>
<string name="close_icon">Icona «Pechar»</string> <string name="close_icon">Icona «Pechar»</string>
<string name="connection_established">Estabeleceuse a conexión</string> <string name="connection_established">Estabeleceuse a conexión</string>
<string name="connection_lost">Perdeuse a conexión</string>
<string name="connection_lost_sent_messages_are_queued">Perdeuse a conexión As mensaxes enviadas póñense en cola</string> <string name="connection_lost_sent_messages_are_queued">Perdeuse a conexión As mensaxes enviadas póñense en cola</string>
<string name="continuous_voice_message_recording">Bloquear a gravación para gravar continuamente a mensaxe de voz</string> <string name="continuous_voice_message_recording">Bloquear a gravación para gravar continuamente a mensaxe de voz</string>
<string name="conversation_is_read_only">A conversa é só de lectura</string> <string name="conversation_is_read_only">A conversa é só de lectura</string>

View File

@ -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>

View File

@ -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>

View File

@ -27,6 +27,7 @@
<string name="close">Fechar</string> <string name="close">Fechar</string>
<string name="close_icon">Fechar ícone</string> <string name="close_icon">Fechar ícone</string>
<string name="connection_established">Conexão estabelecida</string> <string name="connection_established">Conexão estabelecida</string>
<string name="connection_lost">Conexão perdida</string>
<string name="connection_lost_sent_messages_are_queued">Conexão perdida - As mensagens enviadas estão na fila</string> <string name="connection_lost_sent_messages_are_queued">Conexão perdida - As mensagens enviadas estão na fila</string>
<string name="continuous_voice_message_recording">Gravação de bloqueio para gravação contínua da mensagem de voz</string> <string name="continuous_voice_message_recording">Gravação de bloqueio para gravação contínua da mensagem de voz</string>
<string name="conversation_is_read_only">A conversa é somente leitura</string> <string name="conversation_is_read_only">A conversa é somente leitura</string>

View File

@ -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>

View File

@ -26,6 +26,7 @@
<string name="clear_status_message_after">Rensa statusmeddelande efter</string> <string name="clear_status_message_after">Rensa statusmeddelande efter</string>
<string name="close">Stäng</string> <string name="close">Stäng</string>
<string name="connection_established">Anslutning etablerad</string> <string name="connection_established">Anslutning etablerad</string>
<string name="connection_lost">Anslutning förlorad</string>
<string name="connection_lost_sent_messages_are_queued">Anslutning förlorad - Skickade meddelanden är i kö</string> <string name="connection_lost_sent_messages_are_queued">Anslutning förlorad - Skickade meddelanden är i kö</string>
<string name="continuous_voice_message_recording">Lås inspelning för kontinuerlig inspelning av röstmeddelandet</string> <string name="continuous_voice_message_recording">Lås inspelning för kontinuerlig inspelning av röstmeddelandet</string>
<string name="conversation_is_read_only">Konversationen är skrivskyddad</string> <string name="conversation_is_read_only">Konversationen är skrivskyddad</string>

View File

@ -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>

View File

@ -27,6 +27,7 @@
<string name="close">關閉</string> <string name="close">關閉</string>
<string name="close_icon">關閉圖示</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="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>

View File

@ -27,6 +27,7 @@
<string name="close">關閉</string> <string name="close">關閉</string>
<string name="close_icon">關閉按鈕</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="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>

View File

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

View File

@ -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

View File

@ -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"/>

Binary file not shown.

View File

@ -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

View File

@ -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
} }

View File

@ -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>