Merge branch 'release/26.03.2'

This commit is contained in:
Jorge Martín
2026-03-06 11:25:55 +01:00
449 changed files with 6031 additions and 3967 deletions

View File

@@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs:
@@ -68,7 +68,7 @@ jobs:
run: ./gradlew :app:assembleGplayDebug app:assembleFDroidDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES
- name: Upload debug APKs
if: ${{ matrix.variant == 'debug' }}
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: elementx-debug
path: |

View File

@@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs:
@@ -76,7 +76,7 @@ jobs:
run: ./gradlew :app:assembleGplayDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES
- name: Upload debug Enterprise APKs
if: ${{ matrix.variant == 'debug' }}
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: elementx-enterprise-debug
path: |

View File

@@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
ARCH: x86_64
DEVICE: pixel_7_pro
@@ -57,7 +57,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }}
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
- name: Upload APK as artifact
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: elementx-apk-maestro
path: |
@@ -82,7 +82,7 @@ jobs:
# https://github.com/actions/checkout/issues/881
ref: ${{ github.ref }}
- name: Download APK artifact from previous job
uses: actions/download-artifact@v7
uses: actions/download-artifact@v8
with:
name: elementx-apk-maestro
- name: Enable KVM group perms
@@ -115,7 +115,7 @@ jobs:
script: |
.github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh app-gplay-x86_64-debug.apk
- name: Upload test results
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: test-results
path: |
@@ -126,7 +126,7 @@ jobs:
- name: Update summary (success)
if: steps.maestro_test.outcome == 'success'
run: |
echo "### Maestro tests worked :rocket:!"
echo "### Maestro tests worked :rocket:!" >> $GITHUB_STEP_SUMMARY
- name: Update summary (failure)
if: steps.maestro_test.outcome != 'success'
run: |

View File

@@ -7,7 +7,7 @@ on:
- cron: "0 4 * * *"
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs:

View File

@@ -8,7 +8,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs:
@@ -56,7 +56,7 @@ jobs:
- name: ✅ Upload kover report
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: kover-results
path: |
@@ -88,7 +88,7 @@ jobs:
run: ./gradlew dependencyCheckAnalyze $CI_GRADLE_ARG_PROPERTIES
- name: Upload dependency analysis
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: dependency-analysis
path: build/reports/dependency-check-report.html

View File

@@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs:
@@ -111,7 +111,7 @@ jobs:
run: ./gradlew :tests:konsist:testDebugUnitTest $CI_GRADLE_ARG_PROPERTIES --no-daemon
- name: Upload reports
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: konsist-report
path: |
@@ -188,7 +188,7 @@ jobs:
run: ./gradlew :app:lintGplayDebug :app:lintFdroidDebug lintDebug $CI_GRADLE_ARG_PROPERTIES --continue
- name: Upload reports
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: linting-report
path: |
@@ -228,7 +228,7 @@ jobs:
run: ./gradlew detekt $CI_GRADLE_ARG_PROPERTIES --no-daemon
- name: Upload reports
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: detekt-report
path: |
@@ -268,7 +268,7 @@ jobs:
run: ./gradlew ktlintCheck $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: ktlint-report
path: |
@@ -331,7 +331,7 @@ jobs:
# https://github.com/actions/checkout/issues/881
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }}
- name: Download reports from previous jobs
uses: actions/download-artifact@v7
uses: actions/download-artifact@v8
- name: Prepare Danger
if: always()
run: |

View File

@@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g -Dsonar.gradle.skipCompile=true
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g -Dsonar.gradle.skipCompile=true
CI_GRADLE_ARG_PROPERTIES: --no-configuration-cache
jobs:

View File

@@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs:
@@ -53,7 +53,7 @@ jobs:
ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }}
run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload bundle as artifact
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: elementx-app-gplay-bundle-unsigned
path: |
@@ -89,7 +89,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload bundle as artifact
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: elementx-enterprise-app-gplay-bundle-unsigned
path: |
@@ -131,7 +131,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
run: ./gradlew assembleFdroidRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload apks as artifact
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: elementx-app-fdroid-apks-unsigned
path: |

View File

@@ -0,0 +1,77 @@
#!/usr/bin/env python3
import xml.etree.ElementTree as ET
import sys
import glob
screenshot_test_failures = []
output = []
def parse_test_failures(xml_file):
"""Parse XML test results and print failures."""
tree = ET.parse(xml_file)
root = tree.getroot()
# Find all testcase elements with failure children
if root.get("failures", "0") == "0":
return
name = root.get('name', 'Test Suite')
is_screenshot_test = name.startswith('ui.Preview')
if not is_screenshot_test:
output.append(f"## {name}")
for testcase in root.findall('.//testcase'):
failure = testcase.find('failure')
if failure is not None:
# Get testcase attributes
classname = testcase.get('classname', '')
name = testcase.get('name', '')
if is_screenshot_test:
# For screenshot tests, we want to display the classname as well
screenshot_test_failures.append(f"{classname}.{name}")
else:
# Get failure content (text inside the failure element)
failure_message = failure.get('message', '')
failure_content = failure.text if failure.text else ''
# Print in the requested format
output.append(f"### {name}")
output.append("```")
output.append(failure_message)
output.append("```")
output.append("<details><summary>Stacktrace</summary>")
output.append(f"<pre><code>{failure_content}</code></pre>")
output.append("</details>")
output.append("\n")
if __name__ == "__main__":
if len(sys.argv) < 2:
output.append("Usage: parse_test_failures.py <file>", file=sys.stderr)
sys.exit(1)
file = sys.argv[1]
if file.endswith('xml'):
parse_test_failures(file)
else:
files = glob.glob("**/build/test-results/*UnitTest/*.xml", root_dir = file, recursive = True)
for file in files:
parse_test_failures(file)
if screenshot_test_failures:
output.append("## Screenshot Test Failures")
output.append("```")
for failure in screenshot_test_failures:
output.append(failure)
output.append("```")
text_output = '\n'.join(output)
# Trim output larger than 1MB to avoid GitHub Action log limits
while len(text_output.encode('utf-8')) > 1_040_000:
output.pop(-2)
output.append("## !!! Truncated output due to size limits. !!!")
text_output = '\n'.join(output)
print(text_output)

View File

@@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --warn -Dsonar.gradle.skipCompile=true --no-configuration-cache
GROUP: ${{ format('sonar-{0}', github.ref) }}

View File

