Merge commit 'f6b85b8f9a0b4ce162616e79045fb015a21b27da' into feature/5004_basis_update_element

* commit 'f6b85b8f9a0b4ce162616e79045fb015a21b27da': (40 commits)
  finish version++
  version++
  changelog.d: Upgrade MatrixSDK version ([v0.27.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.1)).
  completed
  code improvement
  fix 7646
  opening the safari web view externally so that it will be able to share the cookies
  web view opened on tap + changelog
  added the cell, now I just need to implement the navigation to the web view
  completed
  Hide deactivate account if the auth property is present on the WK.
  Add changelogs
  Prevent mention crashes when room members are missing display names (objc interop)
  Prevent pill crashes when room members are missing display names (objc interop)
  Update introspect to the latest version, remove now duplicate `introspectCollectionView`
  Prepare for new sprint
  finish version++
  Add missing changelog entry.
  version++
  changelog.d: Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)).
  ...

# Conflicts:
#	Config/AppVersion.xcconfig
#	Podfile
#	Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme
#	Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift
#	Riot/Modules/Settings/SettingsViewController.m
#	Riot/target.yml
This commit is contained in:
JanNiklas Grabowski
2023-08-29 17:00:19 +02:00
43 changed files with 540 additions and 280 deletions
+36
View File
@@ -1,3 +1,39 @@
## Changes in 1.11.1 (2023-08-29)
✨ Features
- New settings cell to manage your account through MAS if the home server allows it. ([#7653](https://github.com/vector-im/element-ios/issues/7653))
🙌 Improvements
- Upgrade MatrixSDK version ([v0.27.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.1)).
🐛 Bugfixes
- Prevent mention crashes when room members are missing display names (objc interop) ([#7649](https://github.com/vector-im/element-ios/pull/7649))
- Add email UI is hidden if the 3 pid changes capability is disabled. ([#7645](https://github.com/vector-im/element-ios/issues/7645))
- You can now log out from other sessions using MAS on supported OIDC home servers. ([#7646](https://github.com/vector-im/element-ios/issues/7646))
- Deactivate account is hidden for servers with OIDC auth. ([#7648](https://github.com/vector-im/element-ios/issues/7648))
- Prevent pill crashes when room members are missing display names (objc interop) ([#7651](https://github.com/vector-im/element-ios/issues/7651))
## Changes in 1.11.0 (2023-08-15)
✨ Features
- Integrate Device Dehydration v2 through the Crypto SDK ([#7630](https://github.com/vector-im/element-ios/pull/7630))
🙌 Improvements
- Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)).
- Disable Siri, Share and Reply (from NSE) Extensions. ([#7618](https://github.com/vector-im/element-ios/issues/7618))
🐛 Bugfixes
- Fix bug in SSO URL generation that was non-compliant with the spec. ([#7639](https://github.com/vector-im/element-ios/pull/7639))
- Fix a crash when opening v11 rooms. ([#7633](https://github.com/vector-im/element-ios/issues/7633))
## Changes in 1.10.14 (2023-06-21)
🙌 Improvements
+1 -1
View File
@@ -192,7 +192,7 @@ final class BuildSettings: NSObject {
#else
/// The configuration to use for analytics. Set `isEnabled` to false to disable analytics.
static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: BuildSettings.baseBundleIdentifier.starts(with: "im.vector.app"),
host: "https://posthog.hss.element.io",
host: "https://posthog.element.io",
apiKey: "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO",
termsURL: URL(string: "https://element.io/cookie-policy")!)
#endif
+13 -1
View File
@@ -16,7 +16,7 @@ use_frameworks!
# - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI
#
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
$matrixSDKVersion = '= 0.26.12'
$matrixSDKVersion = '= 0.27.1'
# $matrixSDKVersion = :local
# $matrixSDKVersion = { :branch => 'develop'}
# $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } }
@@ -193,6 +193,18 @@ abstract_target 'RiotPods' do
import_MatrixSDK
end
# Disabled due to crypto corruption issues.
# https://github.com/vector-im/element-ios/issues/7618
# target "RiotShareExtension" do
# import_MatrixSDK
# import_MatrixKit_pods
# end
#
# target "SiriIntents" do
# import_MatrixSDK
# import_MatrixKit_pods
# end
end
post_install do |installer|
+13 -13
View File
@@ -26,7 +26,7 @@ PODS:
- GBDeviceInfo/Core (= 7.1.0)
- GBDeviceInfo/Core (7.1.0)
- GZIP (1.3.0)
- Introspect (0.1.4)
- Introspect (0.11.0)
- JitsiMeetSDKLite (8.1.2-lite):
- JitsiWebRTC (~> 111.0)
- JitsiWebRTC (111.0.2)
@@ -39,20 +39,20 @@ PODS:
- LoggerAPI (1.9.200):
- Logging (~> 1.1)
- Logging (1.4.0)
- MatrixSDK (0.26.12):
- MatrixSDK/Core (= 0.26.12)
- MatrixSDK/Core (0.26.12):
- MatrixSDK (0.27.1):
- MatrixSDK/Core (= 0.27.1)
- MatrixSDK/Core (0.27.1):
- AFNetworking (~> 4.0.0)
- GZIP (~> 1.3.0)
- libbase58 (~> 0.1.4)
- MatrixSDKCrypto (= 0.3.4)
- MatrixSDKCrypto (= 0.3.12)
- OLMKit (~> 3.2.5)
- Realm (= 10.27.0)
- SwiftyBeaver (= 1.9.5)
- MatrixSDK/JingleCallStack (0.26.12):
- MatrixSDK/JingleCallStack (0.27.1):
- JitsiMeetSDKLite (= 8.1.2-lite)
- MatrixSDK/Core
- MatrixSDKCrypto (0.3.4)
- MatrixSDKCrypto (0.3.12)
- OLMKit (3.2.12):
- OLMKit/olmc (= 3.2.12)
- OLMKit/olmcpp (= 3.2.12)
@@ -102,8 +102,8 @@ DEPENDENCIES:
- KeychainAccess (~> 4.2.2)
- KTCenterFlowLayout (~> 1.3.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixSDK (= 0.26.12)
- MatrixSDK/JingleCallStack (= 0.26.12)
- MatrixSDK (= 0.27.1)
- MatrixSDK/JingleCallStack (= 0.27.1)
- OLMKit
- PostHog (~> 2.0.0)
- ReadMoreTextView (~> 3.0.1)
@@ -177,7 +177,7 @@ SPEC CHECKSUMS:
FlowCommoniOS: ca92071ab526dc89905495a37844fd7e78d1a7f2
GBDeviceInfo: 5d62fa85bdcce3ed288d83c28789adf1173e4376
GZIP: 416858efbe66b41b206895ac6dfd5493200d95b3
Introspect: b62c4dd2063072327c21d618ef2bedc3c87bc366
Introspect: 4cc1e4c34dd016540c8d86a591c231c09dafbee3
JitsiMeetSDKLite: 895213158cf62342069a10634a41d2f1c00057f7
JitsiWebRTC: 80f62908fcf2a1160e0d14b584323fb6e6be630b
KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
@@ -187,8 +187,8 @@ SPEC CHECKSUMS:
libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75
LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d
Logging: beeb016c9c80cf77042d62e83495816847ef108b
MatrixSDK: 0af737bc461b82d0ec9edd6fdf8f70b02771ebd3
MatrixSDKCrypto: ac805c22c24f79f349cdbfa065855c73a4c81b51
MatrixSDK: f6c197ca06aab29ff69d1105965a57d277dfcd9d
MatrixSDKCrypto: 25929a40733b4ab54f659aaf6a730552a0a06504
OLMKit: da115f16582e47626616874e20f7bb92222c7a51
PostHog: 660ec6c9d80cec17b685e148f17f6785a88b597d
ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d
@@ -208,6 +208,6 @@ SPEC CHECKSUMS:
zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
PODFILE CHECKSUM: 0e7e10f516d40d9df60cb874170b91603c632118
PODFILE CHECKSUM: ce6afe3dea7ea9b073a7ad0406b2cc5615646746
COCOAPODS: 1.11.3
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1200"
version = "1.3">
LastUpgradeVersion = "1430"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
+13 -8
View File
@@ -406,8 +406,8 @@
"settings_ui_language" = "Sprache";
// Events formatter
"event_formatter_member_updates" = "%tu Änderungen der Mitgliedschaft";
"contacts_user_directory_section" = "NUTZER VERZEICHNIS";
"contacts_user_directory_offline_section" = "NUTZER VERZEICHNIS (offline)";
"contacts_user_directory_section" = "NUTZERVERZEICHNIS";
"contacts_user_directory_offline_section" = "NUTZERVERZEICHNIS (offline)";
"auth_home_server_placeholder" = "URL (z.B. https://matrix.org)";
"auth_identity_server_placeholder" = "URL (z. B. https://vector.im)";
"room_ongoing_conference_call_close" = "Schließen";
@@ -2396,12 +2396,12 @@
"room_suggestion_settings_screen_nav_title" = "Raum vorschlagen";
"room_access_space_chooser_other_spaces_section_info" = "Diese sind vermutlich Dinge, zu denen andere Admins von %@ gehören.";
"room_access_space_chooser_other_spaces_section" = "Andere Spaces oder Räume";
"room_access_settings_screen_setting_room_access" = "Lege Raumzugriff fest";
"room_access_settings_screen_upgrade_alert_upgrading" = "Raum upgraden";
"room_access_settings_screen_setting_room_access" = "Raumzutritt festlegen";
"room_access_settings_screen_upgrade_alert_upgrading" = "Raum aktualisieren";
"room_access_settings_screen_upgrade_alert_upgrade_button" = "Aktualisieren";
"room_access_settings_screen_upgrade_alert_auto_invite_switch" = "Mitglieder automatisch zu neuem Raum einladen";
"room_access_settings_screen_upgrade_alert_message" = "Jeder in %@ kann diesen Raum finden und ihm beitreten - jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern.";
"room_access_settings_screen_upgrade_alert_title" = "Raum upgraden";
"room_access_settings_screen_upgrade_alert_message" = "Jeder in %@ kann diesen Raum finden und ihm beitreten jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern.";
"room_access_settings_screen_upgrade_alert_title" = "Raum aktualisieren";
"room_access_settings_screen_edit_spaces" = "Spaces bearbeiten";
"room_access_settings_screen_upgrade_required" = "Upgrade erforderlich";
"room_access_settings_screen_message" = "Lege fest, wer %@ finden und beitreten kann.";
@@ -2461,13 +2461,13 @@
"threads_discourage_information_1" = "Dein Heimserver unterstützt aktuell keine Threads, weshalb diese Funktion unzuverlässig sein könnte. Manche Thread-Nachrichten könnten nicht zuverlässig verfügbar sein. ";
"all_chats_nothing_found_placeholder_title" = "Nichts gefunden.";
"spaces_create_subspace_title" = "Sub-Space erstellen";
"room_access_settings_screen_upgrade_alert_note" = "Bitte beachte, dass das Upgrade eine neue Version dieses Raums erstellt. Alle aktuellen Nachrichten bleiben in diesem archivierten Raum.";
"room_access_settings_screen_upgrade_alert_note" = "Bitte beachte, dass die Aktualisierung eine neue Version dieses Raums erstellt. Alle aktuellen Nachrichten bleiben in diesem archivierten Raum.";
"invite_to" = "Zu %@ einladen";
"all_chats_empty_unreads_placeholder_message" = "Hier werden deine ungelesenen Nachrichten erscheinen, wenn du welche hast.";
"all_chats_edit_layout_show_recents" = "Historie anzeigen";
"all_chats_empty_list_placeholder_title" = "Du bist auf dem neuesten Stand.";
"spaces_explore_rooms_format" = "%@ erkunden";
"room_access_settings_screen_upgrade_alert_message_no_param" = "Jeder in einem übergeordneten Space kann diesen Raum finden und ihm beitreten - jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern.";
"room_access_settings_screen_upgrade_alert_message_no_param" = "Jeder in einem übergeordneten Space kann diesen Raum finden und ihm beitreten jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern.";
"room_access_settings_screen_public_message" = "Sichtbar und zugänglich für jeden.";
"room_access_settings_screen_restricted_message" = "Sichtbar und betretbar für jeden Nutzer in einem Space.\nDu wählst, für welche Spaces dies gilt.";
"room_access_settings_screen_private_message" = "Nur sichtbar und betretbar für eingeladene Personen.";
@@ -2771,3 +2771,8 @@
"notice_display_name_changed_to" = "%@ hat den Anzeigenamen zu %@ geändert";
"poll_timeline_loading" = "Lade …";
"room_command_discard_session_description" = "Erzwingt das Verferfen der aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum";
"room_creation_user_not_found_prompt_title" = "Bestätigung";
"room_creation_user_not_found_prompt_message" = "Wir konnten kein Profil für diese Matrix-ID finden. Möchtest du dennoch eine Direktnachricht beginnen?";
"room_creation_user_not_found_prompt_invite_action" = "Dennoch DM beginnen";
"room_participants_invite_unknown_participant_prompt_to_msg" = "Wir konnten kein Profil für diese Matrix-ID finden. Möchtest du wirklich %@ nach %@ einladen?";
"room_participants_invite_anyway" = "Dennoch einladen";
+5
View File
@@ -748,6 +748,9 @@ Tap the + to start adding people.";
"settings_three_pids_management_information_part1" = "Manage which email addresses or phone numbers you can use to log in or recover your account here. Control who can find you in ";
"settings_three_pids_management_information_part2" = "Discovery";
"settings_three_pids_management_information_part3" = ".";
"settings_manage_account_title" = "Account";
"settings_manage_account_action" = "Manage account";
"settings_manage_account_description" = "Manage your account at %@";
"settings_confirm_media_size" = "Confirm size when sending";
"settings_confirm_media_size_description" = "When this is on, youll be asked to confirm what size images and videos will be sent as.";
@@ -964,6 +967,8 @@ Tap the + to start adding people.";
"manage_session_trusted" = "Trusted by you";
"manage_session_not_trusted" = "Not trusted";
"manage_session_sign_out" = "Sign out of this session";
"manage_session_redirect" = "You will be redirected to your server's authentication provider to complete sign out.";
"manage_session_redirect_error" = "Functionality currently unavailable. Please contact your homeserver admin";
"manage_session_rename" = "Rename session";
"manage_session_sign_out_other_sessions" = "Sign out of all other sessions";
// User sessions management
+1 -1
View File
@@ -1968,7 +1968,7 @@
"notice_encrypted_message" = "Ĉifrita mesaĝo";
"notice_room_related_groups" = "Grupoj rilataj al ĉi tiu ĉambro estas: %@";
"notice_room_aliases_for_dm" = "La kromnomoj estas: %@";
"notice_room_aliases" = "Kromnomoj de la ĉamrbo estas: %@";
"notice_room_aliases" = "Kromnomoj de la ĉambro estas: %@";
"notice_room_power_level_event_requirement" = "La minimumaj povniveloj rilataj al okazoj estas:";
"notice_room_power_level_acting_requirement" = "La minimuma povnivelo, kiun uzanto bezonas antaŭ agi, estas:";
"notice_room_power_level_intro_for_dm" = "La povniveloj de ĉambranoj estas:";
+5
View File
@@ -2709,3 +2709,8 @@
"room_command_change_display_name_description" = "Muudab sinu kuvatavat nime";
"notice_display_name_changed_to" = "%@ muutis oma kuvatavaks nimeks %@";
"poll_timeline_loading" = "Laadin...";
"room_creation_user_not_found_prompt_title" = "Kinnitus";
"room_creation_user_not_found_prompt_invite_action" = "Ikkagi alusta vestlust";
"room_creation_user_not_found_prompt_message" = "Sellele Matrix'i kasutajatunnuse profiili ei leidu. Kas sa ikkagi tahaksid temaga vestlust alustada?";
"room_participants_invite_unknown_participant_prompt_to_msg" = "Sellele Matrix'i kasutajatunnuse profiili ei leidu. Kas sa ikkagi tahaksid saata kutset kasutajale %@ jututuppa %@?";
"room_participants_invite_anyway" = "Kutsu siiski";
+21 -16
View File
@@ -274,7 +274,7 @@
"room_title_members" = "%@ membri";
"room_title_one_member" = "1 membro";
// Room Preview
"room_preview_invitation_format" = "Sei stato invitato ad entrare in questa stanza da %@";
"room_preview_invitation_format" = "Sei stato/a invitato/a ad entrare in questa stanza da %@";
"room_preview_subtitle" = "Questa è l'anteprima della stanza. Le interazioni sono disabilitate.";
"room_preview_unlinked_email_warning" = "Questo invito è stato spedito a %@, che non è associato a questo account. Puoi aggiungere questa email al tuo account o provare ad accedere con un account differente.";
"room_preview_try_join_an_unknown_room" = "Stai provando ad accedere a %@. Desideri entrare per partecipare alla discussione?";
@@ -457,7 +457,7 @@
"group_home_multi_members_format" = "%tu membri";
"group_home_one_room_format" = "1 stanza";
"group_home_multi_rooms_format" = "%tu stanze";
"group_invitation_format" = "%@ ti ha invitato ad unirti a questa comunità";
"group_invitation_format" = "%@ ti ha invitato/a ad unirti a questa comunità";
// Group participants
"group_participants_add_participant" = "Aggiungi membri";
"group_participants_leave_prompt_title" = "Lascia la stanza";
@@ -649,7 +649,7 @@
"sign_out_key_backup_in_progress_alert_cancel_action" = "Attendo";
"close" = "Chiudi";
"auth_forgot_password_error_no_configured_identity_server" = "Non è stato configurato alcun server d'identità: aggiungine uno per ripristinare la password dell'account Matrix.";
"auth_softlogout_signed_out" = "Sei uscito";
"auth_softlogout_signed_out" = "Sei disconnesso/a";
"auth_softlogout_sign_in" = "Accedi";
"auth_softlogout_reason" = "L'amministratore dell'Home Server (%1$@) ti ha disconnesso dal tuo account %2$@ (%3$@).";
"auth_softlogout_recover_encryption_keys" = "Accedi per recuperare le chiavi crittografiche archiviate su questo dispositivo. Le chiavi ti servono per poter leggere i tuoi messaggi cifrati su altri dispositivi.";
@@ -1164,7 +1164,7 @@
"biometrics_cant_unlocked_alert_message_login" = "Riaccedi";
"biometrics_cant_unlocked_alert_message_retry" = "Riprova";
"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Controllo di altre possibilità di verifica...";
"joined" = "Entrato";
"joined" = "Entrato/a";
"switch" = "Cambia";
"more" = "Altro";
"pin_protection_choose_pin_welcome_after_login" = "Bentornato/a.";
@@ -1832,7 +1832,7 @@
"room_error_cannot_load_timeline" = "Caricamento storico dei messaggi fallito";
"room_error_timeline_event_not_found_title" = "Caricamento della posizione nello storico fallito";
"room_error_timeline_event_not_found" = "L'applicazione ha cercato di caricare un punto specifico dello storico dei messaggi in questo canale, ma non è riuscita a trovarlo";
"room_left" = "Sei uscito dalla stanza";
"room_left" = "Sei uscito/a dalla stanza";
"room_no_power_to_create_conference_call" = "Hai bisogno del permesso per invitare a iniziare una conferenza in questo canale";
"room_no_conference_call_in_encrypted_rooms" = "Le chiamate in conferenza non sono supportate nei canali criptati";
// Reply to message
@@ -1906,7 +1906,7 @@
// Language picker
"language_picker_title" = "Scegli una lingua";
"language_picker_default_language" = "Predefinito (%@)";
"notice_room_invite" = "%@ invitato %@";
"notice_room_invite" = "%@ ha invitato %@";
"notice_room_third_party_invite" = "%@ ha invitato %@ a unirsi al canale";
"notice_room_third_party_registered_invite" = "%@ ha accettato l'invito per %@";
"notice_room_third_party_revoked_invite" = "%@ ha ritirato l'invito per %@ a unirsi al canale";
@@ -1944,7 +1944,7 @@
"login" = "Entra";
"create_account" = "Crea utente";
"membership_invite" = "Invitati";
"membership_leave" = "Uscito";
"membership_leave" = "Uscito/a";
"membership_ban" = "Espulso";
"num_members_one" = "%@ utente";
"num_members_other" = "%@ utenti";
@@ -1979,7 +1979,7 @@
"notification_settings_contain_my_user_name" = "Notifica con un suono i messaggi che contengono il mio nome utente";
"notification_settings_contain_my_display_name" = "Notifica con un suono i messaggi che contengono il mio nome completo";
"notification_settings_just_sent_to_me" = "Notifica con un suono i messaggi inviati solo a me";
"notification_settings_invite_to_a_new_room" = "Notifica quando sono invitato in un nuovo canale";
"notification_settings_invite_to_a_new_room" = "Avvisami quando sono invitato/a in una nuova stanza";
"notification_settings_people_join_leave_rooms" = "Notifica quando gli utenti entrano o escono dai canali";
"notification_settings_receive_a_call" = "Notifica quando ricevo una chiamata";
"notification_settings_suppress_from_bots" = "Sopprimi le notifiche dai bot";
@@ -2009,12 +2009,12 @@
"notice_encryption_enabled_unknown_algorithm" = "%1$@ ha attivato la crittografia end-to-end (algoritmo %2$@ non riconosciuto).";
// Notice Events with "You"
"notice_room_invite_by_you" = "Hai invitato %@";
"notice_room_invite_you" = "%@ ti ha invitato";
"notice_room_invite_you" = "%@ ti ha invitato/a";
"notice_room_third_party_invite_by_you" = "Hai mandato un invito a %@ a unirsi alla stanza";
"notice_room_third_party_registered_invite_by_you" = "Hai accettato l'invito per %@";
"notice_room_third_party_revoked_invite_by_you" = "Hai revocato l'invito per %@ a unirsi alla stanza";
"notice_room_join_by_you" = "Sei entrato";
"notice_room_leave_by_you" = "Sei uscito";
"notice_room_join_by_you" = "Sei entrato/a";
"notice_room_leave_by_you" = "Sei uscito/a";
"notice_room_reject_by_you" = "Hai rifiutato l'invito";
"notice_room_kick_by_you" = "Hai rimosso %@";
"notice_room_unban_by_you" = "Hai riammesso %@";
@@ -2049,7 +2049,7 @@
"notice_room_join_rule_public" = "%@ ha reso la stanza pubblica.";
"notice_room_join_rule_public_by_you" = "Hai reso la stanza pubblica.";
"notice_room_name_removed_for_dm" = "%@ ha rimosso il nome";
"notice_room_created_for_dm" = "%@ è entrato.";
"notice_room_created_for_dm" = "%@ è entrato/a.";
"notice_room_join_rule_invite_for_dm" = "%@ l'ha resa solo su invito.";
"notice_room_join_rule_invite_by_you_for_dm" = "L'hai resa solo su invito.";
"notice_room_join_rule_public_for_dm" = "%@ l'ha resa pubblica.";
@@ -2059,7 +2059,7 @@
"notice_room_history_visible_to_members_for_dm" = "%@ ha reso visibili i messaggi futuri a tutti i membri della stanza.";
"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ ha reso visibili i messaggi futuri a chiunque, dal momento dell'invito.";
"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ ha reso visibili i messaggi futuri a chiunque, dal momento dell'entrata.";
"room_left_for_dm" = "Sei uscito";
"room_left_for_dm" = "Sei uscito/a";
"notice_room_third_party_invite_for_dm" = "%@ ha invitato %@";
"notice_room_third_party_revoked_invite_for_dm" = "%@ ha revocato l'invito per %@";
"notice_room_name_changed_for_dm" = "%@ ha cambiato il nome in %@.";
@@ -2067,7 +2067,7 @@
"notice_room_third_party_revoked_invite_by_you_for_dm" = "Hai revocato l'invito per %@";
"notice_room_name_changed_by_you_for_dm" = "Hai cambiato il nome in %@.";
"notice_room_name_removed_by_you_for_dm" = "Hai rimosso il nome";
"notice_room_created_by_you_for_dm" = "Sei entrato.";
"notice_room_created_by_you_for_dm" = "Sei entrato/a.";
"notice_room_history_visible_to_members_by_you_for_dm" = "Hai reso visibili i messaggi futuri a tutti i membri della stanza.";
"notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Hai reso visibili i messaggi futuri a chiunque, dal momento dell'invito.";
"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Hai reso visibili i messaggi futuri a chiunque, dal momento dell'entrata.";
@@ -2096,7 +2096,7 @@
"attachment_small_with_resolution" = "Piccolo %@ (~%@)";
"attachment_size_prompt_message" = "Puoi disattivarlo nelle impostazioni.";
"attachment_size_prompt_title" = "Conferma dimensione da inviare";
"room_displayname_all_other_members_left" = "%@ (Uscito)";
"room_displayname_all_other_members_left" = "%@ (Uscito/a)";
"attachment_unsupported_preview_message" = "Questo tipo di file non è supportato.";
"attachment_unsupported_preview_title" = "Anteprima non disponibile";
"message_reply_to_sender_sent_their_location" = "ha condiviso la sua posizione.";
@@ -2273,7 +2273,7 @@
"location_sharing_live_list_item_last_update_invalid" = "Ultimo aggiornamento sconosciuto";
"location_sharing_live_list_item_last_update" = "Aggiornato %@ fa";
"location_sharing_live_list_item_sharing_expired" = "Condivisione scaduta";
"location_sharing_live_list_item_time_left" = "%@ è uscito";
"location_sharing_live_list_item_time_left" = "%@ è uscito/a";
"location_sharing_live_viewer_title" = "Posizione";
"location_sharing_live_map_callout_title" = "Condividi posizione";
"bug_report_logs_description" = "Per diagnosticare i problemi, i registri di questo client verranno inviati con questo rapporto di errore. Se preferisci inviare solo il testo soprastante, deseleziona:";
@@ -2737,3 +2737,8 @@
"room_command_change_display_name_description" = "Cambia il tuo nome visualizzato";
"notice_display_name_changed_to" = "%@ ha cambiato il suo nome visualizzato in %@";
"poll_timeline_loading" = "Caricamento...";
"room_creation_user_not_found_prompt_title" = "Conferma";
"room_creation_user_not_found_prompt_invite_action" = "Inizia il messaggio lo stesso";
"room_participants_invite_anyway" = "Invita lo stesso";
"room_participants_invite_unknown_participant_prompt_to_msg" = "Impossibile trovare profili con questo ID Matrix. Vuoi davvero invitare %@ in %@?";
"room_creation_user_not_found_prompt_message" = "Impossibile trovare profili con questo ID Matrix. Vuoi comunque iniziare un messaggio diretto?";
+88
View File
@@ -2265,3 +2265,91 @@
// Room Access Settings
"room_access_settings_screen_nav_title" = "Доступ к комнате";
"spaces_coming_soon_detail" = "Эта функция еще не реализована здесь, но она в разработке. На данный момент вы можете сделать это с помощью %@ на своем компьютере.";
// Unverified sessions
"key_verification_alert_title" = "У вас есть не подтвержденные сессии";
"key_verification_scan_qr_code_title" = "Сканируйте QR-код";
"home_context_menu_favourite" = "Любимые";
"spaces_add_space_title" = "Создать пространство";
"room_details_promote_room_title" = "Продвигать комнату";
"room_suggestion_settings_screen_title" = "Сделать комнату предлагаемой в пространстве";
"analytics_prompt_terms_link_new_user" = "здесь";
"create_room_suggest_room" = "Предложения для пользователей пространства";
"room_info_back_button_title" = "Информация о комнате";
"home_context_menu_make_dm" = "Перейти к людям";
"create_room_processing" = "Создание комнаты";
"home_context_menu_unmute" = "Снять заглушку";
// MARK: - Room invite
"room_invite_to_space_option_title" = "К %@";
"analytics_prompt_yes" = "Да, все классно";
"create_room_section_footer_type_private" = "Только приглашенные люди могут искать и вступать.";
"home_context_menu_make_room" = "Перейти к комнатам";
"create_room_suggest_room_footer" = "Предлагаемые комнаты выдвинуты для участников как лучший выбор для вступления.";
"home_context_menu_notifications" = "Уведомления";
"analytics_prompt_terms_link_upgrade" = "здесь";
"device_verification_self_verify_open_on_other_device_title" = "Откройте %@ на другом вашем устройстве";
"create_room_section_footer_type_public" = "Только приглашенные люди могут искать и вступать, не только люди из пространства.";
"home_context_menu_unfavourite" = "Удалить из любимых";
"home_context_menu_normal_priority" = "Нормальный приоритет";
"home_context_menu_mute" = "Заглушить";
"room_access_settings_screen_upgrade_alert_upgrading" = "Улучшение комнаты";
"room_access_settings_screen_upgrade_alert_upgrade_button" = "Улучшить";
"key_backup_recover_from_private_key_progress" = "%@%% закончено";
"room_access_settings_screen_upgrade_alert_title" = "Улучшить комнату";
"share_extension_low_quality_video_message" = "Отправьте в %@ для лучшего качества или отправьте в пониженном качестве.";
"settings_acceptable_use" = "Принимаемые политики пользования";
"room_suggestion_settings_screen_message" = "Предлагаемые комнаты рекламируются среди участников пространства как подходящие для присоединения.";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Вы можете прочитать все наши условия %@.";
"key_verification_alert_body" = "Перепроверьте надежность сохранности аккаунта.";
// MARK: - Launch loading
"launch_loading_generic" = "Синхронизация ваших разговоров";
"home_context_menu_mark_as_unread" = "Пометить как непрочитанное";
// MARK: Sign out warning
"sign_out" = "Выйти";
"room_command_unban_user_description" = "Разблокирует пользователя с указанным ID";
"device_verification_self_verify_open_on_other_device_information" = "Вам нужно подтвердить эту сессию для того, чтобы прочитать защищенную историю сообщений\n\nОткройте Element на одном из ваших прочих устройств и действуйте по инструкции.";
"room_command_change_room_topic_description" = "Указывает тему комнаты";
"room_access_settings_screen_upgrade_required" = "Требуется улучшение";
"key_verification_scan_qr_code_information_other_user" = "Наведите камеру на QR-код, отображенном на вашем устройстве для подтверждения ваших сессий";
// Room suggestion Settings
"room_suggestion_settings_screen_nav_title" = "Предложить комнату";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Прочитать все наши условия %@. Они подходят?";
"key_verification_scan_qr_code_information_other_session" = "Наведите камеру на QR-код, отображенном на другом вашем устройстве для подтверждения вашей сессии";
"key_verification_scan_qr_code_information_other_device" = "Наведите камеру на QR-код, отображенном на другом вашем устройстве для подтверждения этой сессии";
"create_room_type_restricted" = "Участники пространства";
"home_context_menu_low_priority" = "Низкий приоритет";
"share_invite_link_space_text" = "Хэй, вступай в это пространство на %@";
"create_room_promotion_header" = "ПРОДВИЖЕНИЕ";
"create_room_show_in_directory_footer" = "Это может помочь людям искать и вступать.";
"space_invite_not_enough_permission" = "У вас нет разрешения для приглашения людей в это пространство";
// Room commands descriptions
"room_command_change_display_name_description" = "Изменяет отображаемое имя пользователя";
"room_command_emote_description" = "Отображает действие";
"room_command_join_room_description" = "Присоединяться к комнате с указанным адресом";
"room_command_part_room_description" = "Покинуть комнату";
"room_command_invite_user_description" = "Добавляет пользователя с указанным ID в текущую комнату";
"room_command_kick_user_description" = "Удаляет пользователя с указанным ID из этой комнаты";
"room_command_ban_user_description" = "Блокирует пользователя с указанным ID";
"room_command_set_user_power_level_description" = "Назначает уровень силы пользователя";
"room_command_reset_user_power_level_description" = "Разжалует пользователя с указанным ID";
"room_command_discard_session_description" = "Принудительно отбрасывает текущий исходящий групповой сеанс в зашифрованной комнате";
"room_command_error_unknown_command" = "Некорректная или необработанная команда";
// Legacy to Rust security upgrade
"key_verification_self_verify_security_upgrade_alert_title" = "Приложение обновлено";
"key_verification_self_verify_security_upgrade_alert_message" = "Безопасное общение может быть улучшено с новым обновлением. Пожалуйста, проверьте ваше устройство.";
"device_verification_self_verify_wait_recover_secrets_additional_help" = "Нет доступа к существующей %@ сессии?";
"key_verification_scan_qr_code_information_new_session" = "Наведите камеру на QR-код, отображенном на другом вашем устройстве для подтверждения вашей новой сессии";
"create_room_section_footer_type_restricted" = "Все в пространстве могут искать и вступать.";
"launch_loading_delay_warning" = "Это может занимать больше времени.\nСпасибо за терпение.";
+5
View File
@@ -2960,3 +2960,8 @@
"room_command_change_display_name_description" = "Mení vaše zobrazované meno / prezývku";
"notice_display_name_changed_to" = "%@ zmenil/a svoje zobrazované meno na %@";
"poll_timeline_loading" = "Načítavanie…";
"room_creation_user_not_found_prompt_title" = "Potvrdenie";
"room_creation_user_not_found_prompt_invite_action" = "Spustiť konverzáciu aj tak";
"room_participants_invite_anyway" = "Napriek tomu pozvať";
"room_creation_user_not_found_prompt_message" = "Nie je možné nájsť používateľské profily pre toto Matrix ID. Chcete aj tak poslať priamu správu?";
"room_participants_invite_unknown_participant_prompt_to_msg" = "Nie je možné nájsť profily pre toto Matrix ID. Ste si istí, že chcete pozvať %@ do %@?";
+28
View File
@@ -2676,3 +2676,31 @@
"room_command_change_room_topic_description" = "Sätter rummets ämne";
"room_command_discard_session_description" = "Tvingar den aktuella utgående gruppsessionen i ett krypterat rum att kasseras";
"room_command_error_unknown_command" = "Ogiltigt eller obehandlat kommando";
// Legacy to Rust security upgrade
"key_verification_self_verify_security_upgrade_alert_title" = "App uppdaterad";
"key_verification_self_verify_security_upgrade_alert_message" = "Säker meddelandehantering har förbättrats med den senaste uppdateringen. Vänligen verifiera din enhet igen.";
"device_verification_self_verify_open_on_other_device_title" = "Öppna %@ på din andra enhet";
"device_verification_self_verify_wait_recover_secrets_additional_help" = "Kan du inte komma åt en befintlig %@-session?";
"key_verification_scan_qr_code_title" = "Skanna QR-kod";
"device_verification_self_verify_open_on_other_device_information" = "Du behöver verifiera den här sessionen för att kunna läsa din säkra meddelandehistorik.\n\nÖppna Element på en av dina andra enheter och följ instruktionerna.";
"key_verification_scan_qr_code_information_other_user" = "Rikta kameran mot QR-koden som visas på deras enhet för att verifiera deras session";
"room_waiting_other_participants_title" = "Väntar på att användare ska gå med i %@";
"pill_message_from" = "Meddelande från %@";
"pill_message_in" = "Meddelande i %@";
"notice_display_name_changed_to" = "%@ bytte sitt visningsnamn till %@";
// MARK: - Launch loading
"launch_loading_generic" = "Synkar dina konversationer";
"launch_loading_delay_warning" = "Detta kan ta lite längre tid.\nTack för ditt tålamod.";
"key_verification_scan_qr_code_information_other_device" = "Rikta kameran mot QR-koden som visas på din andra enhet för att verifiera den här sessionen";
"room_waiting_other_participants_message" = "När inbjudna användare har gått med i %@ kommer du att kunna chatta och rummet kommer att totalsträckskrypteras";
"poll_timeline_loading" = "Laddar …";
// Pills
"pill_room_fallback_display_name" = "Utrymme/rum";
"pill_message" = "Meddelande";
"key_verification_scan_qr_code_information_new_session" = "Rikta kameran mot QR-koden som visas på din andra enhet för att verifiera din nya session";
"key_verification_scan_qr_code_information_other_session" = "Rikta kameran mot QR-koden som visas på din andra enhet för att verifiera din session";
+30 -25
View File
@@ -184,7 +184,7 @@
"settings_remove_prompt_title" = "Підтвердження";
"settings_surname" = "Прізвище";
"settings_first_name" = "Ім’я";
"settings_display_name" = "Показуване ім’я";
"settings_display_name" = "Псевдонім";
"settings_profile_picture" = "Зображення профілю";
"settings_sign_out_e2e_warn" = "Ви втратите всі ваші ключі наскрізного шифрування. Це означає що ви більше не будете мати змогу читати старі повідомлення у зашифрованих кімнатах на цьому пристрої.";
"settings_sign_out_confirmation" = "Ви впевнені?";
@@ -433,7 +433,7 @@
"room_widget_permission_theme_permission" = "Ваша тема";
"room_widget_permission_user_id_permission" = "Ваш ID користувача";
"room_widget_permission_avatar_url_permission" = "URL-адреса вашого аватара";
"room_widget_permission_display_name_permission" = "Ваше показуване імʼя";
"room_widget_permission_display_name_permission" = "Ваш псевдонім";
"room_widget_permission_creator_info_title" = "Цей віджет додано:";
// Room widget permissions
@@ -1129,7 +1129,7 @@
"settings_show_url_previews" = "Попередній перегляд вебсайтів";
"settings_ui_theme_picker_message_match_system_theme" = "«Авто» застосовує тему вашого пристрою";
"settings_ui_theme_picker_message_invert_colours" = "«Авто» застосовує налаштування вашого пристрою «Інвертувати кольори»";
"settings_messages_containing_display_name" = "Моє показуване імʼя";
"settings_messages_containing_display_name" = "Мій псевдонім";
"settings_discovery_three_pid_details_title_phone_number" = "Керувати номером телефону";
"settings_discovery_three_pid_details_title_email" = "Керувати е-поштою";
"settings_discovery_error_message" = "Сталася помилка. Повторіть спробу.";
@@ -1866,7 +1866,7 @@
"login_prompt_email_token" = "Введіть ключ підтвердження електронної пошти:";
"login_email_placeholder" = "Адреса е-пошти";
"login_email_info" = "Вкажіть адресу електронної пошти, щоб інші користувачі могли легше знаходити вас на Matrix і надання вам можливості відновити пароль у майбутньому.";
"login_display_name_placeholder" = "Видиме ім'я (наприклад Bob Obson)";
"login_display_name_placeholder" = "Псевдонім (наприклад Bob Obson)";
"login_optional_field" = "необов'язково";
"login_password_placeholder" = "Пароль";
"login_user_id_placeholder" = "Ідентифікатор Matrix (наприклад @bob:matrix.org або bob)";
@@ -2113,10 +2113,10 @@
"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ робить майбутню історію повідомлень видимою всім від часу їхнього приєднання.";
"notice_room_history_visible_to_members_from_joined_point" = "%@ робить майбутню історію кімнати видимою всім учасникам кімнати від часу їхнього приєднання.";
"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ робить майбутню історію повідомлень видимою всім від часу їхнього запрошення.";
"notice_room_history_visible_to_members_from_invited_point" = "%@ робить майбутню історію кімнати видимою усім учасникам кімнати від часу їхнього запрошення.";
"notice_room_history_visible_to_members_for_dm" = "%@ робить майбутню історію повідомлень видимою усім учасникам кімнати.";
"notice_room_history_visible_to_members" = "%@ робить майбутню історію кімнати видимою усім учасникам кімнати.";
"notice_room_history_visible_to_anyone" = "%@ робить майбутню історію кімнати видимою усім.";
"notice_room_history_visible_to_members_from_invited_point" = "%@ робить майбутню історію кімнати видимою всім учасникам кімнати від часу їхнього запрошення.";
"notice_room_history_visible_to_members_for_dm" = "%@ робить майбутню історію повідомлень видимою всім учасникам кімнати.";
"notice_room_history_visible_to_members" = "%@ робить майбутню історію кімнати видимою всім учасникам кімнати.";
"notice_room_history_visible_to_anyone" = "%@ робить майбутню історію кімнати видимою всім.";
"notice_redaction" = "%@ редагує подію (id: %@)";
"notice_feedback" = "Подія відгуку (id: %@): %@";
"notice_room_related_groups" = "Групи пов'язані з цією кімнатою: %@";
@@ -2136,9 +2136,9 @@
"notice_room_name_changed_for_dm" = "%@ змінює назву на %@.";
"notice_room_name_changed" = "%@ змінює назву кімнати на %@.";
"notice_topic_changed" = "%@ змінює тему на «%@».";
"notice_display_name_removed" = "%@ вилучає своє показуване ім'я";
"notice_display_name_changed_from" = "%@ змінює своє показуване ім'я з %@ на %@";
"notice_display_name_set" = "%@ встановлює своїм показуваним іменем %@";
"notice_display_name_removed" = "%@ вилучає свій псевдонім";
"notice_display_name_changed_from" = "%@ змінює свій псевдонім з %@ на %@";
"notice_display_name_set" = "%@ встановлює своїм псевдонімом %@";
"notice_room_withdraw" = "%@ анульовує запрошення для %@";
"notice_room_kick" = "%@ вилучає %@";
"notice_room_reject" = "%@ відхиляє запрошення";
@@ -2194,7 +2194,7 @@
"notification_settings_per_room_notifications" = "Сповіщення від кожної кімнати";
"notification_settings_per_sender_notifications" = "Сповіщення про кожного відправника";
"notification_settings_contain_my_user_name" = "Сповіщати звуком про повідомлення, що містять моє ім'я користиувача";
"notification_settings_contain_my_display_name" = "Сповіщати звуком про повідомлення, що містять моє показуване ім'я";
"notification_settings_contain_my_display_name" = "Сповіщати звуком про повідомлення з моїм псевдонімом";
"notification_settings_just_sent_to_me" = "Сповіщати звуком про надіслані лише мені повідомлення";
"notification_settings_invite_to_a_new_room" = "Сповіщати про запрошення до нових кімнат";
"notification_settings_people_join_leave_rooms" = "Сповіщати, коли люди приєднуються чи виходять з кімнат";
@@ -2209,7 +2209,7 @@
"account_error_email_wrong_title" = "Неправильна адреса е-пошти";
"account_error_matrix_session_is_not_opened" = "Сеанс Matrix не відкрито";
"account_error_picture_change_failed" = "Не вдалося змінити зображення";
"account_error_display_name_change_failed" = "Не вдалося змінити показуване ім'я";
"account_error_display_name_change_failed" = "Не вдалося змінити псевдонім";
"account_msisdn_validation_error" = "Не вдалося перевірити номер телефону.";
"account_email_validation_title" = "Очікування перевірки";
"account_msisdn_validation_title" = "Очікування перевірки";
@@ -2241,12 +2241,12 @@
"e2e_passphrase_enter" = "Введіть парольну фразу";
"e2e_passphrase_empty" = "Парольна фраза не повинна бути порожньою";
"e2e_passphrase_confirm" = "Підтвердити парольну фразу";
"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими будь-кому від часу їхнього приєднання.";
"notice_room_history_visible_to_members_from_joined_point_by_you" = "Ви зробили майбутню історію кімнати видимою усім учасникам кімнати від часу їхнього приєднання.";
"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими всім від часу їхнього приєднання.";
"notice_room_history_visible_to_members_from_joined_point_by_you" = "Ви зробили майбутню історію кімнати видимою всім учасникам кімнати від часу їхнього приєднання.";
"notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими будь-кому від часу запрошення їх.";
"notice_room_history_visible_to_members_from_invited_point_by_you" = "Ви зробили майбутню історію кімнати видимою усім учасникам кімнати від часу запрошення їх.";
"notice_room_history_visible_to_members_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими усім учасникам кімнати.";
"notice_room_history_visible_to_members_by_you" = "Ви зробили майбутню історію кімнати видимою усім учасникам кімнати.";
"notice_room_history_visible_to_members_from_invited_point_by_you" = "Ви зробили майбутню історію кімнати видимою всім учасникам кімнати від часу запрошення їх.";
"notice_room_history_visible_to_members_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими всім учасникам кімнати.";
"notice_room_history_visible_to_members_by_you" = "Ви зробили майбутню історію кімнати видимою всім учасникам кімнати.";
"notice_room_history_visible_to_anyone_by_you" = "Ви зробили майбутню історію кімнати видимою будь-кому.";
"notice_room_created_by_you" = "Ви створили й сконфігурували кімнату.";
"notice_profile_change_redacted_by_you" = "Ви оновили свій профіль %@";
@@ -2261,9 +2261,9 @@
"notice_room_name_changed_by_you_for_dm" = "Ви змінили назву на %@.";
"notice_room_name_changed_by_you" = "Ви змінили назву кімнати на %@.";
"notice_topic_changed_by_you" = "Ви змінили тему на «%@».";
"notice_display_name_removed_by_you" = "Ви вилучили показуване ім'я";
"notice_display_name_changed_from_by_you" = "Ви змінили показуване ім'я з %@ на %@";
"notice_display_name_set_by_you" = "Ви вказали показуваним іменем %@";
"notice_display_name_removed_by_you" = "Ви вилучили псевдонім";
"notice_display_name_changed_from_by_you" = "Ви змінили псевдонім з %@ на %@";
"notice_display_name_set_by_you" = "Ви налаштували псевдонімом %@";
"notice_conference_call_finished" = "Голосовий груповий виклик завершено";
"notice_conference_call_started" = "Груповий голосовий виклик розпочато";
"notice_conference_call_request" = "%@ запрошує до групового голосового виклику";
@@ -2467,11 +2467,11 @@
"onboarding_avatar_accessibility_label" = "Зображення профілю";
"onboarding_avatar_message" = "Час додати обличчя до імені";
"onboarding_avatar_title" = "Додати зображення профілю";
"onboarding_display_name_max_length" = "Ваше показуване ім'я повинно складатися з менш ніж 256 символів";
"onboarding_display_name_max_length" = "Ваш псевдонім повинен складатися з менш ніж 256 символів";
"onboarding_display_name_hint" = "Ви можете змінити його пізніше";
"onboarding_display_name_placeholder" = "Показуване ім'я";
"onboarding_display_name_placeholder" = "Псевдонім";
"onboarding_display_name_message" = "Його буде показано у надісланих повідомленнях.";
"onboarding_display_name_title" = "Виберіть показуване ім'я";
"onboarding_display_name_title" = "Оберіть псевдонім";
"onboarding_personalization_skip" = "Пропустити цей крок";
"onboarding_personalization_save" = "Зберегти й продовжити";
"onboarding_congratulations_home_button" = "На головну";
@@ -2960,5 +2960,10 @@
// Room commands descriptions
"room_command_change_display_name_description" = "Змінює ваш нік";
"notice_display_name_changed_to" = "%@ змінили своє показуване ім'я на %@";
"notice_display_name_changed_to" = "%@ змінили свій псевдонім на %@";
"poll_timeline_loading" = "Завантаження...";
"room_creation_user_not_found_prompt_invite_action" = "Усе одно розпочати приватну бесіду";
"room_participants_invite_anyway" = "Усе одно запросити";
"room_creation_user_not_found_prompt_title" = "Підтвердження";
"room_creation_user_not_found_prompt_message" = "Не вдалося знайти профілі для цього Matrix ID. Усе одно хочете розпочати приватну бесіду?";
"room_participants_invite_unknown_participant_prompt_to_msg" = "Не вдалося знайти профілі для цього Matrix ID. Ви впевнені, що хочете запросити %@ до %@?";
+20
View File
@@ -3667,6 +3667,14 @@ public class VectorL10n: NSObject {
public static var manageSessionNotTrusted: String {
return VectorL10n.tr("Vector", "manage_session_not_trusted")
}
/// You will be redirected to your server's authentication provider to complete sign out.
public static var manageSessionRedirect: String {
return VectorL10n.tr("Vector", "manage_session_redirect")
}
/// Functionality currently unavailable. Please contact your homeserver admin
public static var manageSessionRedirectError: String {
return VectorL10n.tr("Vector", "manage_session_redirect_error")
}
/// Rename session
public static var manageSessionRename: String {
return VectorL10n.tr("Vector", "manage_session_rename")
@@ -7791,6 +7799,18 @@ public class VectorL10n: NSObject {
public static var settingsLinks: String {
return VectorL10n.tr("Vector", "settings_links")
}
/// Manage account
public static var settingsManageAccountAction: String {
return VectorL10n.tr("Vector", "settings_manage_account_action")
}
/// Manage your account at %@
public static func settingsManageAccountDescription(_ p1: String) -> String {
return VectorL10n.tr("Vector", "settings_manage_account_description", p1)
}
/// Account
public static var settingsManageAccountTitle: String {
return VectorL10n.tr("Vector", "settings_manage_account_title")
}
/// Mark all messages as read
public static var settingsMarkAllAsRead: String {
return VectorL10n.tr("Vector", "settings_mark_all_as_read")
@@ -53,10 +53,13 @@ final class HomeserverConfigurationBuilder: NSObject {
secureBackupSetupMethods = [.passphrase]
}
let deviceDehydrationEnabled = wellKnown?.jsonDictionary()["org.matrix.msc3814"] as? Bool == true
let encryptionConfiguration = HomeserverEncryptionConfiguration(isE2EEByDefaultEnabled: isE2EEByDefaultEnabled,
isSecureBackupRequired: isSecureBackupRequired,
secureBackupSetupMethods: secureBackupSetupMethods,
outboundKeysPreSharingMode: outboundKeysPreSharingMode)
outboundKeysPreSharingMode: outboundKeysPreSharingMode,
deviceDehydrationEnabled: deviceDehydrationEnabled)
// Jitsi configuration
let jitsiPreferredDomain: String?
@@ -23,15 +23,18 @@ final class HomeserverEncryptionConfiguration: NSObject {
let isSecureBackupRequired: Bool
let secureBackupSetupMethods: [VectorWellKnownBackupSetupMethod]
let outboundKeysPreSharingMode: MXKKeyPreSharingStrategy
let deviceDehydrationEnabled: Bool
init(isE2EEByDefaultEnabled: Bool,
isSecureBackupRequired: Bool,
secureBackupSetupMethods: [VectorWellKnownBackupSetupMethod],
outboundKeysPreSharingMode: MXKKeyPreSharingStrategy) {
outboundKeysPreSharingMode: MXKKeyPreSharingStrategy,
deviceDehydrationEnabled: Bool) {
self.isE2EEByDefaultEnabled = isE2EEByDefaultEnabled
self.isSecureBackupRequired = isSecureBackupRequired
self.outboundKeysPreSharingMode = outboundKeysPreSharingMode
self.secureBackupSetupMethods = secureBackupSetupMethods
self.deviceDehydrationEnabled = deviceDehydrationEnabled
super.init()
}
@@ -50,7 +50,7 @@ final class SSOAuthenticationService: NSObject {
var ssoRedirectPath = SSOURLConstants.Paths.redirect
if let identityProvider = identityProvider {
if let identityProvider = identityProvider, !identityProvider.isEmpty {
ssoRedirectPath.append("/\(identityProvider)")
}
@@ -305,15 +305,5 @@
*/
- (void)showAuthenticationFallBackView;
#pragma mark - Device rehydration
/**
Call this method at an appropriate time to attempt rehydrating from an existing dehydrated device
@param keyData Secret key data
@param credentials Account credentials
*/
- (void)attemptDeviceRehydrationWithKeyData:(NSData *)keyData credentials:(MXCredentials *)credentials;
@end
@@ -1513,68 +1513,6 @@
[self _createAccountWithCredentials:credentials];
}
- (void)attemptDeviceRehydrationWithKeyData:(NSData *)keyData
credentials:(MXCredentials *)credentials
{
[self attemptDeviceRehydrationWithKeyData:keyData
credentials:credentials
retry:YES];
}
- (void)attemptDeviceRehydrationWithKeyData:(NSData *)keyData
credentials:(MXCredentials *)credentials
retry:(BOOL)retry
{
MXLogDebug(@"[MXKAuthenticationViewController] attemptDeviceRehydration: starting device rehydration");
if (keyData == nil)
{
MXLogError(@"[MXKAuthenticationViewController] attemptDeviceRehydration: no key provided for device rehydration");
[self _createAccountWithCredentials:credentials];
return;
}
MXRestClient *mxRestClient = [[MXRestClient alloc] initWithCredentials:credentials andOnUnrecognizedCertificateBlock:^BOOL(NSData *certificate) {
return NO;
} andPersistentTokenDataHandler:^(void (^handler)(NSArray<MXCredentials *> *credentials, void (^completion)(BOOL didUpdateCredentials))) {
[[MXKAccountManager sharedManager] readAndWriteCredentials:handler];
} andUnauthenticatedHandler: nil];
MXWeakify(self);
[[MXKAccountManager sharedManager].dehydrationService rehydrateDeviceWithMatrixRestClient:mxRestClient dehydrationKey:keyData success:^(NSString * deviceId) {
MXStrongifyAndReturnIfNil(self);
if (deviceId)
{
MXLogDebug(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device %@ rehydrated successfully.", deviceId);
credentials.deviceId = deviceId;
}
else
{
MXLogDebug(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device rehydration has been canceled.");
}
[self _createAccountWithCredentials:credentials];
} failure:^(NSError *error) {
MXStrongifyAndReturnIfNil(self);
if (retry)
{
MXLogErrorDetails(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device rehydration failed due to error: Retrying", @{
@"error": error ?: @"unknown"
});
[self attemptDeviceRehydrationWithKeyData:keyData credentials:credentials retry:NO];
return;
}
MXLogErrorDetails(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device rehydration failed due to error", @{
@"error": error ?: @"unknown"
});
[self _createAccountWithCredentials:credentials];
}];
}
- (void)_createAccountWithCredentials:(MXCredentials *)credentials
{
MXKAccount *account = [[MXKAccount alloc] initWithCredentials:credentials];
@@ -375,13 +375,6 @@ typedef BOOL (^MXKAccountOnCertificateChange)(MXKAccount *mxAccount, NSData *cer
#pragma mark - Sync filter
/**
Call this method at an appropriate time to attempt dehydrating to a new backup device
*/
- (void)attemptDeviceDehydrationWithKeyData:(NSData *)keyData
success:(void (^)(void))success
failure:(void (^)(NSError *error))failure;
/**
Handle unauthenticated errors from the server triggering hard/soft logouts as appropriate.
*/
@@ -1727,70 +1727,6 @@ static NSArray<NSNumber*> *initialSyncSilentErrorsHTTPStatusCodes;
}];
}
- (void)attemptDeviceDehydrationWithKeyData:(NSData *)keyData
success:(void (^)(void))success
failure:(void (^)(NSError *error))failure
{
[self attemptDeviceDehydrationWithKeyData:keyData retry:YES success:success failure:failure];
}
- (void)attemptDeviceDehydrationWithKeyData:(NSData *)keyData
retry:(BOOL)retry
success:(void (^)(void))success
failure:(void (^)(NSError *error))failure
{
if (keyData == nil)
{
MXLogWarning(@"[MXKAccount] attemptDeviceDehydrationWithRetry: no key provided for device dehydration");
if (failure)
{
failure(nil);
}
return;
}
if (![mxSession.crypto.crossSigning isKindOfClass:[MXLegacyCrossSigning class]]) {
MXLogFailure(@"Device dehydratation is currently only supported by legacy cross signing, add support to all implementations");
if (failure)
{
failure(nil);
}
return;
}
MXLegacyCrossSigning *crossSigning = (MXLegacyCrossSigning *)mxSession.crypto.crossSigning;;
MXLogDebug(@"[MXKAccount] attemptDeviceDehydrationWithRetry: starting device dehydration");
[[MXKAccountManager sharedManager].dehydrationService dehydrateDeviceWithMatrixRestClient:mxRestClient crossSigning:crossSigning dehydrationKey:keyData success:^(NSString *deviceId) {
MXLogDebug(@"[MXKAccount] attemptDeviceDehydrationWithRetry: device successfully dehydrated");
if (success)
{
success();
}
} failure:^(NSError *error) {
if (retry)
{
[self attemptDeviceDehydrationWithKeyData:keyData retry:NO success:success failure:failure];
MXLogErrorDetails(@"[MXKAccount] attemptDeviceDehydrationWithRetry: device dehydration failed due to error: Retrying.", @{
@"error": error ?: @"unknown"
});
}
else
{
MXLogErrorDetails(@"[MXKAccount] attemptDeviceDehydrationWithRetry: device dehydration failed due to error", @{
@"error": error ?: @"unknown"
});
if (failure)
{
failure(error);
}
}
}];
}
- (void)onMatrixSessionStateChange
{
// Check if pause has been requested
@@ -104,8 +104,6 @@ extern NSString *const MXKAccountManagerDataType;
*/
@property (nonatomic) BOOL isPushAvailable;
@property (nonatomic, readonly) MXDehydrationService *dehydrationService;
/**
Retrieve the MXKAccounts manager.
@@ -71,7 +71,6 @@ NSString *const MXKAccountManagerDataType = @"org.matrix.kit.MXKAccountManagerDa
if (self)
{
_storeClass = [MXFileStore class];
_dehydrationService = [MXDehydrationService new];
_savingAccountsEnabled = YES;
// Migrate old account file to new format
@@ -830,11 +830,11 @@ static NSString *const kRepliedTextPattern = @"<mx-reply>.*<blockquote>.*<br>(.*
}
case MXEventTypeRoomCreate:
{
NSString *creatorId;
MXJSONModelSetString(creatorId, event.content[@"creator"]);
// Room version 11 removes `creator` in favour of `sender`.
// https://github.com/matrix-org/matrix-spec-proposals/pull/2175
// Just use the sender as it is possible to create a v11 room and spoof the `creator`.
NSString *creatorId = event.sender;
if (creatorId)
{
if ([creatorId isEqualToString:mxSession.myUserId])
{
if (isRoomDirect)
@@ -862,7 +862,6 @@ static NSString *const kRepliedTextPattern = @"<mx-reply>.*<blockquote>.*<br>(.*
{
displayText = [NSString stringWithFormat:@"%@ %@", displayText, redactedInfo];
}
}
break;
}
case MXEventTypeRoomJoinRules:
+5 -3
View File
@@ -198,11 +198,13 @@ class PillsFormatter: NSObject {
return
}
let displayName = roomMember.displayname ?? userId
pill.data?.items = [
.avatar(url: roomMember.avatarUrl,
string: roomMember.displayname,
matrixId: roomMember.userId),
.text(roomMember.displayname)
string: displayName,
matrixId: userId),
.text(displayName)
]
default:
break
@@ -207,8 +207,14 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp
}
func mention(_ member: MXRoomMember) {
self.wysiwygViewModel.setMention(url: MXTools.permalinkToUser(withUserId: member.userId),
name: member.displayname,
guard let userId = member.userId else {
return
}
let displayName = member.displayname ?? userId
self.wysiwygViewModel.setMention(url: MXTools.permalinkToUser(withUserId: userId),
name: displayName,
mentionType: .user)
}
@@ -35,9 +35,9 @@ final class SecretsRecoveryWithKeyCoordinator: SecretsRecoveryWithKeyCoordinator
// MARK: - Setup
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool) {
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool, dehydrationService: DehydrationService?) {
let secretsRecoveryWithKeyViewModel = SecretsRecoveryWithKeyViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal)
let secretsRecoveryWithKeyViewModel = SecretsRecoveryWithKeyViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal, dehydrationService: dehydrationService)
let secretsRecoveryWithKeyViewController = SecretsRecoveryWithKeyViewController.instantiate(with: secretsRecoveryWithKeyViewModel, cancellable: cancellable)
self.secretsRecoveryWithKeyViewController = secretsRecoveryWithKeyViewController
self.secretsRecoveryWithKeyViewModel = secretsRecoveryWithKeyViewModel
@@ -24,6 +24,8 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType
private let recoveryService: MXRecoveryService
private let dehydrationService: DehydrationService?
// MARK: Public
let recoveryGoal: SecretsRecoveryGoal
@@ -39,8 +41,9 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType
// MARK: - Setup
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) {
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, dehydrationService: DehydrationService?) {
self.recoveryService = recoveryService
self.dehydrationService = dehydrationService
self.recoveryGoal = recoveryGoal
}
@@ -83,6 +86,10 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType
}
self.update(viewState: .loaded)
self.coordinatorDelegate?.secretsRecoveryWithKeyViewModelDidRecover(self)
Task {
await self.dehydrationService?.runDeviceDehydrationFlow(privateKeyData: privateKey)
}
}, failure: { [weak self] error in
guard let self = self else {
return
@@ -35,8 +35,8 @@ final class SecretsRecoveryWithPassphraseCoordinator: SecretsRecoveryWithPassphr
// MARK: - Setup
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool) {
let secretsRecoveryWithPassphraseViewModel = SecretsRecoveryWithPassphraseViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal)
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool, dehydrationService: DehydrationService?) {
let secretsRecoveryWithPassphraseViewModel = SecretsRecoveryWithPassphraseViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal, dehydrationService: dehydrationService)
let secretsRecoveryWithPassphraseViewController = SecretsRecoveryWithPassphraseViewController.instantiate(with: secretsRecoveryWithPassphraseViewModel, cancellable: cancellable)
self.secretsRecoveryWithPassphraseViewController = secretsRecoveryWithPassphraseViewController
self.secretsRecoveryWithPassphraseViewModel = secretsRecoveryWithPassphraseViewModel
@@ -24,6 +24,8 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras
private let recoveryService: MXRecoveryService
private let dehydrationService: DehydrationService?
// MARK: Public
let recoveryGoal: SecretsRecoveryGoal
@@ -39,8 +41,9 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras
// MARK: - Setup
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) {
init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, dehydrationService: DehydrationService?) {
self.recoveryService = recoveryService
self.dehydrationService = dehydrationService
self.recoveryGoal = recoveryGoal
}
@@ -103,6 +106,10 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras
}
self.update(viewState: .loaded)
self.coordinatorDelegate?.secretsRecoveryWithPassphraseViewModelDidRecover(self)
Task {
await self.dehydrationService?.runDeviceDehydrationFlow(privateKeyData: privateKey)
}
}, failure: { [weak self] error in
guard let self = self else {
return
@@ -86,14 +86,28 @@ final class SecretsRecoveryCoordinator: SecretsRecoveryCoordinatorType {
// MARK: - Private
private var dehydrationService: DehydrationService? {
if self.session.vc_homeserverConfiguration().encryption.deviceDehydrationEnabled {
return self.session.crypto.dehydrationService
}
return nil
}
private func createRecoverFromKeyCoordinator() -> SecretsRecoveryWithKeyCoordinator {
let coordinator = SecretsRecoveryWithKeyCoordinator(recoveryService: self.session.crypto.recoveryService, recoveryGoal: self.recoveryGoal, cancellable: self.cancellable)
let coordinator = SecretsRecoveryWithKeyCoordinator(recoveryService: self.session.crypto.recoveryService,
recoveryGoal: self.recoveryGoal,
cancellable: self.cancellable,
dehydrationService: dehydrationService)
coordinator.delegate = self
return coordinator
}
private func createRecoverFromPassphraseCoordinator() -> SecretsRecoveryWithPassphraseCoordinator {
let coordinator = SecretsRecoveryWithPassphraseCoordinator(recoveryService: self.session.crypto.recoveryService, recoveryGoal: self.recoveryGoal, cancellable: self.cancellable)
let coordinator = SecretsRecoveryWithPassphraseCoordinator(recoveryService: self.session.crypto.recoveryService,
recoveryGoal: self.recoveryGoal,
cancellable: self.cancellable,
dehydrationService: dehydrationService)
coordinator.delegate = self
return coordinator
}
@@ -42,8 +42,13 @@ final class SecretsSetupRecoveryKeyCoordinator: SecretsSetupRecoveryKeyCoordinat
passphrase: String?,
passphraseOnly: Bool,
allowOverwrite: Bool = false,
cancellable: Bool) {
let secretsSetupRecoveryKeyViewModel = SecretsSetupRecoveryKeyViewModel(recoveryService: recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly, allowOverwrite: allowOverwrite)
cancellable: Bool,
dehydrationService: DehydrationService?) {
let secretsSetupRecoveryKeyViewModel = SecretsSetupRecoveryKeyViewModel(recoveryService: recoveryService,
passphrase: passphrase,
passphraseOnly: passphraseOnly,
allowOverwrite: allowOverwrite,
dehydrationService: dehydrationService)
let secretsSetupRecoveryKeyViewController = SecretsSetupRecoveryKeyViewController.instantiate(with: secretsSetupRecoveryKeyViewModel, cancellable: cancellable)
self.secretsSetupRecoveryKeyViewModel = secretsSetupRecoveryKeyViewModel
self.secretsSetupRecoveryKeyViewController = secretsSetupRecoveryKeyViewController
@@ -28,6 +28,7 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy
private let passphrase: String?
private let passphraseOnly: Bool
private let allowOverwrite: Bool
private let dehydrationService: DehydrationService?
// MARK: Public
@@ -36,11 +37,12 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy
// MARK: - Setup
init(recoveryService: MXRecoveryService, passphrase: String?, passphraseOnly: Bool, allowOverwrite: Bool = false) {
init(recoveryService: MXRecoveryService, passphrase: String?, passphraseOnly: Bool, allowOverwrite: Bool = false, dehydrationService: DehydrationService?) {
self.recoveryService = recoveryService
self.passphrase = passphrase
self.passphraseOnly = passphraseOnly
self.allowOverwrite = allowOverwrite
self.dehydrationService = dehydrationService
}
// MARK: - Public
@@ -76,6 +78,10 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy
self.recoveryService.createRecovery(forSecrets: nil, withPassphrase: self.passphrase, createServicesBackups: true, success: { secretStorageKeyCreationInfo in
self.update(viewState: .recoveryCreated(secretStorageKeyCreationInfo.recoveryKey))
Task {
await self.dehydrationService?.runDeviceDehydrationFlow(privateKeyData: secretStorageKeyCreationInfo.privateKey)
}
}, failure: { error in
self.update(viewState: .error(error))
})
@@ -105,8 +105,21 @@ final class SecureBackupSetupCoordinator: SecureBackupSetupCoordinatorType {
return introViewController
}
private var dehydrationService: DehydrationService? {
if self.session.vc_homeserverConfiguration().encryption.deviceDehydrationEnabled {
return self.session.crypto.dehydrationService
}
return nil
}
private func showSetupKey(passphraseOnly: Bool, passphrase: String? = nil) {
let coordinator = SecretsSetupRecoveryKeyCoordinator(recoveryService: self.recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly, allowOverwrite: allowOverwrite, cancellable: self.cancellable)
let coordinator = SecretsSetupRecoveryKeyCoordinator(recoveryService: self.recoveryService,
passphrase: passphrase,
passphraseOnly: passphraseOnly,
allowOverwrite: allowOverwrite,
cancellable: self.cancellable,
dehydrationService: dehydrationService)
coordinator.delegate = self
coordinator.start()
@@ -676,6 +676,52 @@ enum {
}
- (void)removeDevice
{
MXWellKnownAuthentication *authentication = self.mainSession.homeserverWellknown.authentication;
if (authentication)
{
NSURL *logoutURL = [authentication getLogoutDeviceURLFromID:device.deviceId];
if (logoutURL)
{
[self removeDeviceRedirectWithURL:logoutURL];
}
else
{
[self showRemoveDeviceRedirectError];
}
}
else
{
[self removeDeviceThroughAPI];
}
}
-(void) removeDeviceRedirectWithURL: (NSURL * _Nonnull) url
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle: [VectorL10n manageSessionRedirect] message: nil preferredStyle:UIAlertControllerStyleAlert];
__weak typeof(self) weakSelf = self;
UIAlertAction *action = [UIAlertAction actionWithTitle:[VectorL10n ok]
style:UIAlertActionStyleDefault
handler: ^(UIAlertAction * action) {
[UIApplication.sharedApplication openURL:url options:@{} completionHandler:^(BOOL success) {
if (success && weakSelf)
{
[weakSelf withdrawViewControllerAnimated:YES completion:nil];
}
}];
}];
[alert addAction: action];
[self presentViewController:alert animated:YES completion:nil];
}
-(void) showRemoveDeviceRedirectError
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle: [VectorL10n manageSessionRedirectError] message: nil preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
}
-(void) removeDeviceThroughAPI
{
[self startActivityIndicator];
self.view.userInteractionEnabled = NO;
+52 -3
View File
@@ -55,6 +55,7 @@ typedef NS_ENUM(NSUInteger, SECTION_TAG)
SECTION_TAG_USER_SETTINGS,
SECTION_TAG_NEW_FEATURES,
SECTION_TAG_LOCATION_SHARING,
SECTION_TAG_ACCOUNT,
SECTION_TAG_SENDING_MEDIA,
SECTION_TAG_LINKS,
SECTION_TAG_SECURITY,
@@ -252,6 +253,11 @@ enum
OUTDATED_WARNING = 0
};
typedef NS_ENUM(NSUInteger, ACCOUNT)
{
ACCOUNT_MANAGE_INDEX = 0,
};
typedef void (^blockSettingsViewController_onReadyToDestroy)(void);
#pragma mark - SettingsViewController
@@ -466,7 +472,11 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
[sectionUserSettings addRowWithTag: USER_SETTINGS_PHONENUMBERS_OFFSET + index];
}
}
if (BWIBuildSettings.shared.settingsScreenAllowAddingEmailThreepids)
if (BWIBuildSettings.shared.settingsScreenAllowAddingEmailThreepids &&
BuildSettings.settingsScreenAllowAddingEmailThreepids &&
// If the threePidChanges is nil we assume the capability to be true
(!self.mainSession.homeserverCapabilities.threePidChanges ||
self.mainSession.homeserverCapabilities.threePidChanges.enabled))
{
[sectionUserSettings addRowWithTag:USER_SETTINGS_ADD_EMAIL_INDEX];
}
@@ -493,7 +503,18 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
[tmpSections addObject:sectionNewFeatures];
}
if (BWIBuildSettings.shared.settingsScreenShowConfirmMediaSize)
NSString *manageAccountURL = self.mainSession.homeserverWellknown.authentication.account;
if (manageAccountURL)
{
Section *account = [Section sectionWithTag: SECTION_TAG_ACCOUNT];
[account addRowWithTag:ACCOUNT_MANAGE_INDEX];
account.headerTitle = [VectorL10n settingsManageAccountTitle];
account.footerTitle = [VectorL10n settingsManageAccountDescription:manageAccountURL];
[tmpSections addObject:account];
}
if (BWIBuildSettings.shared.settingsScreenShowConfirmMediaSize &&
BuildSettings.settingsScreenShowConfirmMediaSize)
{
Section *sectionMedia = [Section sectionWithTag:SECTION_TAG_SENDING_MEDIA];
[sectionMedia addRowWithTag:SENDING_MEDIA_CONFIRM_SIZE];
@@ -798,7 +819,8 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
}
}
if (BWIBuildSettings.shared.settingsScreenAllowDeactivatingAccount)
if (BWIBuildSettings.shared.settingsScreenAllowDeactivatingAccount &&
BuildSettings.settingsScreenAllowDeactivatingAccount && !self.mainSession.homeserverWellknown.authentication)
{
Section *sectionDeactivate = [Section sectionWithTag:SECTION_TAG_DEACTIVATE_ACCOUNT];
[sectionDeactivate addRowWithTag:0];
@@ -3113,6 +3135,17 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
cell = showSettingsBtnCell;
}
}
else if (section == SECTION_TAG_ACCOUNT)
{
switch (row)
{
case ACCOUNT_MANAGE_INDEX:
cell = [self getDefaultTableViewCell:tableView];
cell.textLabel.text = [VectorL10n settingsManageAccountAction];
[cell vc_setAccessoryDisclosureIndicatorWithCurrentTheme];
break;
}
}
return cell;
}
@@ -3497,6 +3530,14 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
[self pushViewController:webViewViewController];
}
}
else if (section == SECTION_TAG_ACCOUNT)
{
switch(row) {
case ACCOUNT_MANAGE_INDEX:
[self onManageAccountTap];
break;
}
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
@@ -4435,6 +4476,14 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
}
}
- (void)onManageAccountTap
{
NSURL *url = [NSURL URLWithString: self.mainSession.homeserverWellknown.authentication.account];
if (url) {
[UIApplication.sharedApplication openURL:url options:@{} completionHandler:nil];
}
}
- (void)showThemePicker
{
__weak typeof(self) weakSelf = self;
+1 -1
View File
@@ -44,7 +44,7 @@
#import "ContactDetailsViewController.h"
#import "RoomInputToolbarView.h"
#import "NSArray+Element.h"
#import "ShareItemSender.h"
#import "ShareItemSenderProtocol.h"
#import "Contact.h"
#import "RoomTimelineCellProvider.h"
#import "PlainRoomTimelineCellProvider.h"
+4 -2
View File
@@ -34,8 +34,10 @@ targets:
platform: iOS
dependencies:
- target: RiotShareExtension
# - target: SiriIntents
# Disabled due to crypto corruption issues.
# https://github.com/vector-im/element-ios/issues/7618
# - target: RiotShareExtension
# - target: SiriIntents // BWI: disabled
- target: RiotNSE
- target: BroadcastUploadExtension
- target: DesignKit
+3 -1
View File
@@ -994,7 +994,9 @@ class NotificationService: UNNotificationServiceExtension {
return Constants.toBeRemovedNotificationCategoryIdentifier
}
return "QUICK_REPLY"
// Don't return QUICK_REPLY here as there is an issue
// with crypto corruption when sending from extensions.
return nil
}
/// Attempts to send trigger a VoIP push for the given event
@@ -49,10 +49,4 @@ extension View {
func listBackgroundColor(_ color: Color) -> some View {
modifier(ListBackgroundModifier(color: color))
}
/// Finds a `UICollectionView` from a `SwiftUI.List`, or `SwiftUI.List` child.
/// Stop gap until https://github.com/siteline/SwiftUI-Introspect/pull/169
func introspectCollectionView(customize: @escaping (UICollectionView) -> Void) -> some View {
introspect(selector: TargetViewSelector.ancestorOrSiblingContaining, customize: customize)
}
}
@@ -120,11 +120,7 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable {
case let .renameSession(sessionInfo):
self.showRenameSessionScreen(for: sessionInfo)
case let .logoutOfSession(sessionInfo):
if sessionInfo.isCurrent {
self.showLogoutConfirmationForCurrentSession()
} else {
self.showLogoutConfirmation(for: [sessionInfo])
}
self.handleLogoutOfSession(sessionInfo: sessionInfo)
case let .showSessionStateInfo(sessionInfo):
self.showInfoSheet(parameters: .init(userSessionInfo: sessionInfo, parentSize: self.toPresentable().view.bounds.size))
}
@@ -132,6 +128,22 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable {
pushScreen(with: coordinator)
}
private func handleLogoutOfSession(sessionInfo: UserSessionInfo) {
if sessionInfo.isCurrent {
self.showLogoutConfirmationForCurrentSession()
} else {
if let authentication = self.parameters.session.homeserverWellknown.authentication {
if let logoutURL = authentication.getLogoutDeviceURL(fromID: sessionInfo.id) {
self.openDeviceLogoutRedirectURL(logoutURL)
} else {
self.showDeviceLogoutRedirectError()
}
} else {
self.showLogoutConfirmation(for: [sessionInfo])
}
}
}
/// Shows the QR login screen.
private func openQRLoginScreen() {
let service = QRLoginService(client: parameters.session.matrixRestClient,
@@ -182,6 +194,26 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable {
return UserOtherSessionsCoordinator(parameters: parameters)
}
private func openDeviceLogoutRedirectURL(_ url: URL) {
let alert = UIAlertController(title: VectorL10n.manageSessionRedirect, message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: VectorL10n.ok, style: .default) { [weak self] _ in
UIApplication.shared.open(url) { [weak self] success in
guard success else {
return
}
self?.popToSessionsOverview()
}
})
alert.popoverPresentationController?.sourceView = toPresentable().view
navigationRouter.present(alert, animated: true)
}
private func showDeviceLogoutRedirectError() {
let alert = UIAlertController(title: VectorL10n.manageSessionRedirectError, message: nil, preferredStyle: .alert)
alert.popoverPresentationController?.sourceView = toPresentable().view
navigationRouter.present(alert, animated: true)
}
/// Shows a confirmation dialog to the user to sign out of a session.
private func showLogoutConfirmation(for sessionInfos: [UserSessionInfo]) {
// Use a UIAlertController as we don't have confirmationDialog in SwiftUI on iOS 14.
+4 -2
View File
@@ -32,8 +32,6 @@ include:
- path: Riot/target-bum-beta.yml
- path: Riot/target-bum-open.yml
- path: RiotTests/target.yml
- path: RiotShareExtension/target.yml
- path: SiriIntents/target.yml
- path: RiotNSE/target.yml
- path: BroadcastUploadExtension/target.yml
- path: DesignKit/target.yml
@@ -42,6 +40,10 @@ include:
- path: RiotSwiftUI/targetUITests.yml
- path: CommonKit/target.yml
- path: CommonKit/targetUnitTests.yml
# Disabled due to crypto corruption issues.
# https://github.com/vector-im/element-ios/issues/7618
# - path: RiotShareExtension/target.yml
# - path: SiriIntents/target.yml
packages:
AnalyticsEvents: