diff --git a/CHANGES.rst b/CHANGES.rst index 39ca3b388..f79a5ff3c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changes to be released in next version * 🙌 Improvements + * Settings: The notifications toggle no longer detects the system's "Deliver Quietly" configuration as disabled (#2368). + * Settings: Adds a link to open the Settings app to quickly configure app notifications. + * VoIP: Text & icon changes on call tiles (#4642). + * Voice messages: Stop recording and go into locked mode when the application becomes inactive (#4656) + * Voice messages: Allow voice message playback control from the iOS lock screen and control center (#4655) + * Voice messages: Improve audio recording quality + * Voice messages: Remove labs setting and enable them by default + * Room: Remove the green border from direct message room avatars (#4520). + * VoIP: Additional changes on call tiles (#4642). * SSO: Stable ids for MSC 2858 (#4362). 🐛 Bugfix @@ -16,12 +25,40 @@ Changes to be released in next version 🗣 Translations * +🧱 Build + * Add a script to initialize quickly and easily the project. + +Others + * Docs: Add reference to AppIdentifiers.xcconfig in INSTALL.md + +Changes in 1.4.9 (2021-08-03) +================================================= + +✨ Features + * + +🙌 Improvements + * Voice Messages: Increased recording state microphone icon size + * Voice Messages: Using "Voice message - MM.dd.yyyy HH.mm.ss" as the format for recorded audio files + +🐛 Bugfix + * Voice Messages: Fixed race conditions when sending voice messages (#4641) + +⚠️ API Changes + * + +🗣 Translations + * + 🧱 Build * Others * +Improvements: + + Changes in 1.4.8 (2021-07-29) ================================================= diff --git a/Config/AppIdentifiers.xcconfig b/Config/AppIdentifiers.xcconfig index c21273565..87a13956f 100644 --- a/Config/AppIdentifiers.xcconfig +++ b/Config/AppIdentifiers.xcconfig @@ -22,8 +22,8 @@ APPLICATION_GROUP_IDENTIFIER = group.im.vector APPLICATION_SCHEME = element // Version -MARKETING_VERSION = 1.4.9 -CURRENT_PROJECT_VERSION = 1.4.9 +MARKETING_VERSION = 1.4.10 +CURRENT_PROJECT_VERSION = 1.4.10 // Team diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index ed613fa9b..85f25282a 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -309,10 +309,6 @@ final class BuildSettings: NSObject { static let messageDetailsAllowCopyMedia: Bool = true static let messageDetailsAllowPasteMedia: Bool = true - // MARK: - Voice Message - - static let voiceMessagesEnabled = false - // MARK: - Notifications static let decryptNotificationsByDefault: Bool = true diff --git a/INSTALL.md b/INSTALL.md index ca983508a..b10f6c609 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -77,7 +77,14 @@ Every time you change the `$matrixKitVersion` variable in the `Podfile`, you hav ## Build -## Generate Xcode project +### Configure project + +You may need to change the bundle identifier and app group identifier to be unique to get Xcode to build the app. Make sure to change the bundle identifier, application group identifier and app name in the `Config/AppIdentifiers.xcconfig` file to your new identifiers. + +More advanced build configuration can be found in the `project.yml` file and each target has a `target.yml` file in its respective folder. + + +### Generate Xcode project In order to get rid of git conflicts, the `Riot.xcodeproj` is not pushed into the git repository anymore but generated using `XcodeGen`. To generate the `xcodeproj` file simply run the following command line from the root folder : @@ -117,12 +124,14 @@ $ open Riot.xcworkspace **Note**: If you have multiple Xcode versions installed don't forget to use the right version of Command Line Tools when you are building the app. To check the Command Line Tools version go to `Xcode > Preferences > Locations > Command Line Tools` and check that the displayed version match your Xcode version. -### Configure project -You may need to change the bundle identifier and app group identifier to be unique to get Xcode to build the app. Make sure to change the bundle identifier, application group identifier and app name in the `project.yml` file to your new identifiers. +### Generate the project in one line without effort -Each target has its own YAML file in the folder Targets folder. +If you want to generate the project easily and quickly, there is a local script called `setup_project.sh` that creates the `xcodeproj` and `xcworkspace` with all source files and dependencies with commands described before. It automatically selects the right dependencies based on your local Git branch or your Podfile local modifications. All you have to do is to go in the project root folder and run the script: +``` +$ ./setup_project.sh +``` ## Generate IPA diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Contents.json b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Contents.json new file mode 100644 index 000000000..20f5e66df --- /dev/null +++ b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Video.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Video@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Video@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video.png b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video.png new file mode 100644 index 000000000..e3258d174 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video@2x.png b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video@2x.png new file mode 100644 index 000000000..4bdc782a8 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video@3x.png b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video@3x.png new file mode 100644 index 000000000..f27d51f50 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_missed_video.imageset/Video@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Contents.json b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Contents.json new file mode 100644 index 000000000..5e3dda044 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Voice call.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Voice call@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Voice call@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call.png b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call.png new file mode 100644 index 000000000..f24b41a57 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call@2x.png b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call@2x.png new file mode 100644 index 000000000..4a900f161 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call@3x.png b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call@3x.png new file mode 100644 index 000000000..9613162d2 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_missed_voice.imageset/Voice call@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24.png b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24.png deleted file mode 100644 index aa4d94502..000000000 Binary files a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24@2x.png b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24@2x.png deleted file mode 100644 index b359725c4..000000000 Binary files a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24@2x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24@3x.png b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24@3x.png deleted file mode 100644 index 2c487f4aa..000000000 Binary files a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/24@3x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Contents.json index 453722c5e..044af1b2e 100644 --- a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "24.png", + "filename" : "Video.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "24@2x.png", + "filename" : "Video@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "24@3x.png", + "filename" : "Video@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video.png b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video.png new file mode 100644 index 000000000..b43277beb Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video@2x.png b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video@2x.png new file mode 100644 index 000000000..75db1057d Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video@3x.png b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video@3x.png new file mode 100644 index 000000000..8f2acb229 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Call/call_video_icon.imageset/Video@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording.png b/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording.png index 8fa147c18..5972e1272 100644 Binary files a/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording.png and b/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording.png differ diff --git a/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@2x.png b/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@2x.png index f00a46204..802268ba0 100644 Binary files a/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@2x.png and b/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@3x.png b/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@3x.png index 7fdf91c21..b1def35e1 100644 Binary files a/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@3x.png and b/Riot/Assets/Images.xcassets/Room/VoiceMessages/voice_message_record_button_recording.imageset/voice_message_record_button_recording@3x.png differ diff --git a/Riot/Assets/bg.lproj/Vector.strings b/Riot/Assets/bg.lproj/Vector.strings index 04a669524..854c51242 100644 --- a/Riot/Assets/bg.lproj/Vector.strings +++ b/Riot/Assets/bg.lproj/Vector.strings @@ -298,7 +298,6 @@ "settings_global_settings_info" = "Глобални настройки на известия са налични на Вашия %@ уеб клиент"; "settings_pin_rooms_with_missed_notif" = "Закачане на стаи с пропуснати известия"; "settings_pin_rooms_with_unread" = "Закачане на стаи с непрочетени съобщения"; -"settings_on_denied_notification" = "Известията са отказани за %@. Моля, включете ги в настройките на устройството"; "settings_enable_callkit" = "Интегрирани разговори"; "settings_callkit_info" = "Получаване на входящи повиквания при заключен екран. Показване на Element разговори в историята на системата. Ако iCloud е включен, историята на разговорите се споделя с Apple."; "settings_ui_language" = "Език"; diff --git a/Riot/Assets/ca.lproj/Vector.strings b/Riot/Assets/ca.lproj/Vector.strings index 75c7c7fe2..d690d7efe 100644 --- a/Riot/Assets/ca.lproj/Vector.strings +++ b/Riot/Assets/ca.lproj/Vector.strings @@ -295,7 +295,6 @@ "settings_global_settings_info" = "Els paràmetres de notificació globals estan disponibles al teu client web %@"; "settings_pin_rooms_with_missed_notif" = "Fixa sales amb notificacions pendents"; "settings_pin_rooms_with_unread" = "Fixa sales amb missatges pendents"; -"settings_on_denied_notification" = "%@ no permet notificacions, si us plau activa-les en els ajustos del teu dispositiu"; "settings_enable_callkit" = "Trucades integrades"; "settings_callkit_info" = "Rep les trucades entrants a la pantalla de bloqueig. Consulta les trucades de Element a l'historial de trucades del sistema. Si està habilitat iCloud, aquest historial de trucades es compartirà amb Apple."; "settings_ui_language" = "Llenguatge"; diff --git a/Riot/Assets/cy.lproj/Vector.strings b/Riot/Assets/cy.lproj/Vector.strings index 868341391..36b72d7b5 100644 --- a/Riot/Assets/cy.lproj/Vector.strings +++ b/Riot/Assets/cy.lproj/Vector.strings @@ -373,7 +373,6 @@ "settings_global_settings_info" = "Mae gosodiadau hysbysu eang ar gael ar eich cleient %@ gwe"; "settings_pin_rooms_with_missed_notif" = "Pinio ystafelloedd gyda hysbysiadau heb eu gweld"; "settings_pin_rooms_with_unread" = "Pinio ystafelloedd gyda negeseuon heb eu darllen"; -"settings_on_denied_notification" = "Gwrthodir hysbysiadau i %@, caniatewch nhw yn eich gosodiadau dyfais"; "settings_enable_callkit" = "Galw integredig"; "settings_callkit_info" = "Derbyn galwadau sy'n dod i mewn ar eich sgrin clo. Gwelwch eich galwadau Element yn hanes galwadau'r system. Os yw iCloud wedi'i alluogi, bydd yr hanes galw hwn yn cael ei rannu gydag Apple."; "settings_calls_stun_server_fallback_button" = "Caniatáu gweinydd cymorth galw wrth gefn"; diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index df37ce7c2..32aabeaf5 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -316,7 +316,6 @@ "settings_global_settings_info" = "Globale Benachrichtigungseinstellungen sind auf deinem %@ web-Client verfügbar"; "settings_pin_rooms_with_missed_notif" = "Pinnen von Räumen mit verpassten Benachrichtigungen"; "settings_pin_rooms_with_unread" = "Pinnen von Räumen mit ungelesenen Nachrichten"; -"settings_on_denied_notification" = "Benachrichtigungen verboten für %@, bitte in den Geräte-Einstellungen erlauben"; "settings_contacts_discover_matrix_users" = "Entdecke andere Benutzer mittels E-Mail-Adressen oder Telefonnummern"; "settings_labs_e2e_encryption_prompt_message" = "Zum Fertigstellen der Verschlüsselung bitte neu anmelden."; "settings_third_party_notices" = "Anmerkungen von Dritten"; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 01a6f2ef1..e46028bc4 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -492,11 +492,13 @@ Tap the + to start adding people."; "settings_security" = "SECURITY"; "settings_enable_push_notif" = "Notifications on this device"; +"settings_device_notifications" = "Device notifications"; "settings_show_decrypted_content" = "Show decrypted content"; "settings_global_settings_info" = "Global notification settings are available on your %@ web client"; "settings_pin_rooms_with_missed_notif" = "Pin rooms with missed notifications"; "settings_pin_rooms_with_unread" = "Pin rooms with unread messages"; -"settings_on_denied_notification" = "Notifications are denied for %@, please allow them in your device settings"; +"settings_notifications_disabled_alert_title" = "Notifications disabled"; +"settings_notifications_disabled_alert_message" = "To enable notifications, go to your device settings."; //"settings_enable_all_notif" = "Enable all notifications"; //"settings_messages_my_display_name" = "Msg containing my display name"; //"settings_messages_my_user_name" = "Msg containing my user name"; @@ -844,14 +846,17 @@ Tap the + to start adding people."; "event_formatter_rerequest_keys_part1_link" = "Re-request encryption keys"; "event_formatter_rerequest_keys_part2" = " from your other sessions."; "event_formatter_message_edited_mention" = "(edited)"; -"event_formatter_call_voice" = "Voice call"; -"event_formatter_call_video" = "Video call"; "event_formatter_call_connecting" = "Connecting…"; "event_formatter_call_ringing" = "Ringing…"; -"event_formatter_call_has_ended" = "Ended %@"; -"event_formatter_call_you_currently_in" = "Active call"; -"event_formatter_call_you_declined" = "You declined this call"; -"event_formatter_call_you_missed" = "You missed this call"; +"event_formatter_call_has_ended" = "Call ended"; +"event_formatter_call_has_ended_with_time" = "Call ended • %@"; +"event_formatter_call_incoming_voice" = "Incoming voice call"; +"event_formatter_call_incoming_video" = "Incoming video call"; +"event_formatter_call_active_voice" = "Active voice call"; +"event_formatter_call_active_video" = "Active video call"; +"event_formatter_call_you_declined" = "Call declined"; +"event_formatter_call_missed_voice" = "Missed voice call"; +"event_formatter_call_missed_video" = "Missed video call"; "event_formatter_call_connection_failed" = "Connection failed"; "event_formatter_call_back" = "Call back"; "event_formatter_call_decline" = "Decline"; @@ -1687,3 +1692,4 @@ Tap the + to start adding people."; "voice_message_release_to_send" = "Hold to record, release to send"; "voice_message_remaining_recording_time" = "%@s left"; "voice_message_stop_locked_mode_recording" = "Tap on your recording to stop or listen"; +"voice_message_lock_screen_placeholder" = "Voice message"; diff --git a/Riot/Assets/eo.lproj/Vector.strings b/Riot/Assets/eo.lproj/Vector.strings index bf7636ecb..5fb7c6707 100644 --- a/Riot/Assets/eo.lproj/Vector.strings +++ b/Riot/Assets/eo.lproj/Vector.strings @@ -975,7 +975,6 @@ "settings_calls_stun_server_fallback_description" = "Permesi repaŝan servilon %@ asistan je vokoj, kiam la hejmservilo ne provizas servilon (via IP-adreso ne doniĝus dum voko)."; "settings_calls_stun_server_fallback_button" = "Permesi repaŝan servilon asistan je vokoj"; "settings_callkit_info" = "Ricevi vokpetojn ĉe via ŝlosa ekrano. Vidi viajn vokojn de Element ĉe la sistema vokhistorio. Se iCloud estas ŝaltita, la vokhistorio doniĝas ankaŭ al Apple."; -"settings_on_denied_notification" = "Sciigo por %s estas malŝaltitaj, bonvole permesu ilin per la agordoj de via aparato"; "settings_pin_rooms_with_unread" = "Alpingli ĉambrojn kun nelegitaj mesaĝoj"; "settings_pin_rooms_with_missed_notif" = "Alpinigli ĉambrojn kun nerimarkitaj sciigoj"; "settings_show_decrypted_content" = "Montri malĉifritajn enhavojn"; diff --git a/Riot/Assets/es.lproj/Vector.strings b/Riot/Assets/es.lproj/Vector.strings index 216722a92..bcb6247d5 100644 --- a/Riot/Assets/es.lproj/Vector.strings +++ b/Riot/Assets/es.lproj/Vector.strings @@ -321,7 +321,6 @@ "settings_global_settings_info" = "Los ajustes de notificación globales están disponibles en tu cliente web %@"; "settings_pin_rooms_with_missed_notif" = "Fijar salas con notificaciones pendientes"; "settings_pin_rooms_with_unread" = "Fijar salas con mensajes no leídos"; -"settings_on_denied_notification" = "Las notificaciones están denegadas para %@, por favor habilita notificaciones en los ajustes de tu dispositivo"; "settings_enable_callkit" = "Integración de llamadas"; "settings_callkit_info" = "Recibe llamadas entrantes en tu pantalla de bloqueo. Ve tus llamadas de Element en el historial de llamadas del sistema. Si iCloud está habilitado, este historial de llamadas se compartirá con Apple."; "settings_ui_language" = "Idioma"; diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index 1349ade0d..7deb01246 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -497,7 +497,6 @@ "settings_global_settings_info" = "Üldised teavituste seadistused leiduvad sinu %@ veebikliendis"; "settings_pin_rooms_with_missed_notif" = "Klammerda jututoad, kus leidub lugemata teavitusi"; "settings_pin_rooms_with_unread" = "Klammerda jututoad, kus leidub lugemata sõnumeid"; -"settings_on_denied_notification" = "Teavitused on %@ jaoks keelatud, palun luba nad oma seadme seadistustes"; "settings_enable_callkit" = "Lõimitud helistamine"; "settings_callkit_info" = "Vasta kõnedele lukustuskuvalt. Vaata Element'i kõnesid süsteemi kõnelogist. Kui iCloud on kasutusel, siis kõnede ajalugu jagatakse Applega."; "settings_calls_stun_server_fallback_button" = "Kasuta kõnehõlbustusserverit"; @@ -1361,7 +1360,7 @@ // Room Notification Settings "room_notifs_settings_notify_me_for" = "Teavita mind"; "room_details_notifs" = "Teavitused"; -"voice_message_stop_locked_mode_recording" = "Salvestuse peatamiseks ja taasesituseks vajuta lainekese nuppu"; +"voice_message_stop_locked_mode_recording" = "Salvestuse peatamiseks ja taasesituseks vajuta salvestuse vaadet"; "voice_message_remaining_recording_time" = "salvestusaega jäänud %@s"; // Mark: - Voice Messages diff --git a/Riot/Assets/eu.lproj/Vector.strings b/Riot/Assets/eu.lproj/Vector.strings index 9278d4a1d..b3651544f 100644 --- a/Riot/Assets/eu.lproj/Vector.strings +++ b/Riot/Assets/eu.lproj/Vector.strings @@ -396,7 +396,6 @@ "room_participants_remove_third_party_invite_msg" = "Hirugarrengoen gonbidapenak kentzea ez da onartzen APIa ez dagoen bitartean"; "settings_sign_out_e2e_warn" = "Zure muturretik muturrerako zifratze gakoak galduko dituzu. Horrek esan nahi du ezin izango dituzula mezu zaharrak gehiago irakurri zifratutako geletan gailu honetatik."; "settings_global_settings_info" = "Jakinarazpen orokorren ezarpenak eskuragarri daude zure %@ web bezeroan"; -"settings_on_denied_notification" = "Jakinarazpenak ukatu dira %@(e)n, baimendu zure gailuaren ezarpenetan"; "room_details_history_section_prompt_msg" = "Historiala nork irakurri dezakeen aldatzea gelak honetara aurrerantzean bidalitako mezuei besterik ez zaie aplikatuko. Badagoen historialaren ikusgaitasuna ez da aldatuko."; // Call "call_incoming_voice_prompt" = "%@ erabiltzailearen deia jasotzen"; diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index 2f632e10c..d7734038b 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -278,7 +278,6 @@ "settings_global_settings_info" = "Les paramètres de notification globaux sont disponibles sur votre client web %@"; "settings_pin_rooms_with_missed_notif" = "Épingler les salons avec des notifications non lues"; "settings_pin_rooms_with_unread" = "Épingler les salons avec des messages non lus"; -"settings_on_denied_notification" = "Les notifications sont refusées pour %@, merci de les autoriser dans les paramètres de votre appareil"; "settings_unignore_user" = "Afficher tous les messages de %@ ?"; "settings_contacts_discover_matrix_users" = "Utiliser un e-mail ou un numéro de téléphone pour retrouver des utilisateurs"; "settings_contacts_phonebook_country" = "Pays pour le répertoire téléphonique"; diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index 3e991b86a..da19f6cb8 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -311,7 +311,6 @@ "settings_global_settings_info" = "Globális értesítési beállításokat a webes kliensedben találod: %@"; "settings_pin_rooms_with_missed_notif" = "Szobák kitűzése elszalasztott értesítésekkel"; "settings_pin_rooms_with_unread" = "Szobák kitűzése olvasatlan üzenetekkel"; -"settings_on_denied_notification" = "Az értesítések tiltva vannak ehhez: %@, kérlek engedélyezd az eszköz beállításaiban"; "settings_enable_callkit" = "Beépített hívás"; "settings_callkit_info" = "Hívások fogadása a zárolt képernyőn. Element hívások megjelenítése a rendszer hívás naplójában. Ha az iCloud engedélyezett akkor a hívásnapló az Apple-el megosztásra kerül."; "settings_ui_language" = "Nyelv"; @@ -1424,7 +1423,7 @@ // Room Notification Settings "room_notifs_settings_notify_me_for" = "Értesítés ezért:"; "room_details_notifs" = "Értesítések"; -"voice_message_stop_locked_mode_recording" = "Megállításhoz és visszajátszáshoz koppints a hullámhosszra"; +"voice_message_stop_locked_mode_recording" = "Megállításhoz és visszajátszáshoz koppints a felvételre"; "voice_message_remaining_recording_time" = "%@s távozott"; // Mark: - Voice Messages diff --git a/Riot/Assets/is.lproj/Vector.strings b/Riot/Assets/is.lproj/Vector.strings index bd4577fda..a34e891ad 100644 --- a/Riot/Assets/is.lproj/Vector.strings +++ b/Riot/Assets/is.lproj/Vector.strings @@ -442,7 +442,6 @@ "settings_fail_to_update_profile" = "Mistókst að uppfæra notandasnið"; "settings_pin_rooms_with_missed_notif" = "Festa spjallrásir með óskoðuðum tilkynningum"; "settings_pin_rooms_with_unread" = "Festa spjallrásir með ólesnum skilaboðum"; -"settings_on_denied_notification" = "Tilkynningum er hafnað fyrir %@, leyfðu þær í stillingum tækisins"; "settings_ui_theme_picker_message" = "\"Sjálfvirkt\" notar \"Umsnúa litum\" stillingar tækisins"; "settings_contacts_discover_matrix_users" = "Notaðu tölvupóstföng og símanúmer til að finna notendur"; "settings_labs_e2e_encryption_prompt_message" = "Til að ljúka við uppsetningu á dulritun verðurðu að skrá þig inn aftur."; diff --git a/Riot/Assets/it.lproj/InfoPlist.strings b/Riot/Assets/it.lproj/InfoPlist.strings index d46035a77..8e49c5075 100644 --- a/Riot/Assets/it.lproj/InfoPlist.strings +++ b/Riot/Assets/it.lproj/InfoPlist.strings @@ -1,7 +1,7 @@ // Permissions usage explanations "NSCameraUsageDescription" = "La fotocamera viene utilizzata per scattare fotografie, registrare video ed eseguire videochiamate."; "NSPhotoLibraryUsageDescription" = "La libreria fotografica viene utilizzata per inviare foto e video."; -"NSMicrophoneUsageDescription" = "Il microfono viene utilizzato per registrare video ed effettuare chiamate."; +"NSMicrophoneUsageDescription" = "Element ha bisogno di accedere al microfono per effettuare e ricevere chiamate, registrare video e messaggi vocali."; "NSContactsUsageDescription" = "Per scoprire i contatti che già usano Matrix, Element può inviare gli indirizzi email e i numeri di telefono della tua rubrica al server identità che hai scelto. Se supportato, viene fatto un hash dei dati personali prima dell'invio - controlla la politica sulla privacy del tuo server di identità per maggiori informazioni."; "NSCalendarsUsageDescription" = "Vedi le tue riunioni programmate nell'app."; "NSFaceIDUsageDescription" = "Face ID viene usato per accedere all'app."; diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index 0a7d64e0e..18d8dd011 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -327,7 +327,6 @@ "settings_global_settings_info" = "Le impostazioni di notifica avanzate sono disponibili nel tuo %@ web client"; "settings_pin_rooms_with_missed_notif" = "Segna le stanze con notifiche perse"; "settings_pin_rooms_with_unread" = "Segna le stanze con messaggi non letti"; -"settings_on_denied_notification" = "Le notifiche non sono permesse per %@, abilitale nelle impostazioni del tuo dispositivo"; "settings_enable_callkit" = "Chiamate integrate"; "settings_callkit_info" = "Ricevi le chiamate in arrivo sul blocca schermo. Mostra le chiamate Element nella cronologia di chiamate del dispositivo. Se iCloud è attivo, questa cronologia sarà condivisa con Apple."; "settings_ui_language" = "Lingua"; @@ -1395,3 +1394,10 @@ // Room Notification Settings "room_notifs_settings_notify_me_for" = "Inviami notifiche per"; "room_details_notifs" = "Notifiche"; +"voice_message_stop_locked_mode_recording" = "Tocca la registrazione per fermare o ascoltare"; +"voice_message_remaining_recording_time" = "%@s rimasti"; + +// Mark: - Voice Messages + +"voice_message_release_to_send" = "Tieni premuto per registrare, rilascia per inviare"; +"settings_labs_voice_messages" = "Messaggi vocali"; diff --git a/Riot/Assets/ja.lproj/Vector.strings b/Riot/Assets/ja.lproj/Vector.strings index 6ccb42bc3..2ca4ac3b8 100644 --- a/Riot/Assets/ja.lproj/Vector.strings +++ b/Riot/Assets/ja.lproj/Vector.strings @@ -289,7 +289,6 @@ "settings_show_decrypted_content" = "復号化された文章を表示"; "settings_global_settings_info" = "あなたの %@ webクライアント上で、全体の通知設定が可能です"; "settings_pin_rooms_with_missed_notif" = "通知の届かなかった部屋をピン止めする"; -"settings_on_denied_notification" = "%@で通知されないように設定されています。あなたの端末設定で許可してください"; "settings_callkit_info" = "画面がロックされているときに着信がありました。Elementの着信はシステムの通話履歴で確認できます。 iCloudが有効になっている場合、この通話履歴はAppleと共有されます。"; "settings_ui_language" = "言語"; "settings_ui_theme" = "外観"; diff --git a/Riot/Assets/kab.lproj/Vector.strings b/Riot/Assets/kab.lproj/Vector.strings index 1fa265a06..58166fb8f 100644 --- a/Riot/Assets/kab.lproj/Vector.strings +++ b/Riot/Assets/kab.lproj/Vector.strings @@ -1305,7 +1305,6 @@ "security_settings_blacklist_unverified_devices" = "Ɣur-k·m ad tazneḍ akk iznan ɣer tɣimiyin ur nettwattkal ara"; "security_settings_crypto_sessions_description_2" = "MA yella ur tessineḍ ara anekcum, senfel awal-ik·imuffir, rnu wennez aḥraz aɣellsan."; "settings_send_crash_report" = "Azen tura tura isefka yerrẓen & useqdec"; -"settings_on_denied_notification" = "Ttwagin yilɣa i %@, ttxil-k·m sireg-iten deg yiɣewaren n yibenk-inek·inem"; "settings_global_settings_info" = "Iɣewwaren n yilɣa imatuyen llan ɣef umsaɣ-inek·inem web %@"; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Ulac aqeddac n timagit i yettusbadun, ihi ur tezmireḍ ara ad tebduḍ adiwenni akked unermis isseqdacen imayl."; "contacts_address_book_permission_required" = "Ttusrant tsirag i unekcum ɣer yinermisen idiganen"; diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 744f54033..418c89a9c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -857,7 +857,6 @@ "room_details_photo_for_dm" = "Bilde"; "room_details_photo" = "Rombilde"; "settings_flair" = "Vis kobling hvor tillatt"; -"settings_on_denied_notification" = "Varsler er ikke tillat for %@, vennligst tillat dem i enhetens innstillinger"; "settings_pin_rooms_with_missed_notif" = "Fest rom med tapte varsler"; "room_info_list_several_members" = "%@ medlemmer"; "pin_protection_not_allowed_pin" = "Av sikkerhetsårsaker er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index 5c7a00cae..a7ba063a6 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -289,7 +289,6 @@ "settings_global_settings_info" = "Globale meldingsinstellingen zijn beschikbaar op uw %@-webcliënt"; "settings_pin_rooms_with_missed_notif" = "Gesprekken met gemiste meldingen vastprikken"; "settings_pin_rooms_with_unread" = "Gesprekken met ongelezen berichten vastprikken"; -"settings_on_denied_notification" = "Meldingen worden geweigerd voor %@, sta ze toe in uw apparaatinstellingen"; //"settings_enable_all_notif" = "Alle notificaties aanzetten"; //"settings_messages_my_display_name" = "Bericht dat mijn naam bevat"; //"settings_messages_my_user_name" = "Bericht dat mijn gebruikersnaam bevat"; diff --git a/Riot/Assets/pl.lproj/Vector.strings b/Riot/Assets/pl.lproj/Vector.strings index 9fc3c92a9..96af5fb0b 100644 --- a/Riot/Assets/pl.lproj/Vector.strings +++ b/Riot/Assets/pl.lproj/Vector.strings @@ -503,7 +503,6 @@ "settings_key_backup" = "KOPIA ZAPASOWA KLUCZY"; "settings_enable_push_notif" = "Powiadomienia na tym urządzeniu"; "settings_global_settings_info" = "Globalne i szczegółowe ustawienia powiadomień są dostępne z poziomu klienta webowego: %@"; -"settings_on_denied_notification" = "Powiadomienia dla aplikacji %@ są wyłączone. Proszę zezwól na nie w ustawieniach urządzenia"; "settings_callkit_info" = "Odbieraj połączenia przychodzące na ekranie blokady. Zobacz swoje połęczenia Element w historii połączeń w systemie. Jeśli usługa iCloud jest włączona, historia połączeń zostanie udostępniona Apple."; "settings_ui_theme_picker_message" = "\"Auto\" używa ustawienia \"Odwróć kolory\" Twojego urządzenia"; "close" = "Zamknij"; diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index 626dbaa96..3c1086f35 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -317,7 +317,6 @@ "settings_enable_push_notif" = "Notificações neste dispositivo"; "settings_show_decrypted_content" = "Mostrar conteúdo decriptado"; "settings_global_settings_info" = "Configurações de notificação globais estão disponíveis em seu cliente web %@"; -"settings_on_denied_notification" = "Notificações são negadas para %@, por favor permita-as nas configurações de seu dispositivo"; "settings_enable_callkit" = "Chamamento integrado"; "settings_callkit_info" = "Receba chamadas chegando em sua tela de bloqueio. Veja suas chamadas Element no histórico de chamadas do sistema. Se iCloud está ativado, este histórico de chamadas vai ser compartilhado com Apple."; "settings_ui_language" = "Língua"; @@ -1393,7 +1392,7 @@ "room_notifs_settings_notify_me_for" = "Notifique-me para"; "room_details_notifs" = "Notificações"; "voice_message_remaining_recording_time" = "%@s restando"; -"voice_message_stop_locked_mode_recording" = "Toque no comprimento de onda para parar e dar playback"; +"voice_message_stop_locked_mode_recording" = "Toque em sua gravação para parar ou escutar"; // Mark: - Voice Messages diff --git a/Riot/Assets/ru.lproj/Vector.strings b/Riot/Assets/ru.lproj/Vector.strings index 0ad6dbef6..0091c576a 100644 --- a/Riot/Assets/ru.lproj/Vector.strings +++ b/Riot/Assets/ru.lproj/Vector.strings @@ -259,7 +259,6 @@ "settings_fail_to_update_profile" = "Не удалось обновить профиль"; "settings_enable_push_notif" = "Уведомления на этом устройстве"; "settings_global_settings_info" = "Глобальные настройки уведомлений доступны в вашем %@ веб-клиенте"; -"settings_on_denied_notification" = "Уведомления для %@ запрещены, пожалуйста, разрешите их в настройках вашего устройства"; "settings_ui_language" = "Язык"; "settings_unignore_user" = "Показать все сообщения от %@?"; "settings_labs_e2e_encryption" = "Сквозное шифрование"; diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 295c8a932..7a6eb2f8c 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -493,7 +493,6 @@ "settings_sign_out_e2e_warn" = "Do të humbni kyçet tuaj të fshehtëzimit skaj-më-skaj. Kjo do të thotë se s’do të jeni më në gjendje të lexoni mesazhe të vjetër te dhoma të fshehtëzuara në këtë pajisje."; "settings_surname" = "Mbiemër"; "settings_global_settings_info" = "Rregullimet globale për njoftime i gjeni te klienti juaj %@ web"; -"settings_on_denied_notification" = "Njoftimet për %@ s’pranohen, ju lutemi, lejojini që nga rregullimet e pajisjes tuaj"; "settings_enable_callkit" = "Thirrje të integruara"; "settings_callkit_info" = "Merrini thirrjet ardhëse edhe me ekran të kyçur. Shihni thirrjet tuaja nën Element te historiku i thirrjeve të sistemit. Nëse iCloud është i aktivizuar, ky historik thirrjesh do t’i jepet kompanisë Apple."; "settings_ui_theme_picker_message" = "\"Auto\" përdor rregullimet \"Përmbysi Ngjyrat\" të pajisjes tuaj"; diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index 1bbec2ef6..8316784a1 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -309,7 +309,6 @@ "settings_show_decrypted_content" = "Visa avkrypterat innehåll"; "settings_pin_rooms_with_missed_notif" = "Fäst rum med missade aviseringar"; "settings_pin_rooms_with_unread" = "Fäst rum med olästa meddelanden"; -"settings_on_denied_notification" = "Aviseringar har nekats för %@, vänligen tillåt dem i dina enhetsinställningar"; "settings_enable_callkit" = "Integrerade samtal"; "settings_integrations_allow_button" = "Hantera integrationer"; "settings_ui_language" = "Språk"; diff --git a/Riot/Assets/vi.lproj/Vector.strings b/Riot/Assets/vi.lproj/Vector.strings index 88fc75f85..c401d3268 100644 --- a/Riot/Assets/vi.lproj/Vector.strings +++ b/Riot/Assets/vi.lproj/Vector.strings @@ -290,7 +290,6 @@ "settings_global_settings_info" = "Cài đặt thông báo toàn cầu khả dụng trên %@ trình duyệt khách của bạn"; "settings_pin_rooms_with_missed_notif" = "Neo phòng có thông báo bỏ lỡ"; "settings_pin_rooms_with_unread" = "Neo phòng có tin nhắn chưa đọc"; -"settings_on_denied_notification" = "Thông báo bị từ chối cho %@, vui lòng cho phép trong cài đặt thiết bị của bạn"; "settings_enable_callkit" = "Cuộc gọi tích hợp"; "settings_callkit_info" = "Nhận cuộc gọi tới trên màn hình khóa. Xem lịch sử cuộc gọi trong lịch sử cuộc gọi của hệ thống. Nếu iCloud được kích hoạt, lịch sử cuộc gọi sẽ được chia sẻ với Apple."; "settings_ui_language" = "Ngôn ngữ"; diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index 38f1729f1..732a53609 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -272,7 +272,6 @@ "settings_global_settings_info" = "全局通知设置可在 %@ 的网页客户端中修改"; "settings_pin_rooms_with_missed_notif" = "置顶含有错过的通知的聊天室"; "settings_pin_rooms_with_unread" = "置顶含有未读消息的聊天室"; -"settings_on_denied_notification" = "%@ 的通知请求被拒绝,请在系统设置中允许"; "settings_unignore_user" = "显示所有来自 %@ 的消息?"; "settings_contacts_discover_matrix_users" = "使用电子邮件和手机号码来发现用户"; "settings_contacts_phonebook_country" = "电话本国家"; @@ -1426,7 +1425,7 @@ "settings_ui_theme_picker_message_invert_colours" = "“自动”使用您设备的“反转颜色”设置"; "room_recents_unknown_room_error_message" = "找不到这个房间。 确保它存在"; "room_creation_dm_error" = "我们无法创建您的 DM。 请检查您要邀请的用户,然后重试。"; -"voice_message_stop_locked_mode_recording" = "轻按波长停止和回放消息"; +"voice_message_stop_locked_mode_recording" = "轻按录音停止或收听"; "voice_message_remaining_recording_time" = "剩 %@s"; // Mark: - Voice Messages diff --git a/Riot/Assets/zh_Hant.lproj/Vector.strings b/Riot/Assets/zh_Hant.lproj/Vector.strings index de6fbf1ab..bf0c0648c 100644 --- a/Riot/Assets/zh_Hant.lproj/Vector.strings +++ b/Riot/Assets/zh_Hant.lproj/Vector.strings @@ -344,7 +344,6 @@ "room_ongoing_conference_call_with_close" = "群組通話進行中。 以 %@ 或 %@ 加入。%@ 該通話。"; "settings_pin_rooms_with_missed_notif" = "釘選含有錯過的通知的聊天室"; "settings_pin_rooms_with_unread" = "釘選含有未讀訊息的聊天室"; -"settings_on_denied_notification" = "因 %@ 的通知不被允許,請在裝置設定中允許"; "settings_enable_callkit" = "整合式通話"; "settings_callkit_info" = "在鎖定畫面接聽 Element 來電、在通話紀錄中顯示 Element 通話。 如果您已啟用 iCloud ,則這些通話紀錄會與蘋果公司共享。"; "settings_ui_language" = "語言"; diff --git a/Riot/Generated/Images.swift b/Riot/Generated/Images.swift index 709ed216d..c6b056c71 100644 --- a/Riot/Generated/Images.swift +++ b/Riot/Generated/Images.swift @@ -36,6 +36,8 @@ internal enum Asset { internal static let callDialpadCallIcon = ImageAsset(name: "call_dialpad_call_icon") internal static let callGoToChatIcon = ImageAsset(name: "call_go_to_chat_icon") internal static let callHangupLarge = ImageAsset(name: "call_hangup_large") + internal static let callMissedVideo = ImageAsset(name: "call_missed_video") + internal static let callMissedVoice = ImageAsset(name: "call_missed_voice") internal static let callMoreIcon = ImageAsset(name: "call_more_icon") internal static let callPausedIcon = ImageAsset(name: "call_paused_icon") internal static let callPausedWhiteIcon = ImageAsset(name: "call_paused_white_icon") diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 7f2cb1930..680cd7848 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -1242,6 +1242,14 @@ internal enum VectorL10n { internal static var errorUserAlreadyLoggedIn: String { return VectorL10n.tr("Vector", "error_user_already_logged_in") } + /// Active video call + internal static var eventFormatterCallActiveVideo: String { + return VectorL10n.tr("Vector", "event_formatter_call_active_video") + } + /// Active voice call + internal static var eventFormatterCallActiveVoice: String { + return VectorL10n.tr("Vector", "event_formatter_call_active_voice") + } /// Answer internal static var eventFormatterCallAnswer: String { return VectorL10n.tr("Vector", "event_formatter_call_answer") @@ -1266,9 +1274,29 @@ internal enum VectorL10n { internal static var eventFormatterCallEndCall: String { return VectorL10n.tr("Vector", "event_formatter_call_end_call") } - /// Ended %@ - internal static func eventFormatterCallHasEnded(_ p1: String) -> String { - return VectorL10n.tr("Vector", "event_formatter_call_has_ended", p1) + /// Call ended + internal static var eventFormatterCallHasEnded: String { + return VectorL10n.tr("Vector", "event_formatter_call_has_ended") + } + /// Call ended • %@ + internal static func eventFormatterCallHasEndedWithTime(_ p1: String) -> String { + return VectorL10n.tr("Vector", "event_formatter_call_has_ended_with_time", p1) + } + /// Incoming video call + internal static var eventFormatterCallIncomingVideo: String { + return VectorL10n.tr("Vector", "event_formatter_call_incoming_video") + } + /// Incoming voice call + internal static var eventFormatterCallIncomingVoice: String { + return VectorL10n.tr("Vector", "event_formatter_call_incoming_voice") + } + /// Missed video call + internal static var eventFormatterCallMissedVideo: String { + return VectorL10n.tr("Vector", "event_formatter_call_missed_video") + } + /// Missed voice call + internal static var eventFormatterCallMissedVoice: String { + return VectorL10n.tr("Vector", "event_formatter_call_missed_voice") } /// Retry internal static var eventFormatterCallRetry: String { @@ -1278,26 +1306,10 @@ internal enum VectorL10n { internal static var eventFormatterCallRinging: String { return VectorL10n.tr("Vector", "event_formatter_call_ringing") } - /// Video call - internal static var eventFormatterCallVideo: String { - return VectorL10n.tr("Vector", "event_formatter_call_video") - } - /// Voice call - internal static var eventFormatterCallVoice: String { - return VectorL10n.tr("Vector", "event_formatter_call_voice") - } - /// Active call - internal static var eventFormatterCallYouCurrentlyIn: String { - return VectorL10n.tr("Vector", "event_formatter_call_you_currently_in") - } - /// You declined this call + /// Call declined internal static var eventFormatterCallYouDeclined: String { return VectorL10n.tr("Vector", "event_formatter_call_you_declined") } - /// You missed this call - internal static var eventFormatterCallYouMissed: String { - return VectorL10n.tr("Vector", "event_formatter_call_you_missed") - } /// Group call internal static var eventFormatterGroupCall: String { return VectorL10n.tr("Vector", "event_formatter_group_call") @@ -4114,6 +4126,10 @@ internal enum VectorL10n { internal static var settingsDeactivateMyAccount: String { return VectorL10n.tr("Vector", "settings_deactivate_my_account") } + /// Device notifications + internal static var settingsDeviceNotifications: String { + return VectorL10n.tr("Vector", "settings_device_notifications") + } /// SESSIONS internal static var settingsDevices: String { return VectorL10n.tr("Vector", "settings_devices") @@ -4390,6 +4406,14 @@ internal enum VectorL10n { internal static var settingsNightMode: String { return VectorL10n.tr("Vector", "settings_night_mode") } + /// To enable notifications, go to your device settings. + internal static var settingsNotificationsDisabledAlertMessage: String { + return VectorL10n.tr("Vector", "settings_notifications_disabled_alert_message") + } + /// Notifications disabled + internal static var settingsNotificationsDisabledAlertTitle: String { + return VectorL10n.tr("Vector", "settings_notifications_disabled_alert_title") + } /// NOTIFICATION SETTINGS internal static var settingsNotificationsSettings: String { return VectorL10n.tr("Vector", "settings_notifications_settings") @@ -4402,10 +4426,6 @@ internal enum VectorL10n { internal static func settingsOlmVersion(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_olm_version", p1) } - /// Notifications are denied for %@, please allow them in your device settings - internal static func settingsOnDeniedNotification(_ p1: String) -> String { - return VectorL10n.tr("Vector", "settings_on_denied_notification", p1) - } /// OTHER internal static var settingsOther: String { return VectorL10n.tr("Vector", "settings_other") @@ -4882,6 +4902,10 @@ internal enum VectorL10n { internal static var voice: String { return VectorL10n.tr("Vector", "voice") } + /// Voice message + internal static var voiceMessageLockScreenPlaceholder: String { + return VectorL10n.tr("Vector", "voice_message_lock_screen_placeholder") + } /// Hold to record, release to send internal static var voiceMessageReleaseToSend: String { return VectorL10n.tr("Vector", "voice_message_release_to_send") diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index 7d41bc4df..2b60b3123 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -52,7 +52,6 @@ final class RiotSettings: NSObject { static let roomCreationScreenRoomIsPublic = "roomCreationScreenRoomIsPublic" static let allowInviteExernalUsers = "allowInviteExernalUsers" static let enableRingingForGroupCalls = "enableRingingForGroupCalls" - static let enableVoiceMessages = "enableVoiceMessages" static let roomSettingsScreenShowLowPriorityOption = "roomSettingsScreenShowLowPriorityOption" static let roomSettingsScreenShowDirectChatOption = "roomSettingsScreenShowDirectChatOption" static let roomSettingsScreenAllowChangingAccessSettings = "roomSettingsScreenAllowChangingAccessSettings" @@ -96,7 +95,6 @@ final class RiotSettings: NSObject { private override init() { super.init() - defaults.register(defaults: [UserDefaultsKeys.enableVoiceMessages: BuildSettings.voiceMessagesEnabled]) } // MARK: Servers @@ -221,14 +219,6 @@ final class RiotSettings: NSObject { } } - var enableVoiceMessages: Bool { - get { - return defaults.bool(forKey: UserDefaultsKeys.enableVoiceMessages) - } set { - defaults.set(newValue, forKey: UserDefaultsKeys.enableVoiceMessages) - } - } - // MARK: Calls /// Indicate if `allowStunServerFallback` settings has been set once. diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.h b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.h index d2e776b92..e3feee4e4 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.h +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.h @@ -23,7 +23,6 @@ @property (weak, nonatomic) IBOutlet UIView *missedNotifAndUnreadIndicator; @property (weak, nonatomic) IBOutlet MXKImageView *roomAvatar; -@property (weak, nonatomic) IBOutlet UIView *directRoomBorderView; @property (weak, nonatomic) IBOutlet UIImageView *encryptedRoomIcon; @property (weak, nonatomic) IBOutlet UILabel *missedNotifAndUnreadBadgeLabel; diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m index 37e70eed6..337c39cba 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m @@ -27,11 +27,6 @@ #import "MXRoomSummary+Riot.h" -#pragma mark - Defines & Constants - -static const CGFloat kDirectRoomBorderColorAlpha = 0.75; -static const CGFloat kDirectRoomBorderWidth = 3.0; - @implementation RecentTableViewCell #pragma mark - Class methods @@ -54,16 +49,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; self.lastEventDate.textColor = ThemeService.shared.theme.textSecondaryColor; self.missedNotifAndUnreadBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor; - // Prepare direct room border - CGColorRef directRoomBorderColor = CGColorCreateCopyWithAlpha(ThemeService.shared.theme.tintColor.CGColor, kDirectRoomBorderColorAlpha); - - [self.directRoomBorderView.layer setCornerRadius:self.directRoomBorderView.frame.size.width / 2]; - self.directRoomBorderView.clipsToBounds = YES; - self.directRoomBorderView.layer.borderColor = directRoomBorderColor; - self.directRoomBorderView.layer.borderWidth = kDirectRoomBorderWidth; - - CFRelease(directRoomBorderColor); - self.roomAvatar.defaultBackgroundColor = [UIColor clearColor]; } @@ -138,8 +123,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; // The room title is not bold anymore self.roomTitle.font = [UIFont systemFontOfSize:17 weight:UIFontWeightMedium]; } - - self.directRoomBorderView.hidden = !roomCellData.roomSummary.room.isDirect; [roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar]; } diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib index 8765ab55e..dec130d7d 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib @@ -1,9 +1,9 @@ - + - + @@ -34,14 +34,6 @@ - - + @@ -87,20 +87,8 @@ - - diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 11bbcb3d8..29765dd4a 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -89,6 +89,7 @@ enum enum { NOTIFICATION_SETTINGS_ENABLE_PUSH_INDEX = 0, + NOTIFICATION_SETTINGS_SYSTEM_SETTINGS, NOTIFICATION_SETTINGS_SHOW_DECODED_CONTENT, NOTIFICATION_SETTINGS_GLOBAL_SETTINGS_INDEX, NOTIFICATION_SETTINGS_PIN_MISSED_NOTIFICATIONS_INDEX, @@ -143,7 +144,6 @@ enum enum { LABS_ENABLE_RINGING_FOR_GROUP_CALLS_INDEX = 0, - LABS_ENABLE_VOICE_MESSAGES = 1 }; enum @@ -235,6 +235,11 @@ TableViewSectionsDelegate> */ @property (nonatomic) BOOL newPhoneEditingEnabled; +/** + The current `UNUserNotificationCenter` notification settings for the app. + */ +@property (nonatomic) UNNotificationSettings *systemNotificationSettings; + @property (nonatomic, weak) DeactivateAccountViewController *deactivateAccountViewController; @property (nonatomic, strong) SignOutAlertPresenter *signOutAlertPresenter; @property (nonatomic, weak) UIButton *signOutButton; @@ -351,6 +356,7 @@ TableViewSectionsDelegate> Section *sectionNotificationSettings = [Section sectionWithTag:SECTION_TAG_NOTIFICATIONS]; [sectionNotificationSettings addRowWithTag:NOTIFICATION_SETTINGS_ENABLE_PUSH_INDEX]; + [sectionNotificationSettings addRowWithTag:NOTIFICATION_SETTINGS_SYSTEM_SETTINGS]; if (RiotSettings.shared.settingsScreenShowNotificationDecodedContentOption) { [sectionNotificationSettings addRowWithTag:NOTIFICATION_SETTINGS_SHOW_DECODED_CONTENT]; @@ -488,7 +494,6 @@ TableViewSectionsDelegate> { Section *sectionLabs = [Section sectionWithTag:SECTION_TAG_LABS]; [sectionLabs addRowWithTag:LABS_ENABLE_RINGING_FOR_GROUP_CALLS_INDEX]; - [sectionLabs addRowWithTag:LABS_ENABLE_VOICE_MESSAGES]; sectionLabs.headerTitle = NSLocalizedStringFromTable(@"settings_labs", @"Vector", nil); if (sectionLabs.hasAnyRows) { @@ -1231,6 +1236,24 @@ TableViewSectionsDelegate> [self editNewPhoneNumberTextField]; keepNewPhoneNumberEditing = NO; } + + // Update notification access + [self refreshSystemNotificationSettings]; +} + +- (void)refreshSystemNotificationSettings +{ + MXWeakify(self); + + // Get the system notification settings to check authorization status and configuration. + [UNUserNotificationCenter.currentNotificationCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { + dispatch_async(dispatch_get_main_queue(), ^{ + MXStrongifyAndReturnIfNil(self); + + self.systemNotificationSettings = settings; + [self.tableView reloadData]; + }); + }]; } - (void)formatNewPhoneNumber @@ -1791,13 +1814,38 @@ TableViewSectionsDelegate> MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath]; labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_enable_push_notif", @"Vector", nil); - labelAndSwitchCell.mxkSwitch.on = account.pushNotificationServiceIsActive; labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor; labelAndSwitchCell.mxkSwitch.enabled = YES; [labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(togglePushNotifications:) forControlEvents:UIControlEventTouchUpInside]; + BOOL isPushEnabled = account.pushNotificationServiceIsActive; + + // Even if push is enabled for the account, the user may have turned off notifications in system settings + if (isPushEnabled && self.systemNotificationSettings) + { + isPushEnabled = self.systemNotificationSettings.authorizationStatus == UNAuthorizationStatusAuthorized; + } + + labelAndSwitchCell.mxkSwitch.on = isPushEnabled; + cell = labelAndSwitchCell; } + else if (row == NOTIFICATION_SETTINGS_SYSTEM_SETTINGS) + { + cell = [tableView dequeueReusableCellWithIdentifier:kSettingsViewControllerPhoneBookCountryCellId]; + if (!cell) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kSettingsViewControllerPhoneBookCountryCellId]; + } + + cell.textLabel.textColor = ThemeService.shared.theme.textPrimaryColor; + + cell.textLabel.text = NSLocalizedStringFromTable(@"settings_device_notifications", @"Vector", nil); + cell.detailTextLabel.text = @""; + + [cell vc_setAccessoryDisclosureIndicatorWithCurrentTheme]; + cell.selectionStyle = UITableViewCellSelectionStyleDefault; + } else if (row == NOTIFICATION_SETTINGS_SHOW_DECODED_CONTENT) { MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath]; @@ -2265,17 +2313,6 @@ TableViewSectionsDelegate> [labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableRingingForGroupCalls:) forControlEvents:UIControlEventValueChanged]; - cell = labelAndSwitchCell; - } else if (row == LABS_ENABLE_VOICE_MESSAGES) - { - MXKTableViewCellWithLabelAndSwitch *labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath]; - - labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_labs_voice_messages", @"Vector", nil); - labelAndSwitchCell.mxkSwitch.on = RiotSettings.shared.enableVoiceMessages; - labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor; - - [labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableVoiceMessages:) forControlEvents:UIControlEventValueChanged]; - cell = labelAndSwitchCell; } } @@ -2501,6 +2538,10 @@ TableViewSectionsDelegate> UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; [self showInviteFriendsFromSourceView:selectedCell]; } + else if (section == SECTION_TAG_NOTIFICATIONS && row == NOTIFICATION_SETTINGS_SYSTEM_SETTINGS) + { + [self openSystemSettingsApp]; + } else if (section == SECTION_TAG_DISCOVERY) { [self.settingsDiscoveryTableViewSection selectRow:row]; @@ -2804,20 +2845,20 @@ TableViewSectionsDelegate> - (void)togglePushNotifications:(UISwitch *)sender { - // Check first whether the user allow notification from device settings - UIUserNotificationType currentUserNotificationTypes = UIApplication.sharedApplication.currentUserNotificationSettings.types; - if (currentUserNotificationTypes == UIUserNotificationTypeNone) + // Check first whether the user allow notification from system settings + if (self.systemNotificationSettings.authorizationStatus == UNAuthorizationStatusDenied) { [currentAlert dismissViewControllerAnimated:NO completion:nil]; __weak typeof(self) weakSelf = self; - - NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"]; - currentAlert = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:NSLocalizedStringFromTable(@"settings_on_denied_notification", @"Vector", nil), appDisplayName] message:nil preferredStyle:UIAlertControllerStyleAlert]; + NSString *title = NSLocalizedStringFromTable(@"settings_notifications_disabled_alert_title", @"Vector", nil); + NSString *message = NSLocalizedStringFromTable(@"settings_notifications_disabled_alert_message", @"Vector", nil); - [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] - style:UIAlertActionStyleDefault + currentAlert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; + + [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { if (weakSelf) @@ -2828,6 +2869,21 @@ TableViewSectionsDelegate> }]]; + UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"settings"] + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + + [self openSystemSettingsApp]; + } + }]; + + [currentAlert addAction:settingsAction]; + currentAlert.preferredAction = settingsAction; + [currentAlert mxk_setAccessibilityIdentifier: @"SettingsVCPushNotificationsAlert"]; [self presentViewController:currentAlert animated:YES completion:nil]; @@ -2871,6 +2927,12 @@ TableViewSectionsDelegate> } } +- (void)openSystemSettingsApp +{ + NSURL *settingsAppURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; + [[UIApplication sharedApplication] openURL:settingsAppURL options:@{} completionHandler:nil]; +} + - (void)toggleCallKit:(UISwitch *)sender { [MXKAppSettings standardAppSettings].enableCallKit = sender.isOn; @@ -2959,11 +3021,6 @@ TableViewSectionsDelegate> RiotSettings.shared.enableRingingForGroupCalls = sender.isOn; } -- (void)toggleEnableVoiceMessages:(UISwitch *)sender -{ - RiotSettings.shared.enableVoiceMessages = sender.isOn; -} - - (void)togglePinRoomsWithMissedNotif:(UISwitch *)sender { RiotSettings.shared.pinRoomsWithMissedNotificationsOnHome = sender.isOn; diff --git a/setup_project.sh b/setup_project.sh new file mode 100755 index 000000000..1da8aedb9 --- /dev/null +++ b/setup_project.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Use this script to setup the Xcode project + +# Remove existing project file if any +rm -r Riot.xcodeproj + +# Create the xcodeproj with all project source files +xcodegen + +# Use appropriated dependencies + +# Check if Podfile changed in unstaged +git diff --exit-code --quiet --name-only Podfile +PODFILE_HAS_CHANGED_UNSTAGED=$? +# Check if Podfile changed in staged +git diff --staged --exit-code --quiet --name-only Podfile +PODFILE_HAS_CHANGED_STAGED=$? + +# If Podfile has changed locally do not modify it +# otherwise use the appropriated dependencies according to the current branch +if [[ "$PODFILE_HAS_CHANGED_UNSTAGED" -eq 1 || "$PODFILE_HAS_CHANGED_STAGED" -eq 1 ]]; then + echo "Podfile has been changed locally do not modify it" +else + echo "Podfile has not been changed locally, use appropriated dependencies according to the current branch" + bundle exec fastlane point_dependencies_to_same_feature +fi + +# Create the xcworkspace with all project dependencies +pod install