@@ -75,7 +75,7 @@ jobs:
- name: 🚫 Upload kover failed coverage reports
if: failure()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: kover-error-report
path: |
@@ -87,7 +87,7 @@ jobs:
- name: 🚫 Upload test results on error
if: failure()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: tests-and-screenshot-tests-results
path: |
@@ -95,6 +95,15 @@ jobs:
**/build/roborazzi/failures/
**/build/reports/tests/*UnitTest/
- name: 🚫 Modify summary on error
if: failure()
run: |
echo """## Tests failed!
""" >> $GITHUB_STEP_SUMMARY
python3 .github/workflows/scripts/parse_test_failures.py . >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
# https://github.com/codecov/codecov-action
- name: ☂️ Upload coverage reports to codecov
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2

View File

@@ -1,3 +1,60 @@
Changes in Element X v26.03.0
=============================
<!-- Release notes generated using configuration in .github/release.yml at v26.03.0 -->
## What's Changed
### ✨ Features
* Let enterprise build be able to use a different notification channel for noisy notification. by @bmarty in https://github.com/element-hq/element-x-android/pull/6177
### 🙌 Improvements
* Notification fallback counter by @bmarty in https://github.com/element-hq/element-x-android/pull/6181
* Sort audio device by device type before sending the list to Element Call by @bmarty in https://github.com/element-hq/element-x-android/pull/6160
### 🐛 Bugfixes
* Fix stack overflow when quickly going back on a `Space` screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6180
* Rely on the SessionObserver to detect a sign out. by @bmarty in https://github.com/element-hq/element-x-android/pull/6182
* When linkifying, adjust the `URLSpan`'s url too by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6188
* Fix call button color and ensure call can always be declined from the notification by @bmarty in https://github.com/element-hq/element-x-android/pull/6195
* Try to fix common issue with the top app bar by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6187
* Limit the max number of opened rooms in the backstack by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6215
* Remove all video metadata from externally shared videos by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6224
* Remove `runBlocking` call to restore sessions when the app starts by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6193
* Catch exceptions when changing the audio communication device by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6226
### 🗣 Translations
* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/6207
### 🧱 Build
* Fix Maestro tests again by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6167
* Add free disk space action to CI actions by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6212
### 🚧 In development 🚧
* Ensure that Element X can use the service from Element Classic. by @bmarty in https://github.com/element-hq/element-x-android/pull/6238
### Dependency upgrades
* fix(deps): update activity to v1.12.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6184
* Update roborazzi to v1.59.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6179
* Update dependency androidx.compose:compose-bom to v2026.02.00 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6172
* Remove explicit dependency `androix.compose.material` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6199
* Update metro to v0.10.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6202
* Update dependency org.matrix.rustcomponents:sdk-android to v26.2.16 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6211
* Update dependency com.posthog:posthog-android to v3.32.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6210
* Update dependency io.sentry:sentry-android to v8.33.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6223
* Update dependency org.matrix.rustcomponents:sdk-android to v26.02.19 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6229
* Update dependency org.unifiedpush.android:connector to v3.3.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6214
* Update dependency com.posthog:posthog-android to v3.32.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6230
* Update dependency io.github.zxing-cpp:android to v3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6170
* Update kotlin to v2.3.6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6218
* Update dependency org.matrix.rustcomponents:sdk-android to v26.03.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6242
### Others
* Remove `NavigationState.Space`. by @bmarty in https://github.com/element-hq/element-x-android/pull/6185
* Fallback notification cleanup by @bmarty in https://github.com/element-hq/element-x-android/pull/6190
* Use fade animation when replacing Placeholder by @ganfra in https://github.com/element-hq/element-x-android/pull/6216
* request audio focus when recording voice messages by @vmfunc in https://github.com/element-hq/element-x-android/pull/6194
* Disable the cross-process lock in the SDK by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6231
* Improve element gallery header by @bmarty in https://github.com/element-hq/element-x-android/pull/6239
* Add extra analytics for notification performance by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6237
## New Contributors
* @vmfunc made their first contribution in https://github.com/element-hq/element-x-android/pull/6194
**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v26.02.0...v26.03.0
Changes in Element X v26.02.0
=============================

View File

@@ -57,6 +57,7 @@ dependencies {
testCommonDependencies(libs)
testImplementation(projects.features.login.test)
testImplementation(projects.features.share.test)
testImplementation(projects.libraries.matrix.test)
testImplementation(projects.libraries.oidc.test)
testImplementation(projects.libraries.preferences.test)

View File

@@ -8,7 +8,6 @@
package io.element.android.appnav
import android.content.Intent
import android.os.Parcelable
import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
@@ -63,6 +62,7 @@ import io.element.android.features.roomdirectory.api.RoomDescription
import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint
import io.element.android.features.securebackup.api.SecureBackupEntryPoint
import io.element.android.features.share.api.ShareEntryPoint
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.startchat.api.StartChatEntryPoint
import io.element.android.features.userprofile.api.UserProfileEntryPoint
import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint
@@ -307,7 +307,7 @@ class LoggedInFlowNode(
data object RoomDirectory : NavTarget
@Parcelize
data class IncomingShare(val intent: Intent) : NavTarget
data class IncomingShare(val shareIntentData: ShareIntentData) : NavTarget
@Parcelize
data class IncomingVerificationRequest(val data: VerificationRequest.Incoming) : NavTarget
@@ -570,7 +570,7 @@ class LoggedInFlowNode(
shareEntryPoint.createNode(
parentNode = this,
buildContext = buildContext,
params = ShareEntryPoint.Params(intent = navTarget.intent),
params = ShareEntryPoint.Params(shareIntentData = navTarget.shareIntentData),
callback = object : ShareEntryPoint.Callback {
override fun onDone(roomIds: List<RoomId>) {
// Remove the incoming share screen
@@ -649,13 +649,13 @@ class LoggedInFlowNode(
}
}
internal suspend fun attachIncomingShare(intent: Intent) {
internal suspend fun attachIncomingShare(shareIntentData: ShareIntentData) {
waitForNavTargetAttached { navTarget ->
navTarget is NavTarget.Home
}
attachChild<Node> {
backstack.push(
NavTarget.IncomingShare(intent)
NavTarget.IncomingShare(shareIntentData)
)
}
}

View File

@@ -44,6 +44,7 @@ import io.element.android.features.announcement.api.AnnouncementService
import io.element.android.features.login.api.LoginParams
import io.element.android.features.login.api.accesscontrol.AccountProviderAccessControl
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.signedout.api.SignedOutEntryPoint
import io.element.android.libraries.accountselect.api.AccountSelectEntryPoint
import io.element.android.libraries.architecture.BackstackView
@@ -265,7 +266,7 @@ class RootFlowNode(
@Parcelize data class AccountSelect(
val currentSessionId: SessionId,
val intent: Intent?,
val shareIntentData: ShareIntentData?,
val permalinkData: PermalinkData?,
) : NavTarget
@@ -357,8 +358,8 @@ class RootFlowNode(
backstack.pop()
}
attachSession(sessionId).apply {
if (navTarget.intent != null) {
attachIncomingShare(navTarget.intent)
if (navTarget.shareIntentData != null) {
attachIncomingShare(navTarget.shareIntentData)
} else if (navTarget.permalinkData != null) {
attachPermalinkData(navTarget.permalinkData)
}
@@ -392,7 +393,7 @@ class RootFlowNode(
is ResolvedIntent.Login -> onLoginLink(resolvedIntent.params)
is ResolvedIntent.Oidc -> onOidcAction(resolvedIntent.oidcAction)
is ResolvedIntent.Permalink -> navigateTo(resolvedIntent.permalinkData)
is ResolvedIntent.IncomingShare -> onIncomingShare(resolvedIntent.intent)
is ResolvedIntent.IncomingShare -> onIncomingShare(resolvedIntent.shareIntentData)
}
}
@@ -423,7 +424,7 @@ class RootFlowNode(
}
}
private suspend fun onIncomingShare(intent: Intent) {
private suspend fun onIncomingShare(shareIntentData: ShareIntentData) {
// Is there a session already?
val latestSessionId = sessionStore.getLatestSessionId()
if (latestSessionId == null) {
@@ -437,13 +438,13 @@ class RootFlowNode(
backstack.push(
NavTarget.AccountSelect(
currentSessionId = latestSessionId,
intent = intent,
shareIntentData = shareIntentData,
permalinkData = null,
)
)
} else {
// Only one account, directly attach the incoming share node.
loggedInFlowNode.attachIncomingShare(intent)
loggedInFlowNode.attachIncomingShare(shareIntentData)
}
}
}
@@ -467,7 +468,7 @@ class RootFlowNode(
backstack.push(
NavTarget.AccountSelect(
currentSessionId = latestSessionId,
intent = null,
shareIntentData = null,
permalinkData = permalinkData,
)
)

View File

@@ -12,6 +12,8 @@ import android.content.Intent
import dev.zacsweers.metro.Inject
import io.element.android.features.login.api.LoginIntentResolver
import io.element.android.features.login.api.LoginParams
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.share.api.ShareIntentHandler
import io.element.android.libraries.deeplink.api.DeeplinkData
import io.element.android.libraries.deeplink.api.DeeplinkParser
import io.element.android.libraries.matrix.api.permalink.PermalinkData
@@ -25,7 +27,7 @@ sealed interface ResolvedIntent {
data class Oidc(val oidcAction: OidcAction) : ResolvedIntent
data class Permalink(val permalinkData: PermalinkData) : ResolvedIntent
data class Login(val params: LoginParams) : ResolvedIntent
data class IncomingShare(val intent: Intent) : ResolvedIntent
data class IncomingShare(val shareIntentData: ShareIntentData) : ResolvedIntent
}
@Inject
@@ -34,6 +36,7 @@ class IntentResolver(
private val loginIntentResolver: LoginIntentResolver,
private val oidcIntentResolver: OidcIntentResolver,
private val permalinkParser: PermalinkParser,
private val shareIntentHandler: ShareIntentHandler,
) {
fun resolve(intent: Intent): ResolvedIntent? {
if (intent.canBeIgnored()) return null
@@ -62,7 +65,8 @@ class IntentResolver(
if (permalinkData != null) return ResolvedIntent.Permalink(permalinkData)
if (intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_SEND_MULTIPLE) {
return ResolvedIntent.IncomingShare(intent)
val data = shareIntentHandler.handleIncomingShareIntent(intent) ?: return null
return ResolvedIntent.IncomingShare(data)
}
// Unknown intent

View File

@@ -167,6 +167,6 @@ class LoggedInPresenter(
private fun CoroutineScope.preloadAccountManagementUrl() = launch {
matrixClient.getAccountManagementUrl(AccountManagementAction.Profile)
matrixClient.getAccountManagementUrl(AccountManagementAction.SessionsList)
matrixClient.getAccountManagementUrl(AccountManagementAction.DevicesList)
}
}

View File

@@ -15,6 +15,9 @@ import androidx.core.net.toUri
import com.google.common.truth.Truth.assertThat
import io.element.android.features.login.api.LoginParams
import io.element.android.features.login.test.FakeLoginIntentResolver
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.share.api.UriToShare
import io.element.android.features.share.test.FakeShareIntentHandler
import io.element.android.libraries.deeplink.api.DeeplinkData
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.permalink.PermalinkData
@@ -239,26 +242,34 @@ class IntentResolverTest {
@Test
fun `test incoming share simple`() {
val shareIntentData = ShareIntentData.PlainText("Hello")
val sut = createIntentResolver(
oidcIntentResolverResult = { null },
onIncomingShareIntent = { shareIntentData },
)
val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "Hello")
}
val result = sut.resolve(intent)
assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent))
assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(shareIntentData))
}
@Test
fun `test incoming share multiple`() {
val fileUri = "content://com.example.app/file1.jpg".toUri()
val shareIntentData = ShareIntentData.Uris(text = "Hello", uris = listOf(UriToShare(fileUri, "image/jpg")))
val sut = createIntentResolver(
oidcIntentResolverResult = { null },
onIncomingShareIntent = { shareIntentData },
)
val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply {
action = Intent.ACTION_SEND_MULTIPLE
putExtra(Intent.EXTRA_TEXT, "Hello")
data = fileUri
}
val result = sut.resolve(intent)
assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent))
assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(shareIntentData))
}
@Test
@@ -296,6 +307,7 @@ class IntentResolverTest {
permalinkParserResult: (String) -> PermalinkData = { lambdaError() },
loginIntentResolverResult: (String) -> LoginParams? = { lambdaError() },
oidcIntentResolverResult: (Intent) -> OidcAction? = { lambdaError() },
onIncomingShareIntent: (Intent) -> ShareIntentData? = { null },
): IntentResolver {
return IntentResolver(
deeplinkParser = { deeplinkParserResult },
@@ -308,6 +320,9 @@ class IntentResolverTest {
permalinkParser = FakePermalinkParser(
result = permalinkParserResult
),
shareIntentHandler = FakeShareIntentHandler(
onIncomingShareIntent = onIncomingShareIntent,
),
)
}
}

View File

@@ -81,7 +81,7 @@ class LoggedInPresenterTest {
accountManagementUrlResult.assertions().isCalledExactly(2)
.withSequence(
listOf(value(AccountManagementAction.Profile)),
listOf(value(AccountManagementAction.SessionsList)),
listOf(value(AccountManagementAction.DevicesList)),
)
}
}

View File

@@ -144,8 +144,8 @@ Prerequisites:
```
You can then build the Rust SDK by running the script
[`tools/sdk/build_rust_sdk.sh`](../tools/sdk/build_rust_sdk.sh) and just answering
the questions.
[`tools/sdk/build-rust-sdk`](../tools/sdk/build-rust-sdk). Type
`./tools/sdk/build-rust-sdk --help` for help.
This will prompt you for the path to the Rust SDK, then build it and
`matrix-rust-components-kotlin`, eventually producing an aar file at

View File

@@ -0,0 +1,2 @@
Main changes in this version: fixed an issue that could cause a crash when instantiating the cryptographic database.
Full changelog: https://github.com/element-hq/element-x-android/releases

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Δείτε τους χώρους που έχετε δημιουργήσει ή στους οποίους έχετε εγγραφεί"</string>
<string name="screen_space_announcement_item2">"Να αποδεχθείτε ή να απορρίψετε προσκλήσεις σε χώρους"</string>
<string name="screen_space_announcement_item3">"Να ανακαλύψτε όλες τις αίθουσες που μπορείτε να συμμετάσχετε στους χώρους σας"</string>
<string name="screen_space_announcement_item4">"Να συμμετάσχετε σε δημόσιους χώρους"</string>
<string name="screen_space_announcement_item5">"Να αποχωρήστε από χώρους στους οποίους έχετε συμμετάσχει"</string>
<string name="screen_space_announcement_notice">"Το φιλτράρισμα, η δημιουργία και η διαχείριση χώρων θα είναι σύντομα διαθέσιμα."</string>
<string name="screen_space_announcement_subtitle">"Καλώς ορίσατε στην δοκιμαστική έκδοση των Χώρων! Με αυτήν την πρώτη έκδοση μπορείτε:"</string>
<string name="screen_space_announcement_title">"Παρουσιάζοντας τους Χώρους"</string>
</resources>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Oluşturduğunuz veya katıldığınız alanları görüntüleyin"</string>
<string name="screen_space_announcement_item2">"Alan davetlerini kabul edin veya reddedin"</string>
<string name="screen_space_announcement_item3">"Alanlarınızdaki katılabileceğiniz odaları keşfedin"</string>
<string name="screen_space_announcement_item4">"Herkese açık alanlara katılın"</string>
<string name="screen_space_announcement_item5">"Katıldığınız alanlardan ayrılın"</string>
<string name="screen_space_announcement_notice">"Alanları filtreleme, oluşturma ve yönetme yakında geliyor."</string>
<string name="screen_space_announcement_subtitle">"Alanların beta sürümüne hoş geldiniz! Bu ilk sürümle şunları yapabilirsiniz:"</string>
<string name="screen_space_announcement_title">"Alanlar ile tanışın"</string>
</resources>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Siz yaratgan yoki qoshilgan maydonlarni korish"</string>
<string name="screen_space_announcement_item2">"Maydonlarga takliflarni qabul qilish yoki rad etish"</string>
<string name="screen_space_announcement_item3">"Maydonlaringizga qoshilishingiz mumkin bolgan xonalarni kashf eting"</string>
<string name="screen_space_announcement_item4">"Jamoat maydonlariga qoshilish"</string>
<string name="screen_space_announcement_item5">"Kirgan maydonlaringizni tark eting"</string>
<string name="screen_space_announcement_notice">"Maydonlarni filtrlash, yaratish va boshqarish tez orada amalga oshiriladi."</string>
<string name="screen_space_announcement_subtitle">"Maydonlar beta versiyasiga xush kelibsiz! Bu birinchi versiya bilan siz:"</string>
<string name="screen_space_announcement_title">"Maydonlar bilan tanishish"</string>
</resources>

View File

@@ -3,5 +3,6 @@
<string name="call_foreground_service_channel_title_android">"Llamada en curso"</string>
<string name="call_foreground_service_message_android">"Pulsa para regresar a la llamada"</string>
<string name="call_foreground_service_title_android">"☎️ Llamada en curso"</string>
<string name="call_invalid_audio_device_bluetooth_devices_disabled">"Element Call no soporta dispositivos de audio Bluetooth en esta versión de Android. Selecciona otro dispositivo de audio."</string>
<string name="screen_incoming_call_subtitle_android">"Llamada de Element Call entrante"</string>
</resources>

View File

@@ -3,5 +3,6 @@
<string name="call_foreground_service_channel_title_android">"Devam eden çağrı"</string>
<string name="call_foreground_service_message_android">"Aramaya geri dönmek için dokunun"</string>
<string name="call_foreground_service_title_android">"☎️ Çağrı devam ediyor"</string>
<string name="call_invalid_audio_device_bluetooth_devices_disabled">"Element Araması, bu Android sürümünde Bluetooth ses cihazlarını desteklemiyor. Lütfen farklı bir ses cihazı seçin."</string>
<string name="screen_incoming_call_subtitle_android">"Gelen Element Call"</string>
</resources>

View File

@@ -76,7 +76,7 @@ class ConfigureRoomPresenter(
) : Presenter<ConfigureRoomState> {
@AssistedFactory
interface Factory {
fun create(isSpace: Boolean, parentSpaceId: RoomId?): ConfigureRoomPresenter
fun create(isSpace: Boolean, initialParentSpaceId: RoomId?): ConfigureRoomPresenter
}
private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA)

View File

@@ -6,7 +6,7 @@
<string name="screen_create_room_private_option_description">"Само поканени хора имат достъп до тази стая. Всички съобщения са шифровани от край до край."</string>
<string name="screen_create_room_public_option_description">"Всеки може да намери тази стая.
Можете да промените това по всяко време в настройките на стаята."</string>
<string name="screen_create_room_room_access_section_public_option_description">"Всеки може да се присъедини към тази стая"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Всеки може да се присъедини."</string>
<string name="screen_create_room_room_address_section_footer">"За да бъде тази стая видима в директорията на общодостъпните стаи, ще ви е необходим адрес на стаята."</string>
<string name="screen_create_room_room_visibility_section_title">"Видимост на стаята"</string>
<string name="screen_create_room_topic_label">"Тема за разговор (незадължително)"</string>

View File

@@ -8,21 +8,26 @@
<string name="screen_create_room_new_room_title">"Nyt rum"</string>
<string name="screen_create_room_new_space_title">"Ny gruppe"</string>
<string name="screen_create_room_private_option_description">"Kun inviterede personer kan deltage."</string>
<string name="screen_create_room_private_option_title">"Privat"</string>
<string name="screen_create_room_public_option_description">"Alle kan finde dette rum.
Du kan ændre dette når som helst i rummets indstillinger."</string>
<string name="screen_create_room_public_option_short_description">"Alle kan deltage."</string>
<string name="screen_create_room_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Alle kan bede om at deltage i rummet, men en administrator eller en moderator skal acceptere anmodningen"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Tillad at man kan anmode om deltagelse"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Enhver i %1$s kan deltage, men alle andre skal anmode om adgang."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Anmod om at deltage"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Kun inviterede brugere kan deltage."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privat"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Alle kan deltage i dette rum"</string>
<string name="screen_create_room_room_access_section_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Alle i %1$s kan deltage."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Standard"</string>
<string name="screen_create_room_room_access_section_title">"Hvem har adgang"</string>
<string name="screen_create_room_room_address_section_footer">"Hvis dette rum skal være synligt i det offentlige register, skal du bruge en adresse."</string>
<string name="screen_create_room_room_address_section_title">"Adresse"</string>
<string name="screen_create_room_room_visibility_section_title">"Rummets synlighed"</string>
<string name="screen_create_room_space_selection_no_space_option">"Tilføj ikke til et mellemrum"</string>
<string name="screen_create_room_topic_label">"Emne (valgfrit)"</string>
<string name="screen_create_room_topic_placeholder">"Tilføj beskrivelse…"</string>
</resources>

View File

@@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"Νέα αίθουσα"</string>
<string name="screen_create_room_add_people_title">"Πρόσκληση ατόμων"</string>
<string name="screen_create_room_error_creating_room">"Προέκυψε σφάλμα κατά τη δημιουργία της αίθουσας"</string>
<string name="screen_create_room_private_option_description">"Μόνο τα άτομα που έχουν προσκληθεί μπορούν να έχουν πρόσβαση σε αυτή την αίθουσα. Όλα τα μηνύματα είναι κρυπτογραφημένα από άκρο σε άκρο."</string>
<string name="screen_create_room_error_creating_space">"Δεν ήταν δυνατή η δημιουργία του χώρου λόγω άγνωστου σφάλματος. Δοκιμάστε ξανά αργότερα."</string>
<string name="screen_create_room_name_placeholder">"Προσθήκη ονόματος…"</string>
<string name="screen_create_room_new_room_title">"Νέα αίθουσα"</string>
<string name="screen_create_room_new_space_title">"Νέος χώρος"</string>
<string name="screen_create_room_private_option_description">"Μόνο άτομα που έχουν προσκληθεί μπορούν να συμμετάσχουν."</string>
<string name="screen_create_room_private_option_title">"Ιδιωτικό"</string>
<string name="screen_create_room_public_option_description">"Ο καθένας μπορεί να βρει αυτή την αίθουσα.
Αυτό μπορείτε να το αλλάξετε ανά πάσα στιγμή στις ρυθμίσεις της αίθουσας."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στην αίθουσα, αλλά ένας διαχειριστής ή ένας συντονιστής θα πρέπει να αποδεχτεί το αίτημα"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Αίτημα συμμετοχής"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Οποιοσδήποτε μπορεί να συμμετάσχει σε αυτή την αίθουσα"</string>
<string name="screen_create_room_room_address_section_footer">"Για να είναι ορατή αυτή η αίθουσα στον δημόσιο κατάλογο αιθουσών, θα χρειαστείτε μια διεύθυνση αίθουσας."</string>
<string name="screen_create_room_public_option_short_description">"Οποιοσδήποτε μπορεί να συμμετάσχει."</string>
<string name="screen_create_room_public_option_title">"Δημόσιο"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στην αίθουσα, αλλά ένας διαχειριστής ή ένας συντονιστής θα πρέπει να αποδεχτεί το αίτημα."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Επιτρέψτε την αίτηση συμμετοχής"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Οποιοιδήποτε στο %1$s μπορούν να συμμετάσχουν, αλλά όλοι οι υπόλοιποι πρέπει να ζητήσουν πρόσβαση."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Αίτημα συμμετοχής"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Μόνο άτομα που έχουν προσκληθεί μπορούν να συμμετάσχουν."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Ιδιωτικό"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Οποιοσδήποτε μπορεί να συμμετάσχει."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Δημόσιο"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Οποιοσδήποτε στο %1$s μπορεί να συμμετάσχει."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Πρότυπο"</string>
<string name="screen_create_room_room_access_section_title">"Ποιος έχει πρόσβαση"</string>
<string name="screen_create_room_room_address_section_footer">"Θα χρειαστείτε μια διεύθυνση για να την κάνετε ορατή στον δημόσιο κατάλογο."</string>
<string name="screen_create_room_room_address_section_title">"Διεύθυνση δωματίου"</string>
<string name="screen_create_room_room_visibility_section_title">"Ορατότητα αίθουσας"</string>
<string name="screen_create_room_space_selection_no_space_description">"(κανένας χώρος)"</string>
<string name="screen_create_room_space_selection_no_space_option">"Μην προσθέτετε σε χώρο"</string>
<string name="screen_create_room_space_selection_no_space_title">"Δεν έχει επιλεγεί χώρος"</string>
<string name="screen_create_room_space_selection_sheet_title">"Προσθήκη στον χώρο"</string>
<string name="screen_create_room_topic_label">"Θέμα (προαιρετικό)"</string>
<string name="screen_create_room_topic_placeholder">"Προσθήκη περιγραφής…"</string>
</resources>

View File

@@ -3,13 +3,14 @@
<string name="screen_create_room_action_create_room">"Nueva sala"</string>
<string name="screen_create_room_add_people_title">"Invitar personas"</string>
<string name="screen_create_room_error_creating_room">"Se ha producido un error al crear la sala"</string>
<string name="screen_create_room_private_option_description">"Solo las personas invitadas pueden acceder a esta sala. Todos los mensajes están cifrados de extremo a extremo."</string>
<string name="screen_create_room_private_option_description">"Solo las personas invitadas pueden acceder."</string>
<string name="screen_create_room_public_option_description">"Cualquiera puede encontrar esta sala.
Puedes cambiar esto en cualquier momento en los ajustes de la sala."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Cualquiera puede solicitar unirse a la sala, pero un administrador o un moderador tendrá que aceptar la solicitud"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Solicitud para unirse"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Cualquiera puede unirse a esta sala"</string>
<string name="screen_create_room_room_address_section_footer">"Para que esta sala sea visible en el directorio de salas públicas, necesitarás una dirección de sala."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Cualquiera puede solicitar unirse, pero un administrador o un moderador tendrá que aceptar la solicitud"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Permitir solicitar unirse"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Cualquiera puede unirse."</string>
<string name="screen_create_room_room_address_section_footer">"Necesitarás una dirección de sala para que sea visible en el directorio de salas públicas."</string>
<string name="screen_create_room_room_address_section_title">"Dirección"</string>
<string name="screen_create_room_room_visibility_section_title">"Visibilidad de la sala"</string>
<string name="screen_create_room_topic_label">"Tema (opcional)"</string>
</resources>

View File

@@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"Uusi huone"</string>
<string name="screen_create_room_add_people_title">"Kutsu henkilöitä"</string>
<string name="screen_create_room_error_creating_room">"Huoneen luomisessa tapahtui virhe"</string>
<string name="screen_create_room_private_option_description">"Vain kutsutut henkilöt pääsevät tähän huoneeseen. Kaikki viestit ovat päästä päähän salattuja."</string>
<string name="screen_create_room_error_creating_space">"Tilaa ei voitu luoda tuntemattoman virheen vuoksi. Yritä myöhemmin uudelleen."</string>
<string name="screen_create_room_name_placeholder">"Lisää nimi…"</string>
<string name="screen_create_room_new_room_title">"Uusi huone"</string>
<string name="screen_create_room_new_space_title">"Uusi tila"</string>
<string name="screen_create_room_private_option_description">"Vain kutsutut henkilöt voivat liittyä."</string>
<string name="screen_create_room_private_option_title">"Yksityinen"</string>
<string name="screen_create_room_public_option_description">"Kuka tahansa voi löytää tämän huoneen.
Voit muuttaa tämän milloin tahansa huoneen asetuksista."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Kuka tahansa voi pyytää saada liittyä huoneeseen, mutta ylläpitäjän tai valvojan on hyväksyttävä pyyntö"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Pyydä liittymistä"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Kuka tahansa voi liittyä tähän huoneeseen"</string>
<string name="screen_create_room_room_address_section_footer">"Jotta tämä huone näkyisi julkisessa huonehakemistossa, tarvitset huoneen osoitteen."</string>
<string name="screen_create_room_room_address_section_title">"Huoneen osoite"</string>
<string name="screen_create_room_public_option_short_description">"Kuka tahansa voi liittyä."</string>
<string name="screen_create_room_public_option_title">"Julkinen"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Kuka tahansa voi pyytää saada liittyä huoneeseen, mutta ylläpitäjän tai valvojan on hyväksyttävä pyyntö."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Salli liittymispyynnöt"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Kuka tahansa tilassa %1$s voi liittyä, mutta kaikkien muiden on pyydettävä pääsyä."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Pyydä liittymistä"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Vain kutsutut henkilöt voivat liittyä."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Yksityinen"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Kuka tahansa voi liittyä."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Julkinen"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Kuka tahansa tilassa %1$s voi liittyä."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Vakio"</string>
<string name="screen_create_room_room_access_section_title">"Kenellä on pääsy"</string>
<string name="screen_create_room_room_address_section_footer">"Jotta tämä näkyisi julkisessa hakemistossa, tarvitset osoitteen."</string>
<string name="screen_create_room_room_address_section_title">"Osoite"</string>
<string name="screen_create_room_room_visibility_section_title">"Huoneen näkyvyys"</string>
<string name="screen_create_room_space_selection_no_space_description">"(ei tilaa)"</string>
<string name="screen_create_room_space_selection_no_space_option">"Älä lisää tilaan"</string>
<string name="screen_create_room_space_selection_no_space_title">"Ei valittua tilaa"</string>
<string name="screen_create_room_space_selection_sheet_title">"Lisää tilaan"</string>
<string name="screen_create_room_topic_label">"Aihe (valinnainen)"</string>
<string name="screen_create_room_topic_placeholder">"Lisää kuvaus…"</string>
</resources>

View File

@@ -8,15 +8,19 @@
<string name="screen_create_room_new_room_title">"Új szoba"</string>
<string name="screen_create_room_new_space_title">"Új tér"</string>
<string name="screen_create_room_private_option_description">"Csak a meghívottak léphetnek be."</string>
<string name="screen_create_room_private_option_title">"Privát"</string>
<string name="screen_create_room_public_option_description">"Bárki megtalálhatja ezt a szobát.
Ezt bármikor módosíthatja a szobabeállításokban."</string>
<string name="screen_create_room_public_option_short_description">"Bárki csatlakozhat."</string>
<string name="screen_create_room_public_option_title">"Nyilvános"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Bárki kérheti, hogy csatlakozhasson a szobához, de egy adminisztrátornak vagy moderátornak el kell fogadnia a kérést."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Csatlakozás kérése"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Bárki csatlakozhat innen: %1$s, de mindenki másnak hozzáférést kell kérnie."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Csatlakozás kérése"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Csak a meghívottak léphetnek be."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privát"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Bárki csatlakozhat."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Nyilvános"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Bárki csatlakozhat innen: %1$s."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Szokásos"</string>
<string name="screen_create_room_room_access_section_title">"Hozzáférésre jogosultak"</string>
@@ -24,7 +28,8 @@ Ezt bármikor módosíthatja a szobabeállításokban."</string>
<string name="screen_create_room_room_address_section_title">"Cím"</string>
<string name="screen_create_room_room_visibility_section_title">"Szoba láthatósága"</string>
<string name="screen_create_room_space_selection_no_space_description">"(nincs tér)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Kezdőlap"</string>
<string name="screen_create_room_space_selection_no_space_option">"Ne adja hozzá térhez"</string>
<string name="screen_create_room_space_selection_no_space_title">"Nincs kiválasztott tér"</string>
<string name="screen_create_room_space_selection_sheet_title">"Hozzáadás a térhez"</string>
<string name="screen_create_room_topic_label">"Téma (nem kötelező)"</string>
<string name="screen_create_room_topic_placeholder">"Leírás hozzáadása…"</string>

View File

@@ -3,21 +3,32 @@
<string name="screen_create_room_action_create_room">"Nytt rom"</string>
<string name="screen_create_room_add_people_title">"Inviter folk"</string>
<string name="screen_create_room_error_creating_room">"Det oppsto en feil under opprettelsen av rommet"</string>
<string name="screen_create_room_error_creating_space">"Området kunne ikke opprettes på grunn av en ukjent feil. Prøv på nytt senere."</string>
<string name="screen_create_room_name_placeholder">"Legg til navn…"</string>
<string name="screen_create_room_new_room_title">"Nytt rom"</string>
<string name="screen_create_room_new_space_title">"Nytt område"</string>
<string name="screen_create_room_private_option_description">"Bare inviterte personer kan bli med."</string>
<string name="screen_create_room_private_option_title">"Privat"</string>
<string name="screen_create_room_public_option_description">"Alle kan finne dette rommet.
Du kan endre dette når som helst i rominnstillingene."</string>
<string name="screen_create_room_public_option_short_description">"Alle kan bli med."</string>
<string name="screen_create_room_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Alle kan be om å få bli med, men en administrator eller moderator må godta forespørselen."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Be om å bli med"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Be om å få bli med"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Bare inviterte personer kan bli med."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privat"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Alle kan bli med."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Alle i %1$s kan bli med."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Standard"</string>
<string name="screen_create_room_room_access_section_title">"Hvem har tilgang"</string>
<string name="screen_create_room_room_address_section_footer">"Du trenger en adresse for å gjøre den synlig i den offentlige katalogen."</string>
<string name="screen_create_room_room_address_section_title">"Adresse"</string>
<string name="screen_create_room_room_visibility_section_title">"Romsynlighet"</string>
<string name="screen_create_room_space_selection_no_space_description">"(ingen område)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Ingen områder valgt"</string>
<string name="screen_create_room_space_selection_sheet_title">"Legg til området"</string>
<string name="screen_create_room_topic_label">"Emne (valgfritt)"</string>
<string name="screen_create_room_topic_placeholder">"Legg til beskrivelse…"</string>
</resources>

View File

@@ -4,10 +4,14 @@
<string name="screen_create_room_add_people_title">"Mensen uitnodigen"</string>
<string name="screen_create_room_error_creating_room">"Er is een fout opgetreden bij het aanmaken van de kamer"</string>
<string name="screen_create_room_private_option_description">"Alleen uitgenodigde personen hebben toegang tot deze kamer. Alle berichten zijn end-to-end versleuteld."</string>
<string name="screen_create_room_private_option_title">"Privé"</string>
<string name="screen_create_room_public_option_description">"Iedereen kan deze kamer vinden.
Je kunt dit op elk gewenst moment wijzigen in de kamerinstellingen."</string>
<string name="screen_create_room_public_option_title">"Openbaar"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Iedereen kan vragen om toe te treden tot de kamer, maar een beheerder of moderator moet het verzoek accepteren"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Vraag om toe te treden"</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privé"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Iedereen kan toetreden tot deze kamer"</string>
<string name="screen_create_room_room_access_section_public_option_title">"Openbaar"</string>
<string name="screen_create_room_topic_label">"Onderwerp (optioneel)"</string>
</resources>

View File

@@ -13,12 +13,19 @@
<string name="screen_create_room_public_option_short_description">"Присоединиться может любой."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Любой желающий может подать заявку на присоединение к комнате, но администратор или модератор должен будет принять запрос."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Разрешить запрос на присоединение"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Любой из %1$s может присоединиться, а всем остальным нужно запросить доступ."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Подать заявку на вступление"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Присоединиться могут только приглашенные."</string>
<string name="screen_create_room_room_access_section_public_option_description">"Присоединиться может любой желающий."</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Любой в %1$s может присоединиться."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Стандарт"</string>
<string name="screen_create_room_room_access_section_title">"Кто имеет доступ"</string>
<string name="screen_create_room_room_address_section_footer">"Вам понадобится адрес комнаты, чтобы сделать ее видимой в каталоге."</string>
<string name="screen_create_room_room_address_section_title">"Адрес"</string>
<string name="screen_create_room_room_visibility_section_title">"Видимость комнаты"</string>
<string name="screen_create_room_space_selection_no_space_description">"(нет пространства)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Главная"</string>
<string name="screen_create_room_space_selection_sheet_title">"Добавить в пространство"</string>
<string name="screen_create_room_topic_label">"Тема (необязательно)"</string>
<string name="screen_create_room_topic_placeholder">"Добавить описание…"</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Yeni oda"</string>
<string name="screen_create_room_add_people_title">"İnsanları davet et"</string>
<string name="screen_create_room_add_people_title">"Kişileri davet et"</string>
<string name="screen_create_room_error_creating_room">"Oda oluşturulurken bir hata oluştu"</string>
<string name="screen_create_room_private_option_description">"Bu odaya yalnızca davet edilen kişiler erişebilir. Tüm mesajlar uçtan uca şifrelenir."</string>
<string name="screen_create_room_public_option_description">"Bu odayı herkes bulabilir.

View File

@@ -10,6 +10,7 @@ Buni xona sozlamalaridan istalgan vaqtda oʻzgartirishingiz mumkin."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Qoshilishni sorang"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Bu xonaga istalgan kishi qoshilishi mumkin"</string>
<string name="screen_create_room_room_address_section_footer">"Ushbu xona ommaviy xonalar royxatida korinishi uchun sizga xona manzili kerak boladi."</string>
<string name="screen_create_room_room_address_section_title">"Xona manzili"</string>
<string name="screen_create_room_room_visibility_section_title">"Xonaning korinishi"</string>
<string name="screen_create_room_topic_label">"Mavzu (ixtiyoriy)"</string>
</resources>

View File

@@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"新聊天室"</string>
<string name="screen_create_room_add_people_title">"邀请朋友"</string>
<string name="screen_create_room_error_creating_room">"创建聊天室时出错"</string>
<string name="screen_create_room_private_option_description">"只有受邀用户才能访问此聊天室。所有消息均经过端到端加密。"</string>
<string name="screen_create_room_error_creating_space">"由于未知错误,空间创建失败。请稍后再试。"</string>
<string name="screen_create_room_name_placeholder">"添加名称…"</string>
<string name="screen_create_room_new_room_title">"新聊天室"</string>
<string name="screen_create_room_new_space_title">"新空间"</string>
<string name="screen_create_room_private_option_description">"仅限受邀者加入。"</string>
<string name="screen_create_room_private_option_title">"私密"</string>
<string name="screen_create_room_public_option_description">"任何人都能找到此聊天室。
你可以随时在聊天室设置中更改。"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"任何人都可以请求加入房间,但必须由管理员或审核人接受"</string>
<string name="screen_create_room_public_option_short_description">"任何人都可以找到并加入"</string>
<string name="screen_create_room_public_option_title">"公共"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"任何人都可申请加入,但需由管理员或版主批准请求。"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"请求加入"</string>
<string name="screen_create_room_room_access_section_public_option_description">"任何人都可加入此房间"</string>
<string name="screen_create_room_room_address_section_footer">"要使该房间在公开房间目录中可见,您需要一个房间地址。"</string>
<string name="screen_create_room_room_address_section_title">"房间地址"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"%1$s 中的任何人都可加入,但其他人必须申请访问权限。"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"申请加入"</string>
<string name="screen_create_room_room_access_section_private_option_description">"仅限受邀者加入。"</string>
<string name="screen_create_room_room_access_section_private_option_title">"私密"</string>
<string name="screen_create_room_room_access_section_public_option_description">"任何人都可以加入。"</string>
<string name="screen_create_room_room_access_section_public_option_title">"公共"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"%1$s 中的任何人可加入。"</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"标准"</string>
<string name="screen_create_room_room_access_section_title">"谁有权访问此房间"</string>
<string name="screen_create_room_room_address_section_footer">"要使该聊天室在公共目录中可见,您需要一个聊天室地址。"</string>
<string name="screen_create_room_room_address_section_title">"地址"</string>
<string name="screen_create_room_room_visibility_section_title">"房间可见性"</string>
<string name="screen_create_room_space_selection_no_space_description">"(无空间)"</string>
<string name="screen_create_room_space_selection_no_space_option">"请勿添加至空间"</string>
<string name="screen_create_room_space_selection_no_space_title">"未选择空间"</string>
<string name="screen_create_room_space_selection_sheet_title">"添加至空间"</string>
<string name="screen_create_room_topic_label">"主题(可选)"</string>
<string name="screen_create_room_topic_placeholder">"添加描述…"</string>
</resources>

View File

@@ -33,7 +33,6 @@ data class HomeState(
val eventSink: (HomeEvent) -> Unit,
) {
val isBackHandlerEnabled = currentHomeNavigationBarItem != HomeNavigationBarItem.Chats || roomListState.spaceFiltersState is SpaceFiltersState.Selected
val displayActions = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats
val displayRoomListFilters = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats && roomListState.displayFilters
val showNavigationBar = homeSpacesState.canCreateSpaces || homeSpacesState.spaceRooms.isNotEmpty()
}

View File

@@ -45,7 +45,12 @@ open class HomeStateProvider : PreviewParameterProvider<HomeState> {
),
) + RoomListStateProvider().values.map {
aHomeState(roomListState = it)
}
} + aHomeState(
currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces,
homeSpacesState = aHomeSpacesState(
spaceRooms = emptyList(),
),
)
}
internal fun aHomeState(

View File

@@ -21,19 +21,21 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FabPosition
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.hazeSource
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
@@ -58,15 +60,15 @@ import io.element.android.libraries.androidutils.throttler.FirstThrottler
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
import io.element.android.libraries.designsystem.theme.components.HorizontalFloatingToolbar
import io.element.android.libraries.designsystem.theme.components.HorizontalFloatingToolbarItem
import io.element.android.libraries.designsystem.theme.components.HorizontalFloatingToolbarSeparator
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.NavigationBar
import io.element.android.libraries.designsystem.theme.components.NavigationBarIcon
import io.element.android.libraries.designsystem.theme.components.NavigationBarItem
import io.element.android.libraries.designsystem.theme.components.NavigationBarText
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarHost
import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.coroutines.launch
@Composable
@@ -185,12 +187,10 @@ private fun HomeScaffold(
onAccountSwitch = {
state.eventSink(HomeEvent.SwitchToAccount(it))
},
onCreateSpace = onCreateSpaceClick,
scrollBehavior = scrollBehavior,
displayFilters = state.displayRoomListFilters,
filtersState = roomListState.filtersState,
spaceFiltersState = roomListState.spaceFiltersState,
canCreateSpaces = state.homeSpacesState.canCreateSpaces,
canReportBug = state.canReportBug,
modifier = Modifier.hazeEffect(
state = hazeState,
@@ -198,7 +198,7 @@ private fun HomeScaffold(
)
)
},
bottomBar = {
floatingActionButton = {
if (state.showNavigationBar) {
val coroutineScope = rememberCoroutineScope()
HomeBottomBar(
@@ -222,14 +222,31 @@ private fun HomeScaffold(
state.eventSink(HomeEvent.SelectHomeNavigationBarItem(item))
}
},
modifier = Modifier.hazeEffect(
state = hazeState,
style = HazeMaterials.thick(),
)
floatingActionButton = when (state.currentHomeNavigationBarItem) {
HomeNavigationBarItem.Chats -> {
{
HomeFloatingActionButton(onStartChatClick, CommonStrings.action_create_room)
}
}
HomeNavigationBarItem.Spaces -> if (state.homeSpacesState.canCreateSpaces) {
{
HomeFloatingActionButton(onCreateSpaceClick, CommonStrings.action_create_space)
}
} else {
// No FAB for spaces if we cannot create spaces
null
}
},
)
} else {
HomeFloatingActionButton(onStartChatClick, CommonStrings.action_create_room)
}
},
floatingActionButtonPosition = if (state.showNavigationBar) FabPosition.Center else FabPosition.End,
content = { padding ->
val contentPadding = PaddingValues(
bottom = 96.dp,
)
when (state.currentHomeNavigationBarItem) {
HomeNavigationBarItem.Chats -> {
RoomListContentView(
@@ -243,15 +260,7 @@ private fun HomeScaffold(
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = ::onRoomClick,
onCreateRoomClick = onStartChatClick,
contentPadding = PaddingValues(
// FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80,
// and include provided bottom padding
// Disable contentPadding due to navigation issue using the keyboard
// See https://issuetracker.google.com/issues/436432313
bottom = 80.dp,
// bottom = 80.dp + padding.calculateBottomPadding(),
// top = padding.calculateTopPadding()
),
contentPadding = contentPadding,
modifier = Modifier
.padding(
PaddingValues(
@@ -274,6 +283,7 @@ private fun HomeScaffold(
.padding(padding)
.consumeWindowInsets(padding)
.hazeSource(state = hazeState),
contentPadding = contentPadding,
state = state.homeSpacesState,
lazyListState = spacesLazyListState,
onSpaceClick = { spaceId ->
@@ -286,49 +296,47 @@ private fun HomeScaffold(
}
}
},
floatingActionButton = {
if (state.displayActions) {
FloatingActionButton(
onClick = onStartChatClick,
) {
Icon(
imageVector = CompoundIcons.Plus(),
contentDescription = stringResource(id = R.string.screen_roomlist_a11y_create_message),
)
}
}
},
snackbarHost = { SnackbarHost(snackbarHostState) },
)
}
@Composable
private fun HomeFloatingActionButton(
onClick: () -> Unit,
contentDescription: Int,
modifier: Modifier = Modifier,
) {
FloatingActionButton(onClick = onClick, modifier = modifier) {
Icon(
imageVector = CompoundIcons.Plus(),
contentDescription = stringResource(id = contentDescription),
)
}
}
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
private fun HomeBottomBar(
currentHomeNavigationBarItem: HomeNavigationBarItem,
onItemClick: (HomeNavigationBarItem) -> Unit,
modifier: Modifier = Modifier,
floatingActionButton: (@Composable () -> Unit)?,
) {
NavigationBar(
containerColor = Color.Transparent,
HorizontalFloatingToolbar(
floatingActionButton = floatingActionButton,
modifier = modifier
.zIndex(1f),
) {
HomeNavigationBarItem.entries.forEach { item ->
HomeNavigationBarItem.entries.forEachIndexed { index, item ->
if (index > 0) {
HorizontalFloatingToolbarSeparator()
}
val isSelected = currentHomeNavigationBarItem == item
NavigationBarItem(
selected = isSelected,
onClick = {
onItemClick(item)
},
icon = {
NavigationBarIcon(
imageVector = item.icon(isSelected),
)
},
label = {
NavigationBarText(
text = stringResource(item.labelRes),
)
}
HorizontalFloatingToolbarItem(
icon = item.icon(isSelected),
tooltipLabel = stringResource(item.labelRes),
isSelected = isSelected,
onClick = { onItemClick(item) },
)
}
}

View File

@@ -87,9 +87,7 @@ fun HomeTopBar(
onMenuActionClick: (RoomListMenuAction) -> Unit,
onOpenSettings: () -> Unit,
onAccountSwitch: (SessionId) -> Unit,
onCreateSpace: () -> Unit,
scrollBehavior: TopAppBarScrollBehavior,
canCreateSpaces: Boolean,
canReportBug: Boolean,
displayFilters: Boolean,
filtersState: RoomListFiltersState,
@@ -134,17 +132,13 @@ fun HomeTopBar(
)
},
actions = {
when (selectedNavigationItem) {
HomeNavigationBarItem.Chats -> RoomListMenuItems(
if (selectedNavigationItem == HomeNavigationBarItem.Chats) {
RoomListMenuItems(
onToggleSearch = onToggleSearch,
onMenuActionClick = onMenuActionClick,
canReportBug = canReportBug,
spaceFiltersState = spaceFiltersState,
)
HomeNavigationBarItem.Spaces -> SpacesMenuItems(
canCreateSpaces = canCreateSpaces,
onCreateSpace = onCreateSpace
)
}
},
// We want a 16dp left padding for the navigationIcon :
@@ -230,21 +224,6 @@ private fun RoomListMenuItems(
}
}
@Composable
private fun SpacesMenuItems(
canCreateSpaces: Boolean,
onCreateSpace: () -> Unit
) {
if (canCreateSpaces) {
IconButton(onClick = onCreateSpace) {
Icon(
imageVector = CompoundIcons.Plus(),
contentDescription = stringResource(CommonStrings.action_create_space)
)
}
}
}
@Composable
private fun SpaceFilterButton(
spaceFiltersState: SpaceFiltersState,
@@ -365,8 +344,6 @@ internal fun HomeTopBarPreview() = ElementPreview {
onOpenSettings = {},
onAccountSwitch = {},
onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true,
displayFilters = true,
filtersState = aRoomListFiltersState(),
@@ -388,8 +365,6 @@ internal fun HomeTopBarSpaceFiltersSelectedPreview() = ElementPreview {
onOpenSettings = {},
onAccountSwitch = {},
onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true,
displayFilters = true,
filtersState = aRoomListFiltersState(),
@@ -411,8 +386,6 @@ internal fun HomeTopBarSpacesPreview() = ElementPreview {
onOpenSettings = {},
onAccountSwitch = {},
onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true,
displayFilters = false,
filtersState = aRoomListFiltersState(),
@@ -434,8 +407,6 @@ internal fun HomeTopBarWithIndicatorPreview() = ElementPreview {
onOpenSettings = {},
onAccountSwitch = {},
onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true,
displayFilters = true,
filtersState = aRoomListFiltersState(),
@@ -457,8 +428,6 @@ internal fun HomeTopBarMultiAccountPreview() = ElementPreview {
onOpenSettings = {},
onAccountSwitch = {},
onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true,
displayFilters = true,
filtersState = aRoomListFiltersState(),

View File

@@ -10,6 +10,7 @@ package io.element.android.features.home.impl.spaces
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
@@ -48,6 +49,7 @@ import kotlinx.collections.immutable.toImmutableList
fun HomeSpacesView(
state: HomeSpacesState,
lazyListState: LazyListState,
contentPadding: PaddingValues,
onSpaceClick: (RoomId) -> Unit,
onCreateSpaceClick: () -> Unit,
onExploreClick: () -> Unit,
@@ -55,7 +57,7 @@ fun HomeSpacesView(
) {
if (state.canCreateSpaces && state.spaceRooms.isEmpty()) {
EmptySpaceHomeView(
modifier = modifier,
modifier = modifier.padding(contentPadding),
onCreateSpaceClick = onCreateSpaceClick,
onExploreClick = onExploreClick,
canExploreSpaces = state.canExploreSpaces,
@@ -63,7 +65,8 @@ fun HomeSpacesView(
} else {
LazyColumn(
modifier = modifier,
state = lazyListState
state = lazyListState,
contentPadding = contentPadding,
) {
val space = state.space
when (space) {
@@ -115,6 +118,9 @@ fun HomeSpacesView(
}
}
/**
* Ref: https://www.figma.com/design/pDlJZGBsri47FNTXMnEdXB/Compound-Android-Templates?node-id=1763-74215&t=9IGKMXHDfTGAqzQK-4
*/
@Composable
private fun EmptySpaceHomeView(
onCreateSpaceClick: () -> Unit,
@@ -159,8 +165,7 @@ private fun EmptySpaceHomeView(
}
}
}
) {
}
)
}
@PreviewsDayNight
@@ -174,5 +179,6 @@ internal fun HomeSpacesViewPreview(
onSpaceClick = {},
onCreateSpaceClick = {},
onExploreClick = {},
contentPadding = PaddingValues(bottom = 112.dp),
)
}

