diff --git a/CHANGES.md b/CHANGES.md index 9e42b90fc..f7dc561ab 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,38 @@ +## Changes in 1.9.8 (2022-10-04) + +🙌 Improvements + +- UserSessions: Extended device information (PSG-772). ([#6766](https://github.com/vector-im/element-ios/pull/6766)) +- Settings: Add labs flags for new session manager (PSG-792, PSG-799). ([#6780](https://github.com/vector-im/element-ios/pull/6780)) +- User session details: Include browser version for web sessions (PSG-761). ([#6788](https://github.com/vector-im/element-ios/pull/6788)) +- Upgrade MatrixSDK version ([v0.24.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.0)). +- Include concrete device model in user agent (PSG-754) ([#6742](https://github.com/vector-im/element-ios/issues/6742)) +- CryptoV2: Manual device verification ([#6781](https://github.com/vector-im/element-ios/issues/6781)) +- User sessions: Add support for MSC3881 ([#6787](https://github.com/vector-im/element-ios/issues/6787)) + +🐛 Bugfixes + +- Voiceover: Add labels to User Menu and My Spaces buttons on the All Chats view. ([#6580](https://github.com/vector-im/element-ios/issues/6580)) +- Media: Avoid redundant reloads on media viewer. ([#6717](https://github.com/vector-im/element-ios/issues/6717)) +- Pass country code into MSISDN requests ([#6723](https://github.com/vector-im/element-ios/issues/6723)) +- Fix render of links with both characters requiring percent encoding and markdown-like syntax ([#6748](https://github.com/vector-im/element-ios/issues/6748)) +- Fix crash when scrolling chat list ([#6749](https://github.com/vector-im/element-ios/issues/6749)) +- App Layout: Unable to send message after filtering for room ([#6755](https://github.com/vector-im/element-ios/issues/6755)) +- App Layout: Fix missing toolbar for users with no rooms. ([#6796](https://github.com/vector-im/element-ios/pull/6796)) +- Fix code block background colour ([#6778](https://github.com/vector-im/element-ios/issues/6778)) +- Fix navigation bars visibility on iOS 16. ([#6799](https://github.com/vector-im/element-ios/pull/6799)) + +🧱 Build + +- Fix crash when scrolling chat list ([#6757](https://github.com/vector-im/element-ios/pull/6757)) + +🚧 In development 🚧 + +- Device manager: User session details screen. ([#6693](https://github.com/vector-im/element-ios/issues/6693)) +- Device manager: Session overview screen. ([#6753](https://github.com/vector-im/element-ios/issues/6753)) +- Device Manager: Link current session to session overview. ([#6770](https://github.com/vector-im/element-ios/issues/6770)) + + ## Changes in 1.9.7 (2022-09-28) 🙌 Improvements diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index 4cde3544a..ec3d81ec8 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.9.8 -CURRENT_PROJECT_VERSION = 1.9.8 +MARKETING_VERSION = 1.9.9 +CURRENT_PROJECT_VERSION = 1.9.9 diff --git a/Podfile b/Podfile index ff30fcb7b..e74068a7e 100644 --- a/Podfile +++ b/Podfile @@ -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.23.19' +$matrixSDKVersion = '= 0.24.0' # $matrixSDKVersion = :local # $matrixSDKVersion = { :branch => 'develop'} # $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } } diff --git a/Podfile.lock b/Podfile.lock index 0b53f1a91..0f0faf7a8 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -56,9 +56,9 @@ PODS: - LoggerAPI (1.9.200): - Logging (~> 1.1) - Logging (1.4.0) - - MatrixSDK (0.23.19): - - MatrixSDK/Core (= 0.23.19) - - MatrixSDK/Core (0.23.19): + - MatrixSDK (0.24.0): + - MatrixSDK/Core (= 0.24.0) + - MatrixSDK/Core (0.24.0): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) @@ -66,9 +66,9 @@ PODS: - OLMKit (~> 3.2.5) - Realm (= 10.27.0) - SwiftyBeaver (= 1.9.5) - - MatrixSDK/CryptoSDK (0.23.19): + - MatrixSDK/CryptoSDK (0.24.0): - MatrixSDKCrypto (= 0.1.0) - - MatrixSDK/JingleCallStack (0.23.19): + - MatrixSDK/JingleCallStack (0.24.0): - JitsiMeetSDK (= 5.0.2) - MatrixSDK/Core - MatrixSDKCrypto (0.1.0) @@ -123,8 +123,8 @@ DEPENDENCIES: - KeychainAccess (~> 4.2.2) - KTCenterFlowLayout (~> 1.3.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.23.19) - - MatrixSDK/JingleCallStack (= 0.23.19) + - MatrixSDK (= 0.24.0) + - MatrixSDK/JingleCallStack (= 0.24.0) - OLMKit - PostHog (~> 1.4.4) - ReadMoreTextView (~> 3.0.1) @@ -221,7 +221,7 @@ SPEC CHECKSUMS: libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d Logging: beeb016c9c80cf77042d62e83495816847ef108b - MatrixSDK: a60a00635006c539dce654253e8f0544ea996111 + MatrixSDK: 196ae670143c5169ca9d02ff4d4a87f1e4dd8f08 MatrixSDKCrypto: 4b9146d5ef484550341be056a164c6930038028e OLMKit: da115f16582e47626616874e20f7bb92222c7a51 PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f @@ -241,6 +241,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 400334cf1580361b831a632dcc025f2029e56b6e +PODFILE CHECKSUM: f8957c6eb2617c1f8a9174c1c5eac5f2bd67a599 COCOAPODS: 1.11.2 diff --git a/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme b/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme index 6eba9ae71..012a5a109 100644 --- a/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme +++ b/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme @@ -29,7 +29,8 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" disableMainThreadChecker = "YES" - onlyGenerateCoverageForSpecifiedTargets = "NO"> + codeCoverageEnabled = "YES" + onlyGenerateCoverageForSpecifiedTargets = "YES"> + + + + Location and select Always"; "user_session_details_device_ip_address" = "IP address"; "user_session_details_device_ip_location" = "IP location"; "user_session_details_device_model" = "Model"; +"user_session_details_device_browser" = "Browser"; "user_session_details_device_os" = "Operating System"; "user_session_details_application_name" = "Name"; "user_session_details_application_version" = "Version"; @@ -2731,12 +2729,9 @@ To enable access, tap Settings> Location and select Always"; "user_id_title" = "User ID:"; "offline" = "offline"; "unsent" = "Unsent"; -"error" = "Error"; "error_common_message" = "An error occured. Please try again later."; "not_supported_yet" = "Not supported yet"; "default" = "default"; -"private" = "Private"; -"public" = "Public"; "power_level" = "Power Level"; "network_error_not_reachable" = "Please check your network connectivity"; "user_id_placeholder" = "ex: @bob:homeserver"; diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index 579b52229..d84210c12 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -2430,10 +2430,32 @@ "all_chats_empty_unreads_placeholder_message" = "Kui sul on lugemata sõnumeid, siis nad on siit leitavad."; "all_chats_empty_list_placeholder_title" = "Ei tea... kõik vist on nüüd tehtud."; "all_chats_empty_view_information" = "Paljude võimalustega turvaline suhtlusrakendus sõprade, kogukondade ja tiimide jaoks. Alustamiseks loo mõni uus vestlus või liitu olemasoleva jututoaga."; -"all_chats_empty_space_information" = "Kogukonnad on võimalus jututubade ja inimeste ühendamiseks. Kasutades all vasakul olevat nuppu lisa mõni olemasolev jututuba või loo uus."; +"all_chats_empty_space_information" = "Kogukonnad on võimalus jututubade ja inimeste ühendamiseks. Kasutades all paremal olevat nuppu lisa mõni olemasolev jututuba või loo uus."; "all_chats_empty_view_title" = "%@\ntundub olema tühjavõitu."; "spaces_explore_rooms_format" = "Uuri kogukonda: %@"; // User sessions management "user_sessions_settings" = "Halda sessioone"; "invite_to" = "Saada kutse siia: %@"; +"device_name_unknown" = "Tundmatu klientrakendus"; +"device_name_mobile" = "%@ Mobile"; +"device_name_web" = "%@ Web"; +"device_name_desktop" = "%@ Desktop"; +"user_session_item_details" = "%@ · Viimati kasutusel %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Turvalise sõnumivahetuse nimel palun verifitseeri oma praegune sessioon."; +"user_session_verified_additional_info" = "Sinu praegune sessioon on valmis turvaliseks sõnumivahetuseks."; +"user_session_learn_more" = "Loe lisateavet"; +"user_session_view_details" = "Vaata lisateavet"; +"user_session_verify_action" = "Verifitseeri sessioon"; +"user_session_unverified_short" = "Verifitseerimata"; +"user_session_verified_short" = "Verifitseeritud"; +"user_session_unverified" = "Verifitseerimata sessioon"; +"user_session_verified" = "Verifitseeritud sessioon"; +"user_sessions_overview_current_session_section_title" = "PRAEGUNE SESSIOON"; +"user_sessions_overview_other_sessions_section_info" = "Parima turvalisuse nimel verifitseeri kõik oma sessioonid ning logi välja neist, mida sa enam ei kasuta."; +"user_sessions_overview_other_sessions_section_title" = "MUUD SESSIOONID"; +"settings_labs_enable_new_app_layout" = "Rakenduse uus paigutus"; +"room_first_message_placeholder" = "Saada oma esimene sõnum…"; diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index ee4805a2d..87b74c5bb 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -2485,3 +2485,25 @@ // User sessions management "user_sessions_settings" = "Munkamenetek kezelése"; "invite_to" = "Meghívó ide: %@"; +"device_name_unknown" = "Ismeretlen kliens"; +"device_name_mobile" = "%@ Mobil"; +"device_name_desktop" = "%@ Alkalmazás"; +"device_name_web" = "%@ Web"; +"user_session_item_details" = "%@ · Utolsó aktivitás %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Az aktuális munkamenet készen áll a biztonságos üzenetküldésre."; +"user_session_verified_additional_info" = "Az aktuális munkamenet készen áll a biztonságos üzenetküldésre."; +"user_session_learn_more" = "Tudj meg többet"; +"user_session_view_details" = "Részletek megtekintése"; +"user_session_verify_action" = "Munkamenet hitelesítése"; +"user_session_unverified_short" = "Ellenőrizetlen"; +"user_session_verified_short" = "Hitelesített"; +"user_session_unverified" = "Ellenőrizetlen munkamenet"; +"user_session_verified" = "Ellenőrzött munkamenet"; +"user_sessions_overview_current_session_section_title" = "JELENLEGI MUNKAMENET"; +"user_sessions_overview_other_sessions_section_info" = "A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz."; +"user_sessions_overview_other_sessions_section_title" = "TOVÁBBI MUNKAMENETEK"; +"settings_labs_enable_new_app_layout" = "Új alkalmazás kinézet"; +"room_first_message_placeholder" = "Küld el az első üzenetedet…"; diff --git a/Riot/Assets/id.lproj/Vector.strings b/Riot/Assets/id.lproj/Vector.strings index 1bf9d6fa1..d698f6115 100644 --- a/Riot/Assets/id.lproj/Vector.strings +++ b/Riot/Assets/id.lproj/Vector.strings @@ -2692,3 +2692,25 @@ // User sessions management "user_sessions_settings" = "Kelola sesi"; "invite_to" = "Undang ke %@"; +"device_name_unknown" = "Klien tidak diketahui"; +"device_name_mobile" = "%@ Ponsel"; +"device_name_web" = "%@ Web"; +"device_name_desktop" = "%@ Desktop"; +"user_session_item_details" = "%@ · Aktivitas terakhir %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Verifikasi sesi Anda saat ini untuk perpesanan aman yang baik."; +"user_session_verified_additional_info" = "Sesi Anda saat ini siap untuk perpesanan aman."; +"user_session_learn_more" = "Pelajari lebih lanjut"; +"user_session_view_details" = "Tampilkan detail"; +"user_session_verify_action" = "Verifikasi sesi"; +"user_session_unverified_short" = "Belum diverifikasi"; +"user_session_verified_short" = "Terverifikasi"; +"user_session_unverified" = "Sesi belum diverifikasi"; +"user_session_verified" = "Sesi terverifikasi"; +"user_sessions_overview_current_session_section_title" = "SESI SAAT INI"; +"user_sessions_overview_other_sessions_section_info" = "Untuk keamanan yang terbaik, verifikasi sesi Anda dan keluarkan dari sesi yang Anda tidak kenal atau tidak digunakan lagi."; +"user_sessions_overview_other_sessions_section_title" = "SESI LAINNYA"; +"settings_labs_enable_new_app_layout" = "Tata Letak Aplikasi Baru"; +"room_first_message_placeholder" = "Kirim pesan pertama Anda…"; diff --git a/Riot/Assets/is.lproj/Vector.strings b/Riot/Assets/is.lproj/Vector.strings index c2c8af304..ad9ba1194 100644 --- a/Riot/Assets/is.lproj/Vector.strings +++ b/Riot/Assets/is.lproj/Vector.strings @@ -1279,7 +1279,7 @@ "settings_key_backup_info_signout_warning" = "Taktu öryggisafrit af dulritunarlyklunum áður en þú skráir þig út svo þeir tapist ekki."; "settings_key_backup_info_none" = "Dulritunarlyklarnir þínir eru ekki öryggisafritaðir úr þessari setu."; "settings_key_backup_info_checking" = "Athuga…"; -"settings_deactivate_my_account" = "Gera notandaaðganginn minn óvirkann"; +"settings_deactivate_my_account" = "Gera notandaaðganginn endanlega óvirkan"; "settings_add_3pid_invalid_password_message" = "Ógild auðkenni"; "settings_add_3pid_password_title_msidsn" = "Bæta við símanúmeri"; "settings_add_3pid_password_title_email" = "Bæta við tölvupóstfangi"; @@ -1462,7 +1462,7 @@ "auth_reset_password_error_not_found" = "Tölvupóstfangið þitt lítur ekki út fyrir að vera tengt við Matrix-auðkenni á þessum heimaþjóni."; "auth_login_single_sign_on" = "Skrá inn"; "onboarding_use_case_existing_server_button" = "Tengjast þjóni"; -"onboarding_use_case_skip_button" = "sleppt þessari spurningu"; +"onboarding_use_case_skip_button" = "Sleppa þessari spurningu"; "onboarding_use_case_community_messaging" = "Samfélög"; "onboarding_use_case_work_messaging" = "Teymi"; "onboarding_use_case_personal_messaging" = "Vinir og fjölskylda"; @@ -1714,7 +1714,7 @@ "contacts_address_book_permission_denied_alert_title" = "Tengiliðir óvirkir"; "directory_search_results_title" = "Vafra í niðurstöðum möppu"; /* The placeholder string contains onboarding_use_case_skip_button as a tappable action */ -"onboarding_use_case_not_sure_yet" = "Ekki ennþá viss? Þú getur %@"; +"onboarding_use_case_not_sure_yet" = "Ekki ennþá viss? %@"; "call_invite_expired" = "Boð í símtal er útrunnið"; "notification_settings_suppress_from_bots" = "Útiloka tilkynningar frá vélmennum"; "notification_settings_sender_hint" = "@notandi:lén.is"; @@ -1966,7 +1966,7 @@ "security_settings_crosssigning_complete_security" = "Algjört öryggi"; "settings_key_backup_info" = "Öryggi dulritaðra skilaboða er tryggt með enda-í-enda dulritun. Einungis þú og viðtakendurnir hafa dulritunarlyklana til að lesa slík skilaboð."; "settings_labs_enable_ringing_for_group_calls" = "Hringing fyrir hópsímtöl"; -"onboarding_use_case_message" = "Við munum hjálpa þér að tengjast."; +"onboarding_use_case_message" = "Við munum hjálpa þér að tengjast"; "callbar_only_single_active_group" = "Ýttu til að taka þátt í hópsímtalinu (%@)"; "call_video_with_user" = "Myndsímtal við %@"; "notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Þú gerðir skilaboð héðan í frá sýnileg fyrir alla meðlimi spjallrásarinnar síðan þeir skráðu sig."; @@ -1980,7 +1980,7 @@ "location_sharing_live_timer_selector_long" = "í 8 klukkustundir"; "location_sharing_live_timer_selector_medium" = "í 1 klukkustund"; "location_sharing_live_timer_selector_short" = "í 15 mínútur"; -"location_sharing_live_list_item_stop_sharing_action" = "Hætta deilingu"; +"location_sharing_live_list_item_stop_sharing_action" = "Stöðva"; "location_sharing_live_list_item_current_user_display_name" = "Þú"; "location_sharing_live_list_item_last_update_invalid" = "Síðasta uppfærsla óþekkt"; "location_sharing_live_list_item_last_update" = "Uppfært fyrir %@ síðan"; @@ -2091,8 +2091,8 @@ "threads_beta_title" = "Spjallþræðir"; "threads_notice_done" = "Náði því"; "onboarding_celebration_button" = "Hefjumst handa"; -"onboarding_celebration_message" = "Kjörstillingarnar þínar hafa verið vistaðar."; -"onboarding_celebration_title" = "Nú ertu tilbúin(n)!"; +"onboarding_celebration_message" = "Farðu hvenær sem er í stillingarnar til að breyta notandasniðinu þínu."; +"onboarding_celebration_title" = "Lítur vel út!"; "onboarding_avatar_accessibility_label" = "Auðkennismynd"; "onboarding_avatar_message" = "Þú getur breytt þessu hvenær sem er."; "onboarding_avatar_title" = "Bættu við auðkennismynd"; @@ -2116,3 +2116,64 @@ "joining" = "Gengur til liðs við spjallrás"; // String for App Store "store_short_description" = "Öruggt dreifvinnsluspjall/VoIP"; +"device_name_unknown" = "Óþekkt forrit (biðlari)"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_learn_more" = "Kanna nánar"; +"user_session_view_details" = "Skoða nánar"; +"user_session_verify_action" = "Sannprófa setu"; +"user_session_unverified_short" = "Óstaðfest"; +"user_session_verified_short" = "Staðfest"; +"user_session_unverified" = "Óstaðfest seta"; +"user_session_verified" = "Staðfest seta"; + +// MARK: User sessions management + +"user_sessions_overview_title" = "Setur"; +"space_selector_create_space" = "Búa til svæði"; +"all_chats_onboarding_try_it" = "Prófaðu það"; +"all_chats_edit_menu_space_settings" = "Stillingar svæðis"; +"all_chats_edit_menu_leave_space" = "Yfirgefa %@"; +"room_recents_recently_viewed_section" = "Nýlega skoðað"; +"all_chats_nothing_found_placeholder_title" = "Ekkert fannst."; +"all_chats_empty_list_placeholder_title" = "Þú hefur klárað allt."; +"all_chats_all_filter" = "Allt"; +"all_chats_edit_layout_show_filters" = "Sýna síur"; +"all_chats_edit_layout_show_recents" = "Birta nýlegt"; +"all_chats_edit_layout_unreads" = "Ólesið"; +"all_chats_edit_layout_recents" = "Nýlegt"; + +// Mark: Leave space + +"leave_space_action" = "Yfirgefa svæði"; +"spaces_creation_email_invites_title" = "Bjóddu félögum þínum"; +"spaces_creation_empty_room_name_error" = "Nafn er nauðsynlegt"; +"spaces_explore_rooms_format" = "Kanna %@"; +"room_info_back_button_title" = "Upplýsingar um spjallrás"; +"secrets_setup_recovery_passphrase_information" = "Settu inn öryggisfrasa sem aðeins þú þekkir, þetta er notað til að verja leyndarmálin sem þú geymir á netþjóninum þínum."; +"room_access_settings_screen_title" = "Hver hefur aðgang að þessari spjallrás?"; +"settings_presence_offline_mode" = "Ónettengdur hamur"; +"room_accessibility_record_voice_message" = "Taka upp talskilaboð"; +"authentication_recaptcha_title" = "Ertu mannvera?"; +"authentication_verify_msisdn_invalid_phone_number" = "Ógilt símanúmer"; +"authentication_verify_msisdn_waiting_button" = "Endursenda kóða"; +"authentication_verify_msisdn_text_field_placeholder" = "Símanúmer"; +"authentication_verify_msisdn_input_title" = "Settu inn símanúmerið þitt"; +"authentication_choose_password_not_verified_message" = "Athugaðu pósthólfið þitt"; +"authentication_choose_password_submit_button" = "Endurstilla lykilorð"; +"authentication_choose_password_text_field_placeholder" = "Nýtt lykilorð"; +"authentication_choose_password_input_title" = "Veldu nýtt lykilorð"; +"authentication_forgot_password_waiting_button" = "Senda tölvupóst aftur"; +"authentication_forgot_password_waiting_title" = "Athugaðu tölvupóstinn þinn."; +"authentication_forgot_password_text_field_placeholder" = "Tölvupóstur"; +"authentication_forgot_password_input_title" = "Settu inn tölvupóstfangið þitt"; +"authentication_verify_email_waiting_button" = "Senda tölvupóst aftur"; +"authentication_verify_email_waiting_title" = "Skoðaðu tölvupóstinn þinn."; +"authentication_verify_email_text_field_placeholder" = "Tölvupóstfang"; +"authentication_verify_email_input_title" = "Settu inn tölvupóstfangið þitt"; +"authentication_server_selection_server_url" = "Slóð á heimaþjón"; +"authentication_login_forgot_password" = "Gleymt lykilorð"; +"authentication_login_username" = "Notandanafn / tölvupóstfang / símanúmer"; +"authentication_login_title" = "Velkomin(n) aftur!"; +"authentication_registration_username" = "Notandanafn"; diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index 55b76e8c7..ec31cebb3 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -2465,3 +2465,25 @@ // User sessions management "user_sessions_settings" = "Gestisci sessioni"; "invite_to" = "Invita in %@"; +"device_name_unknown" = "Client sconosciuto"; +"device_name_mobile" = "%@ Mobile"; +"device_name_web" = "%@ Web"; +"device_name_desktop" = "%@ Desktop"; +"user_session_item_details" = "%@ · Ultima attività %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Verifica la tua sessione attuale per messaggi più sicuri."; +"user_session_verified_additional_info" = "La tua sessione attuale è pronta per i messaggi sicuri."; +"user_session_learn_more" = "Maggiori informazioni"; +"user_session_view_details" = "Vedi dettagli"; +"user_session_verify_action" = "Verifica la sessione"; +"user_session_unverified_short" = "Non verificata"; +"user_session_verified_short" = "Verificata"; +"user_session_unverified" = "Sessione non verificata"; +"user_session_verified" = "Sessione verificata"; +"user_sessions_overview_current_session_section_title" = "SESSIONE ATTUALE"; +"user_sessions_overview_other_sessions_section_info" = "Per una maggiore sicurezza, verifica le tue sessioni e disconnetti quelle che non riconosci o che non usi più."; +"user_sessions_overview_other_sessions_section_title" = "ALTRE SESSIONI"; +"settings_labs_enable_new_app_layout" = "Nuova disposizione dell'applicazione"; +"room_first_message_placeholder" = "Invia il tuo primo messaggio…"; diff --git a/Riot/Assets/ja.lproj/Vector.strings b/Riot/Assets/ja.lproj/Vector.strings index ddd2b31e4..df4ef10d1 100644 --- a/Riot/Assets/ja.lproj/Vector.strings +++ b/Riot/Assets/ja.lproj/Vector.strings @@ -142,8 +142,8 @@ "contacts_address_book_matrix_users_toggle" = "Matrix利用者のみ"; "contacts_address_book_no_contact" = "端末内電話帳に連絡先がありません"; "contacts_address_book_permission_required" = "端末内電話帳へのアクセス権限が必要です"; -"contacts_user_directory_section" = "利用者一覧"; -"contacts_user_directory_offline_section" = "利用者一覧(オフライン)"; +"contacts_user_directory_section" = "ユーザー一覧"; +"contacts_user_directory_offline_section" = "ユーザー一覧 (オフライン)"; // Chat participants "room_participants_title" = "参加者"; "room_participants_add_participant" = "参加者を追加"; @@ -172,7 +172,7 @@ "room_participants_action_section_devices" = "セッション一覧"; "room_participants_action_section_other" = "オプション"; "room_participants_action_invite" = "招待"; -"room_participants_action_leave" = "このルームを出る"; +"room_participants_action_leave" = "このルームを退出"; "room_participants_action_remove" = "このルームから削除"; "room_participants_action_ban" = "このルームからブロック"; "room_participants_action_unban" = "ブロックを解除"; @@ -208,7 +208,7 @@ "room_delete_unsent_messages" = "未送信の文を削除"; "room_event_action_copy" = "コピー"; "room_event_action_quote" = "引用"; -"room_event_action_redact" = "移動して削除"; +"room_event_action_redact" = "削除"; "room_event_action_more" = "さらに"; "room_event_action_share" = "共有"; "room_event_action_permalink" = "メッセージへのリンクをコピー"; @@ -332,7 +332,7 @@ "room_details_low_priority_tag" = "低優先度"; "room_details_mute_notifs" = "発言があっても通知しない"; "room_details_direct_chat" = "対話"; -"room_details_access_section" = "ルームにアクセスできる人"; +"room_details_access_section" = "このルームにアクセスできる人は?"; "room_details_access_section_invited_only" = "招待された人のみ"; "room_details_access_section_anyone_apart_from_guest" = "ルームのリンクを知っている人なら誰でも(ゲストユーザーを除く)"; "room_details_access_section_anyone" = "ルームのリンクを知っている人なら誰でも(ゲストユーザーを含む)"; @@ -541,7 +541,7 @@ "deactivate_account_forget_messages_information_part3" = ":これは将来のユーザーに会話の不完全なビューが表示される)"; "deactivate_account_validate_action" = "無効なアカウント"; "deactivate_account_password_alert_title" = "無効なアカウント"; -"deactivate_account_password_alert_message" = "続行するには、パスワードを入力してください"; +"deactivate_account_password_alert_message" = "続行するには、Matrix アカウントのパスワードを入力してください"; // Re-request confirmation dialog "rerequest_keys_alert_title" = "要求が送信されました"; "rerequest_keys_alert_message" = "鍵をこのセッションに送信できるように、メッセージを復号化できる他の端末で%@を起動してください。"; @@ -565,12 +565,12 @@ "room_info_list_one_member" = "1人のメンバー"; "create_room_placeholder_address" = "#testroom:matrix.org"; -"create_room_section_header_address" = "ルームのアドレス"; -"create_room_show_in_directory" = "このルームを一覧に掲載"; +"create_room_section_header_address" = "アドレス"; +"create_room_show_in_directory" = "ルーム一覧に掲載"; "create_room_section_footer_type" = "非公開のルームは、ルームに招待された人のみ参加できます。"; "create_room_type_public" = "公開ルーム (誰でも参加可能)"; "create_room_type_private" = "非公開ルーム (招待者のみ参加可能)"; -"create_room_section_header_type" = "ルームの種類"; +"create_room_section_header_type" = "アクセスできる人"; "create_room_section_footer_encryption" = "暗号化はあとから無効にすることはできません。"; "create_room_section_header_encryption" = "ルームの暗号化"; "create_room_placeholder_topic" = "トピック"; @@ -674,7 +674,7 @@ "room_details_access_section_directory_toggle_for_dm" = "ルーム一覧に掲載"; "room_details_access_section_anyone_apart_from_guest_for_dm" = "リンクを知っている人なら誰でも(ゲストユーザーを除く)"; "room_details_access_section_anyone_for_dm" = "リンクを知っている人なら誰でも(ゲストユーザーを含む)"; -"room_details_access_section_for_dm" = "誰がアクセスできますか?"; +"room_details_access_section_for_dm" = "これにアクセスできる人は?"; "room_details_photo_for_dm" = "写真"; "room_details_integrations" = "インテグレーション"; "room_details_search" = "ルーム内検索"; @@ -707,7 +707,7 @@ "settings_key_backup_info_version" = "鍵のバックアップのバージョン:%@"; "settings_key_backup_info_none" = "あなたの鍵は、このセッションからバックアップされていません。"; "settings_key_backup_info_checking" = "確認しています…"; -"settings_add_3pid_password_message" = "続けるにはパスワードを入力してください"; +"settings_add_3pid_password_message" = "続行するには、Matrix アカウントのパスワードを入力してください"; "settings_add_3pid_invalid_password_message" = "無効な認証情報"; "settings_add_3pid_password_title_email" = "メールアドレスを追加"; "settings_integrations_allow_description" = "インテグレーションマネージャー(%@)を使用して、ボット、ブリッジ、ウィジェット、ステッカーパックを管理します。\n\n設定データを受け取り、お客様に代わってウィジェットの変更、ルーム招待の送信、権限の設定を行うことができます。"; @@ -735,7 +735,7 @@ "room_participants_action_security_status_warning" = "警告"; "room_participants_action_security_status_complete_security" = "セキュリティーを確認"; "room_participants_action_security_status_verify" = "認証"; -"room_participants_action_security_status_verified" = "認証済"; +"room_participants_action_security_status_verified" = "検証済み"; "room_participants_action_section_security" = "セキュリティー"; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "IDサーバーが設定されていないため、メールアドレスを使って連絡先とチャットを開始することができません。"; "room_participants_filter_room_members_for_dm" = "メンバーを検索"; @@ -870,7 +870,7 @@ "user_verification_session_details_additional_information_untrusted_other_user" = "ユーザーがこのセッションを信頼するまでは、セッションとの間で送受信されるメッセージには警告が表示されます。また、手動で認証することもできます。"; "user_verification_session_details_information_untrusted_other_user" = " 新しいセッションを使ってサインインしました:"; "user_verification_session_details_information_untrusted_current_user" = "このセッションを認証することで、信頼できるものとしてマークし、暗号化されたメッセージへのアクセスを許可します。"; -"user_verification_session_details_information_trusted_other_user_part2" = " 認証済:"; +"user_verification_session_details_information_trusted_other_user_part2" = " 検証済み:"; "user_verification_session_details_information_trusted_other_user_part1" = "このセッションは安全なものとして信頼されています。なぜなら "; "user_verification_session_details_information_trusted_current_user" = "このセッションは、認証されたため安全なものとして信頼されています。"; "user_verification_session_details_untrusted_title" = "信頼されていません"; @@ -928,7 +928,7 @@ "key_verification_incoming_request_incoming_alert_message" = "%@は認証を要求しています"; "key_verification_tile_conclusion_warning_title" = "信頼されていないサインイン"; -"key_verification_tile_conclusion_done_title" = "認証済"; +"key_verification_tile_conclusion_done_title" = "検証済み"; "key_verification_tile_request_incoming_approval_decline" = "却下"; "key_verification_tile_request_incoming_approval_accept" = "承認"; "key_verification_tile_request_status_accepted" = "あなたは承認しました"; @@ -1283,7 +1283,7 @@ "room_event_encryption_info_device_id" = "ID\n"; "room_event_encryption_info_device_verification" = "認証\n"; "room_event_encryption_info_device_fingerprint" = "Ed25519 fingerprint\n"; -"room_event_encryption_info_device_verified" = "認証済"; +"room_event_encryption_info_device_verified" = "検証済み"; "room_event_encryption_info_device_not_verified" = "認証されていない"; "room_event_encryption_info_device_blocked" = "ブラックリストに載せた"; "room_event_encryption_info_verify" = "認証しています…"; @@ -1512,7 +1512,7 @@ "notice_room_invite_by_you" = "%@を招待しました"; "notice_room_invite_you" = "%@があなたを招待しました"; "notice_room_join_by_you" = "参加しました"; -"notice_room_leave_by_you" = "退出しました"; +"notice_room_leave_by_you" = "あなたが退出しました"; "notice_room_kick_by_you" = "%@をキックしました"; "notice_room_unban_by_you" = "%@のブロックを解除しました"; "notice_room_ban_by_you" = "%@をブロックしました"; @@ -1587,7 +1587,7 @@ "biometrics_usage_reason" = "アプリを開くには認証が必要です"; "settings_sending_media" = "画像と動画の送信"; "invite_friends_share_text" = "%@ での連絡先: %@"; -"side_menu_action_invite_friends" = "招待する"; +"side_menu_action_invite_friends" = "友だちを招待する"; "call_more_actions_change_audio_device" = "オーディオデバイスを変更"; "call_more_actions_dialpad" = "ダイヤルパッド"; "onboarding_splash_login_button_title" = "既にアカウントを持っています"; @@ -1656,7 +1656,7 @@ "space_topic" = "説明文"; "spaces_creation_cancel_message" = "進捗状況は失われます。"; "spaces_creation_cancel_title" = "スペースの作成を停止しますか?"; -"create_room_section_footer_type_private" = "招待した人のみが検索や参加できます。"; +"create_room_section_footer_type_private" = "招待した人のみが検索・参加できます。"; // MARK: - Searchable Directory View Controller @@ -1668,3 +1668,128 @@ // MARK: Sign out warning "sign_out_existing_key_backup_alert_title" = "サインアウトしてよろしいですか?"; +"find_your_contacts_message" = "%@ であなたの連絡先を表示し、知人とのチャットを素早く始めます。"; +"find_your_contacts_footer" = "この設定はいつでも無効にできます"; +"find_your_contacts_button_title" = "連絡先を検索する"; +"find_your_contacts_title" = "連絡先をリストアップする"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "アバター"; + +// MARK: - Invite friends + +"invite_friends_action" = "友だちを %@ に招待する"; +"call_transfer_error_title" = "エラー"; +"home_context_menu_mark_as_read" = "既読にする"; +"home_context_menu_normal_priority" = "通常優先度"; +"home_context_menu_low_priority" = "低優先度"; +"home_context_menu_unmute" = "ミュート解除"; +"home_context_menu_mute" = "ミュート"; + +// MARK: - Call Transfer +"call_transfer_title" = "転送"; +"room_info_back_button_title" = "ルーム情報"; +"create_room_processing" = "ルーム作成中"; +"call_transfer_users" = "ユーザー"; +"home_context_menu_notifications" = "通知"; +"home_context_menu_make_dm" = "連絡先に移動"; +"home_context_menu_make_room" = "ルームに移動"; +"leave_space_title" = "%@ を退出"; +"room_participants_leave_success" = "ルームを退出しました"; +"room_participants_leave_processing" = "退出中"; +"event_formatter_group_call_leave" = "退出"; +"home_context_menu_leave" = "退出"; + +// Mark: Leave space + +"leave_space_action" = "スペースを退出"; +"leave_space_selection_title" = "ルームを選択"; +"create_room_section_footer_type_restricted" = "誰でもスペース名で検索・参加できます。"; +"create_room_suggest_room" = "スペースメンバーにおすすめ"; +"create_room_show_in_directory_footer" = "他の人が検索・参加できるようになります。"; +"create_room_promotion_header" = "PR"; +"searchable_directory_search_placeholder" = "名前または ID"; +"room_suggestion_settings_screen_title" = "スペースにおすすめのルームを作成"; +"room_suggestion_settings_screen_message" = "おすすめのルームは、スペースメンバーに参加を推奨するものとして PR されます。"; + +// Room suggestion Settings +"room_suggestion_settings_screen_nav_title" = "おすすめのルーム"; +"room_details_promote_room_suggest_title" = "スペースメンバーへのおすすめ"; +"settings_default" = "デフォルトの通知"; +"pin_protection_reset_alert_action_reset" = "リセット"; +"authentication_recaptcha_title" = "あなたは人間ですか?"; +"authentication_verify_msisdn_waiting_button" = "コードを再送信"; +"authentication_choose_password_submit_button" = "パスワードをリセット"; +"authentication_choose_password_signout_all_devices" = "全ての端末からサインアウト"; +"authentication_choose_password_text_field_placeholder" = "新しいパスワード"; +"authentication_terms_title" = "プライバシーポリシー"; +"authentication_verify_msisdn_text_field_placeholder" = "電話番号"; +"password_validation_error_contain_symbol" = "記号を含める"; +"password_validation_error_contain_number" = "数字を含める"; +"password_validation_error_contain_uppercase_letter" = "大文字を含める"; +"password_validation_error_contain_lowercase_letter" = "小文字を含める"; +/* The placeholder will show a number */ +"password_validation_error_max_length" = "%d 文字以下"; +/* The placeholder will show a number */ +"password_validation_error_min_length" = "%d 文字以上"; + +// MARK: Password Validation +"password_validation_info_header" = "以下の条件を満たすパスワードを設定してください:"; +"space_selector_empty_view_title" = "まだスペースがありません"; +"all_chats_empty_list_placeholder_title" = "未読はありません"; +"all_chats_empty_unreads_placeholder_message" = "未読のメッセージがある場合は、ここに表示されます。"; +"room_notifs_settings_account_settings" = "アカウント設定"; +"room_access_settings_screen_upgrade_alert_upgrading" = "ルームをアップグレードしています"; +"room_access_settings_screen_upgrade_alert_upgrade_button" = "アップグレード"; +"room_access_settings_screen_edit_spaces" = "スペースを編集"; +"room_access_settings_screen_upgrade_required" = "アップグレードが必要"; +"room_access_settings_screen_upgrade_alert_title" = "ルームをアップグレード"; +"room_access_settings_screen_public_message" = "誰でも検索・参加できます。"; +"room_access_settings_screen_private_message" = "招待された人だけが検索・参加できます。"; +"room_access_settings_screen_message" = "誰が %@ を検索・参加できるか選択してください。"; +"space_settings_access_section" = "このスペースにアクセスできる人は?"; +"room_access_settings_screen_title" = "このルームにアクセスできる人は?"; +"room_notifs_settings_none" = "なし"; + +// Room Notification Settings +"room_notifs_settings_notify_me_for" = "以下の場合に通知"; +"room_details_access_row_title" = "アクセス"; +"room_details_notifs" = "通知"; +"location_sharing_invalid_power_level_title" = "ライブ現在地共有に必要な権限がありません"; +"settings_labs_enable_live_location_sharing" = "ライブ現在地共有 - 現在地を共有します (開発中の機能、位置情報が一時的にルームの履歴に残ります)"; +"event_formatter_message_deleted" = "削除済みのメッセージ"; +"home_context_menu_unfavourite" = "お気に入りから削除"; +"home_context_menu_favourite" = "お気に入り"; +"all_chats_user_menu_settings" = "ユーザー設定"; +"all_chats_edit_layout_show_filters" = "フィルターを表示"; +"all_chats_edit_layout_show_recents" = "最近使用したものを表示"; +"all_chats_edit_layout_alphabetical_order" = "A-Z で並び替え"; +"all_chats_edit_layout_activity_order" = "アクティビティで並び替え"; +"space_selector_create_space" = "スペースを作成"; +"space_selector_empty_view_information" = "スペースは、ルームや連絡先をグループ化する方法です。以下からスペースを作成できます。"; +"all_chats_all_filter" = "全て"; +"all_chats_edit_layout_recents" = "最近"; +"all_chats_edit_layout_unreads" = "未読"; +"all_chats_section_title" = "チャット"; + +// Mark: - All Chats + +"all_chats_title" = "全てのチャット"; +"location_sharing_live_loading" = "ライブ現在地共有を読み込み中..."; +"location_sharing_live_list_item_stop_sharing_action" = "停止"; +"location_sharing_live_list_item_current_user_display_name" = "あなた"; +"live_location_sharing_banner_stop" = "停止"; +"live_location_sharing_ended" = "ライブ現在地共有が終了"; +"live_location_sharing_banner_title" = "ライブ現在地共有が有効"; +"location_sharing_invalid_authorization_settings" = "設定"; + +// MARK: Live location sharing + +"location_sharing_live_share_title" = "ライブ現在地共有"; +"service_terms_modal_decline_button" = "拒否する"; +"service_terms_modal_accept_button" = "同意する"; +"service_terms_modal_description_identity_server" = "この操作により、端末の連絡先にあなたの電話番号や電子メールを保存している人があなたを検索できるようになります。"; + +// Service terms +"service_terms_modal_title_message" = "続行するには、以下の利用規約に同意してください"; diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index ca607998b..362dd9620 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -2230,7 +2230,7 @@ "settings_labs_enable_auto_report_decryption_errors" = "Auto Reportar Erros de Decriptação"; "room_preview_decline_invitation_options" = "Você quer declinar o convite ou ignorar esta(e) usuária(o)?"; "threads_beta_cancel" = "Não agora"; -"threads_beta_enable" = "Teste aí"; +"threads_beta_enable" = "Experimentar"; "threads_beta_information_link" = "Saber mais"; "threads_beta_information" = "Mantenha discussões organizadas com threads.\n\nThreads ajudam manter suas conversas em-tópico e fáceis de rastrear. "; "threads_beta_title" = "Threads"; @@ -2446,12 +2446,12 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Nada novo."; -"all_chats_onboarding_try_it" = "Testa aí"; +"all_chats_onboarding_try_it" = "Experimentar"; "all_chats_onboarding_title" = "O que tem de novo"; "all_chats_onboarding_page_message3" = "Toque em seu perfil para nos deixar sabendo do que você acha."; -"all_chats_onboarding_page_title3" = "Dar Feedback"; -"all_chats_onboarding_page_message2" = "Acesse seus Espaços (esquerdo fundo) mais rápido e fácil que jamais antes."; -"all_chats_onboarding_page_title2" = "Acessar Espaços"; +"all_chats_onboarding_page_title3" = "Dê Feedback"; +"all_chats_onboarding_page_message2" = "Acesse seus Espaços (esquerda fundo) mais rápido e fácil que jamais antes."; +"all_chats_onboarding_page_title2" = "Acesse Espaços"; "all_chats_onboarding_page_message1" = "Para simplificar seu Element, abas são agora opcionais. Gerencie-as usando o menu direito topo."; "all_chats_onboarding_page_title1" = "Boas vindas a uma nova visão!"; "all_chats_nothing_found_placeholder_message" = "Tente ajustar sua pesquisa."; @@ -2466,3 +2466,25 @@ // User sessions management "user_sessions_settings" = "Gerenciar sessões"; "invite_to" = "Convidar para %@"; +"device_name_unknown" = "Cliente desconhecido"; +"device_name_mobile" = "%@ Mobile"; +"device_name_web" = "%@ Web"; +"device_name_desktop" = "%@ Desktop"; +"user_session_item_details" = "%@ · Última atividade %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Verifique sua sessão atual para mensageria segura melhorada."; +"user_session_verified_additional_info" = "Sua sessão atual está pronta para mensageria segura."; +"user_session_learn_more" = "Saber mais"; +"user_session_view_details" = "Visualizar detalhes"; +"user_session_verify_action" = "Verificar sessão"; +"user_session_unverified_short" = "Não-verificada"; +"user_session_verified_short" = "Verificada"; +"user_session_unverified" = "Sessão não-verificada"; +"user_session_verified" = "Sessão verificada"; +"user_sessions_overview_current_session_section_title" = "SESSÃO ATUAL"; +"user_sessions_overview_other_sessions_section_info" = "Para melhor segurança, verifique suas sessões e faça signout de qualquer sessão que você não reconhece ou usa mais."; +"user_sessions_overview_other_sessions_section_title" = "OUTRAS SESSÕES"; +"settings_labs_enable_new_app_layout" = "Novo Layout de Aplicativo"; +"room_first_message_placeholder" = "Envie sua primeira mensagem…"; diff --git a/Riot/Assets/sk.lproj/Vector.strings b/Riot/Assets/sk.lproj/Vector.strings index ecfcb9734..5cecf24a5 100644 --- a/Riot/Assets/sk.lproj/Vector.strings +++ b/Riot/Assets/sk.lproj/Vector.strings @@ -2688,3 +2688,25 @@ // User sessions management "user_sessions_settings" = "Spravovať relácie"; "invite_to" = "Pozvať do %@"; +"device_name_web" = "%@ Web"; +"device_name_unknown" = "Neznámy klient"; +"device_name_mobile" = "%@ Mobil"; +"device_name_desktop" = "%@ Stolný počítač"; +"user_session_item_details" = "%@ · Posledná aktivita %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Overte svoju aktuálnu reláciu pre vylepšené bezpečné zasielanie správ."; +"user_session_verified_additional_info" = "Vaša aktuálna relácia je pripravená na bezpečné zasielanie správ."; +"user_session_learn_more" = "Zistiť viac"; +"user_session_view_details" = "Zobraziť podrobnosti"; +"user_session_verify_action" = "Overiť reláciu"; +"user_session_unverified_short" = "Neoverené"; +"user_session_verified_short" = "Overené"; +"user_session_unverified" = "Neoverená relácia"; +"user_session_verified" = "Overená relácia"; +"user_sessions_overview_current_session_section_title" = "AKTUÁLNA RELÁCIA"; +"user_sessions_overview_other_sessions_section_info" = "V záujme čo najlepšieho zabezpečenia overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate."; +"user_sessions_overview_other_sessions_section_title" = "OSTATNÉ RELÁCIE"; +"settings_labs_enable_new_app_layout" = "Nové usporiadanie aplikácie"; +"room_first_message_placeholder" = "Pošlite svoju prvú správu…"; diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 783f461a6..4d561fe3d 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -227,7 +227,7 @@ "room_directory_no_public_room" = "Загальнодоступних кімнат немає"; "settings_security" = "БЕЗПЕКА"; "settings_pin_rooms_with_missed_notif" = "Приколоти кімнати із пропущеними сповіщеннями"; -"settings_global_settings_info" = "Глобальні налаштування сповіщень доступні у вашому %@ веб-клієнті"; +"settings_global_settings_info" = "Глобальні налаштування сповіщень доступні у вашому %@ вебклієнті"; "settings_enable_push_notif" = "Сповіщення на цьому пристрої"; "settings_fail_to_update_profile" = "Не вдалося оновити профіль"; "settings_night_mode" = "Нічний режим"; @@ -684,7 +684,7 @@ "space_beta_announce_badge" = "БЕТА"; "space_beta_announce_title" = "Простори скоро з'являться"; "space_beta_announce_subtitle" = "Нова версія спільнот"; -"space_beta_announce_information" = "Простори — це новий спосіб об'єднати кімнати та людей. Їх ще не додано на iOS, але ви вже можете користуватися ними у вебпереглядачі та на комп'ютері."; +"space_beta_announce_information" = "Простори — це новий спосіб об'єднати кімнати та людей. Їх ще не додано на iOS, але ви вже можете користуватися ними у браузері та на комп'ютері."; // No VoIP support "no_voip_title" = "Вхідний виклик"; @@ -1066,7 +1066,7 @@ "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Поки жоден сервер ідентифікації не налаштований, ви не можете почати бесіду з кимось за адресою е-пошти."; "find_your_contacts_message" = "Дозвольте %@ показувати ваші контакти, щоб ви могли швидко почати бесіду з тими, кого знаєте найкраще."; "find_your_contacts_title" = "Почніть із переліку своїх контактів"; -"store_full_description" = "Element — застосунок для листування й співпраці нового покоління:\n\n1. Надає вам контроль над збереженням вашої приватності\n2. Дає змогу спілкуватися з будь-ким у мережі Matrix і навіть за її межами, інтегруючись із такими застосунками, як Slack\n3. Оберігає вас від реклами, збору даних, бекдорів і прив'язаності до провайдера\n4. Захищає вас наскрізним шифруванням і звіркою інших перехресним підписуванням\n\nElement суттєво відрізняється від інших застосунків для листування й співпраці тим, що децентралізований і має відкритий код.\n\nElement дає змогу самостійно встановити сервер або обрати з-поміж загальнодоступних, щоб ви зберігали приватність своїх даних і розмов, власність і контроль над ними. Він надає вам доступ до відкритої мережі; тож ви можете спілкуватися з користувачами інших застосунків, не лише Element. А ще він добре захищений.\n\nElement здатен на це все завдяки своїй основі Matrix — стандарту відкритого, децентралізованого спілкування.\n\nElement надає вам контроль, даючи змогу обрати, в кого зберігаються ваші розмови. У застосунку Element ви можете обрати між такими шляхами:\n\n1. Зареєструвати безплатний обліковий запис на загальнодоступному сервері matrix.org\n2. Самостійно розмістити свій обліковий запис, встановивши сервер на власному обладнанні\n3. Отримати обліковий запис на виділеному сервері, просто передплативши хостинг-платформу Element Matrix Services\n\nЧому Element?\n\nВОЛОДІЙТЕ СВОЇМИ ДАНИМИ: Ви обираєте, де зберігати свої дані й повідомлення. Ви володієте й керуєте ними, не якась МЕГАКОРПОРАЦІЯ, що аналізує ваші дані й передає їх стороннім особам.\n\nВІДКРИТЕ ЛИСТУВАННЯ Й СПІВПРАЦЯ: Можете розмовляти з будь-ким іншим у мережі Matrix незалежно від того, використовують вони Element, інший застосунок Matrix чи навіть сторонню систему листування на зразок Slack, IRC чи XMPP.\n\nНАДБЕЗПЕКА: Справжнє наскрізне шифрування (лише учасники розмови можуть розшифрувати повідомлення) й звірка пристроїв учасників розмови перехресним підписуванням.\n\nДОСКОНАЛЕ СПІЛКУВАННЯ: Листуйтеся, робіть голосові й відеовиклики, діліться файлами, транслюйте екран, підʼєднуйте різноманітні інтеграції, ботів і віджети. Розбудовуйте кімнати, спільноти, будьте на звʼязку й досягайте цілей.\n\nСКРІЗЬ, ДЕ ВИ: Будьте на зв'язку, де б ви не були, завдяки повній синхронізації історії повідомлень між усіма вашим пристроями та онлайн-клієнтом https://app.element.io."; +"store_full_description" = "Element — застосунок для листування й співпраці нового покоління:\n\n1. Надає вам контроль над збереженням вашої приватності\n2. Дає змогу спілкуватися з будь-ким у мережі Matrix і навіть за її межами, інтегруючись із такими застосунками, як Slack\n3. Оберігає вас від реклами, збору даних, бекдорів і прив'язаності до провайдера\n4. Захищає вас наскрізним шифруванням і звіркою інших перехресним підписуванням\n\nElement суттєво відрізняється від інших застосунків для листування й співпраці тим, що децентралізований і має відкритий код.\n\nElement дає змогу самостійно встановити сервер або обрати з-поміж загальнодоступних, щоб ви зберігали приватність своїх даних і розмов, власність і контроль над ними. Він надає вам доступ до відкритої мережі; тож ви можете спілкуватися з користувачами інших застосунків, не лише Element. А ще він добре захищений.\n\nElement здатен на це все завдяки своїй основі Matrix — стандарту відкритого, децентралізованого спілкування.\n\nElement надає вам контроль, даючи змогу обрати, в кого зберігаються ваші розмови. У застосунку Element ви можете обрати між такими шляхами:\n\n1. Зареєструвати безплатний обліковий запис на загальнодоступному сервері matrix.org\n2. Самостійно розмістити свій обліковий запис, встановивши сервер на власному обладнанні\n3. Отримати обліковий запис на виділеному сервері, просто передплативши хостинг-платформу Element Matrix Services\n\nЧому Element?\n\nВОЛОДІЙТЕ СВОЇМИ ДАНИМИ: Ви обираєте, де зберігати свої дані й повідомлення. Ви володієте й керуєте ними, не якась МЕГАКОРПОРАЦІЯ, що аналізує ваші дані й передає їх стороннім особам.\n\nВІДКРИТЕ ЛИСТУВАННЯ Й СПІВПРАЦЯ: Можете розмовляти з будь-ким іншим у мережі Matrix незалежно від того, використовують вони Element, інший застосунок Matrix чи навіть сторонню систему листування на зразок Slack, IRC чи XMPP.\n\nНАДБЕЗПЕКА: Справжнє наскрізне шифрування (лише учасники розмови можуть розшифрувати повідомлення) й звірка пристроїв учасників розмови перехресним підписуванням.\n\nДОСКОНАЛЕ СПІЛКУВАННЯ: Листуйтеся, робіть голосові й відеовиклики, діліться файлами, транслюйте екран, підʼєднуйте різноманітні інтеграції, ботів і віджети. Розбудовуйте кімнати, спільноти, будьте на звʼязку й досягайте цілей.\n\nСКРІЗЬ, ДЕ ВИ: Будьте на зв'язку, де б ви не були, завдяки повній синхронізації історії повідомлень між усіма вашими пристроями та вебклієнтом https://app.element.io."; "security_settings_crosssigning_info_not_bootstrapped" = "Перехресне підписування ще не налаштовано."; "security_settings_crosssigning" = "ПЕРЕХРЕСНЕ ПІДПИСУВАННЯ"; "security_settings_backup" = "РЕЗЕРВНЕ КОПІЮВАННЯ ПОВІДОМЛЕНЬ"; @@ -1386,7 +1386,7 @@ "room_intro_cell_information_room_without_topic_sentence2_part2" = " щоб люди знали, про що ця кімната."; "room_intro_cell_information_dm_sentence2" = "У цій розмові лише ви двоє, більше ніхто не може приєднатися."; "room_intro_cell_information_multiple_dm_sentence2" = "У цій розмові лише ви, поки хтось із вас не запросить іще когось приєднатися."; -"space_feature_unavailable_subtitle" = "Простори ще не готові на iOS, але доступні у вебпереглядачі та на комп'ютері"; +"space_feature_unavailable_subtitle" = "Простори ще не готові на iOS, але доступні у браузері та на комп'ютері"; "space_feature_unavailable_information" = "Простори — новий спосіб групувати кімнати й людей.\n\nСкоро ми їх допрацюємо. Якщо приєднаєтеся до простору на іншій платформі, всі його кімнати стануть доступні й тут."; // Success from secure backup @@ -1408,7 +1408,7 @@ "spaces_suggested_room" = "Пропоновано"; "room_details_access_section_anyone_for_dm" = "Будь-хто з посиланням, зокрема гості"; "spaces_no_room_found_detail" = "Деяких результатів може бути не видно, бо вони закриті й потребують запрошення."; -"spaces_no_member_found_detail" = "Шукаєте когось, хто ще не в %@? Запросіть їх вебпереглядачем або комп'ютером."; +"spaces_no_member_found_detail" = "Шукаєте когось, хто ще не в %@? Запросіть їх через браузер або комп'ютер."; "spaces_invites_coming_soon_title" = "Запрошення ще в розробці"; "spaces_coming_soon_detail" = "Ця можливість ще не втілена, але скоро буде. Поки що можете зробити це в %@ на комп'ютері."; "space_participants_action_remove" = "Вилучити з цього простору"; @@ -1560,7 +1560,7 @@ "widget_integration_manager_disabled" = "Необхідно увімкнути менеджер інтеграцій у налаштуваннях"; "widget_menu_remove" = "Вилучити для всіх"; "widget_menu_revoke_permission" = "Відкликати мій доступ"; -"widget_menu_open_outside" = "Відкрити у переглядачі"; +"widget_menu_open_outside" = "Відкрити у браузері"; "widget_menu_refresh" = "Оновити"; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "Додати зараз?"; "widget_sticker_picker_no_stickerpacks_alert" = "На разі жоден пакунок наліпок не увімкнено."; @@ -2690,3 +2690,25 @@ // User sessions management "user_sessions_settings" = "Керувати сеансами"; "invite_to" = "Запросити до %@"; +"device_name_unknown" = "Невідомий клієнт"; +"device_name_mobile" = "%@ Мобільний"; +"device_name_web" = "%@ Браузер"; +"device_name_desktop" = "%@ Комп'ютер"; +"user_session_item_details" = "%@ · Остання активність %@"; + +// First item is client name and second item is session display name +"user_session_name" = "%@: %@"; +"user_session_unverified_additional_info" = "Звірте свій поточний сеанс для посилення безпеки обміну повідомленнями."; +"user_session_verified_additional_info" = "Ваш поточний сеанс готовий до безпечного обміну повідомленнями."; +"user_session_learn_more" = "Докладніше"; +"user_session_view_details" = "Переглянути подробиці"; +"user_session_verify_action" = "Звірити сеанс"; +"user_session_unverified_short" = "Не звірений"; +"user_session_verified_short" = "Звірений"; +"user_session_unverified" = "Не звірений сеанс"; +"user_session_verified" = "Звірений сеанс"; +"user_sessions_overview_current_session_section_title" = "ПОТОЧНИЙ СЕАНС"; +"user_sessions_overview_other_sessions_section_info" = "Звірте свої сеанси та вийдіть з усіх сеансів, які ви більше не розпізнаєте або не використовуєте для кращої безпеки."; +"user_sessions_overview_other_sessions_section_title" = "ІНШІ СЕАНСИ"; +"settings_labs_enable_new_app_layout" = "Новий вигляд застосунку"; +"room_first_message_placeholder" = "Надішліть своє перше повідомлення…"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 30df7d1af..02c55dac0 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -8511,6 +8511,10 @@ public class VectorL10n: NSObject { public static var userSessionDetailsApplicationVersion: String { return VectorL10n.tr("Vector", "user_session_details_application_version") } + /// Browser + public static var userSessionDetailsDeviceBrowser: String { + return VectorL10n.tr("Vector", "user_session_details_device_browser") + } /// IP address public static var userSessionDetailsDeviceIpAddress: String { return VectorL10n.tr("Vector", "user_session_details_device_ip_address") diff --git a/Riot/Modules/Common/Recents/RecentsViewController.h b/Riot/Modules/Common/Recents/RecentsViewController.h index 09a9ee572..9a9c60ece 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.h +++ b/Riot/Modules/Common/Recents/RecentsViewController.h @@ -93,6 +93,12 @@ FOUNDATION_EXPORT NSString *const RecentsViewControllerDataReadyNotification; */ @property (nonatomic, weak) RootTabEmptyView *emptyView; +/** + The bottom anchor used to layout `emptyView` in the absence of a FAB. + If this value is `nil` the empty view will be anchored to the bottom of its superview. + */ +@property (nonatomic, weak) NSLayoutYAxisAnchor *emptyViewBottomAnchor; + /** The screen timer used for analytics if they've been enabled. The default value is nil. */ diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index c06a6f18a..0a86bd3c0 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -2226,7 +2226,8 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro [self.view addSubview:emptyView]; } - emptyViewBottomConstraint = [emptyView.bottomAnchor constraintEqualToAnchor:emptyView.superview.bottomAnchor]; + NSLayoutYAxisAnchor *bottomAnchor = self.emptyViewBottomAnchor ?: emptyView.superview.bottomAnchor; + emptyViewBottomConstraint = [emptyView.bottomAnchor constraintEqualToAnchor:bottomAnchor constant:-1]; // 1pt spacing for UIToolbar's divider. emptyView.translatesAutoresizingMaskIntoConstraints = NO; diff --git a/Riot/Modules/Common/SwiftUI/VectorHostingController.swift b/Riot/Modules/Common/SwiftUI/VectorHostingController.swift index 9b6860fb7..98faba5c0 100644 --- a/Riot/Modules/Common/SwiftUI/VectorHostingController.swift +++ b/Riot/Modules/Common/SwiftUI/VectorHostingController.swift @@ -73,14 +73,6 @@ class VectorHostingController: UIHostingController { bottomSheetPreferences?.setup(viewController: self) } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - if isNavigationBarHidden { - self.navigationController?.isNavigationBarHidden = true - } - } - override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) @@ -93,6 +85,14 @@ class VectorHostingController: UIHostingController { } } + override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + + if let navigationController = navigationController, navigationController.isNavigationBarHidden != isNavigationBarHidden { + navigationController.isNavigationBarHidden = isNavigationBarHidden + } + } + override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() diff --git a/Riot/Modules/Home/AllChats/AllChatsViewController.swift b/Riot/Modules/Home/AllChats/AllChatsViewController.swift index b2cbc8ce8..1b26bfe81 100644 --- a/Riot/Modules/Home/AllChats/AllChatsViewController.swift +++ b/Riot/Modules/Home/AllChats/AllChatsViewController.swift @@ -127,6 +127,7 @@ class AllChatsViewController: HomeViewController { recentsTableView.contentInsetAdjustmentBehavior = .automatic toolbarHeight = toolbar.frame.height + emptyViewBottomAnchor = toolbar.topAnchor updateUI() diff --git a/RiotSwiftUI/Modules/AnalyticsPrompt/Coordinator/AnalyticsPromptCoordinator.swift b/RiotSwiftUI/Modules/AnalyticsPrompt/Coordinator/AnalyticsPromptCoordinator.swift index fb79b8df8..b4d9daf80 100644 --- a/RiotSwiftUI/Modules/AnalyticsPrompt/Coordinator/AnalyticsPromptCoordinator.swift +++ b/RiotSwiftUI/Modules/AnalyticsPrompt/Coordinator/AnalyticsPromptCoordinator.swift @@ -27,7 +27,7 @@ final class AnalyticsPromptCoordinator: Coordinator, Presentable { // MARK: Private private let parameters: AnalyticsPromptCoordinatorParameters - private let analyticsPromptHostingController: UIViewController + private let analyticsPromptHostingController: VectorHostingController private var _analyticsPromptViewModel: Any? fileprivate var analyticsPromptViewModel: AnalyticsPromptViewModel { @@ -59,6 +59,7 @@ final class AnalyticsPromptCoordinator: Coordinator, Presentable { let view = AnalyticsPrompt(viewModel: viewModel.context) _analyticsPromptViewModel = viewModel analyticsPromptHostingController = VectorHostingController(rootView: view) + analyticsPromptHostingController.isNavigationBarHidden = true } // MARK: - Public diff --git a/RiotSwiftUI/Modules/Onboarding/Celebration/Coordinator/OnboardingCelebrationCoordinator.swift b/RiotSwiftUI/Modules/Onboarding/Celebration/Coordinator/OnboardingCelebrationCoordinator.swift index 9f0ea9273..9db9439df 100644 --- a/RiotSwiftUI/Modules/Onboarding/Celebration/Coordinator/OnboardingCelebrationCoordinator.swift +++ b/RiotSwiftUI/Modules/Onboarding/Celebration/Coordinator/OnboardingCelebrationCoordinator.swift @@ -45,6 +45,7 @@ final class OnboardingCelebrationCoordinator: Coordinator, Presentable { onboardingCelebrationViewModel = viewModel onboardingCelebrationHostingController = VectorHostingController(rootView: view) onboardingCelebrationHostingController.enableNavigationBarScrollEdgeAppearance = true + onboardingCelebrationHostingController.isNavigationBarHidden = true } // MARK: - Public diff --git a/RiotSwiftUI/Modules/Onboarding/Congratulations/Coordinator/OnboardingCongratulationsCoordinator.swift b/RiotSwiftUI/Modules/Onboarding/Congratulations/Coordinator/OnboardingCongratulationsCoordinator.swift index 57cd09d5c..d2f23340e 100644 --- a/RiotSwiftUI/Modules/Onboarding/Congratulations/Coordinator/OnboardingCongratulationsCoordinator.swift +++ b/RiotSwiftUI/Modules/Onboarding/Congratulations/Coordinator/OnboardingCongratulationsCoordinator.swift @@ -58,6 +58,7 @@ final class OnboardingCongratulationsCoordinator: Coordinator, Presentable { onboardingCongratulationsViewModel = viewModel onboardingCongratulationsHostingController = VectorHostingController(rootView: view) onboardingCongratulationsHostingController.statusBarStyle = .lightContent + onboardingCongratulationsHostingController.isNavigationBarHidden = true } // MARK: - Public diff --git a/RiotSwiftUI/Modules/Onboarding/SplashScreen/Coordinator/OnboardingSplashScreenCoordinator.swift b/RiotSwiftUI/Modules/Onboarding/SplashScreen/Coordinator/OnboardingSplashScreenCoordinator.swift index 27c4b3dbc..669ac19cb 100644 --- a/RiotSwiftUI/Modules/Onboarding/SplashScreen/Coordinator/OnboardingSplashScreenCoordinator.swift +++ b/RiotSwiftUI/Modules/Onboarding/SplashScreen/Coordinator/OnboardingSplashScreenCoordinator.swift @@ -46,6 +46,7 @@ final class OnboardingSplashScreenCoordinator: OnboardingSplashScreenCoordinator onboardingSplashScreenViewModel = viewModel onboardingSplashScreenHostingController = VectorHostingController(rootView: view) onboardingSplashScreenHostingController.vc_removeBackTitle() + onboardingSplashScreenHostingController.isNavigationBarHidden = true indicatorPresenter = UserIndicatorTypePresenter(presentingViewController: onboardingSplashScreenHostingController) } diff --git a/RiotSwiftUI/Modules/UserSessions/Common/UserAgentParser.swift b/RiotSwiftUI/Modules/UserSessions/Common/UserAgentParser.swift index d4fe29466..2c0a10487 100644 --- a/RiotSwiftUI/Modules/UserSessions/Common/UserAgentParser.swift +++ b/RiotSwiftUI/Modules/UserSessions/Common/UserAgentParser.swift @@ -125,18 +125,28 @@ enum UserAgentParser { // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) ElementNightly/2022091301 Chrome/104.0.5112.102 Electron/20.1.1 Safari/537.36 private static func parseDesktop(_ userAgent: String) -> UserAgent { var deviceOS: String? - let browserName = browserName(for: userAgent) + let browserInfo = browserInfo(for: userAgent) if let deviceInfo = findFirstDeviceInfo(in: userAgent) { let deviceInfoComponents = deviceInfo.components(separatedBy: "; ") - deviceOS = deviceInfoComponents[safe: 1]?.hasPrefix("Android") == true ? deviceInfoComponents[safe: 1] : deviceInfoComponents.first + if deviceInfoComponents[safe: 1]?.hasPrefix("Android") == true { + deviceOS = deviceInfoComponents[safe: 1] + } else if deviceInfoComponents.first == "Macintosh" { + var osFull = deviceInfoComponents[safe: 1] + osFull = osFull?.replacingOccurrences(of: "Intel ", with: "") + osFull = osFull?.replacingOccurrences(of: "Mac OS X", with: "macOS") + osFull = osFull?.replacingOccurrences(of: "_", with: ".") + deviceOS = osFull + } else { + deviceOS = deviceInfoComponents.first + } } return UserAgent(deviceType: .desktop, - deviceModel: browserName, + deviceModel: nil, deviceOS: deviceOS, - clientName: nil, - clientVersion: nil) + clientName: browserInfo.name, + clientVersion: browserInfo.version) } // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 @@ -164,20 +174,30 @@ enum UserAgentParser { return nil } - private static func browserName(for userAgent: String) -> String? { + private static func browserInfo(for userAgent: String) -> (name: String?, version: String?) { let components = userAgent.components(separatedBy: " ") if components.last?.hasPrefix("Firefox") == true { - return "Firefox" - } else if components.last?.hasPrefix("Safari") == true - && components[safe:components.count - 2]?.hasPrefix("Mobile") == true { + let version = components.last?.components(separatedBy: "/").last + return ("Firefox", version) + } else if components.last?.hasPrefix("Safari") == true, + components[safe: components.count - 2]?.hasPrefix("Mobile") == true { // mobile browser - let possibleBrowserName = components[safe:components.count - 3]?.components(separatedBy: "/").first - return possibleBrowserName == "Version" ? "Safari" : possibleBrowserName - } else if components.last?.hasPrefix("Safari") == true && components[safe:components.count - 2]?.hasPrefix("Version") == true { - return "Safari" + let possibleBrowserComponents = components[safe: components.count - 3] + if possibleBrowserComponents?.hasPrefix("Version") == true { + let version = possibleBrowserComponents?.components(separatedBy: "/").last + return ("Safari", version) + } else { + let components = possibleBrowserComponents?.components(separatedBy: "/") + return (components?.first, components?.last) + } + } else if components.last?.hasPrefix("Safari") == true, components[safe: components.count - 2]?.hasPrefix("Version") == true { + let version = components[safe: components.count - 2]?.components(separatedBy: "/").last + return ("Safari", version) } else { // regular browser - return components[safe:components.count - 2]?.components(separatedBy: "/").first + let browserComponent = components[safe: components.count - 2] + let components = browserComponent?.components(separatedBy: "/") + return (components?.first, components?[safe: 1]) } } } diff --git a/RiotSwiftUI/Modules/UserSessions/Common/UserSessionInfo.swift b/RiotSwiftUI/Modules/UserSessions/Common/UserSessionInfo.swift index 5bfbe2332..79fe49ec2 100644 --- a/RiotSwiftUI/Modules/UserSessions/Common/UserSessionInfo.swift +++ b/RiotSwiftUI/Modules/UserSessions/Common/UserSessionInfo.swift @@ -58,8 +58,11 @@ struct UserSessionInfo: Identifiable { /// Last seen IP location let lastSeenIPLocation: String? - /// Device name - let deviceName: String? + /// Client name + let clientName: String? + + /// Client version + let clientVersion: String? /// True to indicate that session has been used under `inactiveSessionDurationTreshold` value let isActive: Bool diff --git a/RiotSwiftUI/Modules/UserSessions/Common/View/UserSessionCardView.swift b/RiotSwiftUI/Modules/UserSessions/Common/View/UserSessionCardView.swift index 212434309..8fa03b02c 100644 --- a/RiotSwiftUI/Modules/UserSessions/Common/View/UserSessionCardView.swift +++ b/RiotSwiftUI/Modules/UserSessions/Common/View/UserSessionCardView.swift @@ -150,7 +150,8 @@ struct UserSessionCardViewPreview: View { deviceModel: nil, deviceOS: "iOS 15.5", lastSeenIPLocation: nil, - deviceName: "My iPhone", + clientName: "Element", + clientVersion: "1.0.0", isActive: true, isCurrent: isCurrent) viewData = UserSessionCardViewData(sessionInfo: sessionInfo) diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/MockUserSessionDetailsScreenState.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/MockUserSessionDetailsScreenState.swift index 66fb5ad05..ea23cde61 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/MockUserSessionDetailsScreenState.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/MockUserSessionDetailsScreenState.swift @@ -53,7 +53,8 @@ enum MockUserSessionDetailsScreenState: MockScreenState, CaseIterable { deviceModel: nil, deviceOS: "iOS 15.5", lastSeenIPLocation: nil, - deviceName: "My iPhone", + clientName: "Element", + clientVersion: "1.0.0", isActive: true, isCurrent: true) case .sessionSectionOnly: @@ -69,7 +70,8 @@ enum MockUserSessionDetailsScreenState: MockScreenState, CaseIterable { deviceModel: nil, deviceOS: "Android 4.0", lastSeenIPLocation: nil, - deviceName: "My Phone", + clientName: "Element", + clientVersion: "1.0.0", isActive: true, isCurrent: false) } diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/Test/Unit/UserSessionDetailsViewModelTests.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/Test/Unit/UserSessionDetailsViewModelTests.swift index 66d3de41e..524dece67 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/Test/Unit/UserSessionDetailsViewModelTests.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/Test/Unit/UserSessionDetailsViewModelTests.swift @@ -113,7 +113,8 @@ class UserSessionDetailsViewModelTests: XCTestCase { deviceModel: String? = nil, deviceOS: String? = nil, lastSeenIPLocation: String? = nil, - deviceName: String? = nil, + clientName: String? = nil, + clientVersion: String? = nil, isActive: Bool = true, isCurrent: Bool = true) -> UserSessionInfo { UserSessionInfo(id: id, @@ -128,7 +129,8 @@ class UserSessionDetailsViewModelTests: XCTestCase { deviceModel: deviceModel, deviceOS: deviceOS, lastSeenIPLocation: lastSeenIPLocation, - deviceName: deviceName, + clientName: clientName, + clientVersion: clientVersion, isActive: isActive, isCurrent: isCurrent) } diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/UserSessionDetailsViewModel.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/UserSessionDetailsViewModel.swift index 41138c9e1..60732166f 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/UserSessionDetailsViewModel.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionDetails/UserSessionDetailsViewModel.swift @@ -93,6 +93,12 @@ class UserSessionDetailsViewModel: UserSessionDetailsViewModelType, UserSessionD deviceSectionItems.append(.init(title: VectorL10n.userSessionDetailsDeviceModel, value: model)) } + if sessionInfo.deviceType == .web, + let clientName = sessionInfo.clientName, + let clientVersion = sessionInfo.clientVersion { + deviceSectionItems.append(.init(title: VectorL10n.userSessionDetailsDeviceBrowser, + value: "\(clientName) \(clientVersion)")) + } if let deviceOS = sessionInfo.deviceOS { deviceSectionItems.append(.init(title: VectorL10n.userSessionDetailsDeviceOs, value: deviceOS)) diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/MockUserSessionOverviewScreenState.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/MockUserSessionOverviewScreenState.swift index aa505c244..ebf382ad7 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/MockUserSessionOverviewScreenState.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/MockUserSessionOverviewScreenState.swift @@ -60,7 +60,8 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable { deviceModel: nil, deviceOS: "iOS 15.5", lastSeenIPLocation: nil, - deviceName: "My iPhone", + clientName: "Element", + clientVersion: "1.0.0", isActive: true, isCurrent: true) service = MockUserSessionOverviewService() @@ -77,7 +78,8 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable { deviceModel: nil, deviceOS: "macOS 12.5.1", lastSeenIPLocation: nil, - deviceName: "My Mac", + clientName: "Electron", + clientVersion: "20.1.1", isActive: false, isCurrent: false) service = MockUserSessionOverviewService() @@ -94,7 +96,8 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable { deviceModel: nil, deviceOS: "macOS 12.5.1", lastSeenIPLocation: nil, - deviceName: "My Mac", + clientName: "My Mac", + clientVersion: "1.0.0", isActive: false, isCurrent: false) service = MockUserSessionOverviewService(pusherEnabled: enabled) @@ -111,7 +114,8 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable { deviceModel: nil, deviceOS: "macOS 12.5.1", lastSeenIPLocation: nil, - deviceName: "My Mac", + clientName: "My Mac", + clientVersion: "1.0.0", isActive: false, isCurrent: false) service = MockUserSessionOverviewService(pusherEnabled: true, remotelyTogglingPushersAvailable: false) diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Service/MatrixSDK/UserSessionOverviewService.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Service/MatrixSDK/UserSessionOverviewService.swift index 170e2ef2c..794a2e291 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Service/MatrixSDK/UserSessionOverviewService.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Service/MatrixSDK/UserSessionOverviewService.swift @@ -29,6 +29,7 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol { private let session: MXSession private let sessionInfo: UserSessionInfo private var pusher: MXPusher? + private var localNotificationSettings: [String: Any]? // MARK: - Setup @@ -37,19 +38,43 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol { self.sessionInfo = sessionInfo self.pusherEnabledSubject = CurrentValueSubject(nil) self.remotelyTogglingPushersAvailableSubject = CurrentValueSubject(false) - - checkServerVersions { [weak self] in - self?.checkPusher() + + self.localNotificationSettings = session.accountData.localNotificationSettingsForDevice(withId: sessionInfo.id) + + if let localNotificationSettings = localNotificationSettings, let isSilenced = localNotificationSettings[kMXAccountDataIsSilencedKey] as? Bool { + remotelyTogglingPushersAvailableSubject.send(true) + pusherEnabledSubject.send(!isSilenced) + } + + checkPusher { [weak self] in + guard self?.pusher != nil else { + return + } + + self?.checkServerVersions() } } // MARK: - UserSessionOverviewServiceProtocol func togglePushNotifications() { - guard let pusher = pusher, let enabled = pusher.enabled?.boolValue, self.remotelyTogglingPushersAvailableSubject.value else { + guard let pusher = pusher, let enabled = pusher.enabled?.boolValue else { + updateLocalNotification() return } - + + toggle(pusher, enabled: !enabled) + } + + // MARK: - Private + + private func toggle(_ pusher: MXPusher, enabled: Bool) { + guard self.remotelyTogglingPushersAvailableSubject.value else { + MXLog.warning("[UserSessionOverviewService] toggle pusher canceled: remotely toggling pushers not available") + return + } + + MXLog.debug("[UserSessionOverviewService] remotely toggling pusher") let data = pusher.data.jsonDictionary() as? [String: Any] ?? [:] self.session.matrixRestClient.setPusher(pushKey: pusher.pushkey, @@ -61,22 +86,36 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol { lang: pusher.lang, data: data, append: false, - enabled: !enabled) { [weak self] response in + enabled: enabled) { [weak self] response in guard let self = self else { return } switch response { case .success: self.checkPusher() case .failure(let error): - MXLog.warning("[UserSessionOverviewService] togglePushNotifications failed due to error: \(error)") - self.pusherEnabledSubject.send(enabled) + MXLog.warning("[UserSessionOverviewService] togglePusher failed due to error: \(error)") + self.pusherEnabledSubject.send(!enabled) } } } - - // MARK: - Private - private func checkServerVersions(_ completion: @escaping () -> Void) { + private func updateLocalNotification() { + guard var localNotificationSettings = localNotificationSettings, let isSilenced = localNotificationSettings[kMXAccountDataIsSilencedKey] as? Bool else { + MXLog.warning("[UserSessionOverviewService] updateLocalNotification canceled: \"\(kMXAccountDataIsSilencedKey)\" notification property not found") + return + } + + localNotificationSettings[kMXAccountDataIsSilencedKey] = !isSilenced + session.setAccountData(localNotificationSettings, forType: MXAccountData.localNotificationSettingsKeyForDevice(withId: sessionInfo.id)) { [weak self] in + self?.localNotificationSettings = localNotificationSettings + self?.pusherEnabledSubject.send(isSilenced) + } failure: { [weak self] error in + MXLog.warning("[UserSessionOverviewService] updateLocalNotification failed due to error: \(String(describing: error))") + self?.pusherEnabledSubject.send(!isSilenced) + } + } + + private func checkServerVersions() { session.supportedMatrixVersions { [weak self] response in switch response { case .success(let versions): @@ -84,11 +123,10 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol { case .failure(let error): MXLog.warning("[UserSessionOverviewService] checkServerVersions failed due to error: \(error)") } - completion() } } - private func checkPusher() { + private func checkPusher(_ completion: (() -> Void)? = nil) { session.matrixRestClient.pushers { [weak self] response in switch response { case .success(let pushers): @@ -96,6 +134,7 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol { case .failure(let error): MXLog.warning("[UserSessionOverviewService] checkPusher failed due to error: \(error)") } + completion?() } } diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Test/Unit/UserSessionOverviewViewModelTests.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Test/Unit/UserSessionOverviewViewModelTests.swift index debfffbb8..6f1859dd2 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Test/Unit/UserSessionOverviewViewModelTests.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionOverview/Test/Unit/UserSessionOverviewViewModelTests.swift @@ -92,13 +92,14 @@ class UserSessionOverviewViewModelTests: XCTestCase { isVerified: false, lastSeenIP: "10.0.0.10", lastSeenTimestamp: Date().timeIntervalSince1970 - 100, - applicationName: "Element", + applicationName: "Element iOS", applicationVersion: "1.9.7", applicationURL: nil, deviceModel: "iPhone XS", deviceOS: "iOS 15.5", lastSeenIPLocation: nil, - deviceName: "Mobile", + clientName: "Element", + clientVersion: "1.9.7", isActive: true, isCurrent: true) } diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift index 7ab1f5a04..a8d36cc4e 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift @@ -1,4 +1,4 @@ -// +// // Copyright 2022 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -44,7 +44,7 @@ class UserSessionsDataProvider: UserSessionsDataProviderProtocol { session.crypto.device(withDeviceId: deviceId, ofUser: userId) } - func accountData(for eventType: String) -> [AnyHashable : Any]? { + func accountData(for eventType: String) -> [AnyHashable: Any]? { session.accountData.accountData(forEventType: eventType) } } diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProviderProtocol.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProviderProtocol.swift index ca65e218e..e97310a40 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProviderProtocol.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProviderProtocol.swift @@ -1,4 +1,4 @@ -// +// // Copyright 2022 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsOverviewService.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsOverviewService.swift index a84cd7d44..273072ea7 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsOverviewService.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsOverviewService.swift @@ -143,7 +143,8 @@ extension UserSessionInfo { deviceModel: userAgent?.deviceModel, deviceOS: userAgent?.deviceOS, lastSeenIPLocation: nil, - deviceName: userAgent?.clientName, + clientName: userAgent?.clientName, + clientVersion: userAgent?.clientVersion, isActive: isActive, isCurrent: isCurrent) } diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/Mock/MockUserSessionsOverviewService.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/Mock/MockUserSessionsOverviewService.swift index c315d27fb..5a87dd27b 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/Mock/MockUserSessionsOverviewService.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/Mock/MockUserSessionsOverviewService.swift @@ -89,7 +89,8 @@ class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol { deviceModel: nil, deviceOS: "iOS 15.5", lastSeenIPLocation: nil, - deviceName: "My iPhone", + clientName: "Element", + clientVersion: "1.0.0", isActive: true, isCurrent: true) } @@ -107,7 +108,8 @@ class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol { deviceModel: nil, deviceOS: "macOS 12.5.1", lastSeenIPLocation: nil, - deviceName: "My Mac", + clientName: "Electron", + clientVersion: "20.0.0", isActive: active, isCurrent: false), UserSessionInfo(id: "2 verified: \(verified) active: \(active)", @@ -122,7 +124,8 @@ class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol { deviceModel: nil, deviceOS: "Windows 10", lastSeenIPLocation: nil, - deviceName: "My Windows", + clientName: "Firefox", + clientVersion: "39.0", isActive: active, isCurrent: false), UserSessionInfo(id: "3 verified: \(verified) active: \(active)", @@ -137,7 +140,8 @@ class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol { deviceModel: nil, deviceOS: "Android 4.0", lastSeenIPLocation: nil, - deviceName: "My Phone", + clientName: "Element", + clientVersion: "1.0.0", isActive: active, isCurrent: false)] } diff --git a/RiotTests/UserAgentParserTests.swift b/RiotTests/UserAgentParserTests.swift index d68306d67..e268deda6 100644 --- a/RiotTests/UserAgentParserTests.swift +++ b/RiotTests/UserAgentParserTests.swift @@ -121,15 +121,15 @@ class UserAgentParserTests: XCTestCase { let expected = [ UserAgent(deviceType: .desktop, - deviceModel: "Electron", - deviceOS: "Macintosh", - clientName: nil, - clientVersion: nil), + deviceModel: nil, + deviceOS: "macOS 10.15.7", + clientName: "Electron", + clientVersion: "20.1.1"), UserAgent(deviceType: .desktop, - deviceModel: "Electron", + deviceModel: nil, deviceOS: "Windows NT 10.0", - clientName: nil, - clientVersion: nil) + clientName: "Electron", + clientVersion: "20.1.1") ] XCTAssertEqual(userAgents, expected) @@ -147,30 +147,30 @@ class UserAgentParserTests: XCTestCase { let expected = [ UserAgent(deviceType: .web, - deviceModel: "Chrome", - deviceOS: "Macintosh", - clientName: nil, - clientVersion: nil), + deviceModel: nil, + deviceOS: "macOS 10.15.7", + clientName: "Chrome", + clientVersion: "104.0.5112.102"), UserAgent(deviceType: .web, - deviceModel: "Chrome", + deviceModel: nil, deviceOS: "Windows NT 10.0", - clientName: nil, - clientVersion: nil), + clientName: "Chrome", + clientVersion: "104.0.5112.102"), UserAgent(deviceType: .web, - deviceModel: "Firefox", - deviceOS: "Macintosh", - clientName: nil, - clientVersion: nil), + deviceModel: nil, + deviceOS: "macOS 10.10", + clientName: "Firefox", + clientVersion: "39.0"), UserAgent(deviceType: .web, - deviceModel: "Safari", - deviceOS: "Macintosh", - clientName: nil, - clientVersion: nil), + deviceModel: nil, + deviceOS: "macOS 10.10.2", + clientName: "Safari", + clientVersion: "8.0.3"), UserAgent(deviceType: .web, - deviceModel: "Chrome", + deviceModel: nil, deviceOS: "Android 9", - clientName: nil, - clientVersion: nil) + clientName: "Chrome", + clientVersion: "69.0.3497.100") ] XCTAssertEqual(userAgents, expected) @@ -181,7 +181,8 @@ class UserAgentParserTests: XCTestCase { "Element (iPhone X; OS 15.2; 3.00)", "Element/1.9.9; iOS", "Element/1.9.7 Android", - "Element/1.9.9; iOS " + "some random string", + "Element/1.9.9; iOS ", ] let userAgents = uaStrings.map { UserAgentParser.parse($0) } @@ -189,6 +190,7 @@ class UserAgentParserTests: XCTestCase { .unknown, .unknown, .unknown, + .unknown, UserAgent(deviceType: .mobile, deviceModel: nil, deviceOS: nil, diff --git a/changelog.d/6580.bugfix b/changelog.d/6580.bugfix deleted file mode 100644 index 1ca94a1df..000000000 --- a/changelog.d/6580.bugfix +++ /dev/null @@ -1 +0,0 @@ -Voiceover: Add labels to User Menu and My Spaces buttons on the All Chats view. diff --git a/changelog.d/6693.wip b/changelog.d/6693.wip deleted file mode 100644 index a50a16691..000000000 --- a/changelog.d/6693.wip +++ /dev/null @@ -1 +0,0 @@ -Device manager: User session details screen. diff --git a/changelog.d/6717.bugfix b/changelog.d/6717.bugfix deleted file mode 100644 index c3cc45ae3..000000000 --- a/changelog.d/6717.bugfix +++ /dev/null @@ -1 +0,0 @@ -Media: Avoid redundant reloads on media viewer. diff --git a/changelog.d/6723.bugfix b/changelog.d/6723.bugfix deleted file mode 100644 index 228ff2f47..000000000 --- a/changelog.d/6723.bugfix +++ /dev/null @@ -1 +0,0 @@ -Pass country code into MSISDN requests diff --git a/changelog.d/6742.change b/changelog.d/6742.change deleted file mode 100644 index 38aab166a..000000000 --- a/changelog.d/6742.change +++ /dev/null @@ -1 +0,0 @@ -Include concrete device model in user agent (PSG-754) diff --git a/changelog.d/6748.bugfix b/changelog.d/6748.bugfix deleted file mode 100644 index 0c9d08465..000000000 --- a/changelog.d/6748.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix render of links with both characters requiring percent encoding and markdown-like syntax diff --git a/changelog.d/6749.bugfix b/changelog.d/6749.bugfix deleted file mode 100644 index e84ee6f0c..000000000 --- a/changelog.d/6749.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix crash when scrolling chat list diff --git a/changelog.d/6753.wip b/changelog.d/6753.wip deleted file mode 100644 index a96560d05..000000000 --- a/changelog.d/6753.wip +++ /dev/null @@ -1 +0,0 @@ -Device manager: Session overview screen. diff --git a/changelog.d/6755.bugfix b/changelog.d/6755.bugfix deleted file mode 100644 index 3e1d8ee1d..000000000 --- a/changelog.d/6755.bugfix +++ /dev/null @@ -1 +0,0 @@ -App Layout: Unable to send message after filtering for room \ No newline at end of file diff --git a/changelog.d/6770.wip b/changelog.d/6770.wip deleted file mode 100644 index 89911c57c..000000000 --- a/changelog.d/6770.wip +++ /dev/null @@ -1 +0,0 @@ -Device Manager: Link current session to session overview. diff --git a/changelog.d/6778.bugfix b/changelog.d/6778.bugfix deleted file mode 100644 index 9721d8cff..000000000 --- a/changelog.d/6778.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix code block background colour diff --git a/changelog.d/6781.change b/changelog.d/6781.change deleted file mode 100644 index 7ff78b730..000000000 --- a/changelog.d/6781.change +++ /dev/null @@ -1 +0,0 @@ -CryptoV2: Manual device verification diff --git a/changelog.d/6787.change b/changelog.d/6787.change deleted file mode 100644 index b4defa9d7..000000000 --- a/changelog.d/6787.change +++ /dev/null @@ -1 +0,0 @@ -User sessions: Add support for MSC3881 diff --git a/changelog.d/6797.change b/changelog.d/6797.change new file mode 100644 index 000000000..bf6ad3dce --- /dev/null +++ b/changelog.d/6797.change @@ -0,0 +1 @@ +Display push toggle for sessions with m.local_notification_settings. events in account_data diff --git a/changelog.d/pr-6757.build b/changelog.d/pr-6757.build deleted file mode 100644 index e84ee6f0c..000000000 --- a/changelog.d/pr-6757.build +++ /dev/null @@ -1 +0,0 @@ -Fix crash when scrolling chat list diff --git a/changelog.d/pr-6766.change b/changelog.d/pr-6766.change deleted file mode 100644 index 3f5ff2693..000000000 --- a/changelog.d/pr-6766.change +++ /dev/null @@ -1 +0,0 @@ -UserSessions: Extended device information (PSG-772). diff --git a/changelog.d/pr-6780.change b/changelog.d/pr-6780.change deleted file mode 100644 index a50689634..000000000 --- a/changelog.d/pr-6780.change +++ /dev/null @@ -1 +0,0 @@ -Settings: Add labs flags for new session manager (PSG-792, PSG-799).