Compare commits

...

14 Commits

Author SHA1 Message Date
Sowjanya Kota
95f8b08a19
Merge pull request #5022 from nextcloud/bugfix/4921/avoidDupMessagesByBetterSentStatus
avoid duplicate messages
2025-06-18 18:36:17 +02:00
Nextcloud bot
2a7359c1e9
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-18 03:08:20 +00:00
Marcel Hibbe
86bfaa8657
improve send status handling
replace sendingFailed with SendStatus

add auto migration (incl deleting of column sendingFailed)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-17 17:21:36 +02:00
Marcel Hibbe
8c066eb521
avoid duplicate messages by introducing a sendStatus
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-17 17:16:53 +02:00
Andy Scherzinger
9e08af3306
Merge pull request #4468 from nextcloud/renovate/ghcr.io-nextcloud-continuous-integration-android8-4.x
chore(deps): update ghcr.io/nextcloud/continuous-integration-android8 docker tag to v4
2025-06-17 15:27:52 +02:00
Nextcloud bot
95f7a1e312
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-17 11:01:35 +00:00
Marcel Hibbe
73271018f5
Merge pull request #5065 from nextcloud/testFixAnalysisForMergeCommits
Try to run analysis also for merge commits
2025-06-17 10:08:18 +00:00
Marcel Hibbe
7111109ac0
Try to run analysis also for merge commits
Trying to fix
https://github.com/nextcloud/android-config/pull/248/files

which caused that analysis is not only blocked for forks, bit also for merge commits.

Solution: If it's not a PR the step should be omitted..

This commit will be checked when workflow runs on github. It will be merged just to test it's working..

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-17 11:24:01 +02:00
Andy Scherzinger
e3c83823e6
Merge pull request #5064 from nextcloud/renovate/gradle-actions-4.x
chore(deps): update gradle/actions action to v4.4.1
2025-06-17 10:50:08 +02:00
renovate[bot]
3b11a90aac
chore(deps): update gradle/actions action to v4.4.1
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-17 08:40:59 +00:00
Marcel Hibbe
bc29c67269
Merge pull request #5061 from nextcloud/fixWrongPluralsTranslation
fix wrong plurals implementation
2025-06-17 07:33:03 +00:00
Marcel Hibbe
4a93551ef9
fix wrong plurals implementation
- key was duplicated
- kotlin handling of plurals was missing

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-16 10:10:02 +02:00
Andy Scherzinger
71c8719f88
ci: Update signature
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-02-17 19:09:06 +01:00
renovate[bot]
2afa9ca80a chore(deps): update ghcr.io/nextcloud/continuous-integration-android8 docker tag to v4
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-17 19:07:42 +01:00
37 changed files with 944 additions and 64 deletions

View File

@ -8,7 +8,7 @@ name: generic
steps: steps:
- name: generic - name: generic
image: ghcr.io/nextcloud/continuous-integration-android8:3 image: ghcr.io/nextcloud/continuous-integration-android8:4
commands: commands:
- ./gradlew --console=plain assembleGeneric - ./gradlew --console=plain assembleGeneric
@ -27,7 +27,7 @@ name: gplay
steps: steps:
- name: gplay - name: gplay
image: ghcr.io/nextcloud/continuous-integration-android8:3 image: ghcr.io/nextcloud/continuous-integration-android8:4
commands: commands:
- ./gradlew --console=plain assembleGplay - ./gradlew --console=plain assembleGplay
@ -46,7 +46,7 @@ name: tests
steps: steps:
- name: all - name: all
image: ghcr.io/nextcloud/continuous-integration-android8:3 image: ghcr.io/nextcloud/continuous-integration-android8:4
privileged: true privileged: true
commands: commands:
- emulator -avd android -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 & - emulator -avd android -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 &
@ -81,4 +81,6 @@ trigger:
- pull_request - pull_request
--- ---
kind: signature kind: signature
hmac: cdce3f7eea46ef85c0223f62f66d1fe53d7dad007ef095c9f70fa063450d8c75 hmac: cf0c19e54fa45d1ee226f5f05202a32329b90aaf46711ea073c566a4c4a8a6c5
...

View File

@ -29,7 +29,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Disabled on forks - name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }}
run: | run: |
echo 'Can not analyze PRs from forks' echo 'Can not analyze PRs from forks'
exit 1 exit 1

View File

@ -34,7 +34,7 @@ jobs:
java-version: 17 java-version: 17
- name: Gradle validate - name: Gradle validate
uses: gradle/actions/wrapper-validation@8379f6a1328ee0e06e2bb424dadb7b159856a326 # v4.4.0 uses: gradle/actions/wrapper-validation@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
- name: Build ${{ matrix.flavor }} - name: Build ${{ matrix.flavor }}
run: | run: |

View File

@ -33,7 +33,7 @@ jobs:
java-version: 17 java-version: 17
- name: Setup Gradle - name: Setup Gradle
uses: gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326 # v4.4.0 uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1
- name: Run unit tests with coverage - name: Run unit tests with coverage
run: ./gradlew testGplayDebugUnit run: ./gradlew testGplayDebugUnit

View File