View File

@@ -8,6 +8,7 @@
<string name="full_screen_intent_banner_message">"Каб не прапусціць важны званок, зменіце налады, каб дазволіць поўнаэкранныя апавяшчэнні, калі тэлефон заблакіраваны."</string>
<string name="full_screen_intent_banner_title">"Палепшыце якасць званкоў"</string>
<string name="screen_home_tab_chats">"Усе чаты"</string>
<string name="screen_home_tab_spaces">"Прасторы"</string>
<string name="screen_invites_decline_chat_message">"Вы ўпэўненыя, што хочаце адхіліць запрашэнне ў %1$s?"</string>
<string name="screen_invites_decline_chat_title">"Адхіліць запрашэнне"</string>
<string name="screen_invites_decline_direct_chat_message">"Вы ўпэўненыя, што хочаце адмовіцца ад прыватных зносін з %1$s?"</string>
@@ -38,6 +39,7 @@
<string name="screen_roomlist_main_space_title">"Усе чаты"</string>
<string name="screen_roomlist_mark_as_read">"Пазначыць як прачытанае"</string>
<string name="screen_roomlist_mark_as_unread">"Пазначыць як непрачытанае"</string>
<string name="screen_roomlist_your_spaces">"Вашы прасторы"</string>
<string name="session_verification_banner_message">"Здаецца, вы карыстаецеся новай прыладай. Праверце з дапамогай іншай прылады, каб атрымаць доступ да зашыфраваных паведамленняў."</string>
<string name="session_verification_banner_title">"Пацвердзіце, што гэта вы"</string>
</resources>

