Compare commits

..

76 Commits

Author SHA1 Message Date
Nextcloud bot
0eebf8b2d0
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-19 03:07:37 +00:00
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
Nextcloud Android Bot
d0ff4320a8 Weekly 22.0.0 Alpha 06 2025-06-16 03:11:01 +00:00
Marcel Hibbe
20b70c2728
Merge pull request #5032 from nextcloud/issue-5016-app-shortcuts
Adding a short cut to note-to-self
2025-06-13 17:24:48 +00:00
Marcel Hibbe
6aab2e27cd
Merge pull request #5053 from nextcloud/issue-5051-seekbar-illegal-state-exception
Better null and error handling when playing voice messages
2025-06-13 12:44:44 +00:00
Marcel Hibbe
a34ad80a90
remove comment
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-13 14:14:06 +02:00
rapterjet2004
5a22f27b64
Adding a Short cut to note-to-self
Translations, and focuses on edittext upon opening

Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
2025-06-13 13:43:00 +02:00
Nextcloud bot
776ba77c3a
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-13 03:04:33 +00:00
Andy Scherzinger
3cf01d9123
Merge pull request #5056 from nextcloud/repo-sync/android-config/master
🔄 synced file(s) with nextcloud/android-config
2025-06-12 07:28:45 +02:00
nextcloud-android-bot
2ab9f168d2 🔄 synced local '.github/workflows/' with remote 'config/workflows/'
Signed-off-by: nextcloud-android-bot <android@nextcloud.com>
2025-06-12 03:14:09 +00:00
github-actions[bot]
038a30dcca
Merge pull request #5055 from nextcloud/renovate/com.github.spotbugs.snom-spotbugs-gradle-plugin-6.x
fix(deps): update dependency com.github.spotbugs.snom:spotbugs-gradle-plugin to v6.2.0
2025-06-11 10:53:34 +02:00
github-actions[bot]
ddc40537d5
Merge pull request #5054 from nextcloud/renovate/ksp-monorepo
chore(deps): update plugin com.google.devtools.ksp to v2.1.21-2.0.2
2025-06-11 10:53:07 +02:00
renovate[bot]
bd23a05a88
fix(deps): update dependency com.github.spotbugs.snom:spotbugs-gradle-plugin to v6.2.0
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 07:21:21 +00:00
renovate[bot]
76f1e1c005
chore(deps): update plugin com.google.devtools.ksp to v2.1.21-2.0.2
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 07:17:38 +00:00
Nextcloud bot
40c9816827
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-11 03:07:38 +00:00
rapterjet2004
a7f742931e
better null and error handling in the seekbar update observer
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
2025-06-10 11:20:42 -05:00
Marcel Hibbe
a361240692
Merge pull request #5050 from nextcloud/ci/noid/metaData
ci(chksm): Add meta-data
2025-06-10 10:21:50 +00:00
Andy Scherzinger
fe6897baf4
ci(chksm): Add meta-data
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-06-10 11:46:53 +02:00
Nextcloud bot
18578521cf
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-10 03:05:47 +00:00
Nextcloud Android Bot
4b71c50fb2 Weekly 22.0.0 Alpha 05 2025-06-09 03:23:12 +00:00
github-actions[bot]
7ec7904691
Merge pull request #5047 from nextcloud/renovate/junit5-monorepo
fix(deps): update dependency org.junit.vintage:junit-vintage-engine to v5.13.1
2025-06-08 20:20:57 +02:00
github-actions[bot]
34992438ed
Merge pull request #5046 from nextcloud/renovate/com.mebigfatguy.fb-contrib-fb-contrib-7.x
fix(deps): update dependency com.mebigfatguy.fb-contrib:fb-contrib to v7.6.10
2025-06-08 20:17:24 +02:00
github-actions[bot]
af721510e1
Merge pull request #5045 from nextcloud/renovate/androidx.appcompat-appcompat-1.x
fix(deps): update dependency androidx.appcompat:appcompat to v1.7.1
2025-06-08 20:04:51 +02:00
renovate[bot]
393c70f6e6
fix(deps): update dependency org.junit.vintage:junit-vintage-engine to v5.13.1
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 17:57:26 +00:00
renovate[bot]
d28bcbd5e9
fix(deps): update dependency com.mebigfatguy.fb-contrib:fb-contrib to v7.6.10
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 17:56:11 +00:00
renovate[bot]
03e3737e69
fix(deps): update dependency androidx.appcompat:appcompat to v1.7.1
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 17:52:40 +00:00
github-actions[bot]
a5fe9ec133
Merge pull request #5044 from nextcloud/renovate/gradle-8.x
chore(deps): update dependency gradle to v8.14.2
2025-06-08 17:20:36 +00:00
renovate[bot]
6633ae223c
chore(deps): update dependency gradle to v8.14.2
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 16:43:20 +00:00
Andy Scherzinger
1dd9d6ba7b
Merge pull request #5043 from nextcloud/renovate/ubuntu-noble
chore(deps): update ubuntu:noble docker digest to b59d215
2025-06-08 17:53:21 +02:00
renovate[bot]
1a00678e46
chore(deps): update ubuntu:noble docker digest to b59d215
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 15:52:12 +00:00
github-actions[bot]
77944b4367
Merge pull request #4993 from nextcloud/renovate/retrofit-monorepo
fix(deps): update retrofit monorepo to v2.12.0
2025-06-08 15:35:04 +00:00
Andy Scherzinger
9b889ef751
ci(lint): Bump score to reflect main branch state
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-06-08 16:57:57 +02:00
Andy Scherzinger
ccecb9005c
ci(chksm): Add meta-data
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-06-08 16:15:26 +02:00
renovate[bot]
ccb700376a
fix(deps): update retrofit monorepo to v2.12.0
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-08 16:00:22 +02:00
Nextcloud bot
f574359432
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-08 03:05:03 +00:00
Andy Scherzinger
ba690c0615
Merge pull request #5040 from nextcloud/repo-sync/android-config/master
🔄 synced file(s) with nextcloud/android-config
2025-06-07 08:13:45 +02:00
nextcloud-android-bot
ccf955f43e 🔄 synced local '.github/workflows/' with remote 'config/workflows/'
Signed-off-by: nextcloud-android-bot <android@nextcloud.com>
2025-06-07 03:11:25 +00:00
Nextcloud bot
856b1ebf8c
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-07 03:03:38 +00:00
Nextcloud bot
b1448e13b5
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-06 03:12:36 +00:00
Marcel Hibbe
224eb3d0e8
update changelog for v21.1.0
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-05 12:38:49 +02:00
Nextcloud bot
4158628475
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-05 03:07:45 +00:00
Sowjanya Kota
e88bd1caf7
Merge pull request #5035 from nextcloud/bugfix/4983/fixCrashForHttp405ForProfileData
Profile data in ConversationInfo: catch http 405 if endpoint is not available
2025-06-04 13:43:59 +02:00
Marcel Hibbe
27ba2acf86
catch http 405 if endpoint is not available.
E.g. for older server versions

Without this fix there would be the crash:

 E  FATAL EXCEPTION: main
 Process: com.nextcloud.talk2, PID: 7161
  retrofit2.HttpException: HTTP 405
  at retrofit2.KotlinExtensions$await$2$2.onResponse(KotlinExtensions.kt:53)
  at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:164)
  at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
  at java.lang.Thread.run(Thread.java:1012)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@4a67b41, Dispatchers.Main.immediate]

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-04 13:10:42 +02:00
Marcel Hibbe
4efba2b953
Merge pull request #5028 from nextcloud/ui_enhancements
UI improvements to automatic conversation deletion information for event, sip and instant meetings conversation
2025-06-04 07:51:27 +00:00
Marcel Hibbe
f64e9e7c66
Merge pull request #5030 from nextcloud/issue-5018-dark-mode-bug-fix
Fixes message timestamp color
2025-06-04 07:35:54 +00:00
Nextcloud bot
6cd8718ac8
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-04 03:06:30 +00:00
Marcel Hibbe
eb72c70520
Merge pull request #5024 from nextcloud/fixToNotShowContextSearchAccidentally
simplify how search results are shown
2025-06-03 17:24:12 +00:00
rapterjet2004
ca06333c48
Fixes message timestamp color
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
2025-06-03 12:09:52 -05:00
Sowjanya Kota
325ffc4443
Merge pull request #5023 from nextcloud/fixCanDeleteCanLeaveForConvMenu
Fix & rearrange options in conversation button menu
2025-06-03 18:50:22 +02:00
sowjanyakch
89bddbd8fd
format
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2025-06-03 18:35:10 +02:00
sowjanyakch
de62d2776c
remove menu item after pressing keep button
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2025-06-03 18:35:10 +02:00
sowjanyakch
9aa1622929
popup menu color
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2025-06-03 18:35:10 +02:00
sowjanyakch
9dbb7ab703
consistent color to text and icon
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2025-06-03 18:35:09 +02:00
Marcel Hibbe
8307a9a0df
Merge pull request #5020 from nextcloud/mentions_complete
Include mentions in the attachments
2025-06-03 12:24:16 +00:00
Marcel Hibbe
a354ca197e
simplify how search results are shown
1. reverting changes from commit 971cc79b76. The scroll to methods are used in other places and a user reported that the search window suddenly opened without to search.
2. remove checkIfMessageIsSaved method. If the message is saved or not does not matter. The only fact for "scroll to" would be that it's loaded in the adapter.
3. As the adapter is always null with the current implementation (when coming back from the first search window), the "scroll to" is replaced with the startContextChatWindowForMessage. This could be changed again when adapter is not null anymore after coming back from the other screen...

startContextChatWindowForMessage

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-03 14:10:07 +02:00
Marcel Hibbe
12cb0825ca
show "Archive conversation" just before Leave & Delete
same as for web/iOS

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-03 12:17:32 +02:00
Marcel Hibbe
cc8e241213
show "Delete conversation" as last entry
same as for web/iOS

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-03 12:16:16 +02:00
Marcel Hibbe
14fd9b4af8
rely on conversationOperationLeave to show "Leave conversation" button
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-03 12:12:04 +02:00
Marcel Hibbe
9fe39603c3
rely on canDeleteConversation to show "Delete conversation" button
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2025-06-03 12:09:50 +02:00
Nextcloud bot
707371603d
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-03 03:05:04 +00:00
sowjanyakch
632a26d3cb
format
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2025-06-02 15:28:50 +02:00
sowjanyakch
262205b615
Include mentions in the attachments
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
2025-06-02 14:59:32 +02:00
Nextcloud bot
131723317b
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-02 03:39:23 +00: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
69 changed files with 2341 additions and 253 deletions

View File

@ -1,4 +1,4 @@
FROM ubuntu:noble@sha256:6015f66923d7afbc53558d7ccffd325d43b4e249f41a6e93eef074c9505d2233 FROM ubuntu:noble@sha256:b59d21599a2b151e23eea5f6602f4af4d7d31c4e236d22bf0b62b86d2e386b8f
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
ENV ANDROID_HOME=/usr/lib/android-sdk ENV ANDROID_HOME=/usr/lib/android-sdk

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

@ -43,7 +43,7 @@ jobs:
with: with:
swap-size-gb: 10 swap-size-gb: 10
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
- name: Set up JDK 17 - name: Set up JDK 17
@ -57,4 +57,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@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0

View File