@ -0,0 +1,730 @@
{
"formatVersion": 1,
"database": {
"version": 17,
"identityHash": "5bc4247e179307faa995552da5d34324",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userId` TEXT, `username` TEXT, `baseUrl` TEXT, `token` TEXT, `displayName` TEXT, `pushConfigurationState` TEXT, `capabilities` TEXT, `serverVersion` TEXT DEFAULT '', `clientCertificate` TEXT, `externalSignalingServer` TEXT, `current` INTEGER NOT NULL, `scheduledForDeletion` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT"
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT"
},
{
"fieldPath": "baseUrl",
"columnName": "baseUrl",
"affinity": "TEXT"
},
{
"fieldPath": "token",
"columnName": "token",
"affinity": "TEXT"
},
{
"fieldPath": "displayName",
"columnName": "displayName",
"affinity": "TEXT"
},
{
"fieldPath": "pushConfigurationState",
"columnName": "pushConfigurationState",
"affinity": "TEXT"
},
{
"fieldPath": "capabilities",
"columnName": "capabilities",
"affinity": "TEXT"
},
{
"fieldPath": "serverVersion",
"columnName": "serverVersion",
"affinity": "TEXT",
"defaultValue": "''"
},
{
"fieldPath": "clientCertificate",
"columnName": "clientCertificate",
"affinity": "TEXT"
},
{
"fieldPath": "externalSignalingServer",
"columnName": "externalSignalingServer",
"affinity": "TEXT"
},
{
"fieldPath": "current",
"columnName": "current",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "scheduledForDeletion",
"columnName": "scheduledForDeletion",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "ArbitraryStorage",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountIdentifier` INTEGER NOT NULL, `key` TEXT NOT NULL, `object` TEXT, `value` TEXT, PRIMARY KEY(`accountIdentifier`, `key`))",
"fields": [
{
"fieldPath": "accountIdentifier",
"columnName": "accountIdentifier",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "key",
"columnName": "key",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "storageObject",
"columnName": "object",
"affinity": "TEXT"
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"accountIdentifier",
"key"
]
}
},
{
"tableName": "Conversations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `displayName` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `avatarVersion` TEXT NOT NULL, `callFlag` INTEGER NOT NULL, `callRecording` INTEGER NOT NULL, `callStartTime` INTEGER NOT NULL, `canDeleteConversation` INTEGER NOT NULL, `canLeaveConversation` INTEGER NOT NULL, `canStartCall` INTEGER NOT NULL, `description` TEXT NOT NULL, `hasCall` INTEGER NOT NULL, `hasPassword` INTEGER NOT NULL, `isCustomAvatar` INTEGER NOT NULL, `isFavorite` INTEGER NOT NULL, `lastActivity` INTEGER NOT NULL, `lastCommonReadMessage` INTEGER NOT NULL, `lastMessage` TEXT, `lastPing` INTEGER NOT NULL, `lastReadMessage` INTEGER NOT NULL, `lobbyState` TEXT NOT NULL, `lobbyTimer` INTEGER NOT NULL, `messageExpiration` INTEGER NOT NULL, `name` TEXT NOT NULL, `notificationCalls` INTEGER NOT NULL, `notificationLevel` TEXT NOT NULL, `objectType` TEXT NOT NULL, `objectId` TEXT NOT NULL, `participantType` TEXT NOT NULL, `permissions` INTEGER NOT NULL, `readOnly` TEXT NOT NULL, `recordingConsent` INTEGER NOT NULL, `remoteServer` TEXT, `remoteToken` TEXT, `sessionId` TEXT NOT NULL, `status` TEXT, `statusClearAt` INTEGER, `statusIcon` TEXT, `statusMessage` TEXT, `type` TEXT NOT NULL, `unreadMention` INTEGER NOT NULL, `unreadMentionDirect` INTEGER NOT NULL, `unreadMessages` INTEGER NOT NULL, `hasArchived` INTEGER NOT NULL, `hasSensitive` INTEGER NOT NULL, `hasImportant` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`accountId`) REFERENCES `User`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "internalId",
"columnName": "internalId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "accountId",
"columnName": "accountId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "token",
"columnName": "token",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "displayName",
"columnName": "displayName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "actorId",
"columnName": "actorId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "actorType",
"columnName": "actorType",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "avatarVersion",
"columnName": "avatarVersion",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "callFlag",
"columnName": "callFlag",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "callRecording",
"columnName": "callRecording",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "callStartTime",
"columnName": "callStartTime",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "canDeleteConversation",
"columnName": "canDeleteConversation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "canLeaveConversation",
"columnName": "canLeaveConversation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "canStartCall",
"columnName": "canStartCall",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hasCall",
"columnName": "hasCall",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasPassword",
"columnName": "hasPassword",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasCustomAvatar",
"columnName": "isCustomAvatar",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "favorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastActivity",
"columnName": "lastActivity",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastCommonReadMessage",
"columnName": "lastCommonReadMessage",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastMessage",
"columnName": "lastMessage",
"affinity": "TEXT"
},
{
"fieldPath": "lastPing",
"columnName": "lastPing",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastReadMessage",
"columnName": "lastReadMessage",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lobbyState",
"columnName": "lobbyState",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lobbyTimer",
"columnName": "lobbyTimer",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "messageExpiration",
"columnName": "messageExpiration",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "notificationCalls",
"columnName": "notificationCalls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "notificationLevel",
"columnName": "notificationLevel",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "objectType",
"columnName": "objectType",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "objectId",
"columnName": "objectId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "participantType",
"columnName": "participantType",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "permissions",
"columnName": "permissions",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "conversationReadOnlyState",
"columnName": "readOnly",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "recordingConsentRequired",
"columnName": "recordingConsent",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "remoteServer",
"columnName": "remoteServer",
"affinity": "TEXT"
},
{
"fieldPath": "remoteToken",
"columnName": "remoteToken",
"affinity": "TEXT"
},
{
"fieldPath": "sessionId",
"columnName": "sessionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT"
},
{
"fieldPath": "statusClearAt",
"columnName": "statusClearAt",
"affinity": "INTEGER"
},
{
"fieldPath": "statusIcon",
"columnName": "statusIcon",
"affinity": "TEXT"
},
{
"fieldPath": "statusMessage",
"columnName": "statusMessage",
"affinity": "TEXT"
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "unreadMention",
"columnName": "unreadMention",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unreadMentionDirect",
"columnName": "unreadMentionDirect",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unreadMessages",
"columnName": "unreadMessages",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasArchived",
"columnName": "hasArchived",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasSensitive",
"columnName": "hasSensitive",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasImportant",
"columnName": "hasImportant",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"internalId"
]
},
"indices": [
{
"name": "index_Conversations_accountId",
"unique": false,
"columnNames": [
"accountId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_Conversations_accountId` ON `${TABLE_NAME}` (`accountId`)"
}
],
"foreignKeys": [
{
"table": "User",
"onDelete": "CASCADE",
"onUpdate": "CASCADE",
"columns": [
"accountId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "ChatMessages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `id` INTEGER NOT NULL, `internalConversationId` TEXT NOT NULL, `actorDisplayName` TEXT NOT NULL, `message` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `deleted` INTEGER NOT NULL, `expirationTimestamp` INTEGER NOT NULL, `isReplyable` INTEGER NOT NULL, `isTemporary` INTEGER NOT NULL, `lastEditActorDisplayName` TEXT, `lastEditActorId` TEXT, `lastEditActorType` TEXT, `lastEditTimestamp` INTEGER, `markdown` INTEGER, `messageParameters` TEXT, `messageType` TEXT NOT NULL, `parent` INTEGER, `reactions` TEXT, `reactionsSelf` TEXT, `referenceId` TEXT, `sendStatus` TEXT, `silent` INTEGER NOT NULL, `systemMessage` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`internalConversationId`) REFERENCES `Conversations`(`internalId`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "internalId",
"columnName": "internalId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "accountId",
"columnName": "accountId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "token",
"columnName": "token",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "internalConversationId",
"columnName": "internalConversationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "actorDisplayName",
"columnName": "actorDisplayName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "actorId",
"columnName": "actorId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "actorType",
"columnName": "actorType",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "deleted",
"columnName": "deleted",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "expirationTimestamp",
"columnName": "expirationTimestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "replyable",
"columnName": "isReplyable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isTemporary",
"columnName": "isTemporary",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastEditActorDisplayName",
"columnName": "lastEditActorDisplayName",
"affinity": "TEXT"
},
{
"fieldPath": "lastEditActorId",
"columnName": "lastEditActorId",
"affinity": "TEXT"
},
{
"fieldPath": "lastEditActorType",
"columnName": "lastEditActorType",
"affinity": "TEXT"
},
{
"fieldPath": "lastEditTimestamp",
"columnName": "lastEditTimestamp",
"affinity": "INTEGER"
},
{
"fieldPath": "renderMarkdown",
"columnName": "markdown",
"affinity": "INTEGER"
},
{
"fieldPath": "messageParameters",
"columnName": "messageParameters",
"affinity": "TEXT"
},
{
"fieldPath": "messageType",
"columnName": "messageType",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "parentMessageId",
"columnName": "parent",
"affinity": "INTEGER"
},
{
"fieldPath": "reactions",
"columnName": "reactions",
"affinity": "TEXT"
},
{
"fieldPath": "reactionsSelf",
"columnName": "reactionsSelf",
"affinity": "TEXT"
},
{
"fieldPath": "referenceId",
"columnName": "referenceId",
"affinity": "TEXT"
},
{
"fieldPath": "sendStatus",
"columnName": "sendStatus",
"affinity": "TEXT"
},
{
"fieldPath": "silent",
"columnName": "silent",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "systemMessageType",
"columnName": "systemMessage",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"internalId"
]
},
"indices": [
{
"name": "index_ChatMessages_internalId",
"unique": true,
"columnNames": [
"internalId"
],
"orders": [],
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_ChatMessages_internalId` ON `${TABLE_NAME}` (`internalId`)"
},
{
"name": "index_ChatMessages_internalConversationId",
"unique": false,
"columnNames": [
"internalConversationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_ChatMessages_internalConversationId` ON `${TABLE_NAME}` (`internalConversationId`)"
}
],
"foreignKeys": [
{
"table": "Conversations",
"onDelete": "CASCADE",
"onUpdate": "CASCADE",
"columns": [
"internalConversationId"
],
"referencedColumns": [
"internalId"
]
}
]
},
{
"tableName": "ChatBlocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `internalConversationId` TEXT NOT NULL, `accountId` INTEGER, `token` TEXT, `oldestMessageId` INTEGER NOT NULL, `newestMessageId` INTEGER NOT NULL, `hasHistory` INTEGER NOT NULL, FOREIGN KEY(`internalConversationId`) REFERENCES `Conversations`(`internalId`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "internalConversationId",
"columnName": "internalConversationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "accountId",
"columnName": "accountId",
"affinity": "INTEGER"
},
{
"fieldPath": "token",
"columnName": "token",
"affinity": "TEXT"
},
{
"fieldPath": "oldestMessageId",
"columnName": "oldestMessageId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "newestMessageId",
"columnName": "newestMessageId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasHistory",
"columnName": "hasHistory",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_ChatBlocks_internalConversationId",
"unique": false,
"columnNames": [
"internalConversationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_ChatBlocks_internalConversationId` ON `${TABLE_NAME}` (`internalConversationId`)"
}
],
"foreignKeys": [
{
"table": "Conversations",
"onDelete": "CASCADE",
"onUpdate": "CASCADE",
"columns": [
"internalConversationId"
],
"referencedColumns": [
"internalId"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5bc4247e179307faa995552da5d34324')"
]
}
}

View File

@ -29,6 +29,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA
import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.data.ChatMessageRepository import com.nextcloud.talk.chat.data.ChatMessageRepository
import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.data.database.model.SendStatus
import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.network.NetworkMonitor
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ItemCustomOutcomingTextMessageBinding import com.nextcloud.talk.databinding.ItemCustomOutcomingTextMessageBinding
@ -184,7 +185,7 @@ class OutcomingTextMessageViewHolder(itemView: View) :
binding.checkMark.visibility = View.INVISIBLE binding.checkMark.visibility = View.INVISIBLE
binding.sendingProgress.visibility = View.GONE binding.sendingProgress.visibility = View.GONE
if (message.sendingFailed) { if (message.sendStatus == SendStatus.FAILED) {
updateStatus(R.drawable.baseline_error_outline_24, context.resources?.getString(R.string.nc_message_failed)) updateStatus(R.drawable.baseline_error_outline_24, context.resources?.getString(R.string.nc_message_failed))
} else if (message.isTemporary) { } else if (message.isTemporary) {
updateStatus(R.drawable.baseline_schedule_24, context.resources?.getString(R.string.nc_message_sending)) updateStatus(R.drawable.baseline_schedule_24, context.resources?.getString(R.string.nc_message_sending))

View File

@ -1245,8 +1245,9 @@ class ChatActivity :
val deleteNoticeText = binding.conversationDeleteNotice.findViewById<TextView>(R.id.deletion_message) val deleteNoticeText = binding.conversationDeleteNotice.findViewById<TextView>(R.id.deletion_message)
viewThemeUtils.material.themeCardView(binding.conversationDeleteNotice) viewThemeUtils.material.themeCardView(binding.conversationDeleteNotice)
deleteNoticeText.text = String.format( deleteNoticeText.text = resources.getQuantityString(
resources.getString(R.string.nc_conversation_auto_delete_notice), R.plurals.nc_conversation_auto_delete_info,
retentionPeriod,
retentionPeriod retentionPeriod
) )
viewThemeUtils.material.colorMaterialButtonPrimaryTonal( viewThemeUtils.material.colorMaterialButtonPrimaryTonal(

View File

@ -200,7 +200,7 @@ class MessageInputFragment : Fragment() {
val connectionGained = (!wasOnline && isOnline) val connectionGained = (!wasOnline && isOnline)
Log.d(TAG, "isOnline: $isOnline\nwasOnline: $wasOnline\nconnectionGained: $connectionGained") Log.d(TAG, "isOnline: $isOnline\nwasOnline: $wasOnline\nconnectionGained: $connectionGained")
if (connectionGained) { if (connectionGained) {
chatActivity.messageInputViewModel.sendTempMessages( chatActivity.messageInputViewModel.sendUnsentMessages(
chatActivity.conversationUser!!.getCredentials(), chatActivity.conversationUser!!.getCredentials(),
ApiUtils.getUrlForChat( ApiUtils.getUrlForChat(
chatActivity.chatApiVersion, chatActivity.chatApiVersion,

View File

@ -110,7 +110,7 @@ interface ChatMessageRepository : LifecycleAwareManager {
suspend fun editTempChatMessage(message: ChatMessage, editedMessageText: String): Flow<Boolean> suspend fun editTempChatMessage(message: ChatMessage, editedMessageText: String): Flow<Boolean>
suspend fun sendTempChatMessages(credentials: String, url: String) suspend fun sendUnsentChatMessages(credentials: String, url: String)
suspend fun deleteTempMessage(chatMessage: ChatMessage) suspend fun deleteTempMessage(chatMessage: ChatMessage)
} }

View File

@ -14,6 +14,7 @@ import android.util.Log
import com.bluelinelabs.logansquare.annotation.JsonIgnore import com.bluelinelabs.logansquare.annotation.JsonIgnore
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
import com.nextcloud.talk.data.database.model.SendStatus
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.json.chat.ChatUtils.Companion.getParsedMessage import com.nextcloud.talk.models.json.chat.ChatUtils.Companion.getParsedMessage
import com.nextcloud.talk.models.json.chat.ReadStatus import com.nextcloud.talk.models.json.chat.ReadStatus
@ -119,7 +120,7 @@ data class ChatMessage(
var referenceId: String? = null, var referenceId: String? = null,
var sendingFailed: Boolean = true, var sendStatus: SendStatus? = null,
var silent: Boolean = false var silent: Boolean = false

View File

@ -19,6 +19,7 @@ import com.nextcloud.talk.data.database.mappers.asEntity
import com.nextcloud.talk.data.database.mappers.asModel import com.nextcloud.talk.data.database.mappers.asModel
import com.nextcloud.talk.data.database.model.ChatBlockEntity import com.nextcloud.talk.data.database.model.ChatBlockEntity
import com.nextcloud.talk.data.database.model.ChatMessageEntity import com.nextcloud.talk.data.database.model.ChatMessageEntity
import com.nextcloud.talk.data.database.model.SendStatus
import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.network.NetworkMonitor
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.extensions.toIntOrZero import com.nextcloud.talk.extensions.toIntOrZero
@ -214,7 +215,8 @@ class OfflineFirstChatRepository @Inject constructor(
) )
} }
sendTempChatMessages(credentials, urlForChatting) // this call could be deleted when we have a worker to send messages..
sendUnsentChatMessages(credentials, urlForChatting)
// delay is a dirty workaround to make sure messages are added to adapter on initial load before dealing // delay is a dirty workaround to make sure messages are added to adapter on initial load before dealing
// with them (otherwise there is a race condition). // with them (otherwise there is a race condition).
@ -365,11 +367,18 @@ class OfflineFirstChatRepository @Inject constructor(
lookIntoFuture: Boolean, lookIntoFuture: Boolean,
showUnreadMessagesMarker: Boolean showUnreadMessagesMarker: Boolean
) { ) {
receivedChatMessages.forEach {
Log.d(TAG, "receivedChatMessage: " + it.message)
}
// remove all temp messages from UI // remove all temp messages from UI
val oldTempMessages = chatDao.getTempMessagesForConversation(internalConversationId) val oldTempMessages = chatDao.getTempMessagesForConversation(internalConversationId)
.first() .first()
.map(ChatMessageEntity::asModel) .map(ChatMessageEntity::asModel)
oldTempMessages.forEach { _removeMessageFlow.emit(it) } oldTempMessages.forEach {
Log.d(TAG, "oldTempMessage to be removed from UI: " + it.message)
_removeMessageFlow.emit(it)
}
// add new messages to UI // add new messages to UI
val tripleChatMessages = Triple(lookIntoFuture, showUnreadMessagesMarker, receivedChatMessages) val tripleChatMessages = Triple(lookIntoFuture, showUnreadMessagesMarker, receivedChatMessages)
@ -378,6 +387,9 @@ class OfflineFirstChatRepository @Inject constructor(
// remove temp messages from DB that are now found in the new messages // remove temp messages from DB that are now found in the new messages
val chatMessagesReferenceIds = receivedChatMessages.mapTo(HashSet(receivedChatMessages.size)) { it.referenceId } val chatMessagesReferenceIds = receivedChatMessages.mapTo(HashSet(receivedChatMessages.size)) { it.referenceId }
val tempChatMessagesThatCanBeReplaced = oldTempMessages.filter { it.referenceId in chatMessagesReferenceIds } val tempChatMessagesThatCanBeReplaced = oldTempMessages.filter { it.referenceId in chatMessagesReferenceIds }
tempChatMessagesThatCanBeReplaced.forEach {
Log.d(TAG, "oldTempMessage that was identified in newMessages: " + it.message)
}
chatDao.deleteTempChatMessages( chatDao.deleteTempChatMessages(
internalConversationId, internalConversationId,
tempChatMessagesThatCanBeReplaced.map { it.referenceId!! } tempChatMessagesThatCanBeReplaced.map { it.referenceId!! }
@ -389,6 +401,10 @@ class OfflineFirstChatRepository @Inject constructor(
.sortedBy { it.internalId } .sortedBy { it.internalId }
.map(ChatMessageEntity::asModel) .map(ChatMessageEntity::asModel)
remainingTempMessages.forEach {
Log.d(TAG, "remainingTempMessage: " + it.message)
}
val triple = Triple(true, false, remainingTempMessages) val triple = Triple(true, false, remainingTempMessages)
_messageFlow.emit(triple) _messageFlow.emit(triple)
} }
@ -843,6 +859,17 @@ class OfflineFirstChatRepository @Inject constructor(
val chatMessageModel = response.ocs?.data?.asModel() val chatMessageModel = response.ocs?.data?.asModel()
val sentMessage = chatDao.getTempMessageForConversation(
internalConversationId,
referenceId
).firstOrNull()
sentMessage?.let {
it.sendStatus = SendStatus.SENT_PENDING_ACK
chatDao.updateChatMessage(it)
}
Log.d(TAG, "sending chat message succeeded: " + message)
emit(Result.success(chatMessageModel)) emit(Result.success(chatMessageModel))
} }
.catch { e -> .catch { e ->
@ -853,7 +880,7 @@ class OfflineFirstChatRepository @Inject constructor(
referenceId referenceId
).firstOrNull() ).firstOrNull()
failedMessage?.let { failedMessage?.let {
it.sendingFailed = true it.sendStatus = SendStatus.FAILED
chatDao.updateChatMessage(it) chatDao.updateChatMessage(it)
val failedMessageModel = it.asModel() val failedMessageModel = it.asModel()
@ -874,7 +901,7 @@ class OfflineFirstChatRepository @Inject constructor(
referenceId: String referenceId: String
): Flow<Result<ChatMessage?>> { ): Flow<Result<ChatMessage?>> {
val messageToResend = chatDao.getTempMessageForConversation(internalConversationId, referenceId).first() val messageToResend = chatDao.getTempMessageForConversation(internalConversationId, referenceId).first()
messageToResend.sendingFailed = false messageToResend.sendStatus = SendStatus.PENDING
chatDao.updateChatMessage(messageToResend) chatDao.updateChatMessage(messageToResend)
val messageToResendModel = messageToResend.asModel() val messageToResendModel = messageToResend.asModel()
@ -930,8 +957,8 @@ class OfflineFirstChatRepository @Inject constructor(
} }
} }
override suspend fun sendTempChatMessages(credentials: String, url: String) { override suspend fun sendUnsentChatMessages(credentials: String, url: String) {
val tempMessages = chatDao.getTempMessagesForConversation(internalConversationId).first() val tempMessages = chatDao.getTempUnsentMessagesForConversation(internalConversationId).first()
tempMessages.sortedBy { it.internalId }.onEach { tempMessages.sortedBy { it.internalId }.onEach {
sendChatMessage( sendChatMessage(
credentials, credentials,
@ -1025,7 +1052,7 @@ class OfflineFirstChatRepository @Inject constructor(
actorDisplayName = currentUser.displayName!!, actorDisplayName = currentUser.displayName!!,
referenceId = referenceId, referenceId = referenceId,
isTemporary = true, isTemporary = true,
sendingFailed = false, sendStatus = SendStatus.PENDING,
silent = sendWithoutNotification silent = sendWithoutNotification
) )
return entity return entity

View File

@ -169,9 +169,9 @@ class MessageInputViewModel @Inject constructor(
} }
} }
fun sendTempMessages(credentials: String, url: String) { fun sendUnsentMessages(credentials: String, url: String) {
viewModelScope.launch { viewModelScope.launch {
chatRepository.sendTempChatMessages( chatRepository.sendUnsentChatMessages(
credentials, credentials,
url url
) )

View File

@ -50,6 +50,18 @@ interface ChatMessagesDao {
) )
fun getTempMessagesForConversation(internalConversationId: String): Flow<List<ChatMessageEntity>> fun getTempMessagesForConversation(internalConversationId: String): Flow<List<ChatMessageEntity>>
@Query(
"""
SELECT *
FROM ChatMessages
WHERE internalConversationId = :internalConversationId
AND isTemporary = 1
AND sendStatus != 'SENT_PENDING_ACK'
ORDER BY timestamp DESC, id DESC
"""
)
fun getTempUnsentMessagesForConversation(internalConversationId: String): Flow<List<ChatMessageEntity>>
@Query( @Query(
""" """
SELECT * SELECT *

View File

@ -68,7 +68,7 @@ fun ChatMessageEntity.asModel() =
isDeleted = deleted, isDeleted = deleted,
referenceId = referenceId, referenceId = referenceId,
isTemporary = isTemporary, isTemporary = isTemporary,
sendingFailed = sendingFailed, sendStatus = sendStatus,
readStatus = ReadStatus.NONE, readStatus = ReadStatus.NONE,
silent = silent silent = silent
) )

View File

@ -64,7 +64,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 = "referenceId") var referenceId: String? = null, @ColumnInfo(name = "referenceId") var referenceId: String? = null,
@ColumnInfo(name = "sendingFailed") var sendingFailed: Boolean = false, @ColumnInfo(name = "sendStatus") var sendStatus: SendStatus? = null,
@ColumnInfo(name = "silent") var silent: Boolean = false, @ColumnInfo(name = "silent") var silent: Boolean = false,
@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

View File

@ -0,0 +1,14 @@
/*
* Nextcloud Talk - Android Client
*
* SPDX-FileCopyrightText: 2025 Marcel Hibbe <dev@mhibbe.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.nextcloud.talk.data.database.model
enum class SendStatus {
PENDING,
SENT_PENDING_ACK,
FAILED
}

View File

@ -1,18 +1,31 @@
/* /*
* Nextcloud Talk - Android Client * Nextcloud Talk - Android Client
* *
* SPDX-FileCopyrightText: 2024-2025 Marcel Hibbe <dev@mhibbe.de>
* SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de> * SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de>
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package com.nextcloud.talk.data.source.local package com.nextcloud.talk.data.source.local
import android.util.Log import android.util.Log
import androidx.room.DeleteColumn
import androidx.room.migration.AutoMigrationSpec
import androidx.room.migration.Migration import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteDatabase
import java.sql.SQLException import java.sql.SQLException
@Suppress("MagicNumber") @Suppress("MagicNumber")
object Migrations { object Migrations {
//region Auto migrations
@DeleteColumn(tableName = "ChatMessages", columnName = "sendingFailed")
class AutoMigration16To17 : AutoMigrationSpec
//endregion
//region Manual migrations
val MIGRATION_6_8 = object : Migration(6, 8) { val MIGRATION_6_8 = object : Migration(6, 8) {
override fun migrate(db: SupportSQLiteDatabase) { override fun migrate(db: SupportSQLiteDatabase) {
Log.i("Migrations", "Migrating 6 to 8") Log.i("Migrations", "Migrating 6 to 8")
@ -76,6 +89,8 @@ object Migrations {
} }
} }
//endregion
fun migrateToRoom(db: SupportSQLiteDatabase) { fun migrateToRoom(db: SupportSQLiteDatabase) {
db.execSQL( db.execSQL(
"CREATE TABLE User_new (" + "CREATE TABLE User_new (" +

View File

@ -1,7 +1,7 @@
/* /*
* Nextcloud Talk - Android Client * Nextcloud Talk - Android Client
* *
* SPDX-FileCopyrightText: 2023-2024 Marcel Hibbe <dev@mhibbe.de> * SPDX-FileCopyrightText: 2023-2025 Marcel Hibbe <dev@mhibbe.de>
* SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de> * SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de>
* SPDX-FileCopyrightText: 2017-2020 Mario Danic <mario@lovelyhq.com> * SPDX-FileCopyrightText: 2017-2020 Mario Danic <mario@lovelyhq.com>
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
@ -23,12 +23,14 @@ import com.nextcloud.talk.data.database.dao.ConversationsDao
import com.nextcloud.talk.data.database.model.ChatBlockEntity import com.nextcloud.talk.data.database.model.ChatBlockEntity
import com.nextcloud.talk.data.database.model.ChatMessageEntity import com.nextcloud.talk.data.database.model.ChatMessageEntity
import com.nextcloud.talk.data.database.model.ConversationEntity import com.nextcloud.talk.data.database.model.ConversationEntity
import com.nextcloud.talk.data.source.local.Migrations.AutoMigration16To17
import com.nextcloud.talk.data.source.local.converters.ArrayListConverter import com.nextcloud.talk.data.source.local.converters.ArrayListConverter
import com.nextcloud.talk.data.source.local.converters.CapabilitiesConverter import com.nextcloud.talk.data.source.local.converters.CapabilitiesConverter
import com.nextcloud.talk.data.source.local.converters.ExternalSignalingServerConverter import com.nextcloud.talk.data.source.local.converters.ExternalSignalingServerConverter
import com.nextcloud.talk.data.source.local.converters.HashMapHashMapConverter import com.nextcloud.talk.data.source.local.converters.HashMapHashMapConverter
import com.nextcloud.talk.data.source.local.converters.LinkedHashMapConverter import com.nextcloud.talk.data.source.local.converters.LinkedHashMapConverter
import com.nextcloud.talk.data.source.local.converters.PushConfigurationConverter import com.nextcloud.talk.data.source.local.converters.PushConfigurationConverter
import com.nextcloud.talk.data.source.local.converters.SendStatusConverter
import com.nextcloud.talk.data.source.local.converters.ServerVersionConverter import com.nextcloud.talk.data.source.local.converters.ServerVersionConverter
import com.nextcloud.talk.data.source.local.converters.SignalingSettingsConverter import com.nextcloud.talk.data.source.local.converters.SignalingSettingsConverter
import com.nextcloud.talk.data.storage.ArbitraryStoragesDao import com.nextcloud.talk.data.storage.ArbitraryStoragesDao
@ -49,9 +51,10 @@ import java.util.Locale
ChatMessageEntity::class, ChatMessageEntity::class,
ChatBlockEntity::class ChatBlockEntity::class
], ],
version = 16, version = 17,
autoMigrations = [ autoMigrations = [
AutoMigration(from = 9, to = 10) AutoMigration(from = 9, to = 10),
AutoMigration(from = 16, to = 17, spec = AutoMigration16To17::class)
], ],
exportSchema = true exportSchema = true
) )
@ -63,7 +66,8 @@ import java.util.Locale
SignalingSettingsConverter::class, SignalingSettingsConverter::class,
HashMapHashMapConverter::class, HashMapHashMapConverter::class,
LinkedHashMapConverter::class, LinkedHashMapConverter::class,
ArrayListConverter::class ArrayListConverter::class,
SendStatusConverter::class
) )
abstract class TalkDatabase : RoomDatabase() { abstract class TalkDatabase : RoomDatabase() {

View File

@ -0,0 +1,23 @@
/*
* Nextcloud Talk - Android Client
*
* SPDX-FileCopyrightText: 2025 Marcel Hibbe <dev@mhibbe.de>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.nextcloud.talk.data.source.local.converters
import androidx.room.TypeConverter
import com.nextcloud.talk.data.database.model.SendStatus
class SendStatusConverter {
@TypeConverter
fun fromStatus(value: SendStatus): String {
return value.name
}
@TypeConverter
fun toStatus(value: String): SendStatus {
return SendStatus.valueOf(value)
}
}

View File

@ -18,6 +18,7 @@ import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.data.database.model.SendStatus
import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.network.NetworkMonitor
import com.nextcloud.talk.databinding.DialogTempMessageActionsBinding import com.nextcloud.talk.databinding.DialogTempMessageActionsBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils
@ -58,9 +59,10 @@ class TempMessageActionsDialog(
private fun initMenuItems() { private fun initMenuItems() {
this.lifecycleScope.launch { this.lifecycleScope.launch {
initResendMessage(message.sendingFailed && networkMonitor.isOnline.value) val sendingFailed = message.sendStatus == SendStatus.FAILED
initMenuEditMessage(message.sendingFailed || !networkMonitor.isOnline.value) initResendMessage(sendingFailed && networkMonitor.isOnline.value)
initMenuDeleteMessage(message.sendingFailed || !networkMonitor.isOnline.value) initMenuEditMessage(sendingFailed || !networkMonitor.isOnline.value)
initMenuDeleteMessage(sendingFailed || !networkMonitor.isOnline.value)
initMenuItemCopy() initMenuItemCopy()
} }
} }

View File

@ -30,6 +30,11 @@ class DummyChatMessagesDaoImpl : ChatMessagesDao {
override fun getTempMessagesForConversation(internalConversationId: String): Flow<List<ChatMessageEntity>> = override fun getTempMessagesForConversation(internalConversationId: String): Flow<List<ChatMessageEntity>> =
flowOf() flowOf()
override fun getTempUnsentMessagesForConversation(internalConversationId: String): Flow<List<ChatMessageEntity>> {
// nothing to return here as long this class is only used for the Search window
return flowOf()
}
override fun getTempMessageForConversation( override fun getTempMessageForConversation(
internalConversationId: String, internalConversationId: String,
referenceId: String referenceId: String

View File

@ -19,7 +19,6 @@
android:id="@+id/deletion_message" android:id="@+id/deletion_message"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/nc_conversation_auto_delete_notice"
android:textSize="14sp" android:textSize="14sp"
android:lineSpacingExtra="4dp" android:lineSpacingExtra="4dp"
android:gravity="center" android:gravity="center"

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Select authentication certificate</string> <string name="nc_configure_cert_auth">Select authentication certificate</string>
<string name="nc_connecting_call">Connecting …</string> <string name="nc_connecting_call">Connecting …</string>
<string name="nc_contacts_done">Done</string> <string name="nc_contacts_done">Done</string>
<string name="nc_conversation_auto_delete_notice">This conversation will be automatically deleted for everyone after %1$d days of inactivity</string>
<string name="nc_conversation_description">Conversation description</string> <string name="nc_conversation_description">Conversation description</string>
<string name="nc_conversation_menu_conversation_info">Conversation info</string> <string name="nc_conversation_menu_conversation_info">Conversation info</string>
<string name="nc_conversation_menu_video_call">Video call</string> <string name="nc_conversation_menu_video_call">Video call</string>

View File

@ -17,7 +17,7 @@
<string name="call_without_notification">Обаждане без известие</string> <string name="call_without_notification">Обаждане без известие</string>
<string name="camera_permission_granted">Дадено е право на камера. Моля, изберете камера отново. </string> <string name="camera_permission_granted">Дадено е право на камера. Моля, изберете камера отново. </string>
<string name="choose_avatar_from_cloud">Избор на аватар от облака</string> <string name="choose_avatar_from_cloud">Избор на аватар от облака</string>
<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="connection_established">Осъществена е връзка</string> <string name="connection_established">Осъществена е връзка</string>
@ -38,7 +38,7 @@
<string name="file_list_folder">папка</string> <string name="file_list_folder">папка</string>
<string name="file_list_loading">Зареждане …</string> <string name="file_list_loading">Зареждане …</string>
<string name="filename_progress">%1$s (%2$d)</string> <string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 часа</string> <string name="fourHours">4 чàса</string>
<string name="invisible">Невидим</string> <string name="invisible">Невидим</string>
<string name="leave_call">Напускане на обаждането</string> <string name="leave_call">Напускане на обаждането</string>
<string name="load_more_results">Зареждане на още резултати</string> <string name="load_more_results">Зареждане на още резултати</string>
@ -65,7 +65,7 @@
<string name="nc_action_open_main_menu">Отворяне на главното меню</string> <string name="nc_action_open_main_menu">Отворяне на главното меню</string>
<string name="nc_add_attachment">Добавяне на прикачен файл</string> <string name="nc_add_attachment">Добавяне на прикачен файл</string>
<string name="nc_add_emojis">Добавяне на емотикони</string> <string name="nc_add_emojis">Добавяне на емотикони</string>
<string name="nc_add_file">Добавяне към разговор</string> <string name="nc_add_file">Добави към разговор</string>
<string name="nc_add_participants">Добавяне на участници</string> <string name="nc_add_participants">Добавяне на участници</string>
<string name="nc_add_to_favorites">Добави към любимите</string> <string name="nc_add_to_favorites">Добави към любимите</string>
<string name="nc_all_ok_operation">Добре, всичко е готово!</string> <string name="nc_all_ok_operation">Добре, всичко е готово!</string>
@ -113,6 +113,7 @@
<string name="nc_common_disabled">Изключено</string> <string name="nc_common_disabled">Изключено</string>
<string name="nc_common_dismiss">Отхвърляне</string> <string name="nc_common_dismiss">Отхвърляне</string>
<string name="nc_common_error_sorry">Съжалявам нещо се обърка!</string> <string name="nc_common_error_sorry">Съжалявам нещо се обърка!</string>
<string name="nc_common_more_options">Още опции</string>
<string name="nc_common_set">Настройка</string> <string name="nc_common_set">Настройка</string>
<string name="nc_common_skip">Пропусни</string> <string name="nc_common_skip">Пропусни</string>
<string name="nc_common_unknown">Неизвестен</string> <string name="nc_common_unknown">Неизвестен</string>
@ -225,6 +226,7 @@
<string name="nc_missed_call">Пропуснахте обаждане от %s</string> <string name="nc_missed_call">Пропуснахте обаждане от %s</string>
<string name="nc_moderator">Модератор</string> <string name="nc_moderator">Модератор</string>
<string name="nc_new_conversation">Нов разговор</string> <string name="nc_new_conversation">Нов разговор</string>
<string name="nc_new_conversation_visibility">Видимост</string>
<string name="nc_new_mention">Непрочетени споменавания</string> <string name="nc_new_mention">Непрочетени споменавания</string>
<string name="nc_new_messages">Непрочетени съобщения.</string> <string name="nc_new_messages">Непрочетени съобщения.</string>
<string name="nc_nextcloud_talk_app_not_installed">%1$s не е наличен (не е инсталиран или е ограничен от администратора)</string> <string name="nc_nextcloud_talk_app_not_installed">%1$s не е наличен (не е инсталиран или е ограничен от администратора)</string>
@ -393,7 +395,7 @@
<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>
<string name="online">На линия</string> <string name="online">На линия</string>
<string name="online_status">Състояние на линия</string> <string name="online_status">Състояние</string>
<string name="openConversations">Отворени разговори</string> <string name="openConversations">Отворени разговори</string>
<string name="open_in_files_app">Отворяне в приложението Файлове</string> <string name="open_in_files_app">Отворяне в приложението Файлове</string>
<string name="play_pause_voice_message">Възпроизвеждане/пауза на гласово съобщение</string> <string name="play_pause_voice_message">Възпроизвеждане/пауза на гласово съобщение</string>
@ -429,10 +431,10 @@
<string name="save">Записване</string> <string name="save">Записване</string>
<string name="scope_federated_description">Синхронизиране само с доверени сървъри</string> <string name="scope_federated_description">Синхронизиране само с доверени сървъри</string>
<string name="scope_federated_title">Федериран</string> <string name="scope_federated_title">Федериран</string>
<string name="scope_local_description">Видим само за хора от този случай и гости</string> <string name="scope_local_description">Видимо за потребители на тази инстанция на сървъра, както и гости.</string>
<string name="scope_local_title">Локално</string> <string name="scope_local_title">Локално</string>
<string name="scope_private_description">Видим само за хора, съчетани чрез интегриране на телефонен номер чрез Talk на мобилен телефон</string> <string name="scope_private_description">Видим само за хора, открити по телефонен номер, който е зададен в \"Talk\".</string>
<string name="scope_private_title">Частен</string> <string name="scope_private_title">Лично</string>
<string name="scope_published_description">Синхронизиране с доверени сървъри и с глобалната и публичната адресна книга</string> <string name="scope_published_description">Синхронизиране с доверени сървъри и с глобалната и публичната адресна книга</string>
<string name="scope_published_title">Публикувано</string> <string name="scope_published_title">Публикувано</string>
<string name="scope_toggle">Превключване на обхват</string> <string name="scope_toggle">Превключване на обхват</string>
@ -448,7 +450,7 @@
<string name="set">Да се зададе</string> <string name="set">Да се зададе</string>
<string name="set_avatar_from_camera">Задаване на аватар от камерата</string> <string name="set_avatar_from_camera">Задаване на аватар от камерата</string>
<string name="set_status">Задаване на състояние</string> <string name="set_status">Задаване на състояние</string>
<string name="set_status_message">Задаване на съобщение за състояние</string> <string name="set_status_message">Задай състояние</string>
<string name="share">Споделяне</string> <string name="share">Споделяне</string>
<string name="shared_items_audio">Аудио</string> <string name="shared_items_audio">Аудио</string>
<string name="shared_items_file">Файл</string> <string name="shared_items_file">Файл</string>
@ -496,7 +498,7 @@
<string name="userinfo_no_info_headline">Няма зададена лична информация</string> <string name="userinfo_no_info_headline">Няма зададена лична информация</string>
<string name="userinfo_no_info_text">Добавяне на име, снимка и подробности за контакт към страницата на вашия профил.</string> <string name="userinfo_no_info_text">Добавяне на име, снимка и подробности за контакт към страницата на вашия профил.</string>
<string name="video_call">Видео разговор</string> <string name="video_call">Видео разговор</string>
<string name="whats_your_status">Какъв е вашият статус?</string> <string name="whats_your_status">Какво е вашето състояние?</string>
<plurals name="polls_amount_voters"> <plurals name="polls_amount_voters">
<item quantity="one">%dгласувания </item> <item quantity="one">%dгласувания </item>
<item quantity="other">%d гласувания</item> <item quantity="other">%d гласувания</item>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Vyberte certifikát pro ověřování se</string> <string name="nc_configure_cert_auth">Vyberte certifikát pro ověřování se</string>
<string name="nc_connecting_call">Připojování…</string> <string name="nc_connecting_call">Připojování…</string>
<string name="nc_contacts_done">Hotovo</string> <string name="nc_contacts_done">Hotovo</string>
<string name="nc_conversation_auto_delete_notice">Tato konverzace bude automaticky smazána pro kohokoli po %1$d dnech bez jakékoli aktivity.</string>
<string name="nc_conversation_description">Popis konverzace</string> <string name="nc_conversation_description">Popis konverzace</string>
<string name="nc_conversation_menu_conversation_info">Informace o konverzaci</string> <string name="nc_conversation_menu_conversation_info">Informace o konverzaci</string>
<string name="nc_conversation_menu_video_call">Videohovor</string> <string name="nc_conversation_menu_video_call">Videohovor</string>
@ -544,6 +543,7 @@
<string name="online_status">Stav online</string> <string name="online_status">Stav online</string>
<string name="openConversations">Otevřít konverzace</string> <string name="openConversations">Otevřít konverzace</string>
<string name="open_in_files_app">Otevřít v aplikaci Soubory</string> <string name="open_in_files_app">Otevřít v aplikaci Soubory</string>
<string name="open_notes">Otevřít poznámky</string>
<string name="play_pause_voice_message">Přehrát/pozastavit hlasovou zprávu</string> <string name="play_pause_voice_message">Přehrát/pozastavit hlasovou zprávu</string>
<string name="playback_speed_control">Ovládání rychlosti přehrávání</string> <string name="playback_speed_control">Ovládání rychlosti přehrávání</string>
<string name="polls_add_option">Přidat volbu</string> <string name="polls_add_option">Přidat volbu</string>
@ -683,6 +683,12 @@
<item quantity="many">Viz %d podobných zpráv</item> <item quantity="many">Viz %d podobných zpráv</item>
<item quantity="other">Viz %d podobné zprávy</item> <item quantity="other">Viz %d podobné zprávy</item>
</plurals> </plurals>
<plurals name="nc_conversation_auto_delete_info">
<item quantity="one">Tato konverzace bude automaticky smazána pro kohokoli po %1$d dni bez jakékoli aktivity.</item>
<item quantity="few">Tato konverzace bude automaticky smazána pro kohokoli po %1$d dnech bez jakékoli aktivity.</item>
<item quantity="many">Tato konverzace bude automaticky smazána pro kohokoli po %1$d dnech bez jakékoli aktivity.</item>
<item quantity="other">Tato konverzace bude automaticky smazána pro kohokoli po %1$d dnech bez jakékoli aktivity.</item>
</plurals>
<plurals name="polls_amount_voters"> <plurals name="polls_amount_voters">
<item quantity="one">%d hlas</item> <item quantity="one">%d hlas</item>
<item quantity="few">%d hlasy</item> <item quantity="few">%d hlasy</item>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Authentifizierungs-Zertifikat auswählen</string> <string name="nc_configure_cert_auth">Authentifizierungs-Zertifikat auswählen</string>
<string name="nc_connecting_call">Verbinde …</string> <string name="nc_connecting_call">Verbinde …</string>
<string name="nc_contacts_done">Fertig</string> <string name="nc_contacts_done">Fertig</string>
<string name="nc_conversation_auto_delete_notice">Diese Unterhaltung wird für alle bei Inaktivität in %1$d Tagen gelöscht</string>
<string name="nc_conversation_description">Beschreibung der Unterhaltung</string> <string name="nc_conversation_description">Beschreibung der Unterhaltung</string>
<string name="nc_conversation_menu_conversation_info">Unterhaltungs-Information</string> <string name="nc_conversation_menu_conversation_info">Unterhaltungs-Information</string>
<string name="nc_conversation_menu_video_call">Videoanruf</string> <string name="nc_conversation_menu_video_call">Videoanruf</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name= "nc_edit">Επεξεργασία</string> <string name= "nc_edit">Επεξεργασία</string>
<string name="add_participants">Προσθήκη</string>
<string name="appbar_search_in">Αναζήτηση στο %s</string> <string name="appbar_search_in">Αναζήτηση στο %s</string>
<string name="archived">Αρχειοθετήθηκε</string> <string name="archived">Αρχειοθετήθηκε</string>
<string name="audio_output_dialog_headline">Έξοδος ήχου</string> <string name="audio_output_dialog_headline">Έξοδος ήχου</string>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Vali autentimise sertifikaat</string> <string name="nc_configure_cert_auth">Vali autentimise sertifikaat</string>
<string name="nc_connecting_call">Ühendan…</string> <string name="nc_connecting_call">Ühendan…</string>
<string name="nc_contacts_done">Valmis</string> <string name="nc_contacts_done">Valmis</string>
<string name="nc_conversation_auto_delete_notice">See vestlus kustub automaatselt kõigi osalejate jaoks, kui siin pole olnud tegevust %1$d päeva jooksul.</string>
<string name="nc_conversation_description">Vestluse kirjeldus</string> <string name="nc_conversation_description">Vestluse kirjeldus</string>
<string name="nc_conversation_menu_conversation_info">Vestluse teave</string> <string name="nc_conversation_menu_conversation_info">Vestluse teave</string>
<string name="nc_conversation_menu_video_call">Videokõne</string> <string name="nc_conversation_menu_video_call">Videokõne</string>
@ -544,6 +543,7 @@
<string name="online_status">Võrgus staatus</string> <string name="online_status">Võrgus staatus</string>
<string name="openConversations">Ava vestlused</string> <string name="openConversations">Ava vestlused</string>
<string name="open_in_files_app">Ava failirakenduses</string> <string name="open_in_files_app">Ava failirakenduses</string>
<string name="open_notes">Ava märkmik</string>
<string name="play_pause_voice_message">Esita häälsõnumit või peata esitus</string> <string name="play_pause_voice_message">Esita häälsõnumit või peata esitus</string>
<string name="playback_speed_control">Taasesituse kiiruse juhtimine</string> <string name="playback_speed_control">Taasesituse kiiruse juhtimine</string>
<string name="polls_add_option">Lisa valik</string> <string name="polls_add_option">Lisa valik</string>
@ -681,6 +681,10 @@
<item quantity="one">Vaata %d sarnast sõnumit</item> <item quantity="one">Vaata %d sarnast sõnumit</item>
<item quantity="other">Vaata %d sarnast sõnumit</item> <item quantity="other">Vaata %d sarnast sõnumit</item>
</plurals> </plurals>
<plurals name="nc_conversation_auto_delete_info">
<item quantity="one">See vestlus kustub automaatselt kõigi osalejate jaoks, kui siin pole olnud tegevust %1$d päeva jooksul.</item>
<item quantity="other">See vestlus kustub automaatselt kõigi osalejate jaoks, kui siin pole olnud tegevust %1$d päeva jooksul.</item>
</plurals>
<plurals name="polls_amount_voters"> <plurals name="polls_amount_voters">
<item quantity="one">%d hääl</item> <item quantity="one">%d hääl</item>
<item quantity="other">%d häält</item> <item quantity="other">%d häält</item>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Roghnaigh teastas fíordheimhnithe</string> <string name="nc_configure_cert_auth">Roghnaigh teastas fíordheimhnithe</string>
<string name="nc_connecting_call">Ag nascadh…</string> <string name="nc_connecting_call">Ag nascadh…</string>
<string name="nc_contacts_done">Déanta</string> <string name="nc_contacts_done">Déanta</string>
<string name="nc_conversation_auto_delete_notice">Scriosfar an comhrá seo go huathoibríoch do gach duine i %1$d lá gan aon ghníomhaíocht</string>
<string name="nc_conversation_description">Cur síos ar an gcomhrá</string> <string name="nc_conversation_description">Cur síos ar an gcomhrá</string>
<string name="nc_conversation_menu_conversation_info">Eolas faoin gcomhrá</string> <string name="nc_conversation_menu_conversation_info">Eolas faoin gcomhrá</string>
<string name="nc_conversation_menu_video_call">Glao físe</string> <string name="nc_conversation_menu_video_call">Glao físe</string>

View File

@ -2,9 +2,14 @@
<resources> <resources>
<string name= "nc_edit">Szerkesztés</string> <string name= "nc_edit">Szerkesztés</string>
<string name="add_participants">Hozzáadás</string> <string name="add_participants">Hozzáadás</string>
<string name="add_to_notes">Hozzáadás a jegyzetekhez</string>
<string name="added_to_favorites">A(z) %1$s beszélgetés hozzáadva a kedvencekhez</string> <string name="added_to_favorites">A(z) %1$s beszélgetés hozzáadva a kedvencekhez</string>
<string name="appbar_search_in">Keresés itt: %s</string> <string name="appbar_search_in">Keresés itt: %s</string>
<string name="archive_conversation">Beszélgetés archiválása</string>
<string name="archive_hint">Ha archivál egy beszélgetést, akkor alapértelmezetten el lesz rejtve. Válassza az „Archiválva” szűrőt az archivált beszélgetések megtekintéséhez. A közvetlen említéseket továbbra is meg fogja kapni.</string>
<string name="archived">Archiválva</string> <string name="archived">Archiválva</string>
<string name="archived_conversation">Archiválva: %1$s</string>
<string name="audio_call">Hanghívás</string>
<string name="audio_output_bluetooth">Bluetooth</string> <string name="audio_output_bluetooth">Bluetooth</string>
<string name="audio_output_dialog_headline">Hangkimenet</string> <string name="audio_output_dialog_headline">Hangkimenet</string>
<string name="audio_output_phone">Telefon</string> <string name="audio_output_phone">Telefon</string>
@ -13,6 +18,10 @@
<string name="automatic_status_set">Az állapota automatikusan lett beállítva</string> <string name="automatic_status_set">Az állapota automatikusan lett beállítva</string>
<string name="avatar">Profilkép</string> <string name="avatar">Profilkép</string>
<string name="away">Távol</string> <string name="away">Távol</string>
<string name="back_button">Vissza gomb</string>
<string name="ban">Tiltás</string>
<string name="ban_participant">Résztvevő letiltása</string>
<string name="bans_list">Tiltólista</string>
<string name="calendar">Naptár</string> <string name="calendar">Naptár</string>
<string name="call_more_actions_dialog_headline">Speciális hívásbeállítások</string> <string name="call_more_actions_dialog_headline">Speciális hívásbeállítások</string>
<string name="call_running_since_one_hour">A hívás egy órája tart.</string> <string name="call_running_since_one_hour">A hívás egy órája tart.</string>
@ -24,33 +33,46 @@
<string name="close">Bezárás</string> <string name="close">Bezárás</string>
<string name="close_icon">Bezárás ikon</string> <string name="close_icon">Bezárás ikon</string>
<string name="connection_established">A kapcsolat létrejött</string> <string name="connection_established">A kapcsolat létrejött</string>
<string name="connection_lost">Nincs kapcsolat a kiszolgálóval</string>
<string name="connection_lost_sent_messages_are_queued">A kapcsolat elveszett Elküldött üzenetek sorba állítva</string>
<string name="continuous_voice_message_recording">Felvétel zárolása a hangüzenet folyamatos rögzítéséhez</string> <string name="continuous_voice_message_recording">Felvétel zárolása a hangüzenet folyamatos rögzítéséhez</string>
<string name="conversation_archived">A beszélgetés archiválva van</string>
<string name="conversation_is_read_only">A beszélgetés csak olvasható</string>
<string name="conversation_read_only_failed">Nem sikerült csak olvashatóvá állítani a beszélgetést</string>
<string name="conversations">Beszélgetések</string> <string name="conversations">Beszélgetések</string>
<string name="create_conversation">Beszélgetés létrehozása</string> <string name="create_conversation">Beszélgetés létrehozása</string>
<string name="create_issue">Hibajegy létrehozása</string> <string name="create_issue">Hibajegy létrehozása</string>
<string name="custom">Egyéni</string> <string name="custom">Egyéni</string>
<string name="danger_zone">Veszélyes területet</string> <string name="danger_zone">Veszélyes területet</string>
<string name="deck_card_description">%1$s itt: %2$s</string>
<string name="delete_avatar">Profilkép törlése</string> <string name="delete_avatar">Profilkép törlése</string>
<string name="deleted_conversation">%1$s beszélgetés törlése</string> <string name="deleted_conversation">%1$s beszélgetés törlése</string>
<string name="dnd">Ne zavarjanak</string> <string name="dnd">Ne zavarjanak</string>
<string name="dontClear">Ne törölje</string> <string name="dontClear">Ne törölje</string>
<string name="edit">Szerkesztés</string> <string name="edit">Szerkesztés</string>
<string name="edit_error_24_hours_old_message">A 24 óránál régebbi beszélgetések nem szerkeszthetőek</string>
<string name="edit_message_icon_description">Üzenet szerkesztése</string> <string name="edit_message_icon_description">Üzenet szerkesztése</string>
<string name="emoji_category_recent">Legutóbbiak</string> <string name="emoji_category_recent">Legutóbbiak</string>
<string name="encrypted">Titkosított</string> <string name="encrypted">Titkosított</string>
<string name="end_call_for_everyone">Hívás befejezése mindenki számára</string> <string name="end_call_for_everyone">Hívás befejezése mindenki számára</string>
<string name="error_loading_chats">Hiba történt a csevegések betöltése során</string> <string name="error_loading_chats">Hiba történt a csevegések betöltése során</string>
<string name="error_unbanning">Hiba történt a résztvevő tiltásának visszavonása során</string>
<string name="failed_to_save">Sikertelen mentés: %1$s</string> <string name="failed_to_save">Sikertelen mentés: %1$s</string>
<string name="file_list_folder">mappa</string> <string name="file_list_folder">mappa</string>
<string name="file_list_loading">Betöltés…</string> <string name="file_list_loading">Betöltés…</string>
<string name="filename_progress">%1$s (%2$d)</string> <string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 óra </string> <string name="fourHours">4 óra </string>
<string name="get_invitations_error">A függőben lévő meghívások lekérése sikertelen</string>
<string name="hint_edited_message">(szerkesztve)</string>
<string name="internal_note">Belső jegyzet</string> <string name="internal_note">Belső jegyzet</string>
<string name="invisible">Láthatatlan</string> <string name="invisible">Láthatatlan</string>
<string name="languages_error_message">A nyelveket nem lehet lekérni</string>
<string name="languages_error_title">Lekérés sikertelen</string>
<string name="later_today">Mai nap később</string> <string name="later_today">Mai nap később</string>
<string name="leave_call">Hívás elhagyása</string> <string name="leave_call">Hívás elhagyása</string>
<string name="left_conversation">Elhagyta a következő beszélgetést: %1$s</string> <string name="left_conversation">Elhagyta a következő beszélgetést: %1$s</string>
<string name="load_more_results">További találatok betöltése</string> <string name="load_more_results">További találatok betöltése</string>
<string name="local_time">Helyi idő: %1$s</string>
<string name="lock_conversation">Beszélgetés zárolása</string> <string name="lock_conversation">Beszélgetés zárolása</string>
<string name="lock_symbol">Zár szimbólum</string> <string name="lock_symbol">Zár szimbólum</string>
<string name="lower_hand">Kéz letétele</string> <string name="lower_hand">Kéz letétele</string>
@ -63,7 +85,9 @@
<string name="menu_item_sort_by_name_z_a">Z A</string> <string name="menu_item_sort_by_name_z_a">Z A</string>
<string name="menu_item_sort_by_size_biggest_first">Legnagyobb elöl</string> <string name="menu_item_sort_by_size_biggest_first">Legnagyobb elöl</string>
<string name="menu_item_sort_by_size_smallest_first">Legkisebb elöl</string> <string name="menu_item_sort_by_size_smallest_first">Legkisebb elöl</string>
<string name="message_copied">Üzenet másolva</string>
<string name="message_deleted_by_you">Törölte az üzenetet</string> <string name="message_deleted_by_you">Törölte az üzenetet</string>
<string name="message_last_edited_by">Szerkesztette: %1$s</string>
<string name="message_poll_tap_to_open">Koppintson a szavazás megnyitásához</string> <string name="message_poll_tap_to_open">Koppintson a szavazás megnyitásához</string>
<string name="message_search_begin_empty">Nincs találat</string> <string name="message_search_begin_empty">Nincs találat</string>
<string name="message_search_begin_typing">Kezdjen el gépelni a kereséshez…</string> <string name="message_search_begin_typing">Kezdjen el gépelni a kereséshez…</string>
@ -83,6 +107,7 @@
<string name="nc_all_ok_operation">Rendben, minden kész!</string> <string name="nc_all_ok_operation">Rendben, minden kész!</string>
<string name="nc_attendee_pin">PIN: %1$s</string> <string name="nc_attendee_pin">PIN: %1$s</string>
<string name="nc_biometric_unlock">%1$s feloldása</string> <string name="nc_biometric_unlock">%1$s feloldása</string>
<string name="nc_bluetooth_permission_hint">A bluetooth-os hangszórók engedélyezéséhez adja meg a „Közeli eszközök” engedélyt.</string>
<string name="nc_call_button_content_description_answer_video_call">Válasz videóhívásként</string> <string name="nc_call_button_content_description_answer_video_call">Válasz videóhívásként</string>
<string name="nc_call_button_content_description_answer_voice_only">Válasz csak hanghívásként</string> <string name="nc_call_button_content_description_answer_voice_only">Válasz csak hanghívásként</string>
<string name="nc_call_button_content_description_audio_output">Hangkimenet módosítása</string> <string name="nc_call_button_content_description_audio_output">Hangkimenet módosítása</string>
@ -102,11 +127,12 @@
<string name="nc_call_state_with_video">%1$s videóval</string> <string name="nc_call_state_with_video">%1$s videóval</string>
<string name="nc_call_timeout">Nincs válasz 45 másodpercen belül, koppintson az újrapróbálkozáshoz</string> <string name="nc_call_timeout">Nincs válasz 45 másodpercen belül, koppintson az újrapróbálkozáshoz</string>
<string name="nc_call_unknown">%s hívás</string> <string name="nc_call_unknown">%s hívás</string>
<string name="nc_call_video">%s videohívás</string> <string name="nc_call_video">%s videóhívás</string>
<string name="nc_call_voice">%s hanghívás</string> <string name="nc_call_voice">%s hanghívás</string>
<string name="nc_camera_permission_hint">A videohívás engedélyezéséhez meg kell adnia a „Kamera” engedélyt.</string> <string name="nc_camera_permission_hint">A videóhívás engedélyezéséhez adja meg a „Kamera” engedélyt.</string>
<string name="nc_cancel">Mégse</string> <string name="nc_cancel">Mégse</string>
<string name="nc_capabilities_failed">A lehetőségek lekérdezése sikertelen, megszakítás</string> <string name="nc_capabilities_failed">A lehetőségek lekérdezése sikertelen, megszakítás</string>
<string name="nc_caption">Felirat</string>
<string name="nc_certificate_dialog_text">Megbízik a(z) %1$s által a(z) %2$s részére kiállított, %3$s és %4$s között érvényes, korábban ismeretlen SSL tanúsítványban?</string> <string name="nc_certificate_dialog_text">Megbízik a(z) %1$s által a(z) %2$s részére kiállított, %3$s és %4$s között érvényes, korábban ismeretlen SSL tanúsítványban?</string>
<string name="nc_certificate_dialog_title">Ellenőrizze a tanúsítványt</string> <string name="nc_certificate_dialog_title">Ellenőrizze a tanúsítványt</string>
<string name="nc_certificate_error">Az SSL beállítás megakadályozta a kapcsolódást</string> <string name="nc_certificate_error">Az SSL beállítás megakadályozta a kapcsolódást</string>
@ -135,14 +161,16 @@
<string name="nc_contacts_done">Kész</string> <string name="nc_contacts_done">Kész</string>
<string name="nc_conversation_description">Beszélgetés leírása</string> <string name="nc_conversation_description">Beszélgetés leírása</string>
<string name="nc_conversation_menu_conversation_info">Beszélgetés információk</string> <string name="nc_conversation_menu_conversation_info">Beszélgetés információk</string>
<string name="nc_conversation_menu_video_call">Videohívás</string> <string name="nc_conversation_menu_video_call">Videóhívás</string>
<string name="nc_conversation_menu_voice_call">Hanghívás</string> <string name="nc_conversation_menu_voice_call">Hanghívás</string>
<string name="nc_conversation_not_found">Beszélgetés nem található</string>
<string name="nc_conversation_settings">Beszélgetésbeállítások</string> <string name="nc_conversation_settings">Beszélgetésbeállítások</string>
<string name="nc_conversations_empty">Csatlakozzon egy beszélgetéshez, vagy indítson egy újat</string> <string name="nc_conversations_empty">Csatlakozzon egy beszélgetéshez, vagy indítson egy újat</string>
<string name="nc_conversations_empty_details">Üdvözölje a barátait és munkatársait!</string> <string name="nc_conversations_empty_details">Üdvözölje a barátait és munkatársait!</string>
<string name="nc_copy_message">Másolás</string> <string name="nc_copy_message">Másolás</string>
<string name="nc_create_new_conversation">Új beszélgetés létrehozása</string> <string name="nc_create_new_conversation">Új beszélgetés létrehozása</string>
<string name="nc_create_poll">Szavazás létrehozása</string> <string name="nc_create_poll">Szavazás létrehozása</string>
<string name="nc_current_user">Ön:</string>
<string name="nc_date_header_today">Ma</string> <string name="nc_date_header_today">Ma</string>
<string name="nc_date_header_yesterday">Tegnap</string> <string name="nc_date_header_yesterday">Tegnap</string>
<string name="nc_delete">Törlés</string> <string name="nc_delete">Törlés</string>
@ -151,16 +179,23 @@
<string name="nc_delete_conversation_more">Ha törli a beszélgetést, akkor az összes többi résztvevő számára is törölve lesz.</string> <string name="nc_delete_conversation_more">Ha törli a beszélgetést, akkor az összes többi résztvevő számára is törölve lesz.</string>
<string name="nc_delete_message">Törlés</string> <string name="nc_delete_message">Törlés</string>
<string name="nc_delete_message_leaked_to_matterbridge">Az üzenet törlése sikeresen megtörtént, de lehet, hogy az már megjelent más szolgáltatásokon</string> <string name="nc_delete_message_leaked_to_matterbridge">Az üzenet törlése sikeresen megtörtént, de lehet, hogy az már megjelent más szolgáltatásokon</string>
<string name="nc_delete_now">Törlés most</string>
<string name="nc_deleted_user">%1$s felhasználó el lett távolítva</string>
<string name="nc_demote">Lefokozás moderátorról</string> <string name="nc_demote">Lefokozás moderátorról</string>
<string name="nc_description_record_voice">Hangüzenet felvétele</string> <string name="nc_description_record_voice">Hangüzenet felvétele</string>
<string name="nc_description_send_message_button">Üzenet küldése</string> <string name="nc_description_send_message_button">Üzenet küldése</string>
<string name="nc_diagnose_account_category_title">Jelenlegi fiók</string> <string name="nc_diagnose_account_category_title">Jelenlegi fiók</string>
<string name="nc_diagnose_account_server">Kiszolgáló</string> <string name="nc_diagnose_account_server">Kiszolgáló</string>
<string name="nc_diagnose_account_server_notification_app">A kiszolgálóértesítések alkalmazása telepítve van?</string>
<string name="nc_diagnose_account_user_name">Felhasználó</string> <string name="nc_diagnose_account_user_name">Felhasználó</string>
<string name="nc_diagnose_account_user_status_enabled">A felhasználói állapot engedélyezett?</string>
<string name="nc_diagnose_android_version_title">Android verzió</string> <string name="nc_diagnose_android_version_title">Android verzió</string>
<string name="nc_diagnose_app_category_title">Alkalmazás</string> <string name="nc_diagnose_app_category_title">Alkalmazás</string>
<string name="nc_diagnose_app_name_title">Alkalmazásnév</string> <string name="nc_diagnose_app_name_title">Alkalmazásnév</string>
<string name="nc_diagnose_app_users_amount">Regisztrált felhasználók</string> <string name="nc_diagnose_app_users_amount">Regisztrált felhasználók</string>
<string name="nc_diagnose_app_version_title">Alkalmazásverzió</string>
<string name="nc_diagnose_battery_optimization_ignored">Az akkumulátoroptimalizálás figyelmen kívül hagyva, minden rendben</string>
<string name="nc_diagnose_battery_optimization_not_ignored">Az akkumulátoroptimalizálás engedélyezve van, amely problémákat okozhat. Ajánlatos letiltani az akkumulátoroptimalizálást.</string>
<string name="nc_diagnose_battery_optimization_title">Akkumulátorbeállítások</string> <string name="nc_diagnose_battery_optimization_title">Akkumulátorbeállítások</string>
<string name="nc_diagnose_device_name_title">Eszköz</string> <string name="nc_diagnose_device_name_title">Eszköz</string>
<string name="nc_diagnose_phone_category_title">Telefon</string> <string name="nc_diagnose_phone_category_title">Telefon</string>
@ -278,9 +313,9 @@
<string name="nc_participants">Résztvevők</string> <string name="nc_participants">Résztvevők</string>
<string name="nc_participants_add">Résztvevők hozzáadása</string> <string name="nc_participants_add">Résztvevők hozzáadása</string>
<string name="nc_password">Jelszó</string> <string name="nc_password">Jelszó</string>
<string name="nc_permissions_ask">Jogosultságok beállításaa</string> <string name="nc_permissions_ask">Engedélyek beállítása</string>
<string name="nc_permissions_denied">Néhány jogosultság meg lett tagadva.</string> <string name="nc_permissions_denied">Néhány engedély meg lett tagadva.</string>
<string name="nc_permissions_rationale_dialog_title">Engedélyezzen jogosultságokat</string> <string name="nc_permissions_rationale_dialog_title">Adja meg az engedélyeket</string>
<string name="nc_permissions_settings">Beállítások megnyitása</string> <string name="nc_permissions_settings">Beállítások megnyitása</string>
<string name="nc_permissions_settings_hint">Adjon engedélyt a Beállítások > Engedélyek menüpontban</string> <string name="nc_permissions_settings_hint">Adjon engedélyt a Beállítások > Engedélyek menüpontban</string>
<string name="nc_phone_book_integration_account_not_found">A fiók nem található</string> <string name="nc_phone_book_integration_account_not_found">A fiók nem található</string>
@ -349,7 +384,7 @@
<string name="nc_settings_notification_sounds_post_oreo">Értesítések</string> <string name="nc_settings_notification_sounds_post_oreo">Értesítések</string>
<string name="nc_settings_other_notifications_ringtone">Üzenetek</string> <string name="nc_settings_other_notifications_ringtone">Üzenetek</string>
<string name="nc_settings_phone_book_integration_desc">Párosítsa a névjegyeket telefonszám alapján, hogy integrálja a Beszélgetéseket a rendszer Névjegyek alkalmazásba</string> <string name="nc_settings_phone_book_integration_desc">Párosítsa a névjegyeket telefonszám alapján, hogy integrálja a Beszélgetéseket a rendszer Névjegyek alkalmazásba</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_429">429-es hiba Túl Sok Kérés</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_429">429-es hiba Túl sok kérés</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_description">Beállíthatja telefonszámát, hogy a többi felhasználó megtalálja Önt</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_description">Beállíthatja telefonszámát, hogy a többi felhasználó megtalálja Önt</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_edit_text_hint">Írja be a telefonszámot</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_edit_text_hint">Írja be a telefonszámot</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_invalid">Érvénytelen telefonszám-formátum</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_invalid">Érvénytelen telefonszám-formátum</string>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Wybierz certyfikat uwierzytelnienia</string> <string name="nc_configure_cert_auth">Wybierz certyfikat uwierzytelnienia</string>
<string name="nc_connecting_call">Łączę…</string> <string name="nc_connecting_call">Łączę…</string>
<string name="nc_contacts_done">Gotowe</string> <string name="nc_contacts_done">Gotowe</string>
<string name="nc_conversation_auto_delete_notice">Ta konwersacja zostanie automatycznie usunięta dla wszystkich po %1$d dniach braku aktywności.</string>
<string name="nc_conversation_description">Opis rozmowy</string> <string name="nc_conversation_description">Opis rozmowy</string>
<string name="nc_conversation_menu_conversation_info">Informacje o rozmowie</string> <string name="nc_conversation_menu_conversation_info">Informacje o rozmowie</string>
<string name="nc_conversation_menu_video_call">Rozmowa wideo</string> <string name="nc_conversation_menu_video_call">Rozmowa wideo</string>
@ -397,6 +396,8 @@
<string name="nc_screen_lock_timeout_three_hundred">300</string> <string name="nc_screen_lock_timeout_three_hundred">300</string>
<string name="nc_search">Szukaj</string> <string name="nc_search">Szukaj</string>
<string name="nc_select_an_account">Wybierz konto</string> <string name="nc_select_an_account">Wybierz konto</string>
<string name="nc_sensitive_conversation">Rozmowa poufna</string>
<string name="nc_sensitive_conversation_hint">Podgląd wiadomości zostanie wyłączony na liście rozmów i w powiadomieniach.</string>
<string name="nc_sent_a_gif" formatted="true">%1$s wysłał GIF.</string> <string name="nc_sent_a_gif" formatted="true">%1$s wysłał GIF.</string>
<string name="nc_sent_a_gif_you">Wysłałeś GIF.</string> <string name="nc_sent_a_gif_you">Wysłałeś GIF.</string>
<string name="nc_sent_a_video" formatted="true">%1$s wysłał plik wideo.</string> <string name="nc_sent_a_video" formatted="true">%1$s wysłał plik wideo.</string>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Selecionar certificado de autenticação</string> <string name="nc_configure_cert_auth">Selecionar certificado de autenticação</string>
<string name="nc_connecting_call">Conectando …</string> <string name="nc_connecting_call">Conectando …</string>
<string name="nc_contacts_done">Concluído</string> <string name="nc_contacts_done">Concluído</string>
<string name="nc_conversation_auto_delete_notice">Esta conversa será excluída automaticamente para todos em %1$d dias sem atividade</string>
<string name="nc_conversation_description">Descrição da conversa</string> <string name="nc_conversation_description">Descrição da conversa</string>
<string name="nc_conversation_menu_conversation_info">Informação da conversa</string> <string name="nc_conversation_menu_conversation_info">Informação da conversa</string>
<string name="nc_conversation_menu_video_call">Chamada de vídeo</string> <string name="nc_conversation_menu_video_call">Chamada de vídeo</string>
@ -313,7 +312,7 @@
<string name="nc_mark_conversation_as_important">Conversa marcada como importante</string> <string name="nc_mark_conversation_as_important">Conversa marcada como importante</string>
<string name="nc_mark_conversation_as_insensitive">Conversa desmarcada como sensível</string> <string name="nc_mark_conversation_as_insensitive">Conversa desmarcada como sensível</string>
<string name="nc_mark_conversation_as_sensitive">Conversa marcada como sensível</string> <string name="nc_mark_conversation_as_sensitive">Conversa marcada como sensível</string>
<string name="nc_mark_conversation_as_unimportant">Conversa não marcada como importante</string> <string name="nc_mark_conversation_as_unimportant">Conversa desmarcada como importante</string>
<string name="nc_meeting_ended">Reunião encerrada</string> <string name="nc_meeting_ended">Reunião encerrada</string>
<string name="nc_message_added_to_notes">Mensagem adicionada às notas</string> <string name="nc_message_added_to_notes">Mensagem adicionada às notas</string>
<string name="nc_message_failed">Falhou</string> <string name="nc_message_failed">Falhou</string>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">Одабери сертификат за пријаву</string> <string name="nc_configure_cert_auth">Одабери сертификат за пријаву</string>
<string name="nc_connecting_call">Повезивање ..</string> <string name="nc_connecting_call">Повезивање ..</string>
<string name="nc_contacts_done">Готово</string> <string name="nc_contacts_done">Готово</string>
<string name="nc_conversation_auto_delete_notice">Овај разговор ће се аутоматски обрисати за све након %1$d дана неактивности</string>
<string name="nc_conversation_description">Опис разговора</string> <string name="nc_conversation_description">Опис разговора</string>
<string name="nc_conversation_menu_conversation_info">Информације о разговору</string> <string name="nc_conversation_menu_conversation_info">Информације о разговору</string>
<string name="nc_conversation_menu_video_call">Видео позив</string> <string name="nc_conversation_menu_video_call">Видео позив</string>

View File

@ -158,7 +158,6 @@
<string name="nc_configure_cert_auth">Välj autentiseringscertifikat</string> <string name="nc_configure_cert_auth">Välj autentiseringscertifikat</string>
<string name="nc_connecting_call">Ansluter…</string> <string name="nc_connecting_call">Ansluter…</string>
<string name="nc_contacts_done">Färdig</string> <string name="nc_contacts_done">Färdig</string>
<string name="nc_conversation_auto_delete_notice">Den här konversationen kommer automatiskt att tas bort för alla om %1$d dagar utan aktivitet</string>
<string name="nc_conversation_description">Konversationsbeskrivning</string> <string name="nc_conversation_description">Konversationsbeskrivning</string>
<string name="nc_conversation_menu_conversation_info">Konversationsinfo</string> <string name="nc_conversation_menu_conversation_info">Konversationsinfo</string>
<string name="nc_conversation_menu_video_call">Videosamtal</string> <string name="nc_conversation_menu_video_call">Videosamtal</string>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">選擇驗證證書</string> <string name="nc_configure_cert_auth">選擇驗證證書</string>
<string name="nc_connecting_call">連線中 …</string> <string name="nc_connecting_call">連線中 …</string>
<string name="nc_contacts_done">完成</string> <string name="nc_contacts_done">完成</string>
<string name="nc_conversation_auto_delete_notice">此對話如無人於%1$d天內互動將會自動為所有人刪除。</string>
<string name="nc_conversation_description">對話描述</string> <string name="nc_conversation_description">對話描述</string>
<string name="nc_conversation_menu_conversation_info">對話資訊</string> <string name="nc_conversation_menu_conversation_info">對話資訊</string>
<string name="nc_conversation_menu_video_call">視訊通話</string> <string name="nc_conversation_menu_video_call">視訊通話</string>

View File

@ -159,7 +159,6 @@
<string name="nc_configure_cert_auth">選擇驗證憑證</string> <string name="nc_configure_cert_auth">選擇驗證憑證</string>
<string name="nc_connecting_call">連線中 …</string> <string name="nc_connecting_call">連線中 …</string>
<string name="nc_contacts_done">完成</string> <string name="nc_contacts_done">完成</string>
<string name="nc_conversation_auto_delete_notice">%1$d天內沒有活動的每個人都會自動刪除此對話。</string>
<string name="nc_conversation_description">對話描述</string> <string name="nc_conversation_description">對話描述</string>
<string name="nc_conversation_menu_conversation_info">對話資訊</string> <string name="nc_conversation_menu_conversation_info">對話資訊</string>
<string name="nc_conversation_menu_video_call">視訊通話</string> <string name="nc_conversation_menu_video_call">視訊通話</string>
@ -544,6 +543,7 @@
<string name="online_status">線上狀態</string> <string name="online_status">線上狀態</string>
<string name="openConversations">開啟對話</string> <string name="openConversations">開啟對話</string>
<string name="open_in_files_app">在「檔案」應用程式中開啟</string> <string name="open_in_files_app">在「檔案」應用程式中開啟</string>
<string name="open_notes">開啟筆記</string>
<string name="play_pause_voice_message">播放/暫停語音訊息</string> <string name="play_pause_voice_message">播放/暫停語音訊息</string>
<string name="playback_speed_control">播放速度控制</string> <string name="playback_speed_control">播放速度控制</string>
<string name="polls_add_option">新增選項</string> <string name="polls_add_option">新增選項</string>
@ -680,6 +680,9 @@
<plurals name="see_similar_system_messages"> <plurals name="see_similar_system_messages">
<item quantity="other">檢視 %d 則類似的訊息</item> <item quantity="other">檢視 %d 則類似的訊息</item>
</plurals> </plurals>
<plurals name="nc_conversation_auto_delete_info">
<item quantity="other">此對話若於%1$d天內沒有活動將會自動為所有人刪除</item>
</plurals>
<plurals name="polls_amount_voters"> <plurals name="polls_amount_voters">
<item quantity="other">%d 票</item> <item quantity="other">%d 票</item>
</plurals> </plurals>

View File

@ -520,12 +520,11 @@ How to translate with transifex:
<string name="nc_forward_message">Forward</string> <string name="nc_forward_message">Forward</string>
<string name="nc_reply">Reply</string> <string name="nc_reply">Reply</string>
<string name="nc_reply_privately">Reply privately</string> <string name="nc_reply_privately">Reply privately</string>
<string name="nc_delete_message">Delete</string> <plurals name="nc_conversation_auto_delete_info">
<plurals name="nc_conversation_auto_delete_notice">
<item quantity="one">This conversation will be automatically deleted for everyone in %1$d day of no activity</item> <item quantity="one">This conversation will be automatically deleted for everyone in %1$d day of no activity</item>
<item quantity="other">This conversation will be automatically deleted for everyone in %1$d days of no activity</item> <item quantity="other">This conversation will be automatically deleted for everyone in %1$d days of no activity</item>
</plurals> </plurals>
<string name="nc_conversation_auto_delete_notice">This conversation will be automatically deleted for everyone in %1$d days of no activity</string> <string name="nc_delete_message">Delete</string>
<string name="nc_delete_now">Delete now</string> <string name="nc_delete_now">Delete now</string>
<string name="nc_keep">Keep</string> <string name="nc_keep">Keep</string>
<string name="nc_delete_message_leaked_to_matterbridge">Message deleted successfully, but it might have been leaked to other services</string> <string name="nc_delete_message_leaked_to_matterbridge">Message deleted successfully, but it might have been leaked to other services</string>