View File

@@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"Απενεργοποίησε τη βελτιστοποίηση μπαταρίας για αυτήν την εφαρμογή, για να βεβαιωθείς ότι λαμβάνονται όλες οι ειδοποιήσεις."</string>
<string name="banner_battery_optimization_submit_android">"Απενεργοποίηση βελτιστοποίησης"</string>
<string name="banner_battery_optimization_title_android">"Δεν φτάνουν οι ειδοποιήσεις;"</string>
<string name="banner_new_sound_message">"Το ping ειδοποιήσεών σας έχει ενημερωθεί—είναι πιο σαφές, πιο γρήγορο και λιγότερο ενοχλητικό."</string>
<string name="banner_new_sound_title">"Ανανεώσαμε τους ήχους σας"</string>
<string name="banner_set_up_recovery_content">"Δημιούργησε ένα νέο κλειδί ανάκτησης που μπορεί να χρησιμοποιηθεί για την επαναφορά του ιστορικού των κρυπτογραφημένων μηνυμάτων σου σε περίπτωση που χάσεις την πρόσβαση στις συσκευές σου."</string>
<string name="banner_set_up_recovery_submit">"Ρύθμιση ανάκτησης"</string>
<string name="banner_set_up_recovery_title">"Ρύθμιση ανάκτησης"</string>
@@ -13,6 +15,7 @@
<string name="full_screen_intent_banner_message">"Για να διασφαλίσετε ότι δεν θα χάσετε ποτέ μια σημαντική κλήση, αλλάξτε τις ρυθμίσεις σας ώστε να επιτρέπονται οι ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σας είναι κλειδωμένο."</string>
<string name="full_screen_intent_banner_title">"Βελτίωσε την εμπειρία κλήσεων"</string>
<string name="screen_home_tab_chats">"Συνομιλίες"</string>
<string name="screen_home_tab_spaces">"Χώροι"</string>
<string name="screen_invites_decline_chat_message">"Σίγουρα θες να απορρίψεις την πρόσκληση συμμετοχής στο %1$s;"</string>
<string name="screen_invites_decline_chat_title">"Απόρριψη πρόσκλησης"</string>
<string name="screen_invites_decline_direct_chat_message">"Σίγουρα θες να απορρίψεις την ιδιωτική συνομιλία με τον χρήστη %1$s;"</string>
@@ -22,6 +25,7 @@
<string name="screen_migration_message">"Αυτή είναι μια εφάπαξ διαδικασία, ευχαριστώ που περίμενες."</string>
<string name="screen_migration_title">"Ρύθμιση του λογαριασμού σου."</string>
<string name="screen_roomlist_a11y_create_message">"Δημιουργία νέας συνομιλίας ή αίθουσας"</string>
<string name="screen_roomlist_clear_filters">"Καθαρισμός φίλτρων"</string>
<string name="screen_roomlist_empty_message">"Ξεκίνησε στέλνοντας μηνύματα σε κάποιον."</string>
<string name="screen_roomlist_empty_title">"Δεν υπάρχουν συνομιλίες ακόμα."</string>
<string name="screen_roomlist_filter_favourites">"Αγαπημένα"</string>
@@ -31,6 +35,7 @@
<string name="screen_roomlist_filter_invites">"Προσκλήσεις"</string>
<string name="screen_roomlist_filter_invites_empty_state_title">"Δεν έχεις εκκρεμείς προσκλήσεις."</string>
<string name="screen_roomlist_filter_low_priority">"Χαμηλής Προτεραιότητας"</string>
<string name="screen_roomlist_filter_low_priority_empty_state_title">"Δεν έχετε ακόμη συνομιλίες χαμηλής προτεραιότητας"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Μπορείς να καταργήσεις την επιλογή φίλτρων για να δεις τις άλλες συνομιλίες σου"</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Δεν έχεις συνομιλίες για αυτήν την επιλογή"</string>
<string name="screen_roomlist_filter_people">"Άτομα"</string>
@@ -45,6 +50,7 @@
<string name="screen_roomlist_mark_as_read">"Επισήμανση ως αναγνωσμένου"</string>
<string name="screen_roomlist_mark_as_unread">"Επισήμανση ως μη αναγνωσμένου"</string>
<string name="screen_roomlist_tombstoned_room_description">"Αυτή η αίθουσα έχει αναβαθμιστεί"</string>
<string name="screen_roomlist_your_spaces">"Οι χώροι σας"</string>
<string name="session_verification_banner_message">"Φαίνεται ότι χρησιμοποιείς μια νέα συσκευή. Επαλήθευσε με άλλη συσκευή για πρόσβαση στα κρυπτογραφημένα σου μηνύματα."</string>
<string name="session_verification_banner_title">"Επαλήθευσε ότι είσαι εσύ"</string>
</resources>

View File

@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="banner_battery_optimization_content_android">"Deshabilita la optimización de la batería en esta aplicación para asegurarte de que recibes notificaciones."</string>
<string name="banner_battery_optimization_submit_android">"Deshabilitar la optimización"</string>
<string name="banner_battery_optimization_title_android">"¿No llegan las notificaciones?"</string>
<string name="banner_set_up_recovery_content">"Recupera tu identidad criptográfica y tu historial de mensajes con una clave de recuperación si has perdido todos tus dispositivos actuales."</string>
<string name="banner_set_up_recovery_submit">"Configurar la recuperación"</string>
<string name="banner_set_up_recovery_title">"Configura la recuperación para proteger tu cuenta"</string>
@@ -19,6 +22,7 @@
<string name="screen_migration_message">"Este proceso solo se hace una vez, gracias por esperar."</string>
<string name="screen_migration_title">"Configura tu cuenta"</string>
<string name="screen_roomlist_a11y_create_message">"Crear una nueva conversación o sala"</string>
<string name="screen_roomlist_clear_filters">"Borrar filtros"</string>
<string name="screen_roomlist_empty_message">"Empieza enviando un mensaje a alguien."</string>
<string name="screen_roomlist_empty_title">"Aún no hay chats."</string>
<string name="screen_roomlist_filter_favourites">"Favoritos"</string>
@@ -41,6 +45,7 @@ Por ahora, puedes deseleccionar los filtros para ver tus otros chats"</string>
<string name="screen_roomlist_main_space_title">"Chats"</string>
<string name="screen_roomlist_mark_as_read">"Marcar como leído"</string>
<string name="screen_roomlist_mark_as_unread">"Marcar como no leído"</string>
<string name="screen_roomlist_tombstoned_room_description">"Esta sala ha sido renovada"</string>
<string name="session_verification_banner_message">"Parece que estás usando un nuevo dispositivo. Verifica que eres tú para acceder a tus mensajes cifrados."</string>
<string name="session_verification_banner_title">"Verifica que eres tú"</string>
</resources>