@ -36,7 +36,7 @@ jobs:
blocklist=$(curl https://raw.githubusercontent.com/nextcloud/.github/master/non-community-usernames.txt | paste -s -d, -) blocklist=$(curl https://raw.githubusercontent.com/nextcloud/.github/master/non-community-usernames.txt | paste -s -d, -)
echo "blocklist=$blocklist" >> "$GITHUB_OUTPUT" echo "blocklist=$blocklist" >> "$GITHUB_OUTPUT"
- uses: nextcloud/pr-feedback-action@1883b38a033fb16f576875e0cf45f98b857655c4 # main - uses: nextcloud/pr-feedback-action@f0cab224dea8e1f282f9451de322f323c78fc7a5 # main
with: with:
feedback-message: | feedback-message: |
Hello there, Hello there,

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@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 uses: github/codeql-action/upload-sarif@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
with: with:
sarif_file: results.sarif sarif_file: results.sarif

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

@ -9,6 +9,36 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
Types of changes can be: Added/Changed/Deprecated/Removed/Fixed/Security Types of changes can be: Added/Changed/Deprecated/Removed/Fixed/Security
## [21.1.0] - 2025-06-05
### Added
- Allow adding participants to one-to-one chats creating a new conversation
- Handling of event conversations
- Show info about participant (organization, role, timezone, ...) in 1:1 conversation info screen
- Added gallery option in chat attachment menu (access photos and videos with one click without giving permissions)
- Add self-test button for push notifications in diagnosis screen
- Edit checkbox in chat messages
- Team mentions in chat
- Add option to mark a conversation as sensitive
- Allow bluetooth headset to be discovered and used during a call (@gavine99)
### Changed
- Design of participants grid in call
- Improve subline in conversations screen when last message is attachment
- Improve message search
- In search window, show messages at last
- Switch video capture for calls between 4:3 and 16:9 ratio depending on portrait/ landscape mode
### Fixed
- Crashes
- Videos in videocall lost after app comes back to foreground
- Open conversations not being shown in search
- Minor bugs (@MmAaXx500)
Minimum: NC 17 Server, Android 8.0 Oreo
For a full list, please see https://github.com/nextcloud/talk-android/milestone/94?closed=1
## [21.0.1] - 2025-04-15 ## [21.0.1] - 2025-04-15
### Fixed ### Fixed

View File

@ -15,7 +15,7 @@ import com.github.spotbugs.snom.SpotBugsTask
plugins { plugins {
id "org.jetbrains.kotlin.plugin.compose" version "2.1.21" id "org.jetbrains.kotlin.plugin.compose" version "2.1.21"
id "org.jetbrains.kotlin.kapt" id "org.jetbrains.kotlin.kapt"
id 'com.google.devtools.ksp' version '2.1.21-2.0.1' id 'com.google.devtools.ksp' version '2.1.21-2.0.2'
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
@ -39,8 +39,8 @@ android {
// mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable)
// xx .xxx .xx .xx // xx .xxx .xx .xx
versionCode 220000004 versionCode 220000006
versionName "22.0.0 Alpha 04" versionName "22.0.0 Alpha 06"
flavorDimensions "default" flavorDimensions "default"
renderscriptTargetApi 19 renderscriptTargetApi 19
@ -161,7 +161,7 @@ ext {
materialDialogsVersion = "3.3.0" materialDialogsVersion = "3.3.0"
parcelerVersion = "1.1.13" parcelerVersion = "1.1.13"
prismVersion = "2.0.0" prismVersion = "2.0.0"
retrofit2Version = "2.11.0" retrofit2Version = "2.12.0"
roomVersion = "2.7.1" roomVersion = "2.7.1"
workVersion = "2.9.1" workVersion = "2.9.1"
espressoVersion = "3.6.1" espressoVersion = "3.6.1"
@ -180,7 +180,7 @@ configurations.configureEach {
dependencies { dependencies {
spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.14.0' spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.14.0'
spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.9' spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.10'
detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.8") detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.8")
implementation("androidx.compose.runtime:runtime:1.7.8") implementation("androidx.compose.runtime:runtime:1.7.8")
@ -193,7 +193,7 @@ dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1" implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1"
implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.12.0' implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation "com.vanniktech:emoji-google:0.21.0" implementation "com.vanniktech:emoji-google:0.21.0"
@ -347,7 +347,7 @@ dependencies {
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion" testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version" testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
testImplementation 'org.junit.vintage:junit-vintage-engine:5.13.0' testImplementation 'org.junit.vintage:junit-vintage-engine:5.13.1'
} }
tasks.register('installGitHooks', Copy) { tasks.register('installGitHooks', Copy) {

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

@ -286,6 +286,7 @@ class WebViewLoginActivity : BaseActivity() {
} }
} }
@SuppressLint("DiscouragedPrivateApi")
@Suppress("Detekt.TooGenericExceptionCaught") @Suppress("Detekt.TooGenericExceptionCaught")
override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) { override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
try { try {

View File

@ -431,9 +431,9 @@ class ConversationItem(
) )
return lastMessage return lastMessage
} else if (MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == chatMessage?.getCalculateMessageType()) { } else if (MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == chatMessage?.getCalculateMessageType()) {
var attachmentName = chatMessage.message var attachmentName = chatMessage.text
if (attachmentName == "{file}") { if (attachmentName == "{file}") {
attachmentName = chatMessage.messageParameters?.get("file")?.get("name") attachmentName = chatMessage.messageParameters?.get("file")?.get("name") ?: ""
} }
val author = authorName(chatMessage) val author = authorName(chatMessage)

View File

@ -20,6 +20,7 @@ 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.talk.R 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
@ -157,7 +158,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
binding.messageEditIndicator.visibility = View.GONE binding.messageEditIndicator.visibility = View.GONE
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
} }
binding.messageTime.setTextColor(ContextCompat.getColor(context, R.color.no_emphasis_text)) viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
// parent message handling // parent message handling
if (!message.isDeleted && message.parentMessageId != null) { if (!message.isDeleted && message.parentMessageId != null) {
processParentMessage(message) processParentMessage(message)

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
@ -105,7 +106,6 @@ class OutcomingTextMessageViewHolder(itemView: View) :
if (!hasCheckboxes) { if (!hasCheckboxes) {
realView.isSelected = false realView.isSelected = false
layoutParams.isWrapBefore = false layoutParams.isWrapBefore = false
viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
binding.messageText.visibility = View.VISIBLE binding.messageText.visibility = View.VISIBLE
binding.checkboxContainer.visibility = View.GONE binding.checkboxContainer.visibility = View.GONE
@ -172,7 +172,7 @@ class OutcomingTextMessageViewHolder(itemView: View) :
binding.messageEditIndicator.visibility = View.GONE binding.messageEditIndicator.visibility = View.GONE
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp)
} }
binding.messageTime.setTextColor(ContextCompat.getColor(context, R.color.no_emphasis_text)) viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT)
setBubbleOnChatMessage(message) setBubbleOnChatMessage(message)
// parent message handling // parent message handling
if (!message.isDeleted && message.parentMessageId != null) { if (!message.isDeleted && message.parentMessageId != null) {
@ -185,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

@ -6,6 +6,7 @@
*/ */
package com.nextcloud.talk.bottomsheet.items package com.nextcloud.talk.bottomsheet.items
import android.annotation.SuppressLint
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
@ -65,6 +66,7 @@ internal class ListIconDialogAdapter<IT : ListItemWithImage>(
} }
} }
@SuppressLint("RestrictedApi")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemViewHolder {
val listItemView: View = parent.inflate(dialog.windowContext, R.layout.menu_item_sheet) val listItemView: View = parent.inflate(dialog.windowContext, R.layout.menu_item_sheet)
val viewHolder = ListItemViewHolder( val viewHolder = ListItemViewHolder(

View File

@ -16,7 +16,6 @@ package com.nextcloud.talk.chat
import android.Manifest import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
@ -276,6 +275,8 @@ class ChatActivity :
lateinit var conversationInfoViewModel: ConversationInfoViewModel lateinit var conversationInfoViewModel: ConversationInfoViewModel
lateinit var messageInputViewModel: MessageInputViewModel lateinit var messageInputViewModel: MessageInputViewModel
private var chatMenu: Menu? = null
private val startSelectContactForResult = registerForActivityResult( private val startSelectContactForResult = registerForActivityResult(
ActivityResultContracts ActivityResultContracts
.StartActivityForResult() .StartActivityForResult()
@ -307,16 +308,11 @@ class ChatActivity :
runBlocking { runBlocking {
val id = intent?.getStringExtra(MessageSearchActivity.RESULT_KEY_MESSAGE_ID) val id = intent?.getStringExtra(MessageSearchActivity.RESULT_KEY_MESSAGE_ID)
id?.let { id?.let {
val isSaved = chatViewModel.isMessageSaved(id.toLong())
if (isSaved) {
onMessageSearchResult(intent)
} else {
startContextChatWindowForMessage(id) startContextChatWindowForMessage(id)
} }
} }
} }
} }
}
private fun startContextChatWindowForMessage(id: String?) { private fun startContextChatWindowForMessage(id: String?) {
binding.genericComposeView.apply { binding.genericComposeView.apply {
@ -366,6 +362,7 @@ class ChatActivity :
var startCallFromRoomSwitch: Boolean = false var startCallFromRoomSwitch: Boolean = false
var voiceOnly: Boolean = true var voiceOnly: Boolean = true
var focusInput: Boolean = false
private lateinit var path: String private lateinit var path: String
var myFirstMessage: CharSequence? = null var myFirstMessage: CharSequence? = null
@ -549,6 +546,8 @@ class ChatActivity :
startCallFromRoomSwitch = extras?.getBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, false) == true startCallFromRoomSwitch = extras?.getBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, false) == true
voiceOnly = extras?.getBoolean(KEY_CALL_VOICE_ONLY, false) == true voiceOnly = extras?.getBoolean(KEY_CALL_VOICE_ONLY, false) == true
focusInput = extras?.getBoolean(BundleKeys.KEY_FOCUS_INPUT) == true
} }
override fun onStart() { override fun onStart() {
@ -640,12 +639,17 @@ class ChatActivity :
supportFragmentManager.commit { supportFragmentManager.commit {
setReorderingAllowed(true) // optimizes out redundant replace operations setReorderingAllowed(true) // optimizes out redundant replace operations
replace(R.id.fragment_container_activity_chat, messageInputFragment) replace(R.id.fragment_container_activity_chat, messageInputFragment)
runOnCommit {
if (focusInput) {
messageInputFragment.binding.fragmentMessageInputView.requestFocus()
}
}
} }
joinRoomWithPassword() joinRoomWithPassword()
if (conversationUser?.userId != "?" && if (conversationUser?.userId != "?" &&
CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.MENTION_FLAG) hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.MENTION_FLAG)
) { ) {
binding.chatToolbar.setOnClickListener { _ -> showConversationInfoScreen() } binding.chatToolbar.setOnClickListener { _ -> showConversationInfoScreen() }
} }
@ -1102,6 +1106,8 @@ class ChatActivity :
context.getString(R.string.nc_room_retention), context.getString(R.string.nc_room_retention),
Snackbar.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
chatMenu?.removeItem(R.id.conversation_event)
} }
is ChatViewModel.UnbindRoomUiState.Error -> { is ChatViewModel.UnbindRoomUiState.Error -> {
Snackbar.make( Snackbar.make(
@ -1237,11 +1243,17 @@ class ChatActivity :
bringToFront() bringToFront()
} }
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)
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(
binding.conversationDeleteNotice
.findViewById<MaterialButton>(R.id.keep_button)
)
if (ConversationUtils.isParticipantOwnerOrModerator(currentConversation!!)) { if (ConversationUtils.isParticipantOwnerOrModerator(currentConversation!!)) {
binding.conversationDeleteNotice.findViewById<MaterialButton>(R.id.delete_now_button).visibility = binding.conversationDeleteNotice.findViewById<MaterialButton>(R.id.delete_now_button).visibility =
@ -2042,7 +2054,7 @@ class ChatActivity :
private fun shouldShowLobby(): Boolean { private fun shouldShowLobby(): Boolean {
if (currentConversation != null) { if (currentConversation != null) {
return CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.WEBINARY_LOBBY) && return hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.WEBINARY_LOBBY) &&
currentConversation?.lobbyState == ConversationEnums.LobbyState.LOBBY_STATE_MODERATORS_ONLY && currentConversation?.lobbyState == ConversationEnums.LobbyState.LOBBY_STATE_MODERATORS_ONLY &&
!ConversationUtils.canModerate(currentConversation!!, spreedCapabilities) && !ConversationUtils.canModerate(currentConversation!!, spreedCapabilities) &&
!participantPermissions.canIgnoreLobby() !participantPermissions.canIgnoreLobby()
@ -2297,15 +2309,8 @@ class ChatActivity :
} }
} }
private fun onMessageSearchResult(intent: Intent?) {
val messageId = intent?.getStringExtra(MessageSearchActivity.RESULT_KEY_MESSAGE_ID)
messageId?.let { id ->
scrollToAndCenterMessageWithId(id)
}
}
private fun executeIfResultOk(result: ActivityResult, onResult: (intent: Intent?) -> Unit) { private fun executeIfResultOk(result: ActivityResult, onResult: (intent: Intent?) -> Unit) {
if (result.resultCode == Activity.RESULT_OK) { if (result.resultCode == RESULT_OK) {
onResult(result.data) onResult(result.data)
} else { } else {
Log.e(TAG, "resultCode for received intent was != ok") Log.e(TAG, "resultCode for received intent was != ok")
@ -2319,7 +2324,7 @@ class ChatActivity :
if (position != null && position >= 0) { if (position != null && position >= 0) {
binding.messagesListView.scrollToPosition(position) binding.messagesListView.scrollToPosition(position)
} else { } else {
startContextChatWindowForMessage(messageId) Log.d(TAG, "message $messageId that should be scrolled to was not found (scrollToMessageWithId)")
} }
} }
@ -2332,10 +2337,12 @@ class ChatActivity :
binding.messagesListView.height / 2 binding.messagesListView.height / 2
) )
} else { } else {
startContextChatWindowForMessage(messageId) Log.d(
TAG,
"message $messageId that should be scrolled " +
"to was not found (scrollToAndCenterMessageWithId)"
)
} }
} ?: run {
startContextChatWindowForMessage(messageId)
} }
} }
@ -2797,7 +2804,7 @@ class ChatActivity :
} }
if (this::spreedCapabilities.isInitialized) { if (this::spreedCapabilities.isInitialized) {
if (CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.MESSAGE_EXPIRATION)) { if (hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.MESSAGE_EXPIRATION)) {
deleteExpiredMessages() deleteExpiredMessages()
} }
} else { } else {
@ -3044,6 +3051,7 @@ class ChatActivity :
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
super.onCreateOptionsMenu(menu) super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.menu_conversation, menu) menuInflater.inflate(R.menu.menu_conversation, menu)
chatMenu = menu
if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT) { if (currentConversation?.objectType == ConversationEnums.ObjectType.EVENT) {
eventConversationMenuItem = menu.findItem(R.id.conversation_event) eventConversationMenuItem = menu.findItem(R.id.conversation_event)
@ -3057,7 +3065,6 @@ class ChatActivity :
loadAvatarForStatusBar() loadAvatarForStatusBar()
setActionBarTitle() setActionBarTitle()
} }
return true return true
} }
@ -3065,7 +3072,7 @@ class ChatActivity :
super.onPrepareOptionsMenu(menu) super.onPrepareOptionsMenu(menu)
if (this::spreedCapabilities.isInitialized) { if (this::spreedCapabilities.isInitialized) {
if (CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.READ_ONLY_ROOMS)) { if (hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.READ_ONLY_ROOMS)) {
checkShowCallButtons() checkShowCallButtons()
} }
@ -3086,7 +3093,7 @@ class ChatActivity :
}.collect() }.collect()
} }
if (CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SILENT_CALL)) { if (hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SILENT_CALL)) {
Handler().post { Handler().post {
findViewById<View?>(R.id.conversation_voice_call)?.setOnLongClickListener { findViewById<View?>(R.id.conversation_voice_call)?.setOnLongClickListener {
showCallButtonMenu(true) showCallButtonMenu(true)
@ -3145,10 +3152,10 @@ class ChatActivity :
else -> super.onOptionsItemSelected(item) else -> super.onOptionsItemSelected(item)
} }
@SuppressLint("InflateParams")
private fun showPopupWindow(anchorView: View) { private fun showPopupWindow(anchorView: View) {
val popupView = layoutInflater.inflate(R.layout.item_event_schedule, null) val popupView = layoutInflater.inflate(R.layout.item_event_schedule, null)
val titleTextView = popupView.findViewById<TextView>(R.id.event_scheduled)
val subtitleTextView = popupView.findViewById<TextView>(R.id.meetingTime) val subtitleTextView = popupView.findViewById<TextView>(R.id.meetingTime)
val popupWindow = PopupWindow( val popupWindow = PopupWindow(
@ -3597,7 +3604,7 @@ class ChatActivity :
fun copyMessage(message: IMessage?) { fun copyMessage(message: IMessage?) {
val clipboardManager = val clipboardManager =
getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText( val clipData = ClipData.newPlainText(
resources?.getString(R.string.nc_app_product_name), resources?.getString(R.string.nc_app_product_name),
message?.text message?.text
@ -3911,7 +3918,7 @@ class ChatActivity :
val isOlderThanSixHours = message val isOlderThanSixHours = message
.createdAt .createdAt
.before(Date(System.currentTimeMillis() - AGE_THRESHOLD_FOR_DELETE_MESSAGE)) .before(Date(System.currentTimeMillis() - AGE_THRESHOLD_FOR_DELETE_MESSAGE))
val hasDeleteMessagesUnlimitedCapability = CapabilitiesUtil.hasSpreedFeatureCapability( val hasDeleteMessagesUnlimitedCapability = hasSpreedFeatureCapability(
spreedCapabilities, spreedCapabilities,
SpreedFeatures.DELETE_MESSAGES_UNLIMITED SpreedFeatures.DELETE_MESSAGES_UNLIMITED
) )
@ -3921,7 +3928,7 @@ class ChatActivity :
!hasDeleteMessagesUnlimitedCapability && isOlderThanSixHours -> false !hasDeleteMessagesUnlimitedCapability && isOlderThanSixHours -> false
message.systemMessageType != ChatMessage.SystemMessageType.DUMMY -> false message.systemMessageType != ChatMessage.SystemMessageType.DUMMY -> false
message.isDeleted -> false message.isDeleted -> false
!CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.DELETE_MESSAGES) -> false !hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.DELETE_MESSAGES) -> false
!participantPermissions.hasChatPermission() -> false !participantPermissions.hasChatPermission() -> false
hasDeleteMessagesUnlimitedCapability -> true hasDeleteMessagesUnlimitedCapability -> true
else -> true else -> true

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

@ -76,8 +76,6 @@ interface ChatMessageRepository : LifecycleAwareManager {
*/ */
suspend fun getMessage(messageId: Long, bundle: Bundle): Flow<ChatMessage> suspend fun getMessage(messageId: Long, bundle: Bundle): Flow<ChatMessage>
suspend fun checkIfMessageIsSaved(messageId: Long): Boolean
@Suppress("LongParameterList") @Suppress("LongParameterList")
suspend fun sendChatMessage( suspend fun sendChatMessage(
credentials: String, credentials: String,
@ -112,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

@ -183,19 +183,26 @@ class MediaPlayerManager : LifecycleAwareManager {
continue continue
} }
if (mediaPlayer != null && mediaPlayer?.isPlaying == true) { mediaPlayer?.let { player ->
val pos = mediaPlayer!!.currentPosition try {
if (!player.isPlaying) return@let
} catch (e: IllegalStateException) {
Log.e(TAG, "Seekbar updated during an improper state: $e")
return@let
}
val pos = player.currentPosition
mediaPlayerPosition = pos mediaPlayerPosition = pos
val progress = (pos.toFloat() / mediaPlayerDuration) * DIVIDER val progress = (pos.toFloat() / mediaPlayerDuration) * DIVIDER
val progressI = ceil(progress).toInt() val progressI = ceil(progress).toInt()
val seconds = (pos / ONE_SEC) val seconds = (pos / ONE_SEC)
_mediaPlayerSeekBarPosition.emit(progressI) _mediaPlayerSeekBarPosition.emit(progressI)
currentCycledMessage?.let { currentCycledMessage?.let { msg ->
it.isPlayingVoiceMessage = true msg.isPlayingVoiceMessage = true
it.voiceMessageSeekbarProgress = progressI msg.voiceMessageSeekbarProgress = progressI
it.voiceMessagePlayedSeconds = seconds msg.voiceMessagePlayedSeconds = seconds
if (progressI >= IS_PLAYED_CUTOFF) it.wasPlayedVoiceMessage = true if (progressI >= IS_PLAYED_CUTOFF) msg.wasPlayedVoiceMessage = true
_mediaPlayerSeekBarPositionMsg.emit(it) _mediaPlayerSeekBarPositionMsg.emit(msg)
} }
} }

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)
} }
@ -475,15 +491,6 @@ class OfflineFirstChatRepository @Inject constructor(
.map(ChatMessageEntity::asModel) .map(ChatMessageEntity::asModel)
} }
override suspend fun checkIfMessageIsSaved(messageId: Long): Boolean {
try {
chatDao.getChatMessageForConversation(internalConversationId, messageId)
return true
} catch (_: Exception) {
return false
}
}
@Suppress("UNCHECKED_CAST", "MagicNumber", "Detekt.TooGenericExceptionCaught") @Suppress("UNCHECKED_CAST", "MagicNumber", "Detekt.TooGenericExceptionCaught")
private fun getMessagesFromServer(bundle: Bundle): Pair<Int, List<ChatMessageJson>>? { private fun getMessagesFromServer(bundle: Bundle): Pair<Int, List<ChatMessageJson>>? {
val fieldMap = bundle.getSerializable(BundleKeys.KEY_FIELD_MAP) as HashMap<String, Int> val fieldMap = bundle.getSerializable(BundleKeys.KEY_FIELD_MAP) as HashMap<String, Int>
@ -852,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 ->
@ -862,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()
@ -883,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()
@ -939,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,
@ -1034,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

@ -285,10 +285,6 @@ class ChatViewModel @Inject constructor(
conversationRepository.getRoom(token) conversationRepository.getRoom(token)
} }
suspend fun isMessageSaved(messageId: Long): Boolean {
return chatRepository.checkIfMessageIsSaved(messageId)
}
fun getCapabilities(user: User, token: String, conversationModel: ConversationModel) { fun getCapabilities(user: User, token: String, conversationModel: ConversationModel) {
Log.d(TAG, "Remote server ${conversationModel.remoteServer}") Log.d(TAG, "Remote server ${conversationModel.remoteServer}")
if (conversationModel.remoteServer.isNullOrEmpty()) { if (conversationModel.remoteServer.isNullOrEmpty()) {

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

@ -319,15 +319,20 @@ class ConversationInfoViewModel @Inject constructor(
} }
} }
@Suppress("Detekt.TooGenericExceptionCaught")
fun getProfileData(user: User, userId: String) { fun getProfileData(user: User, userId: String) {
val url = ApiUtils.getUrlForProfile(user.baseUrl!!, userId) val url = ApiUtils.getUrlForProfile(user.baseUrl!!, userId)
viewModelScope.launch { viewModelScope.launch {
try {
val profile = conversationsRepository.getProfile(user.getCredentials(), url) val profile = conversationsRepository.getProfile(user.getCredentials(), url)
if (profile != null) { if (profile != null) {
_getProfileViewState.value = GetProfileSuccessState(profile) _getProfileViewState.value = GetProfileSuccessState(profile)
} else { } else {
_getProfileViewState.value = GetProfileErrorState _getProfileViewState.value = GetProfileErrorState
} }
} catch (e: Exception) {
Log.w(TAG, "Failed to get profile data (if not supported there wil be http405)", e)
}
} }
} }

View File

@ -16,7 +16,6 @@ import android.animation.AnimatorInflater
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.SearchManager import android.app.SearchManager
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
@ -41,6 +40,9 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.drawable.toDrawable
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
@ -409,6 +411,10 @@ class ConversationsListActivity :
conversationsListViewModel.getRoomsFlow conversationsListViewModel.getRoomsFlow
.onEach { list -> .onEach { list ->
setConversationList(list) setConversationList(list)
val noteToSelf = list
.firstOrNull { ConversationUtils.isNoteToSelfConversation(it) }
val isNoteToSelfAvailable = noteToSelf != null
handleNoteToSelfShortcut(isNoteToSelfAvailable, noteToSelf?.token ?: "")
}.collect() }.collect()
} }
@ -525,6 +531,29 @@ class ConversationsListActivity :
} }
} }
private fun handleNoteToSelfShortcut(noteToSelfAvailable: Boolean, noteToSelfToken: String) {
if (noteToSelfAvailable) {
val bundle = Bundle()
bundle.putString(KEY_ROOM_TOKEN, noteToSelfToken)
bundle.putBoolean(BundleKeys.KEY_FOCUS_INPUT, true)
val intent = Intent(context, ChatActivity::class.java)
intent.putExtras(bundle)
intent.action = Intent.ACTION_VIEW
val openNotesString = resources.getString(R.string.open_notes)
val shortcut = ShortcutInfoCompat.Builder(context, NOTE_TO_SELF_SHORTCUT_ID)
.setShortLabel(openNotesString)
.setLongLabel(openNotesString)
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_pencil_grey600_24dp))
.setIntent(intent)
.build()
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
} else {
ShortcutManagerCompat.removeDynamicShortcuts(context, listOf(NOTE_TO_SELF_SHORTCUT_ID))
}
}
private fun setConversationList(list: List<ConversationModel>) { private fun setConversationList(list: List<ConversationModel>) {
// Update Conversations // Update Conversations
conversationItems.clear() conversationItems.clear()
@ -640,7 +669,7 @@ class ConversationsListActivity :
} }
} }
val archiveFilterOn = filterState[ARCHIVE] ?: false val archiveFilterOn = filterState[ARCHIVE] == true
if (archiveFilterOn && newItems.isEmpty()) { if (archiveFilterOn && newItems.isEmpty()) {
binding.noArchivedConversationLayout.visibility = View.VISIBLE binding.noArchivedConversationLayout.visibility = View.VISIBLE
} else { } else {
@ -755,7 +784,7 @@ class ConversationsListActivity :
} }
private fun initSearchView() { private fun initSearchView() {
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager? val searchManager = getSystemService(SEARCH_SERVICE) as SearchManager?
if (searchItem != null) { if (searchItem != null) {
searchView = MenuItemCompat.getActionView(searchItem) as SearchView searchView = MenuItemCompat.getActionView(searchItem) as SearchView
viewThemeUtils.talk.themeSearchView(searchView!!) viewThemeUtils.talk.themeSearchView(searchView!!)
@ -1217,7 +1246,7 @@ class ConversationsListActivity :
}) })
binding.recyclerView.setOnTouchListener { v: View, _: MotionEvent? -> binding.recyclerView.setOnTouchListener { v: View, _: MotionEvent? ->
if (!isDestroyed) { if (!isDestroyed) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0) imm.hideSoftInputFromWindow(v.windowToken, 0)
} }
false false
@ -1398,7 +1427,7 @@ class ConversationsListActivity :
adapter?.updateDataSet(conversationItems) adapter?.updateDataSet(conversationItems)
adapter?.setFilter("") adapter?.setFilter("")
adapter?.filterItems() adapter?.filterItems()
val archiveFilterOn = filterState[ARCHIVE] ?: false val archiveFilterOn = filterState[ARCHIVE] == true
if (archiveFilterOn && adapter!!.isEmpty) { if (archiveFilterOn && adapter!!.isEmpty) {
binding.noArchivedConversationLayout.visibility = View.VISIBLE binding.noArchivedConversationLayout.visibility = View.VISIBLE
} else { } else {
@ -1809,7 +1838,7 @@ class ConversationsListActivity :
val callsChannelNotEnabled = !NotificationUtils.isCallsNotificationChannelEnabled(this) val callsChannelNotEnabled = !NotificationUtils.isCallsNotificationChannelEnabled(this)
val serverNotificationAppInstalled = val serverNotificationAppInstalled =
currentUser?.capabilities?.notificationsCapability?.features?.isNotEmpty() ?: false currentUser?.capabilities?.notificationsCapability?.features?.isNotEmpty() == true
val settingsOfUserAreWrong = notificationPermissionNotGranted || val settingsOfUserAreWrong = notificationPermissionNotGranted ||
batteryOptimizationNotIgnored || batteryOptimizationNotIgnored ||
@ -2183,5 +2212,6 @@ class ConversationsListActivity :
const val ROOM_TYPE_ONE_ONE = "1" const val ROOM_TYPE_ONE_ONE = "1"
private const val SIXTEEN_HOURS_IN_SECONDS: Long = 57600 private const val SIXTEEN_HOURS_IN_SECONDS: Long = 57600
const val LONG_1000: Long = 1000 const val LONG_1000: Long = 1000
private const val NOTE_TO_SELF_SHORTCUT_ID = "NOTE_TO_SELF_SHORTCUT_ID"
} }
} }

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