View File

@@ -50,6 +50,7 @@ Sinulla ei ole lukemattomia viestejä!"</string>
<string name="screen_roomlist_mark_as_read">"Merkitse luetuksi"</string>
<string name="screen_roomlist_mark_as_unread">"Merkitse lukemattomaksi"</string>
<string name="screen_roomlist_tombstoned_room_description">"Tämä huone on päivitetty"</string>
<string name="screen_roomlist_your_spaces">"Tilasi"</string>
<string name="session_verification_banner_message">"Vaikuttaisi siltä, että käytät uutta laitetta. Vahvista toisella laitteella nähdäksesi salatut viestit."</string>
<string name="session_verification_banner_title">"Vahvista, että se olet sinä"</string>
</resources>

View File

@@ -50,6 +50,7 @@ Du har ingen uleste meldinger!"</string>
<string name="screen_roomlist_mark_as_read">"Marker som lest"</string>
<string name="screen_roomlist_mark_as_unread">"Merk som ulest"</string>
<string name="screen_roomlist_tombstoned_room_description">"Dette rommet har blitt oppgradert"</string>
<string name="screen_roomlist_your_spaces">"Dine områder"</string>
<string name="session_verification_banner_message">"Det ser ut til at du bruker en ny enhet. Bekreft med en annen enhet for å få tilgang til de krypterte meldingene dine."</string>
<string name="session_verification_banner_title">"Bekreft at det er deg"</string>
</resources>

View File

@@ -50,6 +50,7 @@
<string name="screen_roomlist_mark_as_read">"Пометить как прочитанное"</string>
<string name="screen_roomlist_mark_as_unread">"Отметить как непрочитанное"</string>
<string name="screen_roomlist_tombstoned_room_description">"Эта комната была обновлена"</string>
<string name="screen_roomlist_your_spaces">"Ваши пространства"</string>
<string name="session_verification_banner_message">"Похоже, вы используете новое устройство. Чтобы получить доступ к зашифрованным сообщениям пройдите подтверждение с другим устройством."</string>
<string name="session_verification_banner_title">"Подтвердите, что это вы"</string>
</resources>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="banner_new_sound_message">"Bildirim sesi güncellendi — daha net, daha hızlı ve daha az dikkat dağıtıcı."</string>
<string name="banner_set_up_recovery_content">"Mevcut tüm cihazlarınızı kaybettiyseniz şifreleme kimliğinizi ve mesaj geçmişinizi bir kurtarma anahtarıyla kurtarın."</string>
<string name="banner_set_up_recovery_submit">"Kurtarmayı ayarlayın"</string>
<string name="banner_set_up_recovery_title">"Hesabınızı korumak için kurtarmayı ayarlayın"</string>
@@ -10,6 +11,7 @@
<string name="full_screen_intent_banner_message">"Önemli bir aramayı asla kaçırmamak için, telefonunuz kilitliyken tam ekran bildirimlere izin vermek üzere ayarlarınızı değiştirin."</string>
<string name="full_screen_intent_banner_title">"Arama deneyiminizi geliştirin"</string>
<string name="screen_home_tab_chats">"Sohbetler"</string>
<string name="screen_home_tab_spaces">"Alanlar"</string>
<string name="screen_invites_decline_chat_message">"%1$s katılma davetini reddetmek istediğinizden emin misiniz?"</string>
<string name="screen_invites_decline_chat_title">"Daveti reddet"</string>
<string name="screen_invites_decline_direct_chat_message">"%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?"</string>
@@ -19,6 +21,7 @@
<string name="screen_migration_message">"Bu tek seferlik bir işlemdir, beklediğiniz için teşekkürler."</string>
<string name="screen_migration_title">"Hesabınızı ayarlanıyor."</string>
<string name="screen_roomlist_a11y_create_message">"Yeni bir sohbet veya oda oluşturun"</string>
<string name="screen_roomlist_clear_filters">"Filtreleri temizle"</string>
<string name="screen_roomlist_empty_message">"Birine mesaj göndererek başla."</string>
<string name="screen_roomlist_empty_title">"Henüz sohbet yok."</string>
<string name="screen_roomlist_filter_favourites">"Favoriler"</string>
@@ -41,6 +44,7 @@ Okunmamış mesajınız yok!"</string>
<string name="screen_roomlist_main_space_title">"Sohbetler"</string>
<string name="screen_roomlist_mark_as_read">"Okundu olarak işaretle"</string>
<string name="screen_roomlist_mark_as_unread">"Okunmamış olarak işaretle"</string>
<string name="screen_roomlist_tombstoned_room_description">"Bu oda yükseltildi"</string>
<string name="session_verification_banner_message">"Görünüşe göre yeni bir cihaz kullanıyorsunuz. Şifrelenmiş mesajlarınıza erişmek için başka bir cihazla doğrulayın."</string>
<string name="session_verification_banner_title">"Siz olduğunuzu doğrulayın"</string>
</resources>

View File

@@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"Ushbu ilova uchun quvvatni optimallashtirishni oʻchirib qoʻying, barcha xabarnomalar qabul qilinganligiga ishonch hosil qilish uchun."</string>
<string name="banner_battery_optimization_submit_android">"Optimallashtirishni o\'chiring"</string>
<string name="banner_battery_optimization_title_android">"Bildirishnoma kelmayaptimi?"</string>
<string name="banner_new_sound_message">"Xabarnoma signali yangilandi — endi u aniqroq, tezroq va kamroq halal beradigan boldi."</string>
<string name="banner_new_sound_title">"Tovushlaringiz yangilandi"</string>
<string name="banner_set_up_recovery_content">"Mavjud barcha qurilmalarni yoʻqotgan boʻlsangiz, kriptografik kimligingizni va xabarlar tarixini qayta tiklovchi kalit bilan saqlab qoʻying."</string>
<string name="banner_set_up_recovery_submit">"Qayta tiklashni sozlang"</string>
<string name="banner_set_up_recovery_title">"Hisobingizni himoya qilish uchun tiklashni sozlang"</string>
@@ -13,7 +15,7 @@
<string name="full_screen_intent_banner_message">"Muhim qoʻngʻiroqlarni oʻtkazib yubormasligingiz uchun telefoningiz qulflangan holatida toʻliq ekranli bildirishnomalarni korsatishga ruxsat beradigan qilib sozlamalaringizni oʻzgartiring."</string>
<string name="full_screen_intent_banner_title">"Qoʻngʻiroq tajribangizni yaxshilang"</string>
<string name="screen_home_tab_chats">"Suhbatlar"</string>
<string name="screen_home_tab_spaces">"Boshliqlar"</string>
<string name="screen_home_tab_spaces">"Maydonlar"</string>
<string name="screen_invites_decline_chat_message">"Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?"</string>
<string name="screen_invites_decline_chat_title">"Taklifni rad etish"</string>
<string name="screen_invites_decline_direct_chat_message">"Haqiqatan ham bu shaxsiy chatni rad qilmoqchimisiz%1$s ?"</string>

View File

@@ -50,6 +50,7 @@
<string name="screen_roomlist_mark_as_read">"标记为已读"</string>
<string name="screen_roomlist_mark_as_unread">"标记为未读"</string>
<string name="screen_roomlist_tombstoned_room_description">"此房间已升级"</string>
<string name="screen_roomlist_your_spaces">"您的空间"</string>
<string name="session_verification_banner_message">"您似乎正在使用新设备。使用另一台设备进行验证以访问您的加密消息。"</string>
<string name="session_verification_banner_title">"验证是你本人"</string>
</resources>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_decline_and_block_block_user_option_title">"Kullanıcıyı engelle"</string>
<string name="screen_decline_and_block_report_user_reason_placeholder">"Bildirme nedenini açıklayın…"</string>
<string name="screen_invites_decline_chat_message">"%1$s katılma davetini reddetmek istediğinizden emin misiniz?"</string>
<string name="screen_invites_decline_chat_title">"Daveti reddet"</string>
<string name="screen_invites_decline_direct_chat_message">"%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?"</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Αποκλειστήκατε από αυτή την αίθουσα από το χρήστη %1$s."</string>
<string name="screen_join_room_ban_message">"Σας απαγορεύτηκε η είσοδος σε αυτή την αίθουσα"</string>
<string name="screen_join_room_ban_by_message">"Αποκλειστήκατε από το χρήστη %1$s."</string>
<string name="screen_join_room_ban_message">"Σας επιβλήθηκε ένα ban"</string>
<string name="screen_join_room_ban_reason">"Αιτία: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Ακύρωση αιτήματος"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Ναι, ακύρωση"</string>
@@ -11,13 +11,15 @@
<string name="screen_join_room_decline_and_block_alert_message">"Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτήν την αίθουσα; Αυτό θα εμποδίσει επίσης τον χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε αίθουσες."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Απόρριψη πρόσκλησης και αποκλεισμός"</string>
<string name="screen_join_room_decline_and_block_button_title">"Απόρριψη και αποκλεισμός"</string>
<string name="screen_join_room_fail_message">"Η συμμετοχή στην αίθουσα απέτυχε."</string>
<string name="screen_join_room_fail_reason">"Αυτή η αίθουσα είναι είτε μόνο για προσκεκλημένους είτε ενδέχεται να υπάρχουν περιορισμοί πρόσβασης σε επίπεδο χώρου."</string>
<string name="screen_join_room_forget_action">"Ξεχάστε αυτή την αίθουσα"</string>
<string name="screen_join_room_invite_required_message">"Χρειάζεστε πρόσκληση για να συμμετάσχετε σε αυτή την αίθουσα"</string>
<string name="screen_join_room_fail_message">"Η συμμετοχή απέτυχε"</string>
<string name="screen_join_room_fail_reason">"Πρέπει να λάβετε πρόσκληση για να συμμετάσχετε ή ενδέχεται να υπάρχουν περιορισμοί πρόσβασης."</string>
<string name="screen_join_room_forget_action">"Κατάργηση"</string>
<string name="screen_join_room_invite_required_message">"Χρειάζεστε πρόσκληση για να συμμετάσχετε"</string>
<string name="screen_join_room_invited_by">"Προσκεκλημένο από"</string>
<string name="screen_join_room_join_action">"Συμμετοχή"</string>
<string name="screen_join_room_join_restricted_message">"Ενδέχεται να χρειαστεί να προσκληθείτε ή να είστε μέλος ενός χώρου για να συμμετάσχετε."</string>
<string name="screen_join_room_knock_action">"Χτύπα για συμμετοχή"</string>
<string name="screen_join_room_knock_message_characters_count">"Επιτρεπόμενοι χαρακτήρες %1$d από %2$d"</string>
<string name="screen_join_room_knock_message_description">"Μήνυμα (προαιρετικό)"</string>
<string name="screen_join_room_knock_sent_description">"Θα λάβετε πρόσκληση για να συμμετάσχετε στην αίθουσα, εάν το αίτημά σας γίνει αποδεκτό."</string>
<string name="screen_join_room_knock_sent_title">"Το αίτημα συμμετοχής στάλθηκε"</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Has sido vetado de esta sala por %1$s."</string>
<string name="screen_join_room_ban_message">"Has sido vetado de esta sala"</string>
<string name="screen_join_room_ban_by_message">"Has sido baneado por %1$s."</string>
<string name="screen_join_room_ban_message">"Has sido baneado."</string>
<string name="screen_join_room_ban_reason">"Motivo: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Cancelar solicitud"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Sí, cancelar"</string>
@@ -11,10 +11,10 @@
<string name="screen_join_room_decline_and_block_alert_message">"¿Estás seguro de que deseas rechazar la invitación para unirte a esta sala? Esto también impedirá que %1$s pueda contactar contigo o invitarte a salas."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Rechazar invitación y bloquear"</string>
<string name="screen_join_room_decline_and_block_button_title">"Rechazar y bloquear"</string>
<string name="screen_join_room_fail_message">"No se pudo unir a la sala."</string>
<string name="screen_join_room_fail_reason">"O bien solo se puede acceder a esta sala con invitación, o puede que haya restricciones de acceso a nivel de espacio."</string>
<string name="screen_join_room_forget_action">"Olvidar esta sala"</string>
<string name="screen_join_room_invite_required_message">"Necesitas una invitación para unirte a esta sala"</string>
<string name="screen_join_room_fail_message">"Error al unirse"</string>
<string name="screen_join_room_fail_reason">"O es necesario estar invitado para unirse o puede haber restricciones de acceso."</string>
<string name="screen_join_room_forget_action">"Olvidar"</string>
<string name="screen_join_room_invite_required_message">"Necesitas una invitación para unirte"</string>
<string name="screen_join_room_join_action">"Unirse"</string>
<string name="screen_join_room_join_restricted_message">"Es posible que necesites ser invitado o ser miembro de un espacio para poder unirte."</string>
<string name="screen_join_room_knock_action">"Enviar solicitud de unión"</string>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Du bannades från det här rummet av %1$s."</string>
<string name="screen_join_room_ban_by_message">"Du bannades av %1$s."</string>
<string name="screen_join_room_ban_message">"Du bannades från det här rummet"</string>
<string name="screen_join_room_ban_reason">"Anledning: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Avbryt begäran"</string>
@@ -11,10 +11,10 @@
<string name="screen_join_room_decline_and_block_alert_message">"Är du säker på att du vill avvisa inbjudan att gå med i det här rummet? Detta kommer också att hindra %1$s från att kontakta dig eller bjuda in dig till rum."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Avvisa inbjudan och blockera"</string>
<string name="screen_join_room_decline_and_block_button_title">"Avvisa och blockera"</string>
<string name="screen_join_room_fail_message">"Misslyckades att gå med i rummet."</string>
<string name="screen_join_room_fail_message">"Misslyckades att gå med."</string>
<string name="screen_join_room_fail_reason">"Detta rum är antingen endast för inbjudna eller så kan det finnas begränsningar för åtkomst på utrymmesnivå."</string>
<string name="screen_join_room_forget_action">"Glöm det här rummet"</string>
<string name="screen_join_room_invite_required_message">"Du behöver en inbjudan för att gå med i detta rum"</string>
<string name="screen_join_room_forget_action">"Glöm"</string>
<string name="screen_join_room_invite_required_message">"Du behöver en inbjudan för att gå med"</string>
<string name="screen_join_room_join_action">"Gå med"</string>
<string name="screen_join_room_join_restricted_message">"Du kan behöva bli inbjuden eller vara medlem i ett utrymme för att gå med."</string>
<string name="screen_join_room_knock_action">"Knacka för att gå med"</string>

View File

@@ -15,6 +15,7 @@
<string name="screen_join_room_fail_reason">"Bu xona faqat taklif etilganlar uchun yoki bu maydonga kirish huquqi cheklangan bolishi mumkin."</string>
<string name="screen_join_room_forget_action">"Bu xonani esdan chiqarish"</string>
<string name="screen_join_room_invite_required_message">"Bu xonaga kirish uchun taklifnoma kerak"</string>
<string name="screen_join_room_invited_by">"Tomonidan taklif qilingan"</string>
<string name="screen_join_room_join_action">"Qo\'shilish"</string>
<string name="screen_join_room_join_restricted_message">"Qoshilish uchun sizga taklif kerak yoki siz maydonga azo bolishingiz kerak."</string>
<string name="screen_join_room_knock_action">"Qoʻshilish soʻrovini yuborish"</string>

View File

@@ -32,4 +32,5 @@
<string name="screen_room_multiple_knock_requests_view_all_button_title">"Προβολή όλων"</string>
<string name="screen_room_single_knock_request_accept_button_title">"Αποδοχή"</string>
<string name="screen_room_single_knock_request_title">"%1$s θέλει να συμμετάσχει σε αυτή την αίθουσα"</string>
<string name="screen_room_single_knock_request_view_button_title">"Προβολή"</string>
</resources>

View File

@@ -32,4 +32,5 @@
<string name="screen_room_multiple_knock_requests_view_all_button_title">"Ver todo"</string>
<string name="screen_room_single_knock_request_accept_button_title">"Aceptar"</string>
<string name="screen_room_single_knock_request_title">"%1$s quiere unirse a esta sala"</string>
<string name="screen_room_single_knock_request_view_button_title">"Ver"</string>
</resources>

View File

@@ -3,5 +3,8 @@
<string name="leave_conversation_alert_subtitle">"Είσαι σίγουρος ότι θέλεις να αποχωρήσεις από αυτή τη συζήτηση; Αυτή η συνομιλία δεν είναι δημόσια και δεν θα μπορείς να συμμετάσχεις ξανά χωρίς πρόσκληση."</string>
<string name="leave_room_alert_empty_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτή την αίθουσα; Είστε το μόνο άτομο εδώ. Αν αποχωρήσετε, κανείς δεν θα μπορεί να ενταχθεί στο μέλλον, ούτε εσείς."</string>
<string name="leave_room_alert_private_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν την αίθουσα; Αυτή η αίθουσα δεν είναι δημόσια και δεν θα μπορέσετε να επανενταχτείτε χωρίς πρόσκληση."</string>
<string name="leave_room_alert_select_new_owner_action">"Επιλέξτε ιδιοκτήτες"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Είστε ο μόνος ιδιοκτήτης αυτής της αίθουσας. Πρέπει να μεταβιβάσετε την ιδιοκτησία σε κάποιον άλλο πριν φύγετε από την αίθουσα."</string>
<string name="leave_room_alert_select_new_owner_title">"Μεταβίβαση ιδιοκτησίας"</string>
<string name="leave_room_alert_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από την αίθουσα;"</string>
</resources>

View File

@@ -3,7 +3,7 @@
<string name="leave_conversation_alert_subtitle">"Êtes-vous sûr de vouloir quitter cette discussion ? Vous ne pourrez pas la rejoindre à nouveau sans y être invité."</string>
<string name="leave_room_alert_empty_subtitle">"Êtes-vous sûr de vouloir quitter ce salon ? Vous êtes la seule personne ici. Si vous partez, personne ne pourra rejoindre le salon à lavenir, y compris vous."</string>
<string name="leave_room_alert_private_subtitle">"Êtes-vous sûr de vouloir quitter ce salon ? Ce salon nest pas public et vous ne pourrez pas le rejoindre sans invitation."</string>
<string name="leave_room_alert_select_new_owner_action">"Choisissez les propriétaires"</string>
<string name="leave_room_alert_select_new_owner_action">"Choisir les propriétaires"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Vous êtes le seul propriétaire de ce salon. Vous devez en transférer la propriété à quelquun dautre avant de le quitter."</string>
<string name="leave_room_alert_select_new_owner_title">"Transférer la propriété"</string>
<string name="leave_room_alert_subtitle">"Êtes-vous sûr de vouloir quitter le salon ?"</string>

View File

@@ -3,5 +3,8 @@
<string name="leave_conversation_alert_subtitle">"Bu sohbetten ayrılmak istediğinizden emin misiniz? Bu sohbet herkese açık değil ve davet olmadan tekrar katılamayacaksınız."</string>
<string name="leave_room_alert_empty_subtitle">"Bu odadan ayrılmak istediğinizden emin misiniz? Burada tek kişi sizsiniz. Ayrılırsanız, siz de dahil olmak üzere gelecekte kimse katılamayacak."</string>
<string name="leave_room_alert_private_subtitle">"Bu odadan ayrılmak istediğinizden emin misiniz? Bu oda herkese açık değildir ve davet olmadan tekrar katılamazsınız."</string>
<string name="leave_room_alert_select_new_owner_action">"Sahipleri seçin"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Bu odanın tek sahibisiniz. Odadan çıkmadan önce sahipliği başka birine devretmelisiniz."</string>
<string name="leave_room_alert_select_new_owner_title">"Sahipliği aktar"</string>
<string name="leave_room_alert_subtitle">"Odadan çıkmak istediğinden emin misin?"</string>
</resources>

View File

@@ -189,9 +189,13 @@ class LinkNewDeviceFlowNode(
is ErrorType.InvalidCheckCode -> ErrorScreenType.InsecureChannelDetected
is ErrorType.MissingSecretsBackup -> ErrorScreenType.UnknownError
is ErrorType.NotFound -> ErrorScreenType.Expired
is ErrorType.UnableToCreateDevice -> ErrorScreenType.UnknownError
is ErrorType.DeviceNotFound -> ErrorScreenType.UnknownError
is ErrorType.Unknown -> ErrorScreenType.UnknownError
is ErrorType.UnsupportedProtocol -> ErrorScreenType.UnknownError
is ErrorType.Cancelled -> ErrorScreenType.UnknownError
is ErrorType.ConnectionInsecure -> ErrorScreenType.InsecureChannelDetected
is ErrorType.Expired -> ErrorScreenType.Expired
is ErrorType.OtherDeviceAlreadySignedIn -> ErrorScreenType.UnknownError
}
// It is OK to push on backstack, since when user leaves the error screen, a new root will be set,
// or the whole flow will be popped.

View File

@@ -1,16 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"Σάρωση κωδικού QR"</string>
<string name="screen_link_new_device_desktop_step1">"Ανοίξτε το %1$s σε φορητό ή επιτραπέζιο υπολογιστή"</string>
<string name="screen_link_new_device_desktop_step3">"Σάρωσε τον κωδικό QR με αυτήν τη συσκευή"</string>
<string name="screen_link_new_device_desktop_submit">"Έτοιμο για σάρωση"</string>
<string name="screen_link_new_device_desktop_title">"Ανοίξτε το %1$s σε έναν επιτραπέζιο υπολογιστή για να λάβετε τον κωδικό QR"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Οι αριθμοί δεν ταιριάζουν"</string>
<string name="screen_link_new_device_enter_number_notice">"Εισαγάγετε έναν 2ψήφιο κωδικό"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Αυτό θα επαληθεύσει ότι η σύνδεση με την άλλη συσκευή σας είναι ασφαλής."</string>
<string name="screen_link_new_device_enter_number_title">"Εισαγάγετε τον αριθμό που εμφανίζεται στην άλλη συσκευή σας"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Ο πάροχος λογαριασμού σου δεν υποστηρίζει το %1$s."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"Το %1$s δεν υποστηρίζεται"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Ο πάροχος του λογαριασμού σας δεν υποστηρίζει τη σύνδεση σε νέα συσκευή με κωδικό QR."</string>
<string name="screen_link_new_device_error_not_supported_title">"Ο κωδικός QR δεν υποστηρίζεται"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Η σύνδεση ακυρώθηκε στην άλλη συσκευή."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string>
<string name="screen_link_new_device_mobile_step1">"Ανοίξτε το %1$s στην άλλη συσκευή"</string>
<string name="screen_link_new_device_mobile_step2">"Επιλογή %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"«Συνδεθείτε με κωδικό QR»"</string>
<string name="screen_link_new_device_mobile_step3">"Σαρώστε τον QR κωδικό που εμφανίζεται εδώ με την άλλη συσκευή."</string>
<string name="screen_link_new_device_mobile_title">"Ανοίξτε το %1$s στην άλλη συσκευή"</string>
<string name="screen_link_new_device_root_desktop_computer">"Υπολογιστής"</string>
<string name="screen_link_new_device_root_loading_qr_code">"Φόρτωση QR κωδικού…"</string>
<string name="screen_link_new_device_root_mobile_device">"Κινητή συσκευή"</string>
<string name="screen_link_new_device_root_title">"Τι είδους συσκευή θέλετε να συνδέσετε;"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Δοκιμάστε ξανά και βεβαιωθείτε ότι έχετε εισαγάγει σωστά τον 2ψήφιο κωδικό. Εάν οι αριθμοί εξακολουθούν να μην ταιριάζουν, επικοινωνήστε με τον πάροχο του λογαριασμού σας."</string>
<string name="screen_link_new_device_wrong_number_title">"Οι αριθμοί δεν ταιριάζουν"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Δεν ήταν δυνατή η πραγματοποίηση ασφαλούς σύνδεσης στη νέα συσκευή. Οι υπάρχουσες συσκευές σας εξακολουθούν να είναι ασφαλείς και δεν χρειάζεται να ανησυχείς για αυτές."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Τί είναι πάλι;"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Δοκίμασε να συνδεθείς ξανά με έναν κωδικό QR σε περίπτωση που ήταν πρόβλημα του δικτύου"</string>
@@ -21,6 +38,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string>
<string name="screen_qr_code_login_error_declined_title">"Η σύνδεση απορρίφθηκε"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Δεν χρειάζεται να κάνετε τίποτα άλλο."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Η άλλη συσκευή σας είναι ήδη συνδεδεμένη"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_qr_code_login_error_expired_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Η άλλη σου συσκευή δεν υποστηρίζει σύνδεση στο %s με κωδικό QR.

View File

@@ -1,16 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"Skannaa QR-koodi"</string>
<string name="screen_link_new_device_desktop_step1">"Avaa %1$s läppärillä tai pöytätietokoneella"</string>
<string name="screen_link_new_device_desktop_step3">"Skannaa QR-koodi tällä laitteella"</string>
<string name="screen_link_new_device_desktop_submit">"Valmis skannaamaan"</string>
<string name="screen_link_new_device_desktop_title">"Avaa %1$s pöytätietokoneella saadaksesi QR-koodin"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Numerot eivät täsmää"</string>
<string name="screen_link_new_device_enter_number_notice">"Syötä 2-numeroinen koodi"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Tämä varmistaa, että yhteys toiseen laitteeseesi on turvallinen."</string>
<string name="screen_link_new_device_enter_number_title">"Kirjoita toisessa laitteessa näkyvä numero"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Palveluntarjoajasi ei tue %1$s -sovellusta"</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s -sovellusta ei tueta"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Palveluntarjoajasi ei tue kirjautumista uuteen laitteeseen QR-koodilla."</string>
<string name="screen_link_new_device_error_not_supported_title">"QR-koodia ei tueta"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Kirjautuminen peruutettiin toisella laitteella."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Kirjautumista ei suoritettu ajoissa"</string>
<string name="screen_link_new_device_mobile_step1">"Avaa %1$s toisella laitteella"</string>
<string name="screen_link_new_device_mobile_step2">"Valitse %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"\"Kirjaudu sisään QR-koodilla\""</string>
<string name="screen_link_new_device_mobile_step3">"Skannaa tässä näkyvä QR-koodi toisella laitteella"</string>
<string name="screen_link_new_device_mobile_title">"Avaa %1$s toisella laitteella"</string>
<string name="screen_link_new_device_root_desktop_computer">"Pöytätietokone"</string>
<string name="screen_link_new_device_root_loading_qr_code">"Ladataan QR-koodia…"</string>
<string name="screen_link_new_device_root_mobile_device">"Mobiililaite"</string>
<string name="screen_link_new_device_root_title">"Minkä tyyppisen laitteen haluat yhdistää?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Yritä uudelleen ja varmista, että olet syöttänyt 2-numeroisen koodin oikein. Jos numerot eivät vieläkään täsmää, ota yhteyttä palveluntarjoajaasi."</string>
<string name="screen_link_new_device_wrong_number_title">"Numerot eivät täsmää"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Turvallista yhteyttä uuteen laitteeseen ei voitu muodostaa. Olemassa olevat laitteesi ovat edelleen turvassa, eikä sinun tarvitse huolehtia niistä."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Mitä nyt?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Yritä kirjautua sisään uudelleen QR-koodilla, jos kyseessä oli verkko-ongelma"</string>
@@ -21,6 +38,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string>
<string name="screen_qr_code_login_error_declined_title">"Kirjautuminen hylätty"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Sinun ei tarvitse tehdä mitään muuta."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Toinen laitteesi on jo kirjautunut sisään"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string>
<string name="screen_qr_code_login_error_expired_title">"Kirjautumista ei suoritettu ajoissa"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Toinen laitteesi ei tue kirjautumista %s -sovellukseen QR-koodilla.

View File

@@ -1,16 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"QR kodunu tara"</string>
<string name="screen_link_new_device_desktop_step1">"%1$s uygulamasını bir dizüstü veya masaüstü bilgisayarda açın"</string>
<string name="screen_link_new_device_desktop_step3">"QR kodunu bu cihazla tarayın"</string>
<string name="screen_link_new_device_desktop_submit">"Taramaya hazır"</string>
<string name="screen_link_new_device_desktop_title">"QR kodu almak için %1$s uygulamasını masaüstü bilgisayarda açın%1$s%1$s"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Sayılar uyuşmuyor"</string>
<string name="screen_link_new_device_enter_number_notice">"2 haneli kodu girin"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Bu işlem, diğer cihazla olan bağlantının güvenli olduğunu doğrular."</string>
<string name="screen_link_new_device_enter_number_title">"Diğer cihazda gösterilen numarayı girin"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Hesap sağlayıcınız %1$s desteklemiyor."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s desteklenmiyor"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Hesap sağlayıcınız QR kod ile yeni bir cihaza giriş yapılmasını desteklemiyor."</string>
<string name="screen_link_new_device_error_not_supported_title">"QR kodu desteklenmiyor"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Oturum açma işlemi diğer cihazda iptal edildi."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Oturum açma isteği iptal edildi"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Oturum açma süresi doldu. Lütfen tekrar deneyin."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Oturum açma işlemi zamanında tamamlanmadı"</string>
<string name="screen_link_new_device_mobile_step1">"Diğer cihazda %1$s uygulamasınıın"</string>
<string name="screen_link_new_device_mobile_step2">"Seç %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"QR kod ile giriş yap"</string>
<string name="screen_link_new_device_mobile_step3">"Burada gösterilen QR kodu diğer cihazla tarayın"</string>
<string name="screen_link_new_device_mobile_title">"Diğer cihazda %1$s uygulamasınıın"</string>
<string name="screen_link_new_device_root_desktop_computer">"Masaüstü bilgisayar"</string>
<string name="screen_link_new_device_root_loading_qr_code">"QR kod yükleniyor…"</string>
<string name="screen_link_new_device_root_title">"Hangi tür cihazı bağlamak istiyorsunuz?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Lütfen tekrar deneyin ve 2 haneli kodu doğru girdiğinizden emin olun. Numaralar hâlâ eşleşmiyorsa hesap sağlayıcınızla iletişime geçin."</string>
<string name="screen_link_new_device_wrong_number_title">"Sayılar uyuşmuyor"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Yeni cihaza güvenli bir bağlantı kurulamadı. Mevcut cihazlarınız hala güvende ve onlar için endişelenmenize gerek yok."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Şimdi ne olacak?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Bunun bir ağ sorunu olması ihtimaline karşı bir QR koduyla tekrar oturum açmayı deneyin"</string>

View File

@@ -1,16 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"QR kodni skanerlash"</string>
<string name="screen_link_new_device_desktop_step1">"%1$s ilovasini noutbuk yoki desktopda ochish"</string>
<string name="screen_link_new_device_desktop_step3">"Bu qurilma bilan QR kodni skanerlang"</string>
<string name="screen_link_new_device_desktop_submit">"Skanerlashga tayyor"</string>
<string name="screen_link_new_device_desktop_title">"QR kodni olish uchun desktop kompyuterda %1$s ilovasini oching"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Raqamlar mos kelmaydi"</string>
<string name="screen_link_new_device_enter_number_notice">"2 xonali kodni kiriting"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Bu boshqa qurilmangizga ulanish xavfsiz ekanligini tasdiqlaydi."</string>
<string name="screen_link_new_device_enter_number_title">"Boshqa qurilmangizda korsatilgan raqamni kiriting"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Hisob provayderingiz %1$s bilan ishlamaydi."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s qoʻllab-quvvatlanmaydi"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Hisob provayderingiz QR kodi bilan yangi qurilmaga kirishni qollab-quvvatlamaydi."</string>
<string name="screen_link_new_device_error_not_supported_title">"QR kod qoʻllab-quvvatlanmaydi"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Boshqa qurilmadan hisobga kirish bekor qilindi."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Tizimga kirish soʻrovi bekor qilindi"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Kirish muddati tugagan. Iltimos, qayta urinib koʻring."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Kirish oʻz vaqtida tugallanmagan"</string>
<string name="screen_link_new_device_mobile_step1">"Boshqa qurilmada %1$s ni ochish"</string>
<string name="screen_link_new_device_mobile_step2">"%1$sʼni tanlang"</string>
<string name="screen_link_new_device_mobile_step2_action">"\"QR kod bilan kirish\""</string>
<string name="screen_link_new_device_mobile_step3">"Bu yerda korsatilgan QR kodni boshqa qurilma bilan skanerlang"</string>
<string name="screen_link_new_device_mobile_title">"Boshqa qurilmada %1$s ni ochish"</string>
<string name="screen_link_new_device_root_desktop_computer">"Ish stoli kompyuter"</string>
<string name="screen_link_new_device_root_loading_qr_code">"QR kod yuklanmoqda…"</string>
<string name="screen_link_new_device_root_mobile_device">"Mobil qurilma"</string>
<string name="screen_link_new_device_root_title">"Qaysi turdagi qurilmani boglashni xohlaysiz?"</string>
<string name="screen_link_new_device_wrong_number_title">"Raqamlar mos kelmaydi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Yangi qurilmaga xavfsiz ulanish amalga oshirilmadi. Mavjud qurilmalaringiz hali ham xavfsiz va ular haqida qaygʻurishingiz shart emas."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Endi nima?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Agar bu tarmoq muammosi boʻlsa, QR kod bilan qayta kiring"</string>