@ -190,6 +190,7 @@ class FullScreenMediaActivity : AppCompatActivity() {
supportActionBar?.show() supportActionBar?.show()
} }
@OptIn(UnstableApi::class)
private fun applyWindowInsets() { private fun applyWindowInsets() {
val playerView = binding.playerView val playerView = binding.playerView
val exoControls = playerView.findViewById<FrameLayout>(R.id.exo_bottom_bar) val exoControls = playerView.findViewById<FrameLayout>(R.id.exo_bottom_bar)

View File

@ -21,7 +21,7 @@ class ChatUtils {
return message return message
} }
@Suppress("Detekt.ComplexMethod") @Suppress("Detekt.ComplexMethod", "Detekt.ComplexCondition")
private fun parse(messageParameters: HashMap<String?, HashMap<String?, String?>>, message: String?): String? { private fun parse(messageParameters: HashMap<String?, HashMap<String?, String?>>, message: String?): String? {
var resultMessage = message var resultMessage = message
for (key in messageParameters.keys) { for (key in messageParameters.keys) {
@ -29,7 +29,9 @@ class ChatUtils {
if (individualHashMap != null) { if (individualHashMap != null) {
val type = individualHashMap["type"] val type = individualHashMap["type"]
resultMessage = if (type == "user" || type == "guest" || type == "call" || type == "email") { resultMessage = if (type == "user" || type == "guest" || type == "call" || type == "email" ||
type == "user-group" || type == "circle"
) {
resultMessage?.replace("{$key}", "@" + individualHashMap["name"]) resultMessage?.replace("{$key}", "@" + individualHashMap["name"])
} else if (type == "geo-location") { } else if (type == "geo-location") {
individualHashMap["name"] individualHashMap["name"]

View File

@ -6,14 +6,17 @@
*/ */
package com.nextcloud.talk.receivers package com.nextcloud.talk.receivers
import android.Manifest
import android.app.Notification import android.app.Notification
import android.app.NotificationManager import android.app.NotificationManager
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.util.Log import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.Person import androidx.core.app.Person
@ -162,11 +165,17 @@ class DirectReplyReceiver : BroadcastReceiver() {
// Set the updated style // Set the updated style
previousBuilder.setStyle(previousStyle) previousBuilder.setStyle(previousStyle)
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
) {
// Check if notification still exists // Check if notification still exists
if (findActiveNotification(systemNotificationId!!) != null) { if (findActiveNotification(systemNotificationId!!) != null) {
NotificationManagerCompat.from(context).notify(systemNotificationId!!, previousBuilder.build()) NotificationManagerCompat.from(context).notify(systemNotificationId!!, previousBuilder.build())
} }
} }
}
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.subscribe() .subscribe()
} }

View File

@ -118,7 +118,6 @@ class ConversationsListBottomDialog(
currentUser.capabilities?.spreedCapability!!, currentUser.capabilities?.spreedCapability!!,
SpreedFeatures.FAVORITES SpreedFeatures.FAVORITES
) )
val canModerate = ConversationUtils.canModerate(conversation, currentUser.capabilities?.spreedCapability!!)
binding.conversationRemoveFromFavorites.visibility = setVisibleIf( binding.conversationRemoveFromFavorites.visibility = setVisibleIf(
hasFavoritesCapability && conversation.favorite hasFavoritesCapability && conversation.favorite
@ -149,14 +148,11 @@ class ConversationsListBottomDialog(
) )
binding.conversationOperationDelete.visibility = setVisibleIf( binding.conversationOperationDelete.visibility = setVisibleIf(
canModerate conversation.canDeleteConversation
) )
binding.conversationOperationLeave.visibility = setVisibleIf( binding.conversationOperationLeave.visibility = setVisibleIf(
conversation.canLeaveConversation && conversation.canLeaveConversation
// leaving is by api not possible for the last user with moderator permissions.
// for now, hide this option for all moderators.
!ConversationUtils.canModerate(conversation, currentUser.capabilities!!.spreedCapability!!)
) )
} }

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

@ -81,4 +81,5 @@ object BundleKeys {
const val KEY_FIELD_MAP: String = "KEY_FIELD_MAP" const val KEY_FIELD_MAP: String = "KEY_FIELD_MAP"
const val KEY_CHAT_URL: String = "KEY_CHAT_URL" const val KEY_CHAT_URL: String = "KEY_CHAT_URL"
const val KEY_SCROLL_TO_NOTIFICATION_CATEGORY: String = "KEY_SCROLL_TO_NOTIFICATION_CATEGORY" const val KEY_SCROLL_TO_NOTIFICATION_CATEGORY: String = "KEY_SCROLL_TO_NOTIFICATION_CATEGORY"
const val KEY_FOCUS_INPUT: String = "KEY_FOCUS_INPUT"
} }

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

@ -195,37 +195,6 @@
android:textSize="@dimen/bottom_sheet_text_size" /> android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/conversation_archive"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/standard_padding"
android:paddingEnd="@dimen/standard_padding"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:src="@drawable/outline_archive_24"
app:tint="@color/high_emphasis_menu_icon" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/conversation_archive_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="40dp"
android:paddingEnd="@dimen/zero"
android:text="@string/archive_conversation"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/conversation_operation_rename" android:id="@+id/conversation_operation_rename"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -257,7 +226,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/conversation_operation_delete" android:id="@+id/conversation_archive"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height" android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
@ -271,16 +240,17 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:contentDescription="@null" android:contentDescription="@null"
android:src="@drawable/ic_delete_grey600_24dp" android:src="@drawable/outline_archive_24"
app:tint="@color/high_emphasis_menu_icon" /> app:tint="@color/high_emphasis_menu_icon" />
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/conversation_archive_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical" android:layout_gravity="start|center_vertical"
android:paddingStart="40dp" android:paddingStart="40dp"
android:paddingEnd="@dimen/zero" android:paddingEnd="@dimen/zero"
android:text="@string/nc_delete_call" android:text="@string/archive_conversation"
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text" android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" /> android:textSize="@dimen/bottom_sheet_text_size" />
@ -316,6 +286,36 @@
android:textSize="@dimen/bottom_sheet_text_size" /> android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/conversation_operation_delete"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/standard_padding"
android:paddingEnd="@dimen/standard_padding"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:src="@drawable/ic_delete_grey600_24dp"
app:tint="@color/high_emphasis_menu_icon" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="40dp"
android:paddingEnd="@dimen/zero"
android:text="@string/nc_delete_call"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -12,13 +12,12 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp" android:padding="16dp"
android:background="@color/grey_600"> android:background="@color/bg_bottom_sheet">
<TextView <TextView
android:id="@+id/event_scheduled" android:id="@+id/event_scheduled"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/black"
android:text="@string/nc_event_schedule" android:text="@string/nc_event_schedule"
android:textStyle="bold" android:textStyle="bold"
android:textSize="18sp" /> android:textSize="18sp" />
@ -27,7 +26,6 @@
android:id="@+id/meetingTime" android:id="@+id/meetingTime"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="16sp" android:textSize="16sp"
tools:text="Meeting at 8:00 pm"/> tools:text="Meeting at 8:00 pm"/>
@ -46,7 +44,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/archive_conversation" android:text="@string/archive_conversation"
android:textColor="@color/black"
android:visibility = "gone" android:visibility = "gone"
android:textSize="18sp" android:textSize="18sp"
@ -57,7 +54,6 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/unarchive_conversation" android:text="@string/unarchive_conversation"
android:textColor="@color/black"
android:visibility = "gone" android:visibility = "gone"
android:textSize="18sp" android:textSize="18sp"
android:paddingTop="24dp"/> android:paddingTop="24dp"/>

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"
@ -39,6 +38,7 @@
android:textColor="@color/white" android:textColor="@color/white"
app:icon="@drawable/ic_delete" app:icon="@drawable/ic_delete"
app:iconPadding="8dp" app:iconPadding="8dp"
app:iconTint="@color/white"
app:iconGravity="textStart" app:iconGravity="textStart"
android:backgroundTint="@color/nc_darkRed" android:backgroundTint="@color/nc_darkRed"
android:layout_marginEnd="16dp" /> android:layout_marginEnd="16dp" />

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>
@ -310,8 +309,10 @@
<string name="nc_manual">Nenastaveno</string> <string name="nc_manual">Nenastaveno</string>
<string name="nc_mark_as_read">Označit jako přečtené</string> <string name="nc_mark_as_read">Označit jako přečtené</string>
<string name="nc_mark_as_unread">Označit jako nepřečtené</string> <string name="nc_mark_as_unread">Označit jako nepřečtené</string>
<string name="nc_mark_conversation_as_important">Konverzace označena jako důležitá</string>
<string name="nc_mark_conversation_as_insensitive">Zrušeno značení konverzace coby citlivé</string> <string name="nc_mark_conversation_as_insensitive">Zrušeno značení konverzace coby citlivé</string>
<string name="nc_mark_conversation_as_sensitive">Konverzace označena jako citlivá</string> <string name="nc_mark_conversation_as_sensitive">Konverzace označena jako citlivá</string>
<string name="nc_mark_conversation_as_unimportant">Zrušeno značení konverzace coby důležité</string>
<string name="nc_meeting_ended">Schůzka skončila</string> <string name="nc_meeting_ended">Schůzka skončila</string>
<string name="nc_message_added_to_notes">Zpráva přidána do poznámek</string> <string name="nc_message_added_to_notes">Zpráva přidána do poznámek</string>
<string name="nc_message_failed">Nezdařilo se</string> <string name="nc_message_failed">Nezdařilo se</string>
@ -542,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>
@ -681,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

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name= "nc_edit">Rediger</string> <string name= "nc_edit">Rediger</string>
<string name="add_participants">Tilføj</string>
<string name="add_to_notes">Tilføj til Noter</string> <string name="add_to_notes">Tilføj til Noter</string>
<string name="added_to_favorites">Tilføjede samtalen %1$s til favoritter</string> <string name="added_to_favorites">Tilføjede samtalen %1$s til favoritter</string>
<string name="appbar_search_in">Søg i %s</string> <string name="appbar_search_in">Søg i %s</string>
@ -389,9 +390,9 @@
<string name="nc_server_failed_to_import_account">Den valgte konto kunne ikke importeres</string> <string name="nc_server_failed_to_import_account">Den valgte konto kunne ikke importeres</string>
<string name="nc_server_helper_text">Linket til dit %1$s web interface når du åbner den i browseren.</string> <string name="nc_server_helper_text">Linket til dit %1$s web interface når du åbner den i browseren.</string>
<string name="nc_server_import_account">Importer konto fra %1$s appen</string> <string name="nc_server_import_account">Importer konto fra %1$s appen</string>
<string name="nc_server_import_account_plain">Importer konto</string> <string name="nc_server_import_account_plain">Importér konto</string>
<string name="nc_server_import_accounts">Importer konti fra %1$s appen</string> <string name="nc_server_import_accounts">Importer konti fra %1$s appen</string>
<string name="nc_server_import_accounts_plain">Importer konti</string> <string name="nc_server_import_accounts_plain">Importér konti</string>
<string name="nc_server_maintenance">Få venligst %1$s ud fra vedligeholdelse </string> <string name="nc_server_maintenance">Få venligst %1$s ud fra vedligeholdelse </string>
<string name="nc_server_not_installed">Afslut venligst din %1$s installation</string> <string name="nc_server_not_installed">Afslut venligst din %1$s installation</string>
<string name="nc_server_testing_connection">Tester forbindelsen</string> <string name="nc_server_testing_connection">Tester forbindelsen</string>

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>
@ -544,6 +543,7 @@
<string name="online_status">Online-Status</string> <string name="online_status">Online-Status</string>
<string name="openConversations">Offene Unterhaltungen</string> <string name="openConversations">Offene Unterhaltungen</string>
<string name="open_in_files_app">In Dateien-App öffnen</string> <string name="open_in_files_app">In Dateien-App öffnen</string>
<string name="open_notes">Notizen öffnen</string>
<string name="play_pause_voice_message">Sprachnachricht wiedergeben/pausieren</string> <string name="play_pause_voice_message">Sprachnachricht wiedergeben/pausieren</string>
<string name="playback_speed_control">Steuerung der Wiedergabegeschwindigkeit</string> <string name="playback_speed_control">Steuerung der Wiedergabegeschwindigkeit</string>
<string name="polls_add_option">Option hinzufügen</string> <string name="polls_add_option">Option hinzufügen</string>
@ -681,6 +681,10 @@
<item quantity="one">%d ähnliche Nachricht ansehen</item> <item quantity="one">%d ähnliche Nachricht ansehen</item>
<item quantity="other">%d ähnliche Nachrichten ansehen</item> <item quantity="other">%d ähnliche Nachrichten ansehen</item>
</plurals> </plurals>
<plurals name="nc_conversation_auto_delete_info">
<item quantity="one">Diese Unterhaltung wird für alle bei Inaktivität in %1$d Tag gelöscht</item>
<item quantity="other">Diese Unterhaltung wird für alle bei Inaktivität in %1$d Tagen gelöscht</item>
</plurals>
<plurals name="polls_amount_voters"> <plurals name="polls_amount_voters">
<item quantity="one">%d Stimme</item> <item quantity="one">%d Stimme</item>
<item quantity="other">%d Stimmen</item> <item quantity="other">%d Stimmen</item>

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

@ -28,8 +28,8 @@
<string name="call_without_notification">Kõne ilma teavituseta</string> <string name="call_without_notification">Kõne ilma teavituseta</string>
<string name="camera_permission_granted">Õigused kaamera kasutamiseks on nüüd olemas. Palun vali kaamera uuesti.</string> <string name="camera_permission_granted">Õigused kaamera kasutamiseks on nüüd olemas. Palun vali kaamera uuesti.</string>
<string name="choose_avatar_from_cloud">Vali tunnuspilt pilvest</string> <string name="choose_avatar_from_cloud">Vali tunnuspilt pilvest</string>
<string name="clear_status_message">Tühjenda staatuseteade</string> <string name="clear_status_message">Eemalda olekuteade</string>
<string name="clear_status_message_after">Tühjenda staatuseteade pärast</string> <string name="clear_status_message_after">Eemalda olekuteade pärast</string>
<string name="close">Sulge</string> <string name="close">Sulge</string>
<string name="close_icon">Sulgemise ikoon</string> <string name="close_icon">Sulgemise ikoon</string>
<string name="connection_established">Saadi ühendus</string> <string name="connection_established">Saadi ühendus</string>
@ -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>
@ -320,7 +319,7 @@
<string name="nc_message_failed_to_send">Sõnumi saatmine ei õnnestunud:</string> <string name="nc_message_failed_to_send">Sõnumi saatmine ei õnnestunud:</string>
<string name="nc_message_offline">Pole võrgus</string> <string name="nc_message_offline">Pole võrgus</string>
<string name="nc_message_quote_cancel_reply">Katkesta vastamine</string> <string name="nc_message_quote_cancel_reply">Katkesta vastamine</string>
<string name="nc_message_read">Sõnim on loetud</string> <string name="nc_message_read">Sõnum on loetud</string>
<string name="nc_message_sending">Saatmisel</string> <string name="nc_message_sending">Saatmisel</string>
<string name="nc_message_sent">Sõnum on saadetud</string> <string name="nc_message_sent">Sõnum on saadetud</string>
<string name="nc_microphone_permission_hint">Et saaksid suhtlemisel kasutada heliedastust, palun luba rakendusel kasutada mikrofoni.</string> <string name="nc_microphone_permission_hint">Et saaksid suhtlemisel kasutada heliedastust, palun luba rakendusel kasutada mikrofoni.</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

@ -285,6 +285,7 @@
<string name="nc_ignore_battery_optimization_dialog_text">L\'optimisation de la batterie n\'est pas ignorée. Ceci devrait être modifié pour vous assurer que les notifications fonctionnent en arrière-plan. Merci de cliquer OK et sélectionner \"Toutes les applications\" -> %1$s -> Ne pas optimiser</string> <string name="nc_ignore_battery_optimization_dialog_text">L\'optimisation de la batterie n\'est pas ignorée. Ceci devrait être modifié pour vous assurer que les notifications fonctionnent en arrière-plan. Merci de cliquer OK et sélectionner \"Toutes les applications\" -> %1$s -> Ne pas optimiser</string>
<string name="nc_ignore_battery_optimization_dialog_title">Ignorer l\'optimisation de batterie</string> <string name="nc_ignore_battery_optimization_dialog_title">Ignorer l\'optimisation de batterie</string>
<string name="nc_important_conversation">Conversation importante</string> <string name="nc_important_conversation">Conversation importante</string>
<string name="nc_important_conversation_desc">Le statut utilisateur \"Ne pas déranger\" est ignoré pour les conversations importantes.</string>
<string name="nc_invalid_time">Heure invalide</string> <string name="nc_invalid_time">Heure invalide</string>
<string name="nc_invitations">Invitations</string> <string name="nc_invitations">Invitations</string>
<string name="nc_join_open_conversations">Rejoindre des conversations ouvertes</string> <string name="nc_join_open_conversations">Rejoindre des conversations ouvertes</string>
@ -400,6 +401,8 @@
<string name="nc_search">Recherche</string> <string name="nc_search">Recherche</string>
<string name="nc_select_an_account">Choisissez un compte</string> <string name="nc_select_an_account">Choisissez un compte</string>
<string name="nc_send_edit_message">Message de mise à jour</string> <string name="nc_send_edit_message">Message de mise à jour</string>
<string name="nc_sensitive_conversation">Conversation sensible</string>
<string name="nc_sensitive_conversation_hint">La prévisualisation des messages sera désactivée dans la liste des conversations et les notifiactions</string>
<string name="nc_sent_a_gif" formatted="true">%1$s a envoyé un GIF.</string> <string name="nc_sent_a_gif" formatted="true">%1$s a envoyé un GIF.</string>
<string name="nc_sent_a_gif_you">Vous avez envoyé un GIF.</string> <string name="nc_sent_a_gif_you">Vous avez envoyé un GIF.</string>
<string name="nc_sent_a_video" formatted="true">%1$s a envoyé une vidéo.</string> <string name="nc_sent_a_video" formatted="true">%1$s a envoyé une vidéo.</string>

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>
@ -310,6 +309,10 @@
<string name="nc_manual">Gan socraithe</string> <string name="nc_manual">Gan socraithe</string>
<string name="nc_mark_as_read">Marcáil mar léite</string> <string name="nc_mark_as_read">Marcáil mar léite</string>
<string name="nc_mark_as_unread">Marcáil mar neamhléite</string> <string name="nc_mark_as_unread">Marcáil mar neamhléite</string>
<string name="nc_mark_conversation_as_important">Comhrá marcáilte mar thábhachtach</string>
<string name="nc_mark_conversation_as_insensitive">Dímharcáladh an comhrá mar chomhrá íogair</string>
<string name="nc_mark_conversation_as_sensitive">Comhrá marcáilte mar íogair</string>
<string name="nc_mark_conversation_as_unimportant">Dímharcáladh an comhrá mar chomhrá tábhachtach</string>
<string name="nc_meeting_ended">Deireadh leis an gcruinniú</string> <string name="nc_meeting_ended">Deireadh leis an gcruinniú</string>
<string name="nc_message_added_to_notes">Teachtaireacht curtha leis na nótaí</string> <string name="nc_message_added_to_notes">Teachtaireacht curtha leis na nótaí</string>
<string name="nc_message_failed">Theip</string> <string name="nc_message_failed">Theip</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,19 +179,38 @@
<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_dialog_open_checklist">Hibaelhárítási ellenőrzőlista megnyitása</string>
<string name="nc_diagnose_dialog_open_diagnose">Diagnosztikai képernyő megnyitása</string>
<string name="nc_diagnose_dialog_open_dontkillmyapp_website">A dontkillmyapp.com megnyitása</string>
<string name="nc_diagnose_gplay_available_title">Google Play szolgáltatások</string>
<string name="nc_diagnose_gplay_available_yes">A Google Play szolgáltatások elérhetőek</string>
<string name="nc_diagnose_meta_category_title">Metainformációk</string>
<string name="nc_diagnose_meta_system_report_date">Rendszerjelentés előállítása</string>
<string name="nc_diagnose_notification_calls_channel_permission">Engedélyezve van a hívások értesítési csatornája?</string>
<string name="nc_diagnose_notification_messages_channel_permission">Engedélyezve van az üzenetek értesítési csatornája?</string>
<string name="nc_diagnose_notification_permission">Értesítési engedély</string>
<string name="nc_diagnose_phone_category_title">Telefon</string> <string name="nc_diagnose_phone_category_title">Telefon</string>
<string name="nc_diagnose_server_talk_version">Kiszolgáló Beszélgetés verziója</string>
<string name="nc_diagnose_server_version">Kiszolgáló verziója</string>
<string name="nc_diagnose_signaling_mode_extern">Külső</string> <string name="nc_diagnose_signaling_mode_extern">Külső</string>
<string name="nc_diagnose_signaling_mode_intern">Belső</string> <string name="nc_diagnose_signaling_mode_intern">Belső</string>
<string name="nc_dialog_invalid_password">Érvénytelen jelszó</string> <string name="nc_dialog_invalid_password">Érvénytelen jelszó</string>
@ -172,7 +219,9 @@
<string name="nc_dialog_outdated_client_description">Az alkalmazás túl régi, és már nem támogatja ez a kiszolgáló. Frissítse.</string> <string name="nc_dialog_outdated_client_description">Az alkalmazás túl régi, és már nem támogatja ez a kiszolgáló. Frissítse.</string>
<string name="nc_dialog_outdated_client_option_update">Frissítés</string> <string name="nc_dialog_outdated_client_option_update">Frissítés</string>
<string name="nc_dialog_reauth_or_delete">Újrahitelesíti vagy törli ezt a fiókot?</string> <string name="nc_dialog_reauth_or_delete">Újrahitelesíti vagy törli ezt a fiókot?</string>
<string name="nc_dialog_save_to_storage_continue">Folytatja?</string>
<string name="nc_dialog_save_to_storage_no">Nem</string> <string name="nc_dialog_save_to_storage_no">Nem</string>
<string name="nc_dialog_save_to_storage_title">Menti a tárolóba?</string>
<string name="nc_dialog_save_to_storage_yes">Igen</string> <string name="nc_dialog_save_to_storage_yes">Igen</string>
<string name="nc_display_name_not_fetched">A megjelenítendő név nem kérhető le, megszakítás</string> <string name="nc_display_name_not_fetched">A megjelenítendő név nem kérhető le, megszakítás</string>
<string name="nc_display_name_not_stored">A megjelenítendő név nem tárolható, megszakítás</string> <string name="nc_display_name_not_stored">A megjelenítendő név nem tárolható, megszakítás</string>
@ -216,6 +265,7 @@
<string name="nc_guest_access_share_link">Beszélgetés hivatkozásának megosztása</string> <string name="nc_guest_access_share_link">Beszélgetés hivatkozásának megosztása</string>
<string name="nc_hint_enter_a_message">Írjon üzenetet…</string> <string name="nc_hint_enter_a_message">Írjon üzenetet…</string>
<string name="nc_important_conversation">Fontos beszélgetés</string> <string name="nc_important_conversation">Fontos beszélgetés</string>
<string name="nc_invalid_time">Érvénytelen idő</string>
<string name="nc_invitations">Meghívások</string> <string name="nc_invitations">Meghívások</string>
<string name="nc_join_open_conversations">Csatlakozás a nyílt beszélgetésekhez</string> <string name="nc_join_open_conversations">Csatlakozás a nyílt beszélgetésekhez</string>
<string name="nc_keep">Megtartás</string> <string name="nc_keep">Megtartás</string>
@ -278,9 +328,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 +399,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

@ -29,7 +29,7 @@
<string name="clear_status_message">Statusbericht wissen</string> <string name="clear_status_message">Statusbericht wissen</string>
<string name="clear_status_message_after">Statusbericht wissen na</string> <string name="clear_status_message_after">Statusbericht wissen na</string>
<string name="close">Sluit</string> <string name="close">Sluit</string>
<string name="close_icon">Sluiten pictogram</string> <string name="close_icon">Sluiten-pictogram</string>
<string name="connection_established">Verbinding tot stand gebracht</string> <string name="connection_established">Verbinding tot stand gebracht</string>
<string name="connection_lost_sent_messages_are_queued">Verbinding verbroken - Verzonden berichten in de wachtrij geplaatst</string> <string name="connection_lost_sent_messages_are_queued">Verbinding verbroken - Verzonden berichten in de wachtrij geplaatst</string>
<string name="continuous_voice_message_recording">Zet opname vast voor doorlopende opname van de spraak</string> <string name="continuous_voice_message_recording">Zet opname vast voor doorlopende opname van de spraak</string>
@ -557,7 +557,7 @@ Kies er eentje van een provider.</string>
<string name="scope_toggle">Scope omschakelen</string> <string name="scope_toggle">Scope omschakelen</string>
<string name="scope_toggle_description">Wijzigen privacyniveau van %1$s</string> <string name="scope_toggle_description">Wijzigen privacyniveau van %1$s</string>
<string name="scroll_to_bottom">Scroll naar beneden</string> <string name="scroll_to_bottom">Scroll naar beneden</string>
<string name="search_icon">Zoeken pictogram</string> <string name="search_icon">Zoeken-pictogram</string>
<string name="secondsAgo">seconden geleden</string> <string name="secondsAgo">seconden geleden</string>
<string name="selected_list_item">Geselecteerd</string> <string name="selected_list_item">Geselecteerd</string>
<string name="send_email">Verstuur e-mail</string> <string name="send_email">Verstuur e-mail</string>

View File

@ -9,6 +9,7 @@
<string name="archive_hint">Po zarchiwizowaniu rozmowa zostanie domyślnie ukryta. Wybierz filtr „Zarchiwizowane”, aby wyświetlić zarchiwizowane rozmowy. Bezpośrednie wzmianki będą nadal otrzymywane.</string> <string name="archive_hint">Po zarchiwizowaniu rozmowa zostanie domyślnie ukryta. Wybierz filtr „Zarchiwizowane”, aby wyświetlić zarchiwizowane rozmowy. Bezpośrednie wzmianki będą nadal otrzymywane.</string>
<string name="archived">Zarchiwizowane</string> <string name="archived">Zarchiwizowane</string>
<string name="archived_conversation">Zarchiwizowane %1$s</string> <string name="archived_conversation">Zarchiwizowane %1$s</string>
<string name="audio_call">Rozmowa audio</string>
<string name="audio_output_bluetooth">Bluetooth</string> <string name="audio_output_bluetooth">Bluetooth</string>
<string name="audio_output_dialog_headline">Wyjście audio</string> <string name="audio_output_dialog_headline">Wyjście audio</string>
<string name="audio_output_phone">Telefon</string> <string name="audio_output_phone">Telefon</string>
@ -32,8 +33,10 @@
<string name="close">Zamknij</string> <string name="close">Zamknij</string>
<string name="close_icon">Ikona zamknięcia</string> <string name="close_icon">Ikona zamknięcia</string>
<string name="connection_established">Połączenie nawiązane</string> <string name="connection_established">Połączenie nawiązane</string>
<string name="connection_lost">Brak połączenia z serwerem</string>
<string name="connection_lost_sent_messages_are_queued">Utracono połączenie - wysłane wiadomości są w kolejce</string> <string name="connection_lost_sent_messages_are_queued">Utracono połączenie - wysłane wiadomości są w kolejce</string>
<string name="continuous_voice_message_recording">Zablokuj nagrywanie w celu ciągłego nagrywania wiadomości głosowej</string> <string name="continuous_voice_message_recording">Zablokuj nagrywanie w celu ciągłego nagrywania wiadomości głosowej</string>
<string name="conversation_archived">Konwersacja została zarchiwizowana.</string>
<string name="conversation_is_read_only">Rozmowa jest tylko do odczytu</string> <string name="conversation_is_read_only">Rozmowa jest tylko do odczytu</string>
<string name="conversation_read_only_failed">Nie udało się ustawić rozmowy Tylko do odczytu</string> <string name="conversation_read_only_failed">Nie udało się ustawić rozmowy Tylko do odczytu</string>
<string name="conversations">Rozmowy</string> <string name="conversations">Rozmowy</string>
@ -47,6 +50,7 @@
<string name="dnd">Nie przeszkadzać</string> <string name="dnd">Nie przeszkadzać</string>
<string name="dontClear">Nie czyść</string> <string name="dontClear">Nie czyść</string>
<string name="edit">Edytuj</string> <string name="edit">Edytuj</string>
<string name="edit_error_24_hours_old_message">Wiadomości starsze niż 24 godziny nie mogą być edytowane.</string>
<string name="edit_message_icon_description">Edytuj wiadomość</string> <string name="edit_message_icon_description">Edytuj wiadomość</string>
<string name="emoji_category_recent">Ostatnie</string> <string name="emoji_category_recent">Ostatnie</string>
<string name="encrypted">Zaszyfrowane</string> <string name="encrypted">Zaszyfrowane</string>
@ -68,6 +72,7 @@
<string name="leave_call">Rozłącz się</string> <string name="leave_call">Rozłącz się</string>
<string name="left_conversation">Opuściłeś rozmowę %1$s</string> <string name="left_conversation">Opuściłeś rozmowę %1$s</string>
<string name="load_more_results">Wczytaj więcej wyników</string> <string name="load_more_results">Wczytaj więcej wyników</string>
<string name="local_time">Czas lokalny: %1$s</string>
<string name="lock_conversation">Zablokuj rozmowę</string> <string name="lock_conversation">Zablokuj rozmowę</string>
<string name="lock_symbol">Symbol zamknięcia</string> <string name="lock_symbol">Symbol zamknięcia</string>
<string name="lower_hand">Opuścić rękę</string> <string name="lower_hand">Opuścić rękę</string>
@ -80,6 +85,7 @@
<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">Od największych</string> <string name="menu_item_sort_by_size_biggest_first">Od największych</string>
<string name="menu_item_sort_by_size_smallest_first">Od najmniejszych</string> <string name="menu_item_sort_by_size_smallest_first">Od najmniejszych</string>
<string name="message_copied">Wiadomość skopiowana</string>
<string name="message_deleted_by_you">Wiadomość usunięta przez Ciebie</string> <string name="message_deleted_by_you">Wiadomość usunięta przez Ciebie</string>
<string name="message_last_edited_by">Edytowany przez %1$s</string> <string name="message_last_edited_by">Edytowany przez %1$s</string>
<string name="message_poll_tap_to_open">Dotknij, aby otworzyć sondę</string> <string name="message_poll_tap_to_open">Dotknij, aby otworzyć sondę</string>
@ -164,6 +170,7 @@
<string name="nc_copy_message">Kopiuj</string> <string name="nc_copy_message">Kopiuj</string>
<string name="nc_create_new_conversation">Utwórz nową rozmowę</string> <string name="nc_create_new_conversation">Utwórz nową rozmowę</string>
<string name="nc_create_poll">Utwórz sondę</string> <string name="nc_create_poll">Utwórz sondę</string>
<string name="nc_current_user">Ty:</string>
<string name="nc_date_header_today">Dzisiaj</string> <string name="nc_date_header_today">Dzisiaj</string>
<string name="nc_date_header_yesterday">Wczoraj</string> <string name="nc_date_header_yesterday">Wczoraj</string>
<string name="nc_delete">Usuń</string> <string name="nc_delete">Usuń</string>
@ -172,6 +179,7 @@
<string name="nc_delete_conversation_more">Jeśli usuniesz rozmowę, zostanie ona również usunięta dla wszystkich pozostałych uczestników.</string> <string name="nc_delete_conversation_more">Jeśli usuniesz rozmowę, zostanie ona również usunięta dla wszystkich pozostałych uczestników.</string>
<string name="nc_delete_message">Usuń</string> <string name="nc_delete_message">Usuń</string>
<string name="nc_delete_message_leaked_to_matterbridge">Wiadomość została pomyślnie usunięta, ale mogła przedostać się do innych usług</string> <string name="nc_delete_message_leaked_to_matterbridge">Wiadomość została pomyślnie usunięta, ale mogła przedostać się do innych usług</string>
<string name="nc_delete_now">Usuń teraz</string>
<string name="nc_deleted_user">Użytkownik %1$s został usunięty</string> <string name="nc_deleted_user">Użytkownik %1$s został usunięty</string>
<string name="nc_demote">Zdegraduj z moderatora</string> <string name="nc_demote">Zdegraduj z moderatora</string>
<string name="nc_description_record_voice">Nagraj wiadomość głosową</string> <string name="nc_description_record_voice">Nagraj wiadomość głosową</string>
@ -232,6 +240,8 @@
<string name="nc_edit_message">Edycja</string> <string name="nc_edit_message">Edycja</string>
<string name="nc_edit_message_text">Edytuj wiadomość</string> <string name="nc_edit_message_text">Edytuj wiadomość</string>
<string name="nc_edited_by_admin">Edytowane przez administratora</string> <string name="nc_edited_by_admin">Edytowane przez administratora</string>
<string name="nc_event_conversation_menu">Menu rozmowy wydarzenia</string>
<string name="nc_event_schedule">Harmonogram</string>
<string name="nc_expire_message_eight_hours">8 godzin</string> <string name="nc_expire_message_eight_hours">8 godzin</string>
<string name="nc_expire_message_four_weeks">4 tygodnie</string> <string name="nc_expire_message_four_weeks">4 tygodnie</string>
<string name="nc_expire_message_off">Wyłączona</string> <string name="nc_expire_message_off">Wyłączona</string>
@ -248,6 +258,7 @@
<string name="nc_federation_pending_invitation_hint">Masz oczekujące zaproszenia</string> <string name="nc_federation_pending_invitation_hint">Masz oczekujące zaproszenia</string>
<string name="nc_file_browser_back">Wstecz</string> <string name="nc_file_browser_back">Wstecz</string>
<string name="nc_file_storage_permission">Wymagane jest zezwolenie na dostęp do plików</string> <string name="nc_file_storage_permission">Wymagane jest zezwolenie na dostęp do plików</string>
<string name="nc_filter">Filtruj rozmowy</string>
<string name="nc_following_link">Użytkownik korzysta z łącza publicznego</string> <string name="nc_following_link">Użytkownik korzysta z łącza publicznego</string>
<string name="nc_formatted_message_you">Ty: %1$s</string> <string name="nc_formatted_message_you">Ty: %1$s</string>
<string name="nc_forward_message">Przekaż dalej</string> <string name="nc_forward_message">Przekaż dalej</string>
@ -259,8 +270,8 @@
<string name="nc_guest">Gość</string> <string name="nc_guest">Gość</string>
<string name="nc_guest_access">Dostęp dla gościa</string> <string name="nc_guest_access">Dostęp dla gościa</string>
<string name="nc_guest_access_allow_failed">Nie można włączyć/wyłączyć dostępu dla gościa.</string> <string name="nc_guest_access_allow_failed">Nie można włączyć/wyłączyć dostępu dla gościa.</string>
<string name="nc_guest_access_allow_summary">Zezwól gościom na udostępnianie linku publicznego, aby dołączyć do tej rozmowy.</string> <string name="nc_guest_access_allow_summary">Zezwalaj gościom na udostępnianie linku publicznego, aby dołączyć do tej rozmowy.</string>
<string name="nc_guest_access_allow_title">Zezwól gościom</string> <string name="nc_guest_access_allow_title">Zezwalaj gościom</string>
<string name="nc_guest_access_password_dialog_hint">Wprowadź hasło</string> <string name="nc_guest_access_password_dialog_hint">Wprowadź hasło</string>
<string name="nc_guest_access_password_dialog_title">Hasło dostępu gościa</string> <string name="nc_guest_access_password_dialog_title">Hasło dostępu gościa</string>
<string name="nc_guest_access_password_failed">Błąd podczas ustawiania/wyłączania hasła.</string> <string name="nc_guest_access_password_failed">Błąd podczas ustawiania/wyłączania hasła.</string>
@ -274,8 +285,11 @@
<string name="nc_ignore_battery_optimization_dialog_text">Optymalizacja baterii nie jest ignorowana. Należy to zmienić, aby mieć pewność, że powiadomienia działają w tle! Kliknij OK i wybierz \"Wszystkie aplikacje\" -> %1$s -> Nie optymalizuj</string> <string name="nc_ignore_battery_optimization_dialog_text">Optymalizacja baterii nie jest ignorowana. Należy to zmienić, aby mieć pewność, że powiadomienia działają w tle! Kliknij OK i wybierz \"Wszystkie aplikacje\" -> %1$s -> Nie optymalizuj</string>
<string name="nc_ignore_battery_optimization_dialog_title">Zignoruj optymalizację baterii</string> <string name="nc_ignore_battery_optimization_dialog_title">Zignoruj optymalizację baterii</string>
<string name="nc_important_conversation">Ważna rozmowa</string> <string name="nc_important_conversation">Ważna rozmowa</string>
<string name="nc_important_conversation_desc">Status użytkownika „Nie przeszkadzać” jest ignorowany dla ważnych rozmów.</string>
<string name="nc_invalid_time">Nieprawidłowy czas</string>
<string name="nc_invitations">Zaproszenia</string> <string name="nc_invitations">Zaproszenia</string>
<string name="nc_join_open_conversations">Dołącz do otwartych rozmów</string> <string name="nc_join_open_conversations">Dołącz do otwartych rozmów</string>
<string name="nc_keep">Pozostaw</string>
<string name="nc_last_moderator_leaving_room_warning">Zanim opuścisz rozmowę, musisz wybrać nowego moderatora</string> <string name="nc_last_moderator_leaving_room_warning">Zanim opuścisz rozmowę, musisz wybrać nowego moderatora</string>
<string name="nc_last_modified">%1$s | Ostatnio zmodyfikowany: %2$s</string> <string name="nc_last_modified">%1$s | Ostatnio zmodyfikowany: %2$s</string>
<string name="nc_leave">Opuść rozmowę</string> <string name="nc_leave">Opuść rozmowę</string>
@ -295,6 +309,8 @@
<string name="nc_manual">Nie ustawiony</string> <string name="nc_manual">Nie ustawiony</string>
<string name="nc_mark_as_read">Oznacz jako przeczytane</string> <string name="nc_mark_as_read">Oznacz jako przeczytane</string>
<string name="nc_mark_as_unread">Oznacz jako nieprzeczytane</string> <string name="nc_mark_as_unread">Oznacz jako nieprzeczytane</string>
<string name="nc_mark_conversation_as_important">Rozmowa oznaczona jako ważna</string>
<string name="nc_mark_conversation_as_insensitive">Rozmowa została odznaczona jako wrażliwa</string>
<string name="nc_message_failed">Nie powiodło się</string> <string name="nc_message_failed">Nie powiodło się</string>
<string name="nc_message_failed_to_send">Nie udało się wysłać wiadomości:</string> <string name="nc_message_failed_to_send">Nie udało się wysłać wiadomości:</string>
<string name="nc_message_offline">Niedostępny</string> <string name="nc_message_offline">Niedostępny</string>
@ -342,7 +358,7 @@
<string name="nc_password">Hasło</string> <string name="nc_password">Hasło</string>
<string name="nc_permissions_ask">Ustaw uprawnienia</string> <string name="nc_permissions_ask">Ustaw uprawnienia</string>
<string name="nc_permissions_denied">Odmówiono niektórych uprawnień.</string> <string name="nc_permissions_denied">Odmówiono niektórych uprawnień.</string>
<string name="nc_permissions_rationale_dialog_title">Zezwól na uprawnienia</string> <string name="nc_permissions_rationale_dialog_title">Zezwalaj na uprawnienia</string>
<string name="nc_permissions_settings">Otwórz ustawienia</string> <string name="nc_permissions_settings">Otwórz ustawienia</string>
<string name="nc_permissions_settings_hint">Nadaj uprawnienia w Ustawienia > Uprawnienia</string> <string name="nc_permissions_settings_hint">Nadaj uprawnienia w Ustawienia > Uprawnienia</string>
<string name="nc_phone_book_integration_account_not_found">Nie znaleziono konta</string> <string name="nc_phone_book_integration_account_not_found">Nie znaleziono konta</string>
@ -380,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>
@ -310,8 +309,10 @@
<string name="nc_manual">Não definido</string> <string name="nc_manual">Não definido</string>
<string name="nc_mark_as_read">Marcar como lido</string> <string name="nc_mark_as_read">Marcar como lido</string>
<string name="nc_mark_as_unread">Marcar como não lido</string> <string name="nc_mark_as_unread">Marcar como não lido</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 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

@ -44,6 +44,7 @@
<string name="invisible">Drugim nevidno</string> <string name="invisible">Drugim nevidno</string>
<string name="leave_call">Zapusti klic</string> <string name="leave_call">Zapusti klic</string>
<string name="load_more_results">Naloži več zadetkov</string> <string name="load_more_results">Naloži več zadetkov</string>
<string name="local_time">Krajevni čas: %1$s</string>
<string name="lock_conversation">Zakleni pogovor</string> <string name="lock_conversation">Zakleni pogovor</string>
<string name="lock_symbol">Simbol zaklepa</string> <string name="lock_symbol">Simbol zaklepa</string>
<string name="lower_hand">Spusti roko</string> <string name="lower_hand">Spusti roko</string>
@ -140,6 +141,7 @@
<string name="nc_delete_conversation_more">Če izbrišete pogovor, bo ta izbrisan za vse udeležence.</string> <string name="nc_delete_conversation_more">Če izbrišete pogovor, bo ta izbrisan za vse udeležence.</string>
<string name="nc_delete_message">Izbriši</string> <string name="nc_delete_message">Izbriši</string>
<string name="nc_delete_message_leaked_to_matterbridge">Sporočilo je uspešno izbrisano, a je lahko že poslano na druge storitve.</string> <string name="nc_delete_message_leaked_to_matterbridge">Sporočilo je uspešno izbrisano, a je lahko že poslano na druge storitve.</string>
<string name="nc_delete_now">Izbriši</string>
<string name="nc_demote">Ponižaj iz moderatorja</string> <string name="nc_demote">Ponižaj iz moderatorja</string>
<string name="nc_description_record_voice">Posnemi glasovno sporočilo</string> <string name="nc_description_record_voice">Posnemi glasovno sporočilo</string>
<string name="nc_description_send_message_button">Pošlji sporočilo</string> <string name="nc_description_send_message_button">Pošlji sporočilo</string>
@ -204,6 +206,7 @@
<string name="nc_important_conversation">Pomemben pogovor</string> <string name="nc_important_conversation">Pomemben pogovor</string>
<string name="nc_invitations">Povabila</string> <string name="nc_invitations">Povabila</string>
<string name="nc_join_open_conversations">Pridruži se odprtemu pogovoru</string> <string name="nc_join_open_conversations">Pridruži se odprtemu pogovoru</string>
<string name="nc_keep">Ohrani</string>
<string name="nc_last_moderator_leaving_room_warning">Pred odhodom iz pogovora je treba nekoga določiti za moderatorja.</string> <string name="nc_last_moderator_leaving_room_warning">Pred odhodom iz pogovora je treba nekoga določiti za moderatorja.</string>
<string name="nc_last_modified">%1$s | Nazadnje spremenjeno: %2$s</string> <string name="nc_last_modified">%1$s | Nazadnje spremenjeno: %2$s</string>
<string name="nc_leave">Zapusti pogovor</string> <string name="nc_leave">Zapusti pogovor</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>
@ -310,8 +309,10 @@
<string name="nc_manual">Није постављено</string> <string name="nc_manual">Није постављено</string>
<string name="nc_mark_as_read">Означи као прочитано</string> <string name="nc_mark_as_read">Означи као прочитано</string>
<string name="nc_mark_as_unread">Означи као непрочитано</string> <string name="nc_mark_as_unread">Означи као непрочитано</string>
<string name="nc_mark_conversation_as_important">Разговор је означен као важан</string>
<string name="nc_mark_conversation_as_insensitive">Разговор више није означен као осетљив</string> <string name="nc_mark_conversation_as_insensitive">Разговор више није означен као осетљив</string>
<string name="nc_mark_conversation_as_sensitive">Разговор је означен као осетљив</string> <string name="nc_mark_conversation_as_sensitive">Разговор је означен као осетљив</string>
<string name="nc_mark_conversation_as_unimportant">Разговор више није означен као важан</string>
<string name="nc_meeting_ended">Састанак је завршен</string> <string name="nc_meeting_ended">Састанак је завршен</string>
<string name="nc_message_added_to_notes">У белешке је додата порука</string> <string name="nc_message_added_to_notes">У белешке је додата порука</string>
<string name="nc_message_failed">Није успело</string> <string name="nc_message_failed">Није успело</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>
@ -309,8 +308,10 @@
<string name="nc_manual">Inte inställd</string> <string name="nc_manual">Inte inställd</string>
<string name="nc_mark_as_read">Markera som läst</string> <string name="nc_mark_as_read">Markera som läst</string>
<string name="nc_mark_as_unread">Markera som oläst</string> <string name="nc_mark_as_unread">Markera som oläst</string>
<string name="nc_mark_conversation_as_important">Konversationen markerades som viktig</string>
<string name="nc_mark_conversation_as_insensitive">Konversationen avmarkerades som känslig</string> <string name="nc_mark_conversation_as_insensitive">Konversationen avmarkerades som känslig</string>
<string name="nc_mark_conversation_as_sensitive">Konversationen markerades som känslig</string> <string name="nc_mark_conversation_as_sensitive">Konversationen markerades som känslig</string>
<string name="nc_mark_conversation_as_unimportant">Konversationen avmarkerades som viktig</string>
<string name="nc_meeting_ended">Möte avslutat</string> <string name="nc_meeting_ended">Möte avslutat</string>
<string name="nc_message_added_to_notes">Meddelande tillagt i anteckningar</string> <string name="nc_message_added_to_notes">Meddelande tillagt i anteckningar</string>
<string name="nc_message_failed">Misslyckades</string> <string name="nc_message_failed">Misslyckades</string>
@ -541,6 +542,7 @@
<string name="online_status">Online-status</string> <string name="online_status">Online-status</string>
<string name="openConversations">Öppna konversationer</string> <string name="openConversations">Öppna konversationer</string>
<string name="open_in_files_app">Öppna i appen Filer</string> <string name="open_in_files_app">Öppna i appen Filer</string>
<string name="open_notes">Öppna anteckningar</string>
<string name="play_pause_voice_message">Spela/pausa röstmeddelande</string> <string name="play_pause_voice_message">Spela/pausa röstmeddelande</string>
<string name="playback_speed_control">Kontroll av uppspelningshastighet</string> <string name="playback_speed_control">Kontroll av uppspelningshastighet</string>
<string name="polls_add_option">Lägg till alternativ</string> <string name="polls_add_option">Lägg till alternativ</string>
@ -677,6 +679,10 @@
<item quantity="one">Se %d liknande meddelande</item> <item quantity="one">Se %d liknande meddelande</item>
<item quantity="other">Se %d liknande meddelanden</item> <item quantity="other">Se %d liknande meddelanden</item>
</plurals> </plurals>
<plurals name="nc_conversation_auto_delete_info">
<item quantity="one">Den här konversationen kommer automatiskt att tas bort för alla om %1$d dag utan aktivitet</item>
<item quantity="other">Den här konversationen kommer automatiskt att tas bort för alla om %1$d dagar utan aktivitet</item>
</plurals>
<plurals name="polls_amount_voters"> <plurals name="polls_amount_voters">
<item quantity="one">%d röst</item> <item quantity="one">%d röst</item>
<item quantity="other">%d röster</item> <item quantity="other">%d röster</item>

View File

@ -4,9 +4,9 @@
<string name="add_participants">Ekle</string> <string name="add_participants">Ekle</string>
<string name="add_to_notes">Notlar uygulamasına ekle</string> <string name="add_to_notes">Notlar uygulamasına ekle</string>
<string name="added_to_favorites">%1$s görüşmesi sık kullanılara eklendi</string> <string name="added_to_favorites">%1$s görüşmesi sık kullanılara eklendi</string>
<string name="appbar_search_in">%s içinde arama</string> <string name="appbar_search_in">%s içinde ara</string>
<string name="archive_conversation">Görüşmeyi arşivle</string> <string name="archive_conversation">Görüşmeyi arşivle</string>
<string name="archive_hint">Bir görüşme arşivlendiğinde, varsayılan olarak gizlenir. Arşivlenmiş görüşmeleri görüntülemek için \"Arşivlenmiş\" süzgecini seçin. Doğrudan anmalar yine de alınır.</string> <string name="archive_hint">Bir görüşme arşivlendiğinde, varsayılan olarak gizlenir. Arşivlenmiş görüşmeleri görüntülemek için \"Arşivlenmiş\" süzgecini seçin. Doğrudan bahsetmeler yine de alınır.</string>
<string name="archived">Arşivlenmiş</string> <string name="archived">Arşivlenmiş</string>
<string name="archived_conversation">%1$s arşivlendi</string> <string name="archived_conversation">%1$s arşivlendi</string>
<string name="audio_call">Sesli çağrı</string> <string name="audio_call">Sesli çağrı</string>
@ -104,7 +104,7 @@
<string name="nc_all_ok_operation">Hepsi tamam!</string> <string name="nc_all_ok_operation">Hepsi tamam!</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 kilidini aç</string> <string name="nc_biometric_unlock">%1$s kilidini aç</string>
<string name="nc_bluetooth_permission_hint">Bluetooth hoparlörleri kullanıma almak için lütfen \"Yakındaki aygıtlar\" izni verin.</string> <string name="nc_bluetooth_permission_hint">Bluetooth hoparlörleri etkinleştirmek için lütfen \"Yakındaki aygıtlar\" izni verin.</string>
<string name="nc_call_button_content_description_answer_video_call">Görüntülü çağrı olarak yanıtla</string> <string name="nc_call_button_content_description_answer_video_call">Görüntülü çağrı olarak yanıtla</string>
<string name="nc_call_button_content_description_answer_voice_only">Yalnızca sesli çağrı olarak yanıtla</string> <string name="nc_call_button_content_description_answer_voice_only">Yalnızca sesli çağrı olarak yanıtla</string>
<string name="nc_call_button_content_description_audio_output">Ses çıkışını değiştir</string> <string name="nc_call_button_content_description_audio_output">Ses çıkışını değiştir</string>
@ -146,7 +146,7 @@
<string name="nc_common_copy">Kopyala</string> <string name="nc_common_copy">Kopyala</string>
<string name="nc_common_copy_success">Panoya kopyalandı</string> <string name="nc_common_copy_success">Panoya kopyalandı</string>
<string name="nc_common_create">Ekle</string> <string name="nc_common_create">Ekle</string>
<string name="nc_common_disabled">Kullanımdan kaldırılmış</string> <string name="nc_common_disabled">Devre Dışı</string>
<string name="nc_common_dismiss">Yok say</string> <string name="nc_common_dismiss">Yok say</string>
<string name="nc_common_error_sorry">Ne yazık ki bir sorun çıktı!</string> <string name="nc_common_error_sorry">Ne yazık ki bir sorun çıktı!</string>
<string name="nc_common_more_options">Diğer seçenekler</string> <string name="nc_common_more_options">Diğer seçenekler</string>
@ -184,7 +184,7 @@
<string name="nc_diagnose_account_server">Sunucu</string> <string name="nc_diagnose_account_server">Sunucu</string>
<string name="nc_diagnose_account_server_notification_app">Sunucu bildirimi uygulaması kurulmuş mu?</string> <string name="nc_diagnose_account_server_notification_app">Sunucu bildirimi uygulaması kurulmuş mu?</string>
<string name="nc_diagnose_account_user_name">Kullanıcı adı</string> <string name="nc_diagnose_account_user_name">Kullanıcı adı</string>
<string name="nc_diagnose_account_user_status_enabled">Kullanıcı durumu kullanıma alınmış mı?</string> <string name="nc_diagnose_account_user_status_enabled">Kullanıcı durumu etkinleştirilmiş mı?</string>
<string name="nc_diagnose_android_version_title">Android sürümü</string> <string name="nc_diagnose_android_version_title">Android sürümü</string>
<string name="nc_diagnose_app_category_title">Uygulama</string> <string name="nc_diagnose_app_category_title">Uygulama</string>
<string name="nc_diagnose_app_name_title">Uygulama adı</string> <string name="nc_diagnose_app_name_title">Uygulama adı</string>
@ -210,11 +210,11 @@
<string name="nc_diagnose_latest_push_registration_at_server_fail">Henüz sunucuda kaydedilmemiş</string> <string name="nc_diagnose_latest_push_registration_at_server_fail">Henüz sunucuda kaydedilmemiş</string>
<string name="nc_diagnose_meta_category_title">Üst veri bilgileri</string> <string name="nc_diagnose_meta_category_title">Üst veri bilgileri</string>
<string name="nc_diagnose_meta_system_report_date">Sistem raporu hazırlama</string> <string name="nc_diagnose_meta_system_report_date">Sistem raporu hazırlama</string>
<string name="nc_diagnose_notification_calls_channel_permission">Çağrı bildirimi kanalı kullanıma alınmış mı?</string> <string name="nc_diagnose_notification_calls_channel_permission">Çağrı bildirimi kanalı etkinleştirilmiş mı?</string>
<string name="nc_diagnose_notification_messages_channel_permission">İleti bildirimi kanalı kullanıma alınmış mı?</string> <string name="nc_diagnose_notification_messages_channel_permission">İleti bildirimi kanalı etkinleştirilmiş mı?</string>
<string name="nc_diagnose_notification_permission">Bildirim izinleri</string> <string name="nc_diagnose_notification_permission">Bildirim izinleri</string>
<string name="nc_diagnose_phone_category_title">Telefon</string> <string name="nc_diagnose_phone_category_title">Telefon</string>
<string name="nc_diagnose_server_talk_version">Sunucunun Konuş sürümü</string> <string name="nc_diagnose_server_talk_version">Sunucunun Talk sürümü</string>
<string name="nc_diagnose_server_version">Sunucu sürümü</string> <string name="nc_diagnose_server_version">Sunucu sürümü</string>
<string name="nc_diagnose_signaling_mode_extern">Dış</string> <string name="nc_diagnose_signaling_mode_extern">Dış</string>
<string name="nc_diagnose_signaling_mode_intern">İç</string> <string name="nc_diagnose_signaling_mode_intern">İç</string>
@ -224,7 +224,7 @@
<string name="nc_dialog_outdated_client">Uygulama sürümü çok eski</string> <string name="nc_dialog_outdated_client">Uygulama sürümü çok eski</string>
<string name="nc_dialog_outdated_client_description">Uygulama çok eski ve artık bu sunucu tarafından desteklenmiyor. Lütfen güncelleyin.</string> <string name="nc_dialog_outdated_client_description">Uygulama çok eski ve artık bu sunucu tarafından desteklenmiyor. Lütfen güncelleyin.</string>
<string name="nc_dialog_outdated_client_option_update">Güncelle</string> <string name="nc_dialog_outdated_client_option_update">Güncelle</string>
<string name="nc_dialog_reauth_or_delete">Bu hesabı yeniden kullanıma almak ya da silmek ister misiniz?</string> <string name="nc_dialog_reauth_or_delete">Bu hesabı yeniden etkinleştirmek ya da silmek ister misiniz?</string>
<string name="nc_dialog_save_to_storage_content">Bu ortamı depolama alanına kaydetmek, aygıtınızdaki diğer uygulamaların da buna erişmesine izin verir.</string> <string name="nc_dialog_save_to_storage_content">Bu ortamı depolama alanına kaydetmek, aygıtınızdaki diğer uygulamaların da buna erişmesine izin verir.</string>
<string name="nc_dialog_save_to_storage_continue">İlerlemek istiyor musunuz?</string> <string name="nc_dialog_save_to_storage_continue">İlerlemek istiyor musunuz?</string>
<string name="nc_dialog_save_to_storage_no">Hayır</string> <string name="nc_dialog_save_to_storage_no">Hayır</string>
@ -264,8 +264,8 @@
<string name="nc_group">Grup</string> <string name="nc_group">Grup</string>
<string name="nc_guest">Konuk</string> <string name="nc_guest">Konuk</string>
<string name="nc_guest_access">Konuk erişimi</string> <string name="nc_guest_access">Konuk erişimi</string>
<string name="nc_guest_access_allow_failed">Konuk erişimi kullanıma alınamaz ya da kullanımdan kaldırılamaz.</string> <string name="nc_guest_access_allow_failed">Konuk erişimi etkinleştirilemez ya da devre dışı bırakılamaz.</string>
<string name="nc_guest_access_allow_summary">Bu seçenek kullanıma alındığında, konuklar bu görüşmeyi herkese açık bir katılma bağlantısı ile paylaşabilir.</string> <string name="nc_guest_access_allow_summary">Bu seçenek etkinse, konuklar bu görüşmeyi herkese açık bir katılma bağlantısı ile paylaşabilir.</string>
<string name="nc_guest_access_allow_title">Konuklar katılabilsin</string> <string name="nc_guest_access_allow_title">Konuklar katılabilsin</string>
<string name="nc_guest_access_password_dialog_hint">Bir parola yazın</string> <string name="nc_guest_access_password_dialog_hint">Bir parola yazın</string>
<string name="nc_guest_access_password_dialog_title">Konuk erişimi parolası</string> <string name="nc_guest_access_password_dialog_title">Konuk erişimi parolası</string>
@ -314,7 +314,7 @@
<string name="nc_moderator">Sorumlu</string> <string name="nc_moderator">Sorumlu</string>
<string name="nc_new_conversation">Yeni görüşme</string> <string name="nc_new_conversation">Yeni görüşme</string>
<string name="nc_new_conversation_visibility">Görünürlük</string> <string name="nc_new_conversation_visibility">Görünürlük</string>
<string name="nc_new_mention">Okunmamış anmalar</string> <string name="nc_new_mention">Okunmamış bahsetmeler</string>
<string name="nc_new_messages">Okunmamış iletiler</string> <string name="nc_new_messages">Okunmamış iletiler</string>
<string name="nc_nextcloud_talk_app_not_installed">%1$s kullanılamıyor (kurulmamış ya da yönetici tarafından engellenmiş)</string> <string name="nc_nextcloud_talk_app_not_installed">%1$s kullanılamıyor (kurulmamış ya da yönetici tarafından engellenmiş)</string>
<string name="nc_nick_guest">Konuk</string> <string name="nc_nick_guest">Konuk</string>
@ -334,10 +334,10 @@
<string name="nc_notification_channel_uploads_description">Yükleme ilerlemesi bildirilsin</string> <string name="nc_notification_channel_uploads_description">Yükleme ilerlemesi bildirilsin</string>
<string name="nc_notification_settings">Bildirim ayarları</string> <string name="nc_notification_settings">Bildirim ayarları</string>
<string name="nc_notification_warning">Bildirimler doğru olarak ayarlanmamış</string> <string name="nc_notification_warning">Bildirimler doğru olarak ayarlanmamış</string>
<string name="nc_notifications_troubleshooting_dialog_text">Bildirim izni ve pil ayarları, bildirimleri almak için doğru şekilde ayarlanmış. Yine de bildirim almakta sorun yaşıyorsanız lütfen çağrı ve iletiler için bildirim kanallarının kullanıma alınmış olup olmadığını denetleyin. Daha fazla yardım almak için DontKillMyApp.com adresine ya da sorun giderme kontrol listesine bakabilirsiniz. Bunlar işe yaramazsa lütfen tanılama ekranına gidin ve bir hata bildirimi gönderin.</string> <string name="nc_notifications_troubleshooting_dialog_text">Bildirim izni ve pil ayarları, bildirimleri almak için doğru şekilde ayarlanmış. Yine de bildirim almakta sorun yaşıyorsanız lütfen çağrı ve iletiler için bildirim kanallarının etkinleştirilmiş olup olmadığını denetleyin. Daha fazla yardım almak için DontKillMyApp.com adresine ya da sorun giderme kontrol listesine bakabilirsiniz. Bunlar işe yaramazsa lütfen tanılama ekranına gidin ve bir hata bildirimi gönderin.</string>
<string name="nc_notifications_troubleshooting_dialog_title">Bildirim sorunlarını çözme</string> <string name="nc_notifications_troubleshooting_dialog_title">Bildirim sorunlarını çözme</string>
<string name="nc_notify_me_always">Her zaman bildirilsin</string> <string name="nc_notify_me_always">Her zaman bildirilsin</string>
<string name="nc_notify_me_mention">Anmalar bildirilsin</string> <string name="nc_notify_me_mention">Bahsedildiğinde bildirilsin</string>
<string name="nc_notify_me_never">Asla bildirilmesin</string> <string name="nc_notify_me_never">Asla bildirilmesin</string>
<string name="nc_offline">Şu anda çevrim dışı, lütfen bağlantınızı denetleyin</string> <string name="nc_offline">Şu anda çevrim dışı, lütfen bağlantınızı denetleyin</string>
<string name="nc_ok">Tamam</string> <string name="nc_ok">Tamam</string>
@ -361,9 +361,9 @@
<string name="nc_profile_personal_info_title">Kişisel bilgiler</string> <string name="nc_profile_personal_info_title">Kişisel bilgiler</string>
<string name="nc_promote">Sorumluluğa yükselt</string> <string name="nc_promote">Sorumluluğa yükselt</string>
<string name="nc_public_call_status">Herkese açık görüşme</string> <string name="nc_public_call_status">Herkese açık görüşme</string>
<string name="nc_push_disabled">Anında bildirimler kullanımdan kaldırılmış</string> <string name="nc_push_disabled">Anında bildirimler devre dışı bırakılmış</string>
<string name="nc_push_to_talk">Bas-konuş</string> <string name="nc_push_to_talk">Bas Konuş</string>
<string name="nc_push_to_talk_desc">Mikrofon kullanımdan kaldırılmışken, Bas-konuş üzerine tıklayıp basılı tutun</string> <string name="nc_push_to_talk_desc">Mikrofon devre dışı bırakılmışken, Bas-konuş üzerine tıklayıp basılı tutun</string>
<string name="nc_remind">Sonra hatırlat</string> <string name="nc_remind">Sonra hatırlat</string>
<string name="nc_remove_from_favorites">Sık kullanılanlardan kaldır</string> <string name="nc_remove_from_favorites">Sık kullanılanlardan kaldır</string>
<string name="nc_remove_group_and_members">Grup ve üyelerini sil</string> <string name="nc_remove_group_and_members">Grup ve üyelerini sil</string>
@ -408,7 +408,7 @@
<string name="nc_server_maintenance">Lütfen %1$s kopyanızı bakım kipinden çıkarın</string> <string name="nc_server_maintenance">Lütfen %1$s kopyanızı bakım kipinden çıkarın</string>
<string name="nc_server_not_installed">Lütfen %1$s kurulumunuzu tamamlayın</string> <string name="nc_server_not_installed">Lütfen %1$s kurulumunuzu tamamlayın</string>
<string name="nc_server_testing_connection">Bağlantı sınanıyor</string> <string name="nc_server_testing_connection">Bağlantı sınanıyor</string>
<string name="nc_server_unsupported">Sunucuda desteklenen bir Konuş uygulaması kurulu değil</string> <string name="nc_server_unsupported">Sunucuda desteklenen bir Talk uygulaması kurulu değil</string>
<string name="nc_server_url">Sunucu adresi https://…</string> <string name="nc_server_url">Sunucu adresi https://…</string>
<string name="nc_server_version">%1$s yalnızca %2$s 13 ve üzerinde çalışır</string> <string name="nc_server_version">%1$s yalnızca %2$s 13 ve üzerinde çalışır</string>
<string name="nc_set_new_password">Yeni parola ayarla</string> <string name="nc_set_new_password">Yeni parola ayarla</string>
@ -421,15 +421,15 @@
<string name="nc_settings_contact_admin_of">Lütfen şuranın yöneticisi ile görüşün</string> <string name="nc_settings_contact_admin_of">Lütfen şuranın yöneticisi ile görüşün</string>
<string name="nc_settings_diagnose_subtitle">Ayarları denetlemek için tanılama ekranınıın ya da bir hata bildirimi oluşturun</string> <string name="nc_settings_diagnose_subtitle">Ayarları denetlemek için tanılama ekranınıın ya da bir hata bildirimi oluşturun</string>
<string name="nc_settings_diagnose_title">Tanılama</string> <string name="nc_settings_diagnose_title">Tanılama</string>
<string name="nc_settings_incognito_keyboard_desc">Tuş takımında kişisel öğrenmeyi kullanımdan kaldırır (garanti edilmez)</string> <string name="nc_settings_incognito_keyboard_desc">Tuş takımında kişisel öğrenmeyi devre dışı bırakır (garanti edilmez)</string>
<string name="nc_settings_incognito_keyboard_title">Tuş takımı gizliliği</string> <string name="nc_settings_incognito_keyboard_title">Tuş takımı gizliliği</string>
<string name="nc_settings_no_ringtone">Ses yok</string> <string name="nc_settings_no_ringtone">Ses yok</string>
<string name="nc_settings_no_talk_installed">Kimlik doğrulaması yapmak istediğiniz sunucu üzerinde Konuş uygulaması kurulu değil</string> <string name="nc_settings_no_talk_installed">Kimlik doğrulaması yapmak istediğiniz sunucu üzerinde Talk uygulaması kurulu değil</string>
<string name="nc_settings_notification_sounds_post_oreo">Bildirimler</string> <string name="nc_settings_notification_sounds_post_oreo">Bildirimler</string>
<string name="nc_settings_notifications_declined">Bildirimler reddediliyor</string> <string name="nc_settings_notifications_declined">Bildirimler reddediliyor</string>
<string name="nc_settings_notifications_granted">Bildirimlere izin veriliyor</string> <string name="nc_settings_notifications_granted">Bildirimlere izin veriliyor</string>
<string name="nc_settings_other_notifications_ringtone">İletiler</string> <string name="nc_settings_other_notifications_ringtone">İletiler</string>
<string name="nc_settings_phone_book_integration_desc">Kişileri telefon numaralarına göre eşleştirerek sistem kişiler uygulamasında Konuş kısa yolunu görüntüler</string> <string name="nc_settings_phone_book_integration_desc">Kişileri telefon numaralarına göre eşleştirerek sistem kişiler uygulamasında Talk kısa yolunu görüntüler</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_429">Hata 429 çok fazla sayıda istek yapıldı</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_429">Hata 429 çok fazla sayıda istek yapıldı</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_description">Telefon numaranızı ayarlayarak diğer kullanıcıların sizi bulmasını sağlayabilirsiniz</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_description">Telefon numaranızı ayarlayarak diğer kullanıcıların sizi bulmasını sağlayabilirsiniz</string>
<string name="nc_settings_phone_book_integration_phone_number_dialog_edit_text_hint">Telefon numarasını yazın</string> <string name="nc_settings_phone_book_integration_phone_number_dialog_edit_text_hint">Telefon numarasını yazın</string>
@ -504,7 +504,7 @@
<string name="nc_upload_video_from_cam">Görüntü al</string> <string name="nc_upload_video_from_cam">Görüntü al</string>
<string name="nc_user">Kullanıcı</string> <string name="nc_user">Kullanıcı</string>
<string name="nc_video_filename">%1$s üzerinden görüntü kaydı</string> <string name="nc_video_filename">%1$s üzerinden görüntü kaydı</string>
<string name="nc_voice_message_filename">%1$s Konuş kaydı (%2$s)</string> <string name="nc_voice_message_filename">%1$s Talk kaydı (%2$s)</string>
<string name="nc_voice_message_hold_to_record_info">Kaydetmek için basılı tutun, bırakarak gönderin.</string> <string name="nc_voice_message_hold_to_record_info">Kaydetmek için basılı tutun, bırakarak gönderin.</string>
<string name="nc_voice_message_missing_audio_permission">Ses kaydetme izninin verilmesi gereklidir</string> <string name="nc_voice_message_missing_audio_permission">Ses kaydetme izninin verilmesi gereklidir</string>
<string name="nc_voice_message_slide_to_cancel">« İptal etmek için kaydırın</string> <string name="nc_voice_message_slide_to_cancel">« İptal etmek için kaydırın</string>
@ -565,7 +565,7 @@
<string name="scope_federated_title">Birleşik</string> <string name="scope_federated_title">Birleşik</string>
<string name="scope_local_description">Yalnızca bu kopyadaki kişiler ve konuklar görebilir</string> <string name="scope_local_description">Yalnızca bu kopyadaki kişiler ve konuklar görebilir</string>
<string name="scope_local_title">Yerel</string> <string name="scope_local_title">Yerel</string>
<string name="scope_private_description">Yalnızca mobil aygıt üzerinde Konuş telefon numarası bütünleştirmesi ile eşleşen kişiler görebilir</string> <string name="scope_private_description">Yalnızca mobil aygıt üzerinde Talk telefon numarası bütünleştirmesi ile eşleşen kişiler görebilir</string>
<string name="scope_private_title">Kişisel</string> <string name="scope_private_title">Kişisel</string>
<string name="scope_published_description">Genel ve herkese açık adres defteri ile ve güvenilen sunucularla eşitlensin</string> <string name="scope_published_description">Genel ve herkese açık adres defteri ile ve güvenilen sunucularla eşitlensin</string>
<string name="scope_published_title">Yayınlanmış</string> <string name="scope_published_title">Yayınlanmış</string>

View File

@ -3,6 +3,7 @@
<string name= "nc_edit">Редагувати</string> <string name= "nc_edit">Редагувати</string>
<string name="add_participants">Додати</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="audio_output_bluetooth">Bluetooth</string> <string name="audio_output_bluetooth">Bluetooth</string>
<string name="audio_output_dialog_headline">Вивід аудіо</string> <string name="audio_output_dialog_headline">Вивід аудіо</string>
<string name="audio_output_phone">Телефон</string> <string name="audio_output_phone">Телефон</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>
@ -310,8 +309,10 @@
<string name="nc_manual">未設定</string> <string name="nc_manual">未設定</string>
<string name="nc_mark_as_read">標為已讀</string> <string name="nc_mark_as_read">標為已讀</string>
<string name="nc_mark_as_unread">標為未讀</string> <string name="nc_mark_as_unread">標為未讀</string>
<string name="nc_mark_conversation_as_important">對話已標記為重要</string>
<string name="nc_mark_conversation_as_insensitive">對話已取消標記為敏感</string> <string name="nc_mark_conversation_as_insensitive">對話已取消標記為敏感</string>
<string name="nc_mark_conversation_as_sensitive">對話已標記為敏感</string> <string name="nc_mark_conversation_as_sensitive">對話已標記為敏感</string>
<string name="nc_mark_conversation_as_unimportant">對話已取消標記為重要</string>
<string name="nc_meeting_ended">會議已結束</string> <string name="nc_meeting_ended">會議已結束</string>
<string name="nc_message_added_to_notes">訊息已新增至筆記</string> <string name="nc_message_added_to_notes">訊息已新增至筆記</string>
<string name="nc_message_failed">失敗</string> <string name="nc_message_failed">失敗</string>
@ -542,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>
@ -678,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,8 +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>
<plurals name="nc_conversation_auto_delete_info">
<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>
</plurals>
<string name="nc_delete_message">Delete</string> <string name="nc_delete_message">Delete</string>
<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_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>
@ -860,4 +863,5 @@ How to translate with transifex:
<string name="unarchived_conversation">Unarchived %1$s</string> <string name="unarchived_conversation">Unarchived %1$s</string>
<string name="conversation_archived">Conversation is archived</string> <string name="conversation_archived">Conversation is archived</string>
<string name="local_time">Local time: %1$s</string> <string name="local_time">Local time: %1$s</string>
<string name="open_notes">Open Notes</string>
</resources> </resources>

View File

@ -24,7 +24,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:8.10.1' classpath 'com.android.tools.build:gradle:8.10.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}"
classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.1.13' classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.2.0'
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.8" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.8"
classpath "org.jlleitschuh.gradle:ktlint-gradle:12.3.0" classpath "org.jlleitschuh.gradle:ktlint-gradle:12.3.0"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

View File

@ -1432,6 +1432,18 @@ IaddzrPZPmaZ8CtzzyB7+JdSNItBB2Sp
=wK3Q =wK3Q
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
pub BDD2A76422470515
sub 0C77E993AC36C97C
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaDypvxYJKwYBBAHaRw8BAQdAv3OEFRIQWBhSii0M3S9P3eGlZLalGY9smzBQ
C0aiVXW4OARoPKm/EgorBgEEAZdVAQUBAQdA2THBTS3MqZPdTuKmc7QkAvlvwmJa
WEQsXXqkjQdEwD4DAQgHiH4EGBYKACYWIQSu/rh4kM398rwIxKq90qdkIkcFFQUC
aDypvwIbDAUJBaOagAAKCRC90qdkIkcFFfyUAPsGJcpKQP2/sQe+XN69rVZMFXhk
dYg0U9EhpY/7GHDpHQD+J5Uy2s3USLxeyIylXUFWtxqOocB+vZhvH3Yhmjhwmgw=
=zAHg
-----END PGP PUBLIC KEY BLOCK-----
pub BEDE11EAF1164480 pub BEDE11EAF1164480
uid Joe Schmetzer <joe@exubero.com> uid Joe Schmetzer <joe@exubero.com>
@ -1811,8 +1823,6 @@ D6aQF9AkWwwt0KnH445Fg84An1hG98Cj9efdOoxMt6lAEHX1eHLq
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
pub CA80D1F0EB6CA4BA pub CA80D1F0EB6CA4BA
uid Sylwester Lachiewicz <slachiewicz@apache.org>
sub 5EAB8AD72016DF52 sub 5EAB8AD72016DF52
-----BEGIN PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK-----
@ -1827,31 +1837,30 @@ T5nHRHaWhUvmqGRphogmUVEkNwXMO92FILLkcvBGlNmyGDesw5300QEijdcXLZzi
LZBuyANzn7Ve0Bk8b6nNVaNln3yCkwLfrsROPItcj/rlEhS3bjvM5E+VmqBD6pvS LZBuyANzn7Ve0Bk8b6nNVaNln3yCkwLfrsROPItcj/rlEhS3bjvM5E+VmqBD6pvS
kldJPDKJJGfJZFu7jx5x7kygrVZyFayJsSslnBGsyMvmORNhA1zzWR7tn1BNhCB1 kldJPDKJJGfJZFu7jx5x7kygrVZyFayJsSslnBGsyMvmORNhA1zzWR7tn1BNhCB1
8JSiXAZEIrh6YOkK9mDlCYppoPZCUshCZVPD8l18eK7A2MQ8luQvgqC6dQARAQAB 8JSiXAZEIrh6YOkK9mDlCYppoPZCUshCZVPD8l18eK7A2MQ8luQvgqC6dQARAQAB
tC1TeWx3ZXN0ZXIgTGFjaGlld2ljeiA8c2xhY2hpZXdpY3pAYXBhY2hlLm9yZz65 uQINBF62njsBEAC6cz5EQSsWCQHMPtqpMpLLD+B2iV1fnQjN7/i7X/cc3y50SwQ7
Ag0EXraeOwEQALpzPkRBKxYJAcw+2qkykssP4HaJXV+dCM3v+Ltf9xzfLnRLBDs9 PYJwbYFQ0zOtrTMIhL42B4JCgO7UGRlbGS0cV1U28XAeZ8QJMWgRcSMnye5XJzNV
gnBtgVDTM62tMwiEvjYHgkKA7tQZGVsZLRxXVTbxcB5nxAkxaBFxIyfJ7lcnM1WI iO8Xsh9Z+8eFA0yhQWMrGL58DgqJrAWxW0JSyoNtqrOHceqamw63BMQGoA60eN3+
7xeyH1n7x4UDTKFBYysYvnwOComsBbFbQlLKg22qs4dx6pqbDrcExAagDrR43f7h 4QLRhL0LTpOdSxCDqba+nXWivDxoigThr/fHqmL5fIJMhOdGrVhGH9l1YDLJBwLB
AtGEvQtOk51LEIOptr6ddaK8PGiKBOGv98eqYvl8gkyE50atWEYf2XVgMskHAsES EkZfwv4tcwSaJyGTBbSvukRqV/G0O6d3EQ98uS5zcMU96YrMxvS5CYoI/+G2zwzM
Rl/C/i1zBJonIZMFtK+6RGpX8bQ7p3cRD3y5LnNwxT3piszG9LkJigj/4bbPDMyK inC54v68bWQTA2PoA94+tpSr3QJm7dA8aJv4/sia0v7lmx4hOabG62aKKuIDHbIF
cLni/rxtZBMDY+gD3j62lKvdAmbt0Dxom/j+yJrS/uWbHiE5psbrZooq4gMdsgVV VQ5awhRt1mJ1YeerII0TigF6uIzdbqqyotxcZ9Abu926Y6P/ANMSV+BKhNNzqiRk
DlrCFG3WYnVh56sgjROKAXq4jN1uqrKi3Fxn0Bu73bpjo/8A0xJX4EqE03OqJGRV VcqvrsTrwp3WZHlZCtSuAr8+dpBx0WEVLIhiilpXkyOm1oLw45idsYdZRPdhccLX
yq+uxOvCndZkeVkK1K4Cvz52kHHRYRUsiGKKWleTI6bWgvDjmJ2xh1lE92Fxwtcn J7ejyXDPZ6w60qRNs80LdCE+zVjGIPb6zZt0ZiqpEMeMOUDTpJfHBlWdN3irgGiG
t6PJcM9nrDrSpE2zzQt0IT7NWMYg9vrNm3RmKqkQx4w5QNOkl8cGVZ03eKuAaIYB AYKKYk+RsxxhP35ny7Ps986IMJZcPRY7ElmUFjOwySYPykmDahiWXXZm1zPWTEIA
gopiT5GzHGE/fmfLs+z3zogwllw9FjsSWZQWM7DJJg/KSYNqGJZddmbXM9ZMQgBn Z6zBGHPaqc5ph2hiXDW8iMwLlgEF6YJb9cj4jSR4Xwgjtb/sKy0z28ecPQARAQAB
rMEYc9qpzmmHaGJcNbyIzAuWAQXpglv1yPiNJHhfCCO1v+wrLTPbx5w9ABEBAAGJ iQI2BBgBCgAgFiEEMhGM92yexdkY5UlnyoDR8OtspLoFAl62njsCGwwACgkQyoDR
AjYEGAEKACAWIQQyEYz3bJ7F2RjlSWfKgNHw62ykugUCXraeOwIbDAAKCRDKgNHw 8OtspLob3xAAmlXlX22kSOy6uV86MRHnRXwArPYO+sZYWtr3qwHJjo8O+HXvd0/+
62ykuhvfEACaVeVfbaRI7Lq5XzoxEedFfACs9g76xlha2verAcmOjw74de93T/7l 5b89M+rSUDEIoBkvlLAAVnp59SdFP4Cmau7KlIU+arKL/yx7/YC0fIqru2H8+pRZ
vz0z6tJQMQigGS+UsABWenn1J0U/gKZq7sqUhT5qsov/LHv9gLR8iqu7Yfz6lFne 3s7Hz6lq/EHv13y2jtabCA+f4QMeiiev+dkVUxODkLcryMZe4aZFfA7H25Kgd7h2
zsfPqWr8Qe/XfLaO1psID5/hAx6KJ6/52RVTE4OQtyvIxl7hpkV8DsfbkqB3uHZf X/+7x+57eNaZD6l9MGDxtxSM0To8cNdX9ivTIOupdTdTwiQ/gH6VeznC/9nhXCBE
/7vH7nt41pkPqX0wYPG3FIzROjxw11f2K9Mg66l1N1PCJD+AfpV7OcL/2eFcIETC wiOKdcZcm+2tsGII9sYKR/EiehXOXTsKuD3nN8o1pFewqlhNzoqzaP7QhwpPV1w6
I4p1xlyb7a2wYgj2xgpH8SJ6Fc5dOwq4Pec3yjWkV7CqWE3OirNo/tCHCk9XXDoB AYClxZYcRKLgA8YwexW7g29R0dqhvxukwSsE0h2ftJl61FdfZI3zDs+A7UYat+B+
gKXFlhxEouADxjB7FbuDb1HR2qG/G6TBKwTSHZ+0mXrUV19kjfMOz4DtRhq34H6X l8SRtleFzRN9f8W8PUD1fev2r5QfMDEMsaJN0Uej+O3BNVyMC956aN3h9B2yKBJY
xJG2V4XNE31/xbw9QPV96/avlB8wMQyxok3RR6P47cE1XIwL3npo3eH0HbIoElhb W8xpi6J/ciB3S32UEDaOVejrxdk/yCsyZOUo11yVpfE+6OhiuBWCnuCdJRlPbrRd
zGmLon9yIHdLfZQQNo5V6OvF2T/IKzJk5SjXXJWl8T7o6GK4FYKe4J0lGU9utF2X l2i3rgnmnql05cUUdosyNG8umx/U0hVWiuA3VPvOcb1y6r8gjVkO5G6WImoKV864
aLeuCeaeqXTlxRR2izI0by6bH9TSFVaK4DdU+85xvXLqvyCNWQ7kbpYiagpXzrg0 NHpQ5L5JLK9ITyOLdB0M8ODvCZCaCNtvEkLfSsc/jUu6eMy3cMsHNomgTrLN/mmh
elDkvkksr0hPI4t0HQzw4O8JkJoI228SQt9Kxz+NS7p4zLdwywc2iaBOss3+aaF2 do67iARWvgjnaggbagtEb4dhoX7YR7SKTRa9y77u8unIz+2IIM10Nw4=
jruIBFa+COdqCBtqC0Rvh2GhfthHtIpNFr3Lvu7y6cjP7YggzXQ3Dg== =7Ldz
=AKpr
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
pub CB43338E060CF9FA pub CB43338E060CF9FA
@ -6206,6 +6215,22 @@ ymOZIduHXX1X+KzlRZTXvv4tSFnIQ0mWY1ySiOJQJS2WABVwFpFc8rECm6eN
=z4dc =z4dc
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
pub 793FD5751A0F0780
uid Block Open Source Releases <oss-releases@block.xyz>
sub 59EF9FBBED4216F5
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZzuZjRYJKwYBBAHaRw8BAQdA/FAoxAeXKY80R8UZ35NNr06SMFqC3Pv/LtP2
sZS+7N60M0Jsb2NrIE9wZW4gU291cmNlIFJlbGVhc2VzIDxvc3MtcmVsZWFzZXNA
YmxvY2sueHl6Prg4BGc7mY0SCisGAQQBl1UBBQEBB0BxT6NyXTVMCaIjZGa2M+/h
z+xbicRNpHTpudCgcUvccwMBCAeIfgQYFgoAJhYhBB0hf4R17unxmrjda3k/1XUa
DweABQJnO5mNAhsMBQkSzAMAAAoJEHk/1XUaDweAmCgA/2x1ZfeK2BbKUoPDvSHk
bdks1K3OorITH/c1RHMJZe1TAP92RwDPmqy7YsZDKctpFeA0jhlWBNvbNTNkzRNu
yEjMCg==
=Eg1b
-----END PGP PUBLIC KEY BLOCK-----
pub 79752DB6C966F0B8 pub 79752DB6C966F0B8
sub AC9F6F1991913E30 sub AC9F6F1991913E30
-----BEGIN PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK-----

File diff suppressed because it is too large Load Diff

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.14.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

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: 10 errors and 99 warnings</span> <span class="mdl-layout-title">Lint Report: 10 errors and 100 warnings</span>