View File

@@ -1,16 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"扫描二维码"</string>
<string name="screen_link_new_device_desktop_step1">"在笔记本电脑或台式机上打开%1$s "</string>
<string name="screen_link_new_device_desktop_step3">"使用此设备扫描二维码"</string>
<string name="screen_link_new_device_desktop_submit">"准备进行扫描"</string>
<string name="screen_link_new_device_desktop_title">"在电脑上打开%1$s 获取二维码"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"数字不匹配"</string>
<string name="screen_link_new_device_enter_number_notice">"输入两位数的验证码"</string>
<string name="screen_link_new_device_enter_number_subtitle">"这将验证您与其他设备的连接是否安全。"</string>
<string name="screen_link_new_device_enter_number_title">"请输入另一台设备上显示的数字"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"账户提供方不支持 %1$s."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"不支持 %1$s."</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"您的账户提供商不支持使用二维码登录新设备。"</string>
<string name="screen_link_new_device_error_not_supported_title">"不支持二维码"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"登录被另一台设备取消"</string>
<string name="screen_link_new_device_error_request_cancelled_title">"登录请求已取消"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"登录已过期. 请重试."</string>
<string name="screen_link_new_device_error_request_timeout_title">"登录未及时完成"</string>
<string name="screen_link_new_device_mobile_step1">"在另一台设备上打开 %1$s"</string>
<string name="screen_link_new_device_mobile_step2">"选择 %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"“使用二维码登录”"</string>
<string name="screen_link_new_device_mobile_step3">"请用另一台设备扫描此处显示的二维码"</string>
<string name="screen_link_new_device_mobile_title">"在另一台设备上打开 %1$s"</string>
<string name="screen_link_new_device_root_desktop_computer">"台式计算机"</string>
<string name="screen_link_new_device_root_loading_qr_code">"正在加载 QR 码…"</string>
<string name="screen_link_new_device_root_mobile_device">"移动设备"</string>
<string name="screen_link_new_device_root_title">"您想连接哪种类型的设备?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"请重试,并确保您已正确输入两位验证码。如果验证码仍然不匹配,请联系您的账户提供商。"</string>
<string name="screen_link_new_device_wrong_number_title">"数字不匹配"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"无法与新设备建立安全连接。您现有的设备仍然安全,无需担心。"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"现在怎么办?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"如果这是网络问题,请尝试使用二维码再次登录"</string>
@@ -21,6 +38,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"其它设备未接受请求"</string>
<string name="screen_qr_code_login_error_declined_title">"登录被拒绝"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"您无需额外操作。"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"您已在另一台设备登录。"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"登录已过期. 请重试."</string>
<string name="screen_qr_code_login_error_expired_title">"登录未及时完成"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"另一个设备不支持使用二维码登录 %s.

View File

@@ -15,9 +15,9 @@
<string name="screen_app_lock_setup_biometric_unlock_subtitle">"%1$s kullanarak oturum açarken kendinize zaman kazandırın"</string>
<string name="screen_app_lock_setup_choose_pin">"PIN Seç"</string>
<string name="screen_app_lock_setup_confirm_pin">"PIN\'i onayla"</string>
<string name="screen_app_lock_setup_pin_context">"Sohbetlerinize ekstra güvenlik eklemek için %1$s kilitleyin.
<string name="screen_app_lock_setup_pin_context">"Sohbetlerinizi daha güvenli hale getirmek için %1$s uygulamasına bir kilit ekleyin.
Hatırlanabilir bir şey seçin. Bu PIN\'i unutursanız, uygulamadan çıkış yaparsınız."</string>
Uygulamayı her açtığınızda bu PINi girmeniz gerekecek. Bu PINi unutursanız, uygulamadan çıkış yapmanız gerekir."</string>
<string name="screen_app_lock_setup_pin_forbidden_dialog_content">"Güvenlik nedeniyle bunu PIN kodunuz olarak seçemezsiniz"</string>
<string name="screen_app_lock_setup_pin_forbidden_dialog_title">"Farklı bir PIN seçin"</string>
<string name="screen_app_lock_setup_pin_mismatch_dialog_content">"Lütfen aynı PIN\'i iki kez girin"</string>

View File

@@ -13,6 +13,9 @@
<string name="screen_change_account_provider_other">"Άλλο"</string>
<string name="screen_change_account_provider_subtitle">"Χρησιμοποίησε διαφορετικό πάροχο λογαριασμού, όπως τον δικό σου ιδιωτικό διακομιστή ή έναν εργασιακό λογαριασμό."</string>
<string name="screen_change_account_provider_title">"Αλλαγή παρόχου λογαριασμού"</string>
<string name="screen_change_server_error_element_pro_required_action_android">"Google Play"</string>
<string name="screen_change_server_error_element_pro_required_message">"Η εφαρμογή Element Pro απαιτείται στο %1$s. Παρακαλώ κατεβάστε την από το κατάστημα."</string>
<string name="screen_change_server_error_element_pro_required_title">"Απαιτείται το Element Pro"</string>
<string name="screen_change_server_error_invalid_homeserver">"Δεν μπορούσαμε να επικοινωνήσουμε με αυτόν τον οικιακό διακομιστή. Βεβαιώσου ότι έχεις εισαγάγει σωστά τη διεύθυνση URL του αρχικού διακομιστή. Εάν η διεύθυνση URL είναι σωστή, επικοινώνησε με τον διαχειριστή του κεντρικού διακομιστή για περαιτέρω βοήθεια."</string>
<string name="screen_change_server_error_invalid_well_known">"Ο διακομιστής δεν είναι διαθέσιμος λόγω προβλήματος στο αρχείο .well-known:
%1$s"</string>
@@ -34,6 +37,7 @@
<string name="screen_login_subtitle">"Το Matrix είναι ένα ανοιχτό δίκτυο για ασφαλή, αποκεντρωμένη επικοινωνία."</string>
<string name="screen_login_title">"Καλωσόρισες ξανά!"</string>
<string name="screen_login_title_with_homeserver">"Συνδέσου στο %1$s"</string>
<string name="screen_onboarding_app_version">"Έκδοση %1$s"</string>
<string name="screen_onboarding_sign_in_manually">"Σύνδεση χειροκίνητα"</string>
<string name="screen_onboarding_sign_in_to">"Συνδέσου στο %1$s"</string>
<string name="screen_onboarding_sign_in_with_qr_code">"Συνδέσου με κωδικό QR"</string>
@@ -56,6 +60,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string>
<string name="screen_qr_code_login_error_declined_title">"Η σύνδεση απορρίφθηκε"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Δεν χρειάζεται να κάνετε τίποτα άλλο."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Η άλλη συσκευή σας είναι ήδη συνδεδεμένη"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_qr_code_login_error_expired_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Η άλλη σου συσκευή δεν υποστηρίζει σύνδεση στο %s με κωδικό QR.

View File

@@ -34,6 +34,7 @@
<string name="screen_login_subtitle">"Matrix es una red abierta para una comunicación segura y descentralizada."</string>
<string name="screen_login_title">"¡Hola de nuevo!"</string>
<string name="screen_login_title_with_homeserver">"Iniciar sesión en %1$s"</string>
<string name="screen_onboarding_app_version">"Versión %1$s"</string>
<string name="screen_onboarding_sign_in_manually">"Iniciar sesión manualmente"</string>
<string name="screen_onboarding_sign_in_to">"Iniciar sesión en %1$s"</string>
<string name="screen_onboarding_sign_in_with_qr_code">"Iniciar sesión con un código QR"</string>

View File

@@ -60,6 +60,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string>
<string name="screen_qr_code_login_error_declined_title">"Kirjautuminen hylätty"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Sinun ei tarvitse tehdä mitään muuta."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Toinen laitteesi on jo kirjautunut sisään"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string>
<string name="screen_qr_code_login_error_expired_title">"Kirjautumista ei suoritettu ajoissa"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Toinen laitteesi ei tue kirjautumista %s -sovellukseen QR-koodilla.

View File

@@ -16,6 +16,10 @@
<string name="screen_change_server_error_invalid_homeserver">"Bu ana sunucuya ulaşamadık. Lütfen ana sunucu URL\'sini doğru girip girmediğinizi kontrol edin. URL doğruysa, daha fazla yardım için ana sunucu yöneticinize başvurun."</string>
<string name="screen_change_server_error_invalid_well_known">"Well-known dosyasında bir sorun nedeniyle sunucu kullanılamıyor:
%1$s"</string>
<string name="screen_change_server_error_no_sliding_sync_message">"Seçilen hesap sağlayıcısı sliding sync özelliğini desteklemiyor. %1$s kullanmak için sunucunun yükseltilmesi gerekiyor."</string>
<string name="screen_change_server_error_unauthorized_homeserver">"%1$s, %2$s ile bağlantı kurma yetkisine sahip değil."</string>
<string name="screen_change_server_error_unauthorized_homeserver_content">"Bu uygulama şu sağlayıcılara izin verecek şekilde yapılandırıldı: %1$s."</string>
<string name="screen_change_server_error_unauthorized_homeserver_title">"Hesap sağlayıcısı %1$s İzin verilmiyor."</string>
<string name="screen_change_server_form_header">"Ana sunucu URL\'si"</string>
<string name="screen_change_server_subtitle">"Sunucunuzun adresi nedir?"</string>
<string name="screen_change_server_title">"Sunucunuzu seçin"</string>

View File

@@ -60,6 +60,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"其它设备未接受请求"</string>
<string name="screen_qr_code_login_error_declined_title">"登录被拒绝"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"您无需额外操作。"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"您已在另一台设备登录。"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"登录已过期. 请重试."</string>
<string name="screen_qr_code_login_error_expired_title">"登录未及时完成"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"另一个设备不支持使用二维码登录 %s.

View File

@@ -23,6 +23,7 @@ import io.element.android.libraries.matrix.api.encryption.RecoveryState
import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
import io.element.android.libraries.workmanager.api.WorkManagerRequestType
import io.element.android.libraries.workmanager.test.FakeWorkManagerScheduler
import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.lambda.lambdaRecorder
@@ -149,7 +150,7 @@ class LogoutPresenterTest {
@Test
fun `present - logout then confirm`() = runTest {
val cancelWorkManagerJobsLambda = lambdaRecorder<SessionId, Unit> {}
val cancelWorkManagerJobsLambda = lambdaRecorder<SessionId, WorkManagerRequestType?, Unit> { _, _ -> }
val workManagerScheduler = FakeWorkManagerScheduler(cancelLambda = cancelWorkManagerJobsLambda)
val presenter = createLogoutPresenter(workManagerScheduler = workManagerScheduler)
moleculeFlow(RecompositionMode.Immediate) {
@@ -238,7 +239,7 @@ class LogoutPresenterTest {
internal fun createLogoutPresenter(
matrixClient: MatrixClient = FakeMatrixClient(),
encryptionService: EncryptionService = FakeEncryptionService(),
workManagerScheduler: FakeWorkManagerScheduler = FakeWorkManagerScheduler(cancelLambda = {}),
workManagerScheduler: FakeWorkManagerScheduler = FakeWorkManagerScheduler(cancelLambda = { _, _ -> }),
): LogoutPresenter = LogoutPresenter(
matrixClient = matrixClient,
encryptionService = encryptionService,

View File

@@ -115,7 +115,7 @@ private fun ViolationAlert(
},
submitText = stringResource(submitTextId),
onSubmitClick = onSubmitClick,
level = if (isCritical) ComposerAlertLevel.Critical else ComposerAlertLevel.Default,
level = if (isCritical) ComposerAlertLevel.Critical else ComposerAlertLevel.Info,
)
}

View File

@@ -30,5 +30,5 @@ data class TimelineItemStickerContent(
/* Stickers are supposed to be small images so
we allow using the mediaSource (unless the url is empty) */
val preferredMediaSource = if (mediaSource.url.isEmpty()) thumbnailSource else mediaSource
val preferredMediaSource = if (mediaSource.safeUrl.isEmpty()) thumbnailSource else mediaSource
}

View File

@@ -14,10 +14,18 @@
<string name="emoji_picker_category_objects">"Αντικείμενα"</string>
<string name="emoji_picker_category_people">"Φατσούλες &amp; Άνθρωποι"</string>
<string name="emoji_picker_category_places">"Ταξίδια &amp; Μέρη"</string>
<string name="emoji_picker_category_recent">"Πρόσφατα emoji"</string>
<string name="emoji_picker_category_symbols">"Σύμβολα"</string>
<string name="screen_media_upload_preview_caption_warning">"Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Πατήστε για να αλλάξετε την ποιότητα μεταφόρτωσης βίντεο"</string>
<string name="screen_media_upload_preview_error_could_not_be_uploaded">"Δεν ήταν δυνατή η μεταφόρτωση του αρχείου."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Αποτυχία μεταφόρτωσης πολυμέσων, δοκίμασε ξανά."</string>
<string name="screen_media_upload_preview_error_too_large_message">"Το μέγιστο επιτρεπόμενο μέγεθος αρχείου είναι %1$s."</string>
<string name="screen_media_upload_preview_error_too_large_title">"Το αρχείο είναι πολύ μεγάλο για μεταφόρτωση"</string>
<string name="screen_media_upload_preview_item_count">"Στοιχείο %1$d από %2$d"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Βελτιστοποίηση ποιότητας εικόνας"</string>
<string name="screen_media_upload_preview_processing">"Επεξεργασία…"</string>
<string name="screen_report_content_block_user">"Αποκλεισμός χρήστη"</string>
<string name="screen_report_content_block_user_hint">"Επέλεξε εάν θες να αποκρύψεις όλα τα τρέχοντα και μελλοντικά μηνύματα από αυτόν τον χρήστη"</string>
<string name="screen_report_content_explanation">"Αυτό το μήνυμα θα αναφερθεί στον διαχειριστή του οικιακού διακομιστή σας. Δεν θα μπορεί να διαβάσει κρυπτογραφημένα μηνύματα."</string>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="crypto_event_authenticity_mismatched_sender">"El remitente del evento no coincide con el propietario del dispositivo que lo envió."</string>
<string name="crypto_event_authenticity_not_guaranteed">"La autenticidad de este mensaje cifrado no puede ser garantizada en este dispositivo."</string>
<string name="crypto_event_authenticity_previously_verified">"Cifrado por un usuario verificado anteriormente."</string>
<string name="crypto_event_authenticity_sent_in_clear">"No cifrado."</string>
@@ -46,11 +47,16 @@
<string name="screen_room_timeline_no_permission_to_post">"No tienes permiso para publicar en esta sala"</string>
<string name="screen_room_timeline_reactions_show_less">"Mostrar menos"</string>
<string name="screen_room_timeline_reactions_show_more">"Mostrar más"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"Mostrar todas las reacciones"</string>
<string name="screen_room_timeline_read_marker_title">"Nuevos"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d cambio en la sala"</item>
<item quantity="other">"%1$d cambios en la sala"</item>
</plurals>
<string name="screen_room_timeline_tombstoned_room_action">"Ir a la nueva sala"</string>
<string name="screen_room_timeline_tombstoned_room_message">"Esta sala ha sido reemplazada y ya no está activa."</string>
<string name="screen_room_timeline_upgraded_room_action">"Ver mensajes antiguos"</string>
<string name="screen_room_timeline_upgraded_room_message">"Esta sala es la sucesora de otra sala."</string>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s y %3$d otro"</item>
<item quantity="other">"%1$s, %2$s y %3$d otros"</item>

View File

@@ -35,7 +35,7 @@
<string name="screen_room_attachment_source_camera_video">"Ta opp video"</string>
<string name="screen_room_attachment_source_files">"Vedlegg"</string>
<string name="screen_room_attachment_source_gallery">"Foto- og videobibliotek"</string>
<string name="screen_room_attachment_source_location">"Lokasjon"</string>
<string name="screen_room_attachment_source_location">"Posisjon"</string>
<string name="screen_room_attachment_source_poll">"Avstemning"</string>
<string name="screen_room_attachment_text_formatting">"Tekstformatering"</string>
<string name="screen_room_encrypted_history_banner">"Meldingshistorikken er for øyeblikket ikke tilgjengelig."</string>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="crypto_event_authenticity_mismatched_sender">"Etkinliği gönderen kişi, onu gönderen cihazın sahibiyle eşleşmiyor."</string>
<string name="crypto_event_authenticity_not_guaranteed">"Bu şifrelenmiş mesajın doğruluğu bu cihazda garanti edilemez."</string>
<string name="crypto_event_authenticity_previously_verified">"Daha önce doğrulanmış bir kullanıcı tarafından şifrelenmiştir."</string>
<string name="crypto_event_authenticity_sent_in_clear">"Şifrelenmemiş."</string>
@@ -46,11 +47,15 @@
<string name="screen_room_timeline_no_permission_to_post">"Bu odada gönderi yapma izniniz yok"</string>
<string name="screen_room_timeline_reactions_show_less">"Daha az göster"</string>
<string name="screen_room_timeline_reactions_show_more">"Daha fazla göster"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"Tepki özetini göster"</string>
<string name="screen_room_timeline_read_marker_title">"Yeni"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d oda değişikliği"</item>
<item quantity="other">"%1$d oda değişikliği"</item>
</plurals>
<string name="screen_room_timeline_tombstoned_room_action">"Yeni odaya git"</string>
<string name="screen_room_timeline_tombstoned_room_message">"Bu odanın yerini başka bir oda aldı ve artık aktif değil"</string>
<string name="screen_room_timeline_upgraded_room_message">"Bu oda, başka bir odanın devamıdır"</string>
<plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s ve %3$d diğer"</item>
<item quantity="other">"%1$s, %2$s ve %3$d diğer"</item>

View File

@@ -14,6 +14,7 @@
<string name="emoji_picker_category_objects">"Ob\'ektlar"</string>
<string name="emoji_picker_category_people">"Smayllar va odamlar"</string>
<string name="emoji_picker_category_places">"Sayohat va Joylar"</string>
<string name="emoji_picker_category_recent">"Oxirgi kulgichlar"</string>
<string name="emoji_picker_category_symbols">"Belgilar"</string>
<string name="screen_media_upload_preview_caption_warning">"Taglavhalar eski ilovalardan foydalanuvchilarga korinmasligi mumkin."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Video yuklash sifatini oʻzgartirish uchun bosing"</string>
@@ -22,6 +23,7 @@
<string name="screen_media_upload_preview_error_failed_sending">"Media yuklanmadi, qayta urinib koring."</string>
<string name="screen_media_upload_preview_error_too_large_message">"Ruxsat etilgan maksimal fayl hajmi %1$s ."</string>
<string name="screen_media_upload_preview_error_too_large_title">"Fayl yuklash uchun juda katta"</string>
<string name="screen_media_upload_preview_item_count">"Element%1$d ning %2$d"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Tasvir sifatini optimallashtirish"</string>
<string name="screen_media_upload_preview_processing">"Qayta ishlanmoqda…"</string>
<string name="screen_report_content_block_user">"Foydalanuvchini bloklash"</string>

View File

@@ -31,6 +31,7 @@ dependencies {
implementation(projects.libraries.matrix.api)
implementation(projects.libraries.sessionStorage.api)
implementation(projects.libraries.uiStrings)
implementation(projects.libraries.workmanager.api)
testCommonDependencies(libs)
testImplementation(projects.libraries.matrix.test)

View File

@@ -0,0 +1,39 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.migration.impl.migrations
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesIntoSet
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.libraries.workmanager.api.WorkManagerRequestType
import io.element.android.libraries.workmanager.api.WorkManagerScheduler
/**
* Remove existing fetch notifications work manager requests since their format has changed.
*/
@ContributesIntoSet(AppScope::class)
class AppMigration10(
private val sessionStore: SessionStore,
private val workManagerScheduler: WorkManagerScheduler,
) : AppMigration {
override val order: Int = 10
override suspend fun migrate(isFreshInstall: Boolean) {
if (isFreshInstall) return
val sessions = sessionStore.getAllSessions()
for (session in sessions) {
workManagerScheduler.cancel(
sessionId = SessionId(session.userId),
requestType = WorkManagerRequestType.NOTIFICATION_SYNC
)
}
}
}

View File

@@ -20,4 +20,9 @@ interface NetworkMonitor {
* A flow containing the current network connectivity status.
*/
val connectivity: StateFlow<NetworkStatus>
/**
* Checks if the active network is being blocked by Doze, even if it's available.
*/
fun isNetworkBlocked(): Boolean
}

View File

@@ -43,6 +43,9 @@ class DefaultNetworkMonitor(
appCoroutineScope: CoroutineScope,
) : NetworkMonitor {
private val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java)
private val blockedNetworkBlockedChecker = NetworkBlockedChecker(connectivityManager)
override fun isNetworkBlocked(): Boolean = blockedNetworkBlockedChecker.isNetworkBlocked()
override val connectivity: StateFlow<NetworkStatus> = callbackFlow {

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
@file:Suppress("DEPRECATION")
package io.element.android.features.networkmonitor.impl
import android.annotation.SuppressLint
import android.net.ConnectivityManager
import android.net.NetworkInfo
/**
* Helper to check if the active network in [ConnectivityManager] is blocked.
*
* This is extracted to its own class because it uses deprecated APIs (but the only ones that are reliable)
* and we don't want to suppress deprecations everywhere.
*/
class NetworkBlockedChecker(
private val connectivityManager: ConnectivityManager,
) {
// The permission is granted by the manifest, false positive
@SuppressLint("MissingPermission")
fun isNetworkBlocked(): Boolean {
// This call is deprecated, but it seems like it's the only reliable way to tell if doze has blocked network access
return connectivityManager.activeNetworkInfo?.detailedState == NetworkInfo.DetailedState.BLOCKED
}
}

View File

@@ -12,6 +12,10 @@ import io.element.android.features.networkmonitor.api.NetworkMonitor
import io.element.android.features.networkmonitor.api.NetworkStatus
import kotlinx.coroutines.flow.MutableStateFlow
class FakeNetworkMonitor(initialStatus: NetworkStatus = NetworkStatus.Connected) : NetworkMonitor {
class FakeNetworkMonitor(
initialStatus: NetworkStatus = NetworkStatus.Connected,
private val isNetworkBlockedLambda: () -> Boolean = { false },
) : NetworkMonitor {
override val connectivity = MutableStateFlow(initialStatus)
override fun isNetworkBlocked(): Boolean = isNetworkBlockedLambda()
}

View File

@@ -4,5 +4,6 @@
<item quantity="one">"%1$d τοις εκατό των συνολικών ψήφων"</item>
<item quantity="other">"%1$d τοις εκατό του συνόλου των ψήφων"</item>
</plurals>
<string name="a11y_polls_will_remove_selection">"Θα καταργήσει την προηγούμενη επιλογή"</string>
<string name="a11y_polls_winning_answer">"Αυτή είναι η νικητήρια απάντηση"</string>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_polls_winning_answer">"Esta es la respuesta ganadora"</string>
</resources>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_polls_will_remove_selection">"Önceki seçim kaldırılacak"</string>
<string name="a11y_polls_winning_answer">"Kazanan cevap"</string>
</resources>

View File

@@ -41,7 +41,7 @@ class CreatePollNode(
private var isNavigatingUp = AtomicBoolean(false)
private val presenter = presenterFactory.create(
backNavigator = {
navigateUp = {
if (isNavigatingUp.compareAndSet(false, true)) {
navigateUp()
}

View File

@@ -50,7 +50,7 @@ class CreatePollPresenter(
fun interface Factory {
fun create(
timelineMode: Timeline.Mode,
backNavigator: () -> Unit,
navigateUp: () -> Unit,
mode: CreatePollMode
): CreatePollPresenter
}

View File

@@ -5,6 +5,7 @@
<string name="screen_create_poll_anonymous_headline">"Ocultar votos"</string>
<string name="screen_create_poll_answer_hint">"Opción %1$d"</string>
<string name="screen_create_poll_cancel_confirmation_content_android">"Tus cambios no se han guardado. ¿Estás seguro de que quieres volver atrás?"</string>
<string name="screen_create_poll_delete_option_a11y">"Eliminar opción %1$s"</string>
<string name="screen_create_poll_question_desc">"Pregunta o tema"</string>
<string name="screen_create_poll_question_hint">"¿De qué trata la encuesta?"</string>
<string name="screen_create_poll_title">"Crear una Encuesta"</string>

View File

@@ -47,7 +47,7 @@ class EditDefaultNotificationSettingPresenter(
) : Presenter<EditDefaultNotificationSettingState> {
@AssistedFactory
interface Factory {
fun create(oneToOne: Boolean): EditDefaultNotificationSettingPresenter
fun create(isOneToOne: Boolean): EditDefaultNotificationSettingPresenter
}
private val collator = Collator.getInstance().apply {

View File

@@ -165,6 +165,6 @@ class PreferencesRootPresenter(
devicesManagementUrl: MutableState<String?>,
) = launch {
accountManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.Profile).getOrNull()
devicesManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.SessionsList).getOrNull()
devicesManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.DevicesList).getOrNull()
}
}

View File

@@ -10,9 +10,17 @@
<string name="screen_advanced_settings_element_call_base_url_validation_error">"Μη έγκυρη διεύθυνση URL, βεβαιώσου ότι έχεις συμπεριλάβει το πρωτόκολλο (http/https) και τη σωστή διεύθυνση."</string>
<string name="screen_advanced_settings_hide_invite_avatars_toggle_title">"Απόκρυψη εικόνων προφίλ σε αιτήματα πρόσκλησης αίθουσας"</string>
<string name="screen_advanced_settings_hide_timeline_media_toggle_title">"Απόκρυψη προεπισκοπήσεων πολυμέσων στο timeline"</string>
<string name="screen_advanced_settings_labs">"Εργαστήρια"</string>
<string name="screen_advanced_settings_media_compression_description">"Ανέβασε φωτογραφίες και βίντεο γρηγορότερα και μείωσε τη χρήση δεδομένων"</string>
<string name="screen_advanced_settings_media_compression_title">"Βελτιστοποίηση ποιότητας των μέσων"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Συντονισμός και Ασφάλεια"</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_description">"Αυτόματη βελτιστοποίηση εικόνων για ταχύτερες μεταφορτώσεις και μικρότερα μεγέθη αρχείων."</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_title">"Βελτιστοποιήστε την ποιότητα μεταφόρτωσης εικόνων"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_description">"%1$s. Πατήστε εδώ για αλλαγή."</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_high">"Υψηλή (1080p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_low">"Χαμηλή (480p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_standard">"Τυπικό (720p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_title">"Ποιότητα μεταφόρτωσης βίντεο"</string>
<string name="screen_advanced_settings_push_provider_android">"Πάροχος ειδοποιήσεων push"</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Απενεργοποίησε τον επεξεργαστή εμπλουτισμένου κειμένου για να πληκτρολογήσεις Markdown χειροκίνητα."</string>
<string name="screen_advanced_settings_send_read_receipts">"Αποδεικτικά ανάγνωσης"</string>
@@ -36,6 +44,11 @@
<string name="screen_edit_profile_error_title">"Δεν είναι δυνατή η ενημέρωση του προφίλ"</string>
<string name="screen_edit_profile_title">"Επεξεργασία προφίλ"</string>
<string name="screen_edit_profile_updating_details">"Ενημέρωση προφίλ…"</string>
<string name="screen_labs_enable_threads">"Ενεργοποίηση απαντήσεων σε νήμα"</string>
<string name="screen_labs_enable_threads_description">"Η εφαρμογή θα επανεκκινηθεί για να εφαρμοστεί αυτήν την αλλαγή."</string>
<string name="screen_labs_header_description">"Δοκιμάστε τις τελευταίες μας ιδέες που βρίσκονται σε φάση ανάπτυξης. Αυτές οι λειτουργίες δεν είναι τελικές, ενδέχεται να είναι ασταθείς ή να αλλάξουν."</string>
<string name="screen_labs_header_title">"Έχετε διάθεση για πειραματισμούς;"</string>
<string name="screen_labs_title">"Εργαστήρια"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Πρόσθετες ρυθμίσεις"</string>
<string name="screen_notification_settings_calls_label">"Κλήσεις ήχου και βίντεο"</string>
<string name="screen_notification_settings_configuration_mismatch">"Αναντιστοιχία διαμόρφωσης"</string>

View File

@@ -26,6 +26,7 @@
<string name="screen_edit_profile_error_title">"Kan profiel niet bijwerken"</string>
<string name="screen_edit_profile_title">"Profiel bewerken"</string>
<string name="screen_edit_profile_updating_details">"Profiel bijwerken…"</string>
<string name="screen_labs_enable_threads">"Gesprek antwoorden inschakelen"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Aanvullende instellingen"</string>
<string name="screen_notification_settings_calls_label">"Audio- en videogesprekken"</string>
<string name="screen_notification_settings_configuration_mismatch">"Configuratie komt niet overeen"</string>

View File

@@ -13,12 +13,24 @@
<string name="screen_advanced_settings_media_compression_description">"Fotoğraf ve videoları daha hızlı yükleyin ve veri kullanımını azaltın"</string>
<string name="screen_advanced_settings_media_compression_title">"Medya kalitesini optimize edin"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Yönetim ve Güvenlik"</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_description">"Daha hızlı yükleme ve daha küçük dosya boyutları için görselleri otomatik olarak optimize eder."</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_title">"Görsel yükleme kalitesini optimize et"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_description">"%1$s. Değiştirmek için buraya dokunun."</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_high">"Yüksek (1080p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_low">"Düşük (480p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_standard">"Standart (720p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_title">"Video yükleme kalitesi"</string>
<string name="screen_advanced_settings_push_provider_android">"Anlık bildirim sağlayıcısı"</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Markdown\'ı manuel olarak yazmak için zengin metin düzenleyicisini devre dışı bırakın."</string>
<string name="screen_advanced_settings_send_read_receipts">"Okundu bilgisi"</string>
<string name="screen_advanced_settings_send_read_receipts_description">"Kapatılırsa, okundu bilgileriniz kimseye gönderilmez. Diğer kullanıcılardan okundu bilgisi almaya devam edersiniz."</string>
<string name="screen_advanced_settings_share_presence">"Varlığı paylaşın"</string>
<string name="screen_advanced_settings_share_presence_description">"Kapatılırsa, okundu bilgisi veya yazma bildirimleri gönderemez veya alamazsınız."</string>
<string name="screen_advanced_settings_show_media_timeline_always_hide">"Her zaman gizle"</string>
<string name="screen_advanced_settings_show_media_timeline_always_show">"Her zaman göster"</string>
<string name="screen_advanced_settings_show_media_timeline_private_rooms">"Özel odalarda"</string>
<string name="screen_advanced_settings_show_media_timeline_subtitle">"Gizli bir medya, üzerine dokunularak her zaman görüntülenebilir"</string>
<string name="screen_advanced_settings_show_media_timeline_title">"Medya dosyalarını zaman çizelgesinde göster"</string>
<string name="screen_advanced_settings_view_source_description">"Zaman çizelgesinde mesaj kaynağını görüntüleme seçeneğini etkinleştirin."</string>
<string name="screen_blocked_users_empty">"Engellenen kullanıcı yok."</string>
<string name="screen_blocked_users_unblock_alert_action">"Engellemeyi kaldır"</string>
@@ -31,6 +43,10 @@
<string name="screen_edit_profile_error_title">"Profil güncellenemiyor"</string>
<string name="screen_edit_profile_title">"Profili düzenle"</string>
<string name="screen_edit_profile_updating_details">"Profil güncelleniyor…"</string>
<string name="screen_labs_enable_threads">"Konu yanıtlarını etkinleştir"</string>
<string name="screen_labs_enable_threads_description">"Bu değişikliği uygulamak için uygulama yeniden başlatılacak."</string>
<string name="screen_labs_header_description">"Geliştirme aşamasındaki en yeni fikirlerimizi deneyin. Bu özellikler henüz tamamlanmamıştır ve kararsız olabilir."</string>
<string name="screen_labs_header_title">"Labs Ortamı"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Ek ayarlar"</string>
<string name="screen_notification_settings_calls_label">"Sesli ve Görüntülü aramalar"</string>
<string name="screen_notification_settings_configuration_mismatch">"Yapılandırma uyuşmazlığı"</string>

Some files were not shown because too many files have changed in this diff Show More