Merge branch 'develop' into feature/bca/rust_flavor

This commit is contained in:
valere 2023-04-06 08:53:20 +02:00
commit 3e1b59d062
38 changed files with 270 additions and 160 deletions

View file

@ -1,3 +1,26 @@
Changes in Element v1.5.30 (2023-04-05)
=======================================
Features ✨
----------
- Permalinks to a room/space are pillified ([#8219](https://github.com/vector-im/element-android/issues/8219))
- Permalinks to a matrix user are pillified ([#8220](https://github.com/vector-im/element-android/issues/8220))
- Permalinks to messages are pillified ([#8221](https://github.com/vector-im/element-android/issues/8221))
Bugfixes 🐛
----------
- Custom sticker picker loads indefinitely ([#8026](https://github.com/vector-im/element-android/issues/8026))
- Replace hardcoded colors by theming colors on save button. ([#8208](https://github.com/vector-im/element-android/issues/8208))
- Add RTL support to RemoveJitsiWidgetView ([#8210](https://github.com/vector-im/element-android/issues/8210))
- Add user completion for matrix ids ([#8217](https://github.com/vector-im/element-android/issues/8217))
- Long name are truncated in the pills ([#8218](https://github.com/vector-im/element-android/issues/8218))
- The read marker is stuck in the past ([#8268](https://github.com/vector-im/element-android/issues/8268))
Other changes
-------------
- Replace Terms and Conditions with Acceptable Use Policy. ([#8286](https://github.com/vector-im/element-android/issues/8286))
Changes in Element v1.5.28 (2023-03-08) Changes in Element v1.5.28 (2023-03-08)
======================================= =======================================

1
changelog.d/7882.bugfix Normal file
View file

@ -0,0 +1 @@
Fix multiple read receipts for the same user in timeline.

View file

@ -1 +0,0 @@
Replace hardcoded colors by theming colors on save button.

View file

@ -1 +0,0 @@
Add RTL support to RemoveJitsiWidgetView

View file

@ -1 +0,0 @@
Long name are truncated in the pills

View file

@ -1 +0,0 @@
Permalinks to a room/space are pillified

View file

@ -1 +0,0 @@
Permalinks to a matrix user are pillified

View file

@ -1 +0,0 @@
Permalinks to messages are pillified

View file

@ -11,23 +11,21 @@ def gradle = "7.4.2"
def kotlin = "1.8.10" def kotlin = "1.8.10"
def kotlinCoroutines = "1.6.4" def kotlinCoroutines = "1.6.4"
def dagger = "2.45" def dagger = "2.45"
def firebaseBom = "31.3.0" def firebaseBom = "31.4.0"
def appDistribution = "16.0.0-beta06" def appDistribution = "16.0.0-beta06"
def retrofit = "2.9.0" def retrofit = "2.9.0"
def markwon = "4.6.2" def markwon = "4.6.2"
def moshi = "1.14.0" def moshi = "1.14.0"
def lifecycle = "2.5.1" def lifecycle = "2.5.1"
def flowBinding = "1.2.0" def flowBinding = "1.2.0"
def flipper = "0.187.0" def flipper = "0.188.0"
def epoxy = "5.0.0" def epoxy = "5.0.0"
def mavericks = "3.0.2" def mavericks = "3.0.2"
def glide = "4.15.1" def glide = "4.15.1"
def bigImageViewer = "1.8.1" def bigImageViewer = "1.8.1"
def jjwt = "0.11.5" def jjwt = "0.11.5"
// Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert def vanniktechEmoji = "0.16.0"
// the whole commit which set version 0.16.0-SNAPSHOT def sentry = "6.17.0"
def vanniktechEmoji = "0.16.0-SNAPSHOT"
def sentry = "6.16.0"
// Use 1.6.0 alpha to fix issue with test // Use 1.6.0 alpha to fix issue with test
def fragment = "1.6.0-alpha08" def fragment = "1.6.0-alpha08"
// Testing // Testing
@ -59,7 +57,7 @@ ext.libs = [
'fragmentTesting' : "androidx.fragment:fragment-testing:$fragment", 'fragmentTesting' : "androidx.fragment:fragment-testing:$fragment",
'fragmentTestingManifest' : "androidx.fragment:fragment-testing-manifest:$fragment", 'fragmentTestingManifest' : "androidx.fragment:fragment-testing-manifest:$fragment",
'constraintLayout' : "androidx.constraintlayout:constraintlayout:2.1.4", 'constraintLayout' : "androidx.constraintlayout:constraintlayout:2.1.4",
'work' : "androidx.work:work-runtime-ktx:2.8.0", 'work' : "androidx.work:work-runtime-ktx:2.8.1",
'autoFill' : "androidx.autofill:autofill:1.1.0", 'autoFill' : "androidx.autofill:autofill:1.1.0",
'preferenceKtx' : "androidx.preference:preference-ktx:1.2.0", 'preferenceKtx' : "androidx.preference:preference-ktx:1.2.0",
'junit' : "androidx.test.ext:junit:1.1.5", 'junit' : "androidx.test.ext:junit:1.1.5",
@ -88,7 +86,7 @@ ext.libs = [
'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution", 'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution",
'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution", 'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution",
// Phone number https://github.com/google/libphonenumber // Phone number https://github.com/google/libphonenumber
'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.13.8" 'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.13.9"
], ],
dagger : [ dagger : [
'dagger' : "com.google.dagger:dagger:$dagger", 'dagger' : "com.google.dagger:dagger:$dagger",

View file

@ -42,7 +42,6 @@ ext.groups = [
regex: [ regex: [
], ],
group: [ group: [
'com.vanniktech',
] ]
], ],
mavenSnapshots: [ mavenSnapshots: [

View file

@ -0,0 +1,2 @@
Main changes in this version: permalinks to rooms, spaces, users and messages are now displayed as pills in the timeline. We also fixed some issues with custom stickers and the read marker getting stuck in the past.
Full changelog: https://github.com/vector-im/element-android/releases

View file

@ -0,0 +1,2 @@
Fő változás ebben a verzióban: hibajavítások.
Teljes változásnapló: https://github.com/vector-im/element-android/releases

View file

@ -1249,7 +1249,7 @@
<string name="room_member_power_level_moderators">Moderatoren</string> <string name="room_member_power_level_moderators">Moderatoren</string>
<string name="room_member_power_level_custom">Benutzerdefiniert</string> <string name="room_member_power_level_custom">Benutzerdefiniert</string>
<string name="room_member_power_level_invites">Eingeladen</string> <string name="room_member_power_level_invites">Eingeladen</string>
<string name="room_member_power_level_users">Nutzer</string> <string name="room_member_power_level_users">Benutzer</string>
<string name="room_member_power_level_admin_in">Administrator in %1$s</string> <string name="room_member_power_level_admin_in">Administrator in %1$s</string>
<string name="room_member_power_level_moderator_in">Moderator in %1$s</string> <string name="room_member_power_level_moderator_in">Moderator in %1$s</string>
<string name="room_member_jump_to_read_receipt">Springen und als gelesen markieren</string> <string name="room_member_jump_to_read_receipt">Springen und als gelesen markieren</string>
@ -1859,7 +1859,7 @@
<string name="re_authentication_activity_title">Erneute Authentifizierung erforderlich</string> <string name="re_authentication_activity_title">Erneute Authentifizierung erforderlich</string>
<string name="failed_to_initialize_cross_signing">Quersignierung konnte nicht eingerichtet werden</string> <string name="failed_to_initialize_cross_signing">Quersignierung konnte nicht eingerichtet werden</string>
<string name="error_unauthorized">Nicht autorisierte, fehlende gültige Authentifizierungsdaten</string> <string name="error_unauthorized">Nicht autorisierte, fehlende gültige Authentifizierungsdaten</string>
<string name="call_transfer_users_tab_title">Nutzer</string> <string name="call_transfer_users_tab_title">Benutzer</string>
<string name="call_transfer_failure">Beim Weiterleiten des Anrufs ist ein Fehler aufgetreten</string> <string name="call_transfer_failure">Beim Weiterleiten des Anrufs ist ein Fehler aufgetreten</string>
<string name="call_transfer_title">Weiterleiten</string> <string name="call_transfer_title">Weiterleiten</string>
<string name="call_transfer_connect_action">Verbinden</string> <string name="call_transfer_connect_action">Verbinden</string>

View file

@ -262,15 +262,15 @@
<string name="matrix_only_filter">僅 Matrix 聯絡人</string> <string name="matrix_only_filter">僅 Matrix 聯絡人</string>
<string name="no_result_placeholder">沒有結果</string> <string name="no_result_placeholder">沒有結果</string>
<string name="rooms_header">聊天室</string> <string name="rooms_header">聊天室</string>
<string name="send_bug_report_include_logs">傳送錄檔</string> <string name="send_bug_report_include_logs">傳送錄檔</string>
<string name="send_bug_report_include_crash_logs">傳送當機紀錄</string> <string name="send_bug_report_include_crash_logs">傳送當機紀錄</string>
<string name="send_bug_report_include_screenshot">傳送螢幕截圖</string> <string name="send_bug_report_include_screenshot">傳送螢幕截圖</string>
<string name="send_bug_report">回報錯誤</string> <string name="send_bug_report">回報錯誤</string>
<string name="send_bug_report_description">請描述此錯誤。做了什麼?預期發生什麼?實際發生什麼?</string> <string name="send_bug_report_description">請描述此錯誤。您做了什麼?本來預期應該發生什麼?以及實際發生什麼?</string>
<string name="send_bug_report_placeholder">請在這裡描述您的問題</string> <string name="send_bug_report_placeholder">請在這裡描述您的問題</string>
<string name="send_bug_report_logs_description">為了診斷問題,將會隨錯誤回報一起送出客戶端紀錄。這份錯誤回報(包含紀錄檔與螢幕截圖)將不會公開。如果您只想送出上方的文字,請取消勾選:</string> <string name="send_bug_report_logs_description">為了診斷問題,將會隨錯誤回報一起送出客戶端紀錄。這份錯誤回報(包含紀錄檔與螢幕截圖)將不會公開。如果您只想送出上方的文字,請取消勾選:</string>
<string name="send_bug_report_alert_message">您似乎沮喪的搖晃著手機。要開啟錯誤回報畫面嗎?</string> <string name="send_bug_report_alert_message">您似乎在無奈地搖晃手機。 要回報錯誤報告嗎?</string>
<string name="send_bug_report_app_crashed">這個應用程式上次當掉了。您想要開啟錯誤回報畫面嗎?</string> <string name="send_bug_report_app_crashed">應用程式上次當掉了,您想要開啟錯誤回報畫面嗎?</string>
<string name="send_bug_report_rage_shake">透過大力搖晃回報錯誤</string> <string name="send_bug_report_rage_shake">透過大力搖晃回報錯誤</string>
<string name="send_bug_report_sent">已成功送出錯誤回報</string> <string name="send_bug_report_sent">已成功送出錯誤回報</string>
<string name="send_bug_report_failed">無法送出此錯誤回報(%s</string> <string name="send_bug_report_failed">無法送出此錯誤回報(%s</string>
@ -362,7 +362,7 @@
<string name="action_download">下載</string> <string name="action_download">下載</string>
<string name="option_send_voice">發送語音訊息</string> <string name="option_send_voice">發送語音訊息</string>
<string name="option_send_sticker">傳送貼圖</string> <string name="option_send_sticker">傳送貼圖</string>
<string name="no_sticker_application_dialog_content">您目前沒有任何貼圖。 <string name="no_sticker_application_dialog_content">您目前沒有啟用任何貼圖
\n \n
\n要現在新增一些貼圖嗎</string> \n要現在新增一些貼圖嗎</string>
<string name="error_no_external_application_found">對不起,沒有應用程式可以完成此操作。</string> <string name="error_no_external_application_found">對不起,沒有應用程式可以完成此操作。</string>
@ -454,7 +454,7 @@
<string name="media_saving_period_forever">永遠</string> <string name="media_saving_period_forever">永遠</string>
<string name="room_settings_topic">主題</string> <string name="room_settings_topic">主題</string>
<string name="room_settings_room_read_history_rules_pref_title">聊天室歷史紀錄的可讀性</string> <string name="room_settings_room_read_history_rules_pref_title">聊天室歷史紀錄的可讀性</string>
<string name="room_settings_room_read_history_rules_pref_dialog_title">能檢視歷史訊息</string> <string name="room_settings_room_read_history_rules_pref_dialog_title">可以讀取歷史紀錄</string>
<string name="room_settings_read_history_entry_anyone">任何人</string> <string name="room_settings_read_history_entry_anyone">任何人</string>
<string name="room_settings_read_history_entry_members_only_option_time_shared">僅限成員(自選取此選項開始)</string> <string name="room_settings_read_history_entry_members_only_option_time_shared">僅限成員(自選取此選項開始)</string>
<string name="room_settings_read_history_entry_members_only_invited">僅限成員(自他們被邀請開始)</string> <string name="room_settings_read_history_entry_members_only_invited">僅限成員(自他們被邀請開始)</string>
@ -514,7 +514,7 @@
<string name="widget_integration_unable_to_create">無法建立小工具。</string> <string name="widget_integration_unable_to_create">無法建立小工具。</string>
<string name="widget_integration_failed_to_send_request">無法傳送請求。</string> <string name="widget_integration_failed_to_send_request">無法傳送請求。</string>
<string name="widget_integration_positive_power_level">權限等級必需為正整數。</string> <string name="widget_integration_positive_power_level">權限等級必需為正整數。</string>
<string name="widget_integration_must_be_in_room">您不在此聊天室</string> <string name="widget_integration_must_be_in_room">您不在這個聊天室內</string>
<string name="widget_integration_no_permission_in_room">您沒有在這個聊天室做這件事的權限。</string> <string name="widget_integration_no_permission_in_room">您沒有在這個聊天室做這件事的權限。</string>
<string name="widget_integration_missing_room_id">請求中缺少 room_id。</string> <string name="widget_integration_missing_room_id">請求中缺少 room_id。</string>
<string name="widget_integration_missing_user_id">請求中缺少 user_id。</string> <string name="widget_integration_missing_user_id">請求中缺少 user_id。</string>
@ -539,7 +539,7 @@
<string name="reason_colon">理由:%1$s</string> <string name="reason_colon">理由:%1$s</string>
<string name="avatar">大頭照</string> <string name="avatar">大頭照</string>
<string name="dialog_user_consent_content">如要繼續使用此 %1$s 家伺服器,您必須同意該條款與細則。</string> <string name="dialog_user_consent_content">如要繼續使用此 %1$s 家伺服器,您必須同意該條款與細則。</string>
<string name="dialog_user_consent_submit">現在檢視</string> <string name="dialog_user_consent_submit">現在重新檢視</string>
<string name="deactivate_account_title">停用帳號</string> <string name="deactivate_account_title">停用帳號</string>
<string name="deactivate_account_content">這將使您的帳號永遠無法使用。您將無法再登入,且沒有人能夠再次註冊相同的使用者 ID。這將導致您的帳號離開參與的所有聊天室並將從身分伺服器上移除此帳號的詳細資訊。<b>此操作無法還原</b> <string name="deactivate_account_content">這將使您的帳號永遠無法使用。您將無法再登入,且沒有人能夠再次註冊相同的使用者 ID。這將導致您的帳號離開參與的所有聊天室並將從身分伺服器上移除此帳號的詳細資訊。<b>此操作無法還原</b>
\n \n
@ -712,9 +712,9 @@
<string name="keys_backup_restore_with_recovery_key">使用您的復原金鑰以解鎖加密訊息紀錄</string> <string name="keys_backup_restore_with_recovery_key">使用您的復原金鑰以解鎖加密訊息紀錄</string>
<string name="keys_backup_restore_key_enter_hint">輸入復原金鑰</string> <string name="keys_backup_restore_key_enter_hint">輸入復原金鑰</string>
<string name="keys_backup_restore_with_key_helper">遺失您的復原金鑰?可以到設定中打一把新的金鑰。</string> <string name="keys_backup_restore_with_key_helper">遺失您的復原金鑰?可以到設定中打一把新的金鑰。</string>
<string name="keys_backup_passphrase_error_decrypt">無法使用此安全密語解密備份:請確認您是否輸入正確的復原安全密語。</string> <string name="keys_backup_passphrase_error_decrypt">無法使用此密語解密備份:請確認您是否輸入正確的救援密語。</string>
<string name="keys_backup_restoring_waiting_message">正在復原備份:</string> <string name="keys_backup_restoring_waiting_message">正在復原備份:</string>
<string name="keys_backup_unlock_button">解鎖歷史紀錄</string> <string name="keys_backup_unlock_button">解鎖訊息紀錄</string>
<string name="keys_backup_recovery_code_empty_error_message">請輸入復原金鑰</string> <string name="keys_backup_recovery_code_empty_error_message">請輸入復原金鑰</string>
<string name="keys_backup_recovery_code_error_decrypt">無法使用此復原金鑰解密備份:請確認您是否輸入正確的復原金鑰。</string> <string name="keys_backup_recovery_code_error_decrypt">無法使用此復原金鑰解密備份:請確認您是否輸入正確的復原金鑰。</string>
<string name="keys_backup_restore_success_title">備份已復原 %s</string> <string name="keys_backup_restore_success_title">備份已復原 %s</string>
@ -739,15 +739,15 @@
<string name="keys_backup_settings_deleting_backup">正在刪除備份…</string> <string name="keys_backup_settings_deleting_backup">正在刪除備份…</string>
<string name="keys_backup_settings_delete_confirm_title">刪除備份</string> <string name="keys_backup_settings_delete_confirm_title">刪除備份</string>
<string name="keys_backup_settings_delete_confirm_message">真的要從伺服器刪除您備份的加密金鑰?您將無法再使用復原金鑰來讀取加密訊息記錄。</string> <string name="keys_backup_settings_delete_confirm_message">真的要從伺服器刪除您備份的加密金鑰?您將無法再使用復原金鑰來讀取加密訊息記錄。</string>
<string name="sign_out_bottom_sheet_warning_no_backup">若您現在登出,將會失去加密訊息</string> <string name="sign_out_bottom_sheet_warning_no_backup">如果您現在登出的話,將無法再存取您的加密訊息</string>
<string name="sign_out_bottom_sheet_warning_backing_up">正在備份金鑰。若您現在登出,將無法再存取加密訊息。</string> <string name="sign_out_bottom_sheet_warning_backing_up">正在備份金鑰。若您現在登出,將無法再存取加密訊息。</string>
<string name="sign_out_bottom_sheet_warning_backup_not_active">您應該在所有的工作階段中都開啟安全金鑰備份,以避免無法再存取加密訊息。</string> <string name="sign_out_bottom_sheet_warning_backup_not_active">您應該在所有的工作階段中都開啟安全金鑰備份,以避免無法再存取加密訊息。</string>
<string name="sign_out_bottom_sheet_dont_want_secure_messages">我不要我的加密訊息</string> <string name="sign_out_bottom_sheet_dont_want_secure_messages">我不要我的加密訊息</string>
<string name="sign_out_bottom_sheet_backing_up_keys">正在備份金鑰…</string> <string name="sign_out_bottom_sheet_backing_up_keys">正在備份金鑰…</string>
<string name="are_you_sure">您確定嗎?</string> <string name="are_you_sure">您確定嗎?</string>
<string name="backup">備份</string> <string name="backup">備份</string>
<string name="sign_out_bottom_sheet_will_lose_secure_messages">除非您在登出前先備份好加密金鑰,否則將會失去所有加密訊息。</string> <string name="sign_out_bottom_sheet_will_lose_secure_messages">除非您在登出前備份好金鑰,否則將無法再存取所有加密訊息。</string>
<string name="action_sign_out_confirmation_simple">要登出嗎?</string> <string name="action_sign_out_confirmation_simple">確定要登出嗎?</string>
<string name="encryption_message_recovery">還原加密訊息</string> <string name="encryption_message_recovery">還原加密訊息</string>
<string name="error_empty_field_enter_user_name">請輸入使用者名稱。</string> <string name="error_empty_field_enter_user_name">請輸入使用者名稱。</string>
<string name="keys_backup_setup">開始使用金鑰備份</string> <string name="keys_backup_setup">開始使用金鑰備份</string>
@ -762,10 +762,10 @@
<string name="keys_backup_setup_step2_skip_button_title">(進階)使用復原金鑰設定</string> <string name="keys_backup_setup_step2_skip_button_title">(進階)使用復原金鑰設定</string>
<string name="keys_backup_setup_step3_success_title">成功!</string> <string name="keys_backup_setup_step3_success_title">成功!</string>
<string name="keys_backup_setup_step3_text_line1">正在備份您的金鑰。</string> <string name="keys_backup_setup_step3_text_line1">正在備份您的金鑰。</string>
<string name="keys_backup_setup_step3_text_line2">您的復原金鑰是一個安全網,如果您忘記您的安全密語,您可以使用它來復原您對加密訊息的存取權 <string name="keys_backup_setup_step3_text_line2">您的救援金鑰是一張安全網:如果忘記安全密語,可以使用它來復原您對加密訊息的存取權。
\n請把您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱)</string> \n請把您的救援金鑰放在非常安全的地方,如密碼管理員(或保險箱)</string>
<string name="keys_backup_setup_step3_text_line2_no_passphrase">確保您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱)</string> <string name="keys_backup_setup_step3_text_line2_no_passphrase">確保您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱)</string>
<string name="keys_backup_setup_step3_button_title_no_passphrase">我已經備份完了</string> <string name="keys_backup_setup_step3_button_title_no_passphrase">我已經留下副本</string>
<string name="keys_backup_setup_step3_share_recovery_file">分享</string> <string name="keys_backup_setup_step3_share_recovery_file">分享</string>
<string name="keys_backup_banner_recover_line1">絕不失去加密訊息</string> <string name="keys_backup_banner_recover_line1">絕不失去加密訊息</string>
<string name="keys_backup_banner_recover_line2">使用金鑰備份</string> <string name="keys_backup_banner_recover_line2">使用金鑰備份</string>
@ -932,7 +932,7 @@
<string name="identity_server_not_defined">您未使用任何身分伺服器</string> <string name="identity_server_not_defined">您未使用任何身分伺服器</string>
<string name="error_user_already_logged_in">看來您正在嘗試連線到其它家伺服器。您想要登出嗎?</string> <string name="error_user_already_logged_in">看來您正在嘗試連線到其它家伺服器。您想要登出嗎?</string>
<string name="identity_server">身分伺服器</string> <string name="identity_server">身分伺服器</string>
<string name="disconnect_identity_server">取消連線到身分伺服器</string> <string name="disconnect_identity_server">中斷身分伺服器的連線</string>
<string name="add_identity_server">設定身分伺服器</string> <string name="add_identity_server">設定身分伺服器</string>
<string name="change_identity_server">變更身分伺服器</string> <string name="change_identity_server">變更身分伺服器</string>
<string name="settings_discovery_identity_server_info">您正在使用 %1$s 來讓其他現有的聯絡人和您能夠找到彼此。</string> <string name="settings_discovery_identity_server_info">您正在使用 %1$s 來讓其他現有的聯絡人和您能夠找到彼此。</string>
@ -1011,7 +1011,7 @@
<string name="room_widget_permission_display_name">您的顯示名稱</string> <string name="room_widget_permission_display_name">您的顯示名稱</string>
<string name="room_widget_permission_avatar_url">您的大頭照網址</string> <string name="room_widget_permission_avatar_url">您的大頭照網址</string>
<string name="room_widget_permission_user_id">您的使用者 ID</string> <string name="room_widget_permission_user_id">您的使用者 ID</string>
<string name="room_widget_permission_theme">您的佈景主題</string> <string name="room_widget_permission_theme">您的主題</string>
<string name="room_widget_permission_widget_id">小工具 ID</string> <string name="room_widget_permission_widget_id">小工具 ID</string>
<string name="room_widget_permission_room_id">聊天室 ID</string> <string name="room_widget_permission_room_id">聊天室 ID</string>
<string name="room_widget_resource_permission_title">此小工具想要使用下列資源:</string> <string name="room_widget_resource_permission_title">此小工具想要使用下列資源:</string>
@ -1170,8 +1170,8 @@
<string name="devices_current_device">目前的工作階段</string> <string name="devices_current_device">目前的工作階段</string>
<string name="devices_other_devices">其他工作階段</string> <string name="devices_other_devices">其他工作階段</string>
<string name="autocomplete_limited_results">僅顯示初始結果,請繼續輸入文字…</string> <string name="autocomplete_limited_results">僅顯示初始結果,請繼續輸入文字…</string>
<string name="settings_developer_mode_fail_fast_title">快速失敗</string> <string name="settings_developer_mode_fail_fast_title">盡快發生錯誤</string>
<string name="settings_developer_mode_fail_fast_summary">在發生非預期的錯誤時,${app_name} 可能更常當機</string> <string name="settings_developer_mode_fail_fast_summary">發生非預期的錯誤時,更主動讓 ${app_name} 當掉,以捕捉錯誤資訊</string>
<string name="command_description_shrug">在文字訊息前加入 ¯\\_(ツ)_/¯</string> <string name="command_description_shrug">在文字訊息前加入 ¯\\_(ツ)_/¯</string>
<string name="create_room_encryption_title">啟用加密</string> <string name="create_room_encryption_title">啟用加密</string>
<string name="create_room_encryption_description">一旦啟用加密就無法停用。</string> <string name="create_room_encryption_description">一旦啟用加密就無法停用。</string>
@ -1277,7 +1277,7 @@
<string name="room_member_profile_sessions_section_title">工作階段</string> <string name="room_member_profile_sessions_section_title">工作階段</string>
<string name="trusted">受信任</string> <string name="trusted">受信任</string>
<string name="not_trusted">未受信任</string> <string name="not_trusted">未受信任</string>
<string name="verification_profile_device_verified_because">因為 %1$s %2$s已驗證此工作階段所以其在安全通訊上是可受信任的</string> <string name="verification_profile_device_verified_because">因為 %1$s %2$s已驗證此工作階段可信任其用於安全通訊</string>
<string name="verification_profile_device_new_signing">%1$s%2$s使用新的工作階段登入</string> <string name="verification_profile_device_new_signing">%1$s%2$s使用新的工作階段登入</string>
<string name="verification_profile_device_untrust_info">直到此使用者信任此工作階段為止,該工作階段收發的訊息都會有警告標籤。您也可以手動進行驗證。</string> <string name="verification_profile_device_untrust_info">直到此使用者信任此工作階段為止,該工作階段收發的訊息都會有警告標籤。您也可以手動進行驗證。</string>
<string name="initialize_cross_signing">初始化交叉簽署</string> <string name="initialize_cross_signing">初始化交叉簽署</string>
@ -1309,7 +1309,7 @@
<string name="settings_key_requests">金鑰請求</string> <string name="settings_key_requests">金鑰請求</string>
<string name="e2e_use_keybackup">解鎖加密訊息紀錄</string> <string name="e2e_use_keybackup">解鎖加密訊息紀錄</string>
<string name="refresh">重新整理</string> <string name="refresh">重新整理</string>
<string name="new_session">新登入。是您嗎?</string> <string name="new_session">新登入。是您嗎?</string>
<string name="verify_new_session_notice">使用此工作階段來驗證新的工作階段,讓新階段可以存取加密訊息。</string> <string name="verify_new_session_notice">使用此工作階段來驗證新的工作階段,讓新階段可以存取加密訊息。</string>
<string name="verify_new_session_was_not_me">這不是我</string> <string name="verify_new_session_was_not_me">這不是我</string>
<string name="verify_new_session_compromized">您的帳號可能已被盜用</string> <string name="verify_new_session_compromized">您的帳號可能已被盜用</string>
@ -1333,7 +1333,7 @@
<string name="bootstrap_loading_text">這可能需要數秒,請稍候。</string> <string name="bootstrap_loading_text">這可能需要數秒,請稍候。</string>
<string name="bootstrap_loading_title">設定復原。</string> <string name="bootstrap_loading_title">設定復原。</string>
<string name="bootstrap_finish_title">已完成!</string> <string name="bootstrap_finish_title">已完成!</string>
<string name="keep_it_safe">把它放在安全的地方</string> <string name="keep_it_safe">好好保管</string>
<string name="finish">完成</string> <string name="finish">完成</string>
<string name="bootstrap_crosssigning_progress_initializing">正在發佈已建立的身分金鑰</string> <string name="bootstrap_crosssigning_progress_initializing">正在發佈已建立的身分金鑰</string>
<string name="bootstrap_crosssigning_progress_pbkdf2">從安全密語產生安全金鑰</string> <string name="bootstrap_crosssigning_progress_pbkdf2">從安全密語產生安全金鑰</string>
@ -1412,7 +1412,7 @@
<string name="create_room_dm_failure">無法建立您的私訊。請重新確認您想要邀請的使用者後再次傳送。</string> <string name="create_room_dm_failure">無法建立您的私訊。請重新確認您想要邀請的使用者後再次傳送。</string>
<string name="unencrypted">未加密</string> <string name="unencrypted">未加密</string>
<string name="encrypted_unverified">已由未驗證的裝置加密</string> <string name="encrypted_unverified">已由未驗證的裝置加密</string>
<string name="verify_this_session">驗證正在存取您帳號新登入:%1$s</string> <string name="verify_this_session">驗證您帳號新登入紀錄%1$s</string>
<string name="notification_ticker_text_dm">%1$s%2$s</string> <string name="notification_ticker_text_dm">%1$s%2$s</string>
<string name="notification_ticker_text_group">%1$s%2$s %3$s</string> <string name="notification_ticker_text_group">%1$s%2$s %3$s</string>
<string name="add_members_to_room">新增成員</string> <string name="add_members_to_room">新增成員</string>
@ -1446,7 +1446,7 @@
<string name="choose_locale_other_locales_title">其他可用的語言</string> <string name="choose_locale_other_locales_title">其他可用的語言</string>
<string name="choose_locale_loading_locales">正在載入可用的語言…</string> <string name="choose_locale_loading_locales">正在載入可用的語言…</string>
<string name="open_terms_of">開啟 %s 的條款</string> <string name="open_terms_of">開啟 %s 的條款</string>
<string name="disconnect_identity_server_dialog_content">從身分伺服器 %s 斷線</string> <string name="disconnect_identity_server_dialog_content">要中斷與身分伺服器 %s 的連線嗎</string>
<string name="identity_server_error_outdated_identity_server">此身分伺服器太舊了。${app_name} 僅支援 API V2。</string> <string name="identity_server_error_outdated_identity_server">此身分伺服器太舊了。${app_name} 僅支援 API V2。</string>
<string name="identity_server_error_outdated_home_server">此動作是不可能的。家伺服器太舊了。</string> <string name="identity_server_error_outdated_home_server">此動作是不可能的。家伺服器太舊了。</string>
<string name="identity_server_error_no_identity_server_configured">請先設定身分伺服器。</string> <string name="identity_server_error_no_identity_server_configured">請先設定身分伺服器。</string>
@ -1504,7 +1504,7 @@
<string name="settings_secure_backup_setup">設定安全備份</string> <string name="settings_secure_backup_setup">設定安全備份</string>
<string name="settings_secure_backup_reset">重設安全備份</string> <string name="settings_secure_backup_reset">重設安全備份</string>
<string name="settings_secure_backup_enter_to_setup">在此裝置上設定</string> <string name="settings_secure_backup_enter_to_setup">在此裝置上設定</string>
<string name="settings_secure_backup_section_info">透過備份加密金鑰到您的伺服器上,以防止失去存取已加密訊息與資料</string> <string name="settings_secure_backup_section_info">透過備份您伺服器上的加密金鑰,來防止失去對您已加密的訊息與資料的存取權</string>
<string name="reset_secure_backup_title">為您現有的備份產生新的安全金鑰或設定新的安全密語。</string> <string name="reset_secure_backup_title">為您現有的備份產生新的安全金鑰或設定新的安全密語。</string>
<string name="reset_secure_backup_warning">將會取代您目前的金鑰或密語。</string> <string name="reset_secure_backup_warning">將會取代您目前的金鑰或密語。</string>
<string name="disabled_integration_dialog_title">整合被停用</string> <string name="disabled_integration_dialog_title">整合被停用</string>
@ -1531,7 +1531,7 @@
<string name="room_profile_section_admin">管理員動作</string> <string name="room_profile_section_admin">管理員動作</string>
<string name="room_member_power_level_default_in">在 %1$s 中的預設</string> <string name="room_member_power_level_default_in">在 %1$s 中的預設</string>
<string name="settings_hs_admin_e2e_disabled">您的伺服器管理員已在私密聊天室與私人訊息中預設停用端對端加密。</string> <string name="settings_hs_admin_e2e_disabled">您的伺服器管理員已在私密聊天室與私人訊息中預設停用端對端加密。</string>
<string name="bootstrap_info_text_2">輸入只有您知道的安全密語,用於保護您在伺服器上的祕密資訊。</string> <string name="bootstrap_info_text_2">輸入僅有您知道的安全密語,來保護伺服器上與您有關的祕密資訊。</string>
<string name="bootstrap_cancel_text">如果您現在取消,當您忘記登入資訊的話,可能會失去存取加密訊息與資料。 <string name="bootstrap_cancel_text">如果您現在取消,當您忘記登入資訊的話,可能會失去存取加密訊息與資料。
\n \n
\n您也可以在「設定」中設定安全備份並管理您的金鑰。</string> \n您也可以在「設定」中設定安全備份並管理您的金鑰。</string>
@ -1549,16 +1549,16 @@
<string name="bottom_sheet_setup_secure_backup_subtitle">請在您的伺服器上備份加密金鑰,確保您不會失去對加密訊息與資料的存取權限。</string> <string name="bottom_sheet_setup_secure_backup_subtitle">請在您的伺服器上備份加密金鑰,確保您不會失去對加密訊息與資料的存取權限。</string>
<string name="bottom_sheet_setup_secure_backup_submit">設定</string> <string name="bottom_sheet_setup_secure_backup_submit">設定</string>
<string name="bottom_sheet_setup_secure_backup_security_key_title">使用安全金鑰</string> <string name="bottom_sheet_setup_secure_backup_security_key_title">使用安全金鑰</string>
<string name="bottom_sheet_setup_secure_backup_security_key_subtitle">產生安全金鑰並儲存在安全的地方,如密碼管理員或保險櫃</string> <string name="bottom_sheet_setup_secure_backup_security_key_subtitle">產生安全金鑰後,請儲存在密碼管理員或保險箱等安全的地方</string>
<string name="bottom_sheet_setup_secure_backup_security_phrase_title">使用安全密語</string> <string name="bottom_sheet_setup_secure_backup_security_phrase_title">使用安全密語</string>
<string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">輸入只有您知道的密語,並產生金鑰備份</string> <string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">輸入只有您知道的安全密語,並生成備份的金鑰</string>
<string name="bottom_sheet_save_your_recovery_key_title">儲存您的安全金鑰</string> <string name="bottom_sheet_save_your_recovery_key_title">儲存您的安全金鑰</string>
<string name="bottom_sheet_save_your_recovery_key_content">將您的安全金鑰儲存在安全的地方,如密碼管理員或保險櫃。</string> <string name="bottom_sheet_save_your_recovery_key_content">將您的安全金鑰儲存在安全的地方,如密碼管理員或保險櫃。</string>
<string name="set_a_security_phrase_title">設定安全密語</string> <string name="set_a_security_phrase_title">設定安全密語</string>
<string name="set_a_security_phrase_notice">輸入僅有您知道的安全密語,用於保護在您伺服器上的私密加密資訊。</string> <string name="set_a_security_phrase_notice">輸入僅有您知道的安全密語,來保護伺服器上與您有關的祕密資訊。</string>
<string name="set_a_security_phrase_hint">安全密語</string> <string name="set_a_security_phrase_hint">安全密語</string>
<string name="set_a_security_phrase_again_notice">再次輸入您的安全密語以確認。</string> <string name="set_a_security_phrase_again_notice">再次輸入您的安全密語以確認。</string>
<string name="room_settings_name_hint">聊天室設定</string> <string name="room_settings_name_hint">聊天室名稱</string>
<string name="room_settings_topic_hint">主題</string> <string name="room_settings_topic_hint">主題</string>
<string name="room_settings_save_success">您成功變更了聊天室設定</string> <string name="room_settings_save_success">您成功變更了聊天室設定</string>
<string name="notice_crypto_unable_to_decrypt_final">您無法存取此訊息</string> <string name="notice_crypto_unable_to_decrypt_final">您無法存取此訊息</string>
@ -1569,7 +1569,7 @@
<string name="crypto_error_withheld_generic">您無法存取此訊息,因為傳送者刻意不傳送金鑰</string> <string name="crypto_error_withheld_generic">您無法存取此訊息,因為傳送者刻意不傳送金鑰</string>
<string name="notice_crypto_unable_to_decrypt_merged">正在等待加密紀錄</string> <string name="notice_crypto_unable_to_decrypt_merged">正在等待加密紀錄</string>
<string name="disclaimer_title">Riot 改名為 Element 了!</string> <string name="disclaimer_title">Riot 改名為 Element 了!</string>
<string name="disclaimer_content">很高興宣布,我們已改名為 Element您的應用程式已經更新也已經登入帳號。</string> <string name="disclaimer_content">很高興宣布,我們已更名為 Element您的應用程式已更新到最新版您也已經成功登入帳號。</string>
<string name="disclaimer_negative_button">了解</string> <string name="disclaimer_negative_button">了解</string>
<string name="disclaimer_positive_button">取得更多資訊</string> <string name="disclaimer_positive_button">取得更多資訊</string>
<string name="save_recovery_key_chooser_hint">儲存復原金鑰於</string> <string name="save_recovery_key_chooser_hint">儲存復原金鑰於</string>
@ -1683,7 +1683,7 @@
<string name="settings_troubleshoot_test_notification_notification_clicked">通知已被點擊!</string> <string name="settings_troubleshoot_test_notification_notification_clicked">通知已被點擊!</string>
<string name="settings_troubleshoot_test_notification_notice">請點擊通知。如果您沒有看到通知,請檢查系統設定。</string> <string name="settings_troubleshoot_test_notification_notice">請點擊通知。如果您沒有看到通知,請檢查系統設定。</string>
<string name="settings_troubleshoot_test_notification_title">通知顯示</string> <string name="settings_troubleshoot_test_notification_title">通知顯示</string>
<string name="settings_troubleshoot_test_push_notification_content">您正在檢視通知!點擊我</string> <string name="settings_troubleshoot_test_push_notification_content">這是訊息通知測試,點擊我即可清除</string>
<string name="settings_troubleshoot_test_push_loop_failed">接收推送失敗。解決方法可能是重新安裝應用程式。</string> <string name="settings_troubleshoot_test_push_loop_failed">接收推送失敗。解決方法可能是重新安裝應用程式。</string>
<string name="settings_troubleshoot_test_push_loop_success">應用程式正在接收推送</string> <string name="settings_troubleshoot_test_push_loop_success">應用程式正在接收推送</string>
<string name="settings_troubleshoot_test_push_loop_waiting_for_push">應用程式正在等待推送</string> <string name="settings_troubleshoot_test_push_loop_waiting_for_push">應用程式正在等待推送</string>
@ -1752,7 +1752,7 @@
<string name="permissions_denied_qr_code">要掃描 QR Code您必須允許存取相機。</string> <string name="permissions_denied_qr_code">要掃描 QR Code您必須允許存取相機。</string>
<string name="start_chatting">開始聊天</string> <string name="start_chatting">開始聊天</string>
<string name="settings_security_pin_code_change_pin_summary">變更您目前的 PIN</string> <string name="settings_security_pin_code_change_pin_summary">變更您目前的 PIN</string>
<string name="settings_security_pin_code_change_pin_title">變更 PIN</string> <string name="settings_security_pin_code_change_pin_title">變更 PIN</string>
<string name="room_preview_no_preview_join">無法預覽此聊天室。您想要加入嗎?</string> <string name="room_preview_no_preview_join">無法預覽此聊天室。您想要加入嗎?</string>
<string name="room_preview_not_found">目前無法存取此聊天室。 <string name="room_preview_not_found">目前無法存取此聊天室。
\n請稍後再試或是詢問聊天室管理員來確認您是否可以存取。</string> \n請稍後再試或是詢問聊天室管理員來確認您是否可以存取。</string>
@ -1761,7 +1761,7 @@
<string name="room_alias_action_unpublish">取消發佈此位址</string> <string name="room_alias_action_unpublish">取消發佈此位址</string>
<string name="room_alias_action_publish">發佈此位址</string> <string name="room_alias_action_publish">發佈此位址</string>
<string name="room_alias_local_address_add">新增本地位址</string> <string name="room_alias_local_address_add">新增本地位址</string>
<string name="room_alias_local_address_empty">此聊天室沒有本位址</string> <string name="room_alias_local_address_empty">此聊天室沒有本位址</string>
<string name="room_alias_local_address_subtitle">設定此聊天室的位址,這樣使用者就可以透過您的家伺服器(%1$s搜尋此聊天室</string> <string name="room_alias_local_address_subtitle">設定此聊天室的位址,這樣使用者就可以透過您的家伺服器(%1$s搜尋此聊天室</string>
<string name="room_alias_local_address_title">本地位址</string> <string name="room_alias_local_address_title">本地位址</string>
<string name="room_alias_address_hint">新發佈的位址(例如:#alias:server</string> <string name="room_alias_address_hint">新發佈的位址(例如:#alias:server</string>
@ -1778,7 +1778,7 @@
<string name="room_settings_alias_subtitle">檢視並管理此聊天室的位址,以及其在聊天室目錄中的可見性。</string> <string name="room_settings_alias_subtitle">檢視並管理此聊天室的位址,以及其在聊天室目錄中的可見性。</string>
<string name="room_settings_alias_title">聊天室位址</string> <string name="room_settings_alias_title">聊天室位址</string>
<string name="room_settings_room_access_title">聊天室存取權</string> <string name="room_settings_room_access_title">聊天室存取權</string>
<string name="room_settings_room_read_history_dialog_subtitle">對可閱讀歷史訊息的人員的變更,將僅適用於此聊天室的新訊息。現有訊息的可見性將保持不變。</string> <string name="room_settings_room_read_history_dialog_subtitle">對可閱讀歷史訊息的使用者的變更,將僅適用於此聊天室的新訊息。現有訊息的顯示狀態將保持不變。</string>
<string name="action_unpublish">取消發佈</string> <string name="action_unpublish">取消發佈</string>
<string name="action_add">新增</string> <string name="action_add">新增</string>
<string name="default_message_emote_snow">傳送下雪特效 ❄️</string> <string name="default_message_emote_snow">傳送下雪特效 ❄️</string>
@ -1867,7 +1867,7 @@
<string name="a11y_trust_level_trusted">可信任的信任等級</string> <string name="a11y_trust_level_trusted">可信任的信任等級</string>
<string name="a11y_trust_level_warning">警告信任等級</string> <string name="a11y_trust_level_warning">警告信任等級</string>
<string name="a11y_trust_level_default">預設信任等級</string> <string name="a11y_trust_level_default">預設信任等級</string>
<string name="a11y_selected">已選</string> <string name="a11y_selected">已選</string>
<string name="a11y_video">影片</string> <string name="a11y_video">影片</string>
<string name="a11y_unsent_draft">有未傳送的草稿</string> <string name="a11y_unsent_draft">有未傳送的草稿</string>
<string name="a11y_error_some_message_not_sent">部份訊息未傳送</string> <string name="a11y_error_some_message_not_sent">部份訊息未傳送</string>
@ -1945,9 +1945,9 @@
<string name="activity_create_space_title">建立聊天空間</string> <string name="activity_create_space_title">建立聊天空間</string>
<string name="space_type_private_desc">邀請制,適用於您自己或團隊使用</string> <string name="space_type_private_desc">邀請制,適用於您自己或團隊使用</string>
<string name="space_type_private">私密</string> <string name="space_type_private">私密</string>
<string name="space_type_public_desc">任何人開放,適用於社群</string> <string name="space_type_public_desc">所有人開放,最適合社群</string>
<string name="space_type_public">公開</string> <string name="space_type_public">公開</string>
<string name="create_spaces_private_teammates">您與您的團隊成員的私密聊天空間</string> <string name="create_spaces_private_teammates">專為您與團隊成員使用的私密空間</string>
<string name="create_spaces_me_and_teammates">我與團隊成員</string> <string name="create_spaces_me_and_teammates">我與團隊成員</string>
<string name="create_spaces_organise_rooms">整理您聊天室的私密聊天空間</string> <string name="create_spaces_organise_rooms">整理您聊天室的私密聊天空間</string>
<string name="create_spaces_just_me">只有我</string> <string name="create_spaces_just_me">只有我</string>
@ -1957,7 +1957,7 @@
<string name="create_spaces_you_can_change_later">您可以稍後再更改</string> <string name="create_spaces_you_can_change_later">您可以稍後再更改</string>
<string name="create_spaces_choose_type_label">您想要建立哪種類型的聊天空間?</string> <string name="create_spaces_choose_type_label">您想要建立哪種類型的聊天空間?</string>
<string name="your_private_space">您的私密聊天空間</string> <string name="your_private_space">您的私密聊天空間</string>
<string name="your_public_space">您公開聊天空間</string> <string name="your_public_space">公開聊天空間</string>
<string name="add_space">新增聊天空間</string> <string name="add_space">新增聊天空間</string>
<string name="command_description_leave_room">離開指定 ID 的聊天室(如果是 null 的話則為目前聊天室)</string> <string name="command_description_leave_room">離開指定 ID 的聊天室(如果是 null 的話則為目前聊天室)</string>
<string name="command_description_join_space">使用特定的 ID 加入聊天空間</string> <string name="command_description_join_space">使用特定的 ID 加入聊天空間</string>
@ -1968,7 +1968,7 @@
<string name="room_settings_room_access_restricted_title">僅限限聊天空間成員</string> <string name="room_settings_room_access_restricted_title">僅限限聊天空間成員</string>
<string name="room_settings_room_access_public_description">任何人都可以尋找聊天室並加入</string> <string name="room_settings_room_access_public_description">任何人都可以尋找聊天室並加入</string>
<string name="room_settings_room_access_public_title">公開</string> <string name="room_settings_room_access_public_title">公開</string>
<string name="room_settings_room_access_private_description">僅被邀請的夥伴可以尋找並加入</string> <string name="room_settings_room_access_private_description">僅被邀請的人可以找到並加入</string>
<string name="room_settings_room_access_private_title">私密</string> <string name="room_settings_room_access_private_title">私密</string>
<string name="room_settings_room_access_entry_unknown">存取設定未知(%s</string> <string name="room_settings_room_access_entry_unknown">存取設定未知(%s</string>
<string name="room_settings_room_access_entry_knock">任何人都可以要求加入聊天室,成員可以接受或拒絕</string> <string name="room_settings_room_access_entry_knock">任何人都可以要求加入聊天室,成員可以接受或拒絕</string>
@ -1992,7 +1992,7 @@
<string name="send_file_step_compressing_image">正在壓縮圖片…</string> <string name="send_file_step_compressing_image">正在壓縮圖片…</string>
<string name="use_as_default_and_do_not_ask_again">預設使用,不再詢問</string> <string name="use_as_default_and_do_not_ask_again">預設使用,不再詢問</string>
<string name="option_always_ask">總是詢問</string> <string name="option_always_ask">總是詢問</string>
<string name="this_space_has_no_rooms_admin">有些聊天室可能是隱藏的,因為其為私密聊天室,您需要被邀請</string> <string name="this_space_has_no_rooms_admin">有些聊天室可能是隱藏的,因為它們是私密聊天室,您需要收到邀請才可加入</string>
<string name="this_space_has_no_rooms_not_admin">有些聊天室可能是隱藏的,因為其為私密聊天室,您需要被邀請。 <string name="this_space_has_no_rooms_not_admin">有些聊天室可能是隱藏的,因為其為私密聊天室,您需要被邀請。
\n您沒有權限新增聊天室。</string> \n您沒有權限新增聊天室。</string>
<string name="this_space_has_no_rooms">此聊天空間沒有聊天室</string> <string name="this_space_has_no_rooms">此聊天空間沒有聊天室</string>
@ -2121,8 +2121,8 @@
<string name="call_tile_voice_call_has_ended">語音通話已結束 • %1$s</string> <string name="call_tile_voice_call_has_ended">語音通話已結束 • %1$s</string>
<string name="call_tile_video_active">進行中的視訊通話</string> <string name="call_tile_video_active">進行中的視訊通話</string>
<string name="call_tile_voice_active">進行中的語音通話</string> <string name="call_tile_voice_active">進行中的語音通話</string>
<string name="call_tile_video_incoming">視訊通話來電</string> <string name="call_tile_video_incoming">視訊通話來電</string>
<string name="call_tile_voice_incoming">語音通話來電</string> <string name="call_tile_voice_incoming">語音通話來電</string>
<string name="call_tile_you_declined_this_call">您拒接了這通來電</string> <string name="call_tile_you_declined_this_call">您拒接了這通來電</string>
<string name="room_settings_room_notifications_account_settings">帳號設定</string> <string name="room_settings_room_notifications_account_settings">帳號設定</string>
<string name="room_settings_room_notifications_manage_notifications">您可以管理 %1$s 中的通知。</string> <string name="room_settings_room_notifications_manage_notifications">您可以管理 %1$s 中的通知。</string>
@ -2231,7 +2231,7 @@
<string name="end_poll_confirmation_title">結束此投票?</string> <string name="end_poll_confirmation_title">結束此投票?</string>
<string name="poll_end_action">結束投票</string> <string name="poll_end_action">結束投票</string>
<plurals name="poll_total_vote_count_after_ended"> <plurals name="poll_total_vote_count_after_ended">
<item quantity="other">最終投票結果,共投 %1$d 票</item> <item quantity="other">共計 %1$d 票所獲得的投票結果</item>
</plurals> </plurals>
<plurals name="poll_total_vote_count_before_ended_and_not_voted"> <plurals name="poll_total_vote_count_before_ended_and_not_voted">
<item quantity="other">已投 %1$d 票。投票後即可檢視結果</item> <item quantity="other">已投 %1$d 票。投票後即可檢視結果</item>
@ -2253,11 +2253,11 @@
<string name="legals_identity_server_title">您的身分伺服器政策</string> <string name="legals_identity_server_title">您的身分伺服器政策</string>
<string name="legals_home_server_title">您的家伺服器政策</string> <string name="legals_home_server_title">您的家伺服器政策</string>
<string name="legals_application_title">${app_name} 政策</string> <string name="legals_application_title">${app_name} 政策</string>
<string name="analytics_opt_in_list_item_3">隨時可以在設定中關閉此功能</string> <string name="analytics_opt_in_list_item_3">可以隨時到設定中關閉此功能</string>
<string name="analytics_opt_in_list_item_2">我們<b>不會</b>與第三方分享資訊</string> <string name="analytics_opt_in_list_item_2">我們<b>不會</b>與第三方分享這些資訊</string>
<string name="analytics_opt_in_list_item_1">我們<b>不會</b>記錄或分析任何帳號資料</string> <string name="analytics_opt_in_list_item_1">我們<b>不會</b>記錄或分析任何帳號資料</string>
<string name="analytics_opt_in_content_link">這裡</string> <string name="analytics_opt_in_content_link">此處</string>
<string name="analytics_opt_in_content">透過分享匿名使用資料協助我們找出問題並改善 ${app_name}。為了解人們如何使用多台裝置,我們將會產生隨機識別字串,在您的裝置間共享 <string name="analytics_opt_in_content">匿名分享使用資料能幫我們辨識錯誤和改善 ${app_name}。為了瞭解使用者如何使用多種裝置,我們會隨機產生能夠辨識您裝置的辨識碼
\n \n
\n您可以在 %s 閱讀我們的服務條款。</string> \n您可以在 %s 閱讀我們的服務條款。</string>
<string name="analytics_opt_in_title">協助改善 ${app_name}</string> <string name="analytics_opt_in_title">協助改善 ${app_name}</string>
@ -2290,7 +2290,7 @@
<string name="open_poll_option_title">開放式投票</string> <string name="open_poll_option_title">開放式投票</string>
<string name="poll_type_title">投票類型</string> <string name="poll_type_title">投票類型</string>
<string name="edit_poll_title">編輯投票</string> <string name="edit_poll_title">編輯投票</string>
<string name="poll_no_votes_cast">沒有投票</string> <string name="poll_no_votes_cast">尚未投票</string>
<string name="encryption_misconfigured">加密設定錯誤</string> <string name="encryption_misconfigured">加密設定錯誤</string>
<string name="room_profile_section_restore_security">還原加密</string> <string name="room_profile_section_restore_security">還原加密</string>
<string name="contact_admin_to_restore_encryption">請聯絡管理員以將加密還原至有效狀態。</string> <string name="contact_admin_to_restore_encryption">請聯絡管理員以將加密還原至有效狀態。</string>
@ -2401,7 +2401,7 @@
<string name="send_feedback_threads_info">「討論串」是一項正在進行中的工作,包含了即將推出令人興奮的新功能(例如改善後的通知)。我們想要聽到您的回饋!</string> <string name="send_feedback_threads_info">「討論串」是一項正在進行中的工作,包含了即將推出令人興奮的新功能(例如改善後的通知)。我們想要聽到您的回饋!</string>
<string name="send_feedback_threads_title">「討論串」功能 Beta 測試回饋</string> <string name="send_feedback_threads_title">「討論串」功能 Beta 測試回饋</string>
<string name="give_feedback_threads">給予回饋</string> <string name="give_feedback_threads">給予回饋</string>
<string name="beta_title_bottom_sheet_action">BETA 測試版</string> <string name="beta_title_bottom_sheet_action">Beta 測試版</string>
<string name="settings_presence_user_always_appears_offline_summary">若啟用,即使在使用應用程式時,您也會對其他使用者顯示為離線狀態。</string> <string name="settings_presence_user_always_appears_offline_summary">若啟用,即使在使用應用程式時,您也會對其他使用者顯示為離線狀態。</string>
<string name="settings_presence_user_always_appears_offline">離線模式</string> <string name="settings_presence_user_always_appears_offline">離線模式</string>
<string name="settings_presence">出席</string> <string name="settings_presence">出席</string>
@ -2428,11 +2428,11 @@
<string name="live_location_bottom_sheet_last_updated_at">更新於 %1$s 前</string> <string name="live_location_bottom_sheet_last_updated_at">更新於 %1$s 前</string>
<string name="labs_enable_live_location_summary">暫時實作:保留位置資訊在聊天紀錄中</string> <string name="labs_enable_live_location_summary">暫時實作:保留位置資訊在聊天紀錄中</string>
<string name="labs_enable_live_location">啟用即時位置分享</string> <string name="labs_enable_live_location">啟用即時位置分享</string>
<string name="location_share_live_remaining_time"> %1$s</string> <string name="location_share_live_remaining_time"> %1$s</string>
<string name="location_share_live_until">即時分享至 %1$s</string> <string name="location_share_live_until">即時分享至 %1$s</string>
<string name="location_share_live_view">檢視即時位置</string> <string name="location_share_live_view">檢視即時位置</string>
<string name="location_share_live_ended">已結束分享即時位置</string> <string name="location_share_live_ended">已結束分享即時位置</string>
<string name="space_explore_filter_no_result_description">有些結果可能會被隱藏,因為它們是私密的,您需要邀請才能加入。</string> <string name="space_explore_filter_no_result_description">有些結果可能是隱藏的,因為它們是私密聊天室,您需要收到邀請才可加入。</string>
<string name="space_explore_filter_no_result_title">找不到結果</string> <string name="space_explore_filter_no_result_title">找不到結果</string>
<string name="space_leave_radio_button_none">不離開</string> <string name="space_leave_radio_button_none">不離開</string>
<string name="space_leave_radio_button_all">離開全部</string> <string name="space_leave_radio_button_all">離開全部</string>
@ -2561,7 +2561,7 @@
<string name="home_layout_preferences_sort_activity">活動</string> <string name="home_layout_preferences_sort_activity">活動</string>
<string name="home_layout_preferences_recents">顯示最近的</string> <string name="home_layout_preferences_recents">顯示最近的</string>
<string name="home_layout_preferences_filters">顯示過濾條件</string> <string name="home_layout_preferences_filters">顯示過濾條件</string>
<string name="home_layout_preferences">佈局偏好設定</string> <string name="home_layout_preferences">版面偏好設定</string>
<string name="explore_rooms">探索聊天室</string> <string name="explore_rooms">探索聊天室</string>
<string name="create_room">建立聊天室</string> <string name="create_room">建立聊天室</string>
<string name="start_chat">開始聊天</string> <string name="start_chat">開始聊天</string>
@ -2686,7 +2686,7 @@
<string name="rich_text_editor_format_strikethrough">套用刪除線格式</string> <string name="rich_text_editor_format_strikethrough">套用刪除線格式</string>
<string name="rich_text_editor_format_italic">套用斜體格式</string> <string name="rich_text_editor_format_italic">套用斜體格式</string>
<string name="rich_text_editor_format_bold">套用粗體格式</string> <string name="rich_text_editor_format_bold">套用粗體格式</string>
<string name="labs_enable_client_info_recording_summary">記錄客戶端名稱、版本與網址,以便在工作階段管理員當中能更輕鬆找出工作階段</string> <string name="labs_enable_client_info_recording_summary">記錄客戶端名稱、版本與網址,以便在工作階段管理員當中能更輕鬆找出工作階段</string>
<string name="labs_enable_client_info_recording_title">啟用客戶端資訊記錄</string> <string name="labs_enable_client_info_recording_title">啟用客戶端資訊記錄</string>
<string name="labs_enable_session_manager_summary">對所有工作階段有更大的能見度與控制。</string> <string name="labs_enable_session_manager_summary">對所有工作階段有更大的能見度與控制。</string>
<string name="labs_enable_session_manager_title">啟用新的工作階段管理員</string> <string name="labs_enable_session_manager_title">啟用新的工作階段管理員</string>
@ -2790,7 +2790,7 @@
<item quantity="other">登出 %1$d 個工作階段</item> <item quantity="other">登出 %1$d 個工作階段</item>
</plurals> </plurals>
<string name="device_manager_other_sessions_multi_signout_selection">登出</string> <string name="device_manager_other_sessions_multi_signout_selection">登出</string>
<string name="voice_broadcast_recording_time_left"> %1$s</string> <string name="voice_broadcast_recording_time_left"> %1$s</string>
<string name="message_reply_to_sender_created_poll">已建立投票。</string> <string name="message_reply_to_sender_created_poll">已建立投票。</string>
<string name="message_reply_to_sender_sent_sticker">已傳送貼圖。</string> <string name="message_reply_to_sender_sent_sticker">已傳送貼圖。</string>
<string name="message_reply_to_sender_sent_video">已傳送影片。</string> <string name="message_reply_to_sender_sent_video">已傳送影片。</string>
@ -2837,10 +2837,10 @@
<string name="room_polls_active_no_item">此聊天室沒有正在進行的投票</string> <string name="room_polls_active_no_item">此聊天室沒有正在進行的投票</string>
<string name="room_polls_active">進行中的投票</string> <string name="room_polls_active">進行中的投票</string>
<string name="room_profile_section_more_polls">投票紀錄</string> <string name="room_profile_section_more_polls">投票紀錄</string>
<string name="message_reply_to_ended_poll_preview">結束投票</string> <string name="message_reply_to_ended_poll_preview">結束投票</string>
<string name="message_reply_to_poll_preview">投票</string> <string name="message_reply_to_poll_preview">投票</string>
<string name="message_reply_to_sender_ended_poll">已結束投票。</string> <string name="message_reply_to_sender_ended_poll">已結束投票。</string>
<string name="ended_poll_indicator">結束投票。</string> <string name="ended_poll_indicator">結束投票。</string>
<string name="thread_list_not_available">您的家伺服器還不支援列出討論串。</string> <string name="thread_list_not_available">您的家伺服器還不支援列出討論串。</string>
<string name="error_voice_broadcast_unable_to_play">無法播放此語音廣播。</string> <string name="error_voice_broadcast_unable_to_play">無法播放此語音廣播。</string>
<string name="started_a_voice_broadcast">已開始語音廣播</string> <string name="started_a_voice_broadcast">已開始語音廣播</string>

View file

@ -1004,6 +1004,7 @@
<string name="settings_version">Version</string> <string name="settings_version">Version</string>
<string name="settings_olm_version">olm version</string> <string name="settings_olm_version">olm version</string>
<string name="settings_app_term_conditions">Terms &amp; conditions</string> <string name="settings_app_term_conditions">Terms &amp; conditions</string>
<string name="settings_acceptable_use_policy">Acceptable Use Policy</string>
<string name="settings_third_party_notices">Third party notices</string> <string name="settings_third_party_notices">Third party notices</string>
<string name="settings_copyright">Copyright</string> <string name="settings_copyright">Copyright</string>
<string name="settings_privacy_policy">Privacy policy</string> <string name="settings_privacy_policy">Privacy policy</string>

View file

@ -63,7 +63,7 @@ android {
// that the app's state is completely cleared between tests. // that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true' testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "SDK_VERSION", "\"1.5.30\"" buildConfigField "String", "SDK_VERSION", "\"1.5.32\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\"" buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\"" buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""

View file

@ -30,7 +30,8 @@ data class RoomMemberQueryParams(
val displayName: QueryStringValue, val displayName: QueryStringValue,
val memberships: List<Membership>, val memberships: List<Membership>,
val userId: QueryStringValue, val userId: QueryStringValue,
val excludeSelf: Boolean val excludeSelf: Boolean,
val displayNameOrUserId: QueryStringValue,
) { ) {
class Builder { class Builder {
@ -39,12 +40,14 @@ data class RoomMemberQueryParams(
var displayName: QueryStringValue = QueryStringValue.IsNotEmpty var displayName: QueryStringValue = QueryStringValue.IsNotEmpty
var memberships: List<Membership> = Membership.all() var memberships: List<Membership> = Membership.all()
var excludeSelf: Boolean = false var excludeSelf: Boolean = false
var displayNameOrUserId: QueryStringValue = QueryStringValue.NoCondition
fun build() = RoomMemberQueryParams( fun build() = RoomMemberQueryParams(
displayName = displayName, displayName = displayName,
memberships = memberships, memberships = memberships,
userId = userId, userId = userId,
excludeSelf = excludeSelf excludeSelf = excludeSelf,
displayNameOrUserId = displayNameOrUserId
) )
} }
} }

View file

@ -21,6 +21,7 @@ import io.realm.kotlin.createObject
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
import org.matrix.android.sdk.api.session.room.read.ReadService
import org.matrix.android.sdk.internal.crypto.model.SessionInfo import org.matrix.android.sdk.internal.crypto.model.SessionInfo
import org.matrix.android.sdk.internal.database.mapper.asDomain import org.matrix.android.sdk.internal.database.mapper.asDomain
import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntity
@ -76,7 +77,7 @@ internal fun ChunkEntity.addTimelineEvent(
val senderId = eventEntity.sender ?: "" val senderId = eventEntity.sender ?: ""
// Update RR for the sender of a new message with a dummy one // Update RR for the sender of a new message with a dummy one
val readReceiptsSummaryEntity = if (!ownedByThreadChunk) handleReadReceipts(realm, roomId, eventEntity, senderId) else null val readReceiptsSummaryEntity = handleReadReceiptsOfSender(realm, roomId, eventEntity, senderId)
val timelineEventEntity = realm.createObject<TimelineEventEntity>().apply { val timelineEventEntity = realm.createObject<TimelineEventEntity>().apply {
this.localId = localId this.localId = localId
this.root = eventEntity this.root = eventEntity
@ -124,7 +125,7 @@ internal fun computeIsUnique(
} }
} }
private fun handleReadReceipts(realm: Realm, roomId: String, eventEntity: EventEntity, senderId: String): ReadReceiptsSummaryEntity { private fun handleReadReceiptsOfSender(realm: Realm, roomId: String, eventEntity: EventEntity, senderId: String): ReadReceiptsSummaryEntity {
val readReceiptsSummaryEntity = ReadReceiptsSummaryEntity.where(realm, eventEntity.eventId).findFirst() val readReceiptsSummaryEntity = ReadReceiptsSummaryEntity.where(realm, eventEntity.eventId).findFirst()
?: realm.createObject<ReadReceiptsSummaryEntity>(eventEntity.eventId).apply { ?: realm.createObject<ReadReceiptsSummaryEntity>(eventEntity.eventId).apply {
this.roomId = roomId this.roomId = roomId
@ -132,7 +133,12 @@ private fun handleReadReceipts(realm: Realm, roomId: String, eventEntity: EventE
val originServerTs = eventEntity.originServerTs val originServerTs = eventEntity.originServerTs
if (originServerTs != null) { if (originServerTs != null) {
val timestampOfEvent = originServerTs.toDouble() val timestampOfEvent = originServerTs.toDouble()
val readReceiptOfSender = ReadReceiptEntity.getOrCreate(realm, roomId = roomId, userId = senderId, threadId = eventEntity.rootThreadEventId) val readReceiptOfSender = ReadReceiptEntity.getOrCreate(
realm = realm,
roomId = roomId,
userId = senderId,
threadId = eventEntity.rootThreadEventId ?: ReadService.THREAD_ID_MAIN
)
// If the synced RR is older, update // If the synced RR is older, update
if (timestampOfEvent > readReceiptOfSender.originServerTs) { if (timestampOfEvent > readReceiptOfSender.originServerTs) {
val previousReceiptsSummary = ReadReceiptsSummaryEntity.where(realm, eventId = readReceiptOfSender.eventId).findFirst() val previousReceiptsSummary = ReadReceiptsSummaryEntity.where(realm, eventId = readReceiptOfSender.eventId).findFirst()

View file

@ -17,14 +17,13 @@
package org.matrix.android.sdk.internal.session.room.membership package org.matrix.android.sdk.internal.session.room.membership
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.otaliastudios.opengl.core.use
import com.zhuinden.monarchy.Monarchy import com.zhuinden.monarchy.Monarchy
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import io.realm.Realm import io.realm.Realm
import io.realm.RealmQuery import io.realm.RealmQuery
import org.matrix.android.sdk.api.MatrixConfiguration import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.crypto.CryptoService
import org.matrix.android.sdk.api.session.identity.ThreePid import org.matrix.android.sdk.api.session.identity.ThreePid
import org.matrix.android.sdk.api.session.room.members.MembershipService import org.matrix.android.sdk.api.session.room.members.MembershipService
@ -58,7 +57,6 @@ internal class DefaultMembershipService @AssistedInject constructor(
private val cryptoService: CryptoService, private val cryptoService: CryptoService,
@UserId @UserId
private val userId: String, private val userId: String,
private val matrixConfiguration: MatrixConfiguration,
private val queryStringValueProcessor: QueryStringValueProcessor private val queryStringValueProcessor: QueryStringValueProcessor
) : MembershipService { ) : MembershipService {
@ -120,6 +118,13 @@ internal class DefaultMembershipService @AssistedInject constructor(
if (queryParams.excludeSelf) { if (queryParams.excludeSelf) {
notEqualTo(RoomMemberSummaryEntityFields.USER_ID, userId) notEqualTo(RoomMemberSummaryEntityFields.USER_ID, userId)
} }
if (queryParams.displayNameOrUserId != QueryStringValue.NoCondition) {
beginGroup()
process(RoomMemberSummaryEntityFields.USER_ID, queryParams.displayNameOrUserId)
or()
process(RoomMemberSummaryEntityFields.DISPLAY_NAME, queryParams.displayNameOrUserId)
endGroup()
}
} }
} }
} }

View file

@ -2599,7 +2599,9 @@
"face", "face",
"shaking", "shaking",
"shock", "shock",
"vibrate" "vibrate",
"dizzy",
"blurry"
] ]
}, },
"relieved-face": { "relieved-face": {
@ -3800,7 +3802,8 @@
"heart", "heart",
"like", "like",
"love", "love",
"pink" "pink",
"valentines"
] ]
}, },
"orange-heart": { "orange-heart": {
@ -3854,8 +3857,9 @@
"cyan", "cyan",
"heart", "heart",
"light blue", "light blue",
"light blue heart", "teal",
"teal" "ice",
"baby blue"
] ]
}, },
"purple-heart": { "purple-heart": {
@ -3892,10 +3896,10 @@
"b": "1FA76", "b": "1FA76",
"j": [ "j": [
"gray", "gray",
"grey heart",
"heart", "heart",
"silver", "silver",
"slate" "slate",
"monochrome"
] ]
}, },
"white-heart": { "white-heart": {
@ -4198,11 +4202,12 @@
"j": [ "j": [
"high five", "high five",
"leftward", "leftward",
"leftwards pushing hand",
"push", "push",
"refuse", "refuse",
"stop", "stop",
"wait" "wait",
"highfive",
"pressing"
] ]
}, },
"rightwards-pushing-hand": { "rightwards-pushing-hand": {
@ -4213,9 +4218,10 @@
"push", "push",
"refuse", "refuse",
"rightward", "rightward",
"rightwards pushing hand",
"stop", "stop",
"wait" "wait",
"highfive",
"pressing"
] ]
}, },
"ok-hand": { "ok-hand": {
@ -8620,7 +8626,11 @@
"antlers", "antlers",
"elk", "elk",
"mammal", "mammal",
"moose" "shrek",
"canada",
"sweden",
"sven",
"cool"
] ]
}, },
"donkey": { "donkey": {
@ -8630,10 +8640,10 @@
"animal", "animal",
"ass", "ass",
"burro", "burro",
"donkey",
"mammal", "mammal",
"mule", "mule",
"stubborn" "stubborn",
"eeyore"
] ]
}, },
"horse": { "horse": {
@ -9311,7 +9321,8 @@
"bird", "bird",
"flying", "flying",
"mythology", "mythology",
"wing" "angel",
"birds"
] ]
}, },
"black-bird": { "black-bird": {
@ -9331,9 +9342,10 @@
"j": [ "j": [
"bird", "bird",
"fowl", "fowl",
"goose",
"honk", "honk",
"silly" "silly",
"jemima",
"goosebumps"
] ]
}, },
"frog": { "frog": {
@ -9581,10 +9593,11 @@
"burn", "burn",
"invertebrate", "invertebrate",
"jelly", "jelly",
"jellyfish",
"marine", "marine",
"ouch", "ouch",
"stinger" "stinger",
"sting",
"tentacles"
] ]
}, },
"snail": { "snail": {
@ -9885,7 +9898,6 @@
"j": [ "j": [
"bluebonnet", "bluebonnet",
"flower", "flower",
"hyacinth",
"lavender", "lavender",
"lupine", "lupine",
"snapdragon" "snapdragon"
@ -10423,9 +10435,11 @@
"b": "1FADA", "b": "1FADA",
"j": [ "j": [
"beer", "beer",
"ginger root",
"root", "root",
"spice" "spice",
"yellow",
"cooking",
"gingerbread"
] ]
}, },
"pea-pod": { "pea-pod": {
@ -10437,7 +10451,9 @@
"legume", "legume",
"pea", "pea",
"pod", "pod",
"vegetable" "vegetable",
"cozy",
"green"
] ]
}, },
"bread": { "bread": {
@ -15533,9 +15549,9 @@
"dance", "dance",
"fan", "fan",
"flutter", "flutter",
"folding hand fan",
"hot", "hot",
"shy" "shy",
"flamenco"
] ]
}, },
"purse": { "purse": {
@ -15719,7 +15735,8 @@
"Afro", "Afro",
"comb", "comb",
"hair", "hair",
"pick" "pick",
"afro"
] ]
}, },
"crown": { "crown": {
@ -16165,7 +16182,6 @@
"b": "1FA87", "b": "1FA87",
"j": [ "j": [
"instrument", "instrument",
"maracas",
"music", "music",
"percussion", "percussion",
"rattle", "rattle",
@ -16177,11 +16193,13 @@
"b": "1FA88", "b": "1FA88",
"j": [ "j": [
"fife", "fife",
"flute",
"music", "music",
"pipe", "pipe",
"recorder", "recorder",
"woodwind" "woodwind",
"bamboo",
"instrument",
"pied piper"
] ]
}, },
"mobile-phone": { "mobile-phone": {
@ -19036,9 +19054,9 @@
"a": "⊛ Khanda", "a": "⊛ Khanda",
"b": "1FAAF", "b": "1FAAF",
"j": [ "j": [
"khanda",
"religion", "religion",
"Sikh" "Sikh",
"Sikhism"
] ]
}, },
"aries": { "aries": {
@ -19460,7 +19478,9 @@
"computer", "computer",
"internet", "internet",
"network", "network",
"wireless" "wifi",
"contactless",
"signal"
] ]
}, },
"vibration-mode": { "vibration-mode": {

View file

@ -37,7 +37,7 @@ ext.versionMinor = 5
// Note: even values are reserved for regular release, odd values for hotfix release. // Note: even values are reserved for regular release, odd values for hotfix release.
// When creating a hotfix, you should decrease the value, since the current value // When creating a hotfix, you should decrease the value, since the current value
// is the value for the next regular release. // is the value for the next regular release.
ext.versionPatch = 30 ext.versionPatch = 32
static def getGitTimestamp() { static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct' def cmd = 'git show -s --format=%ct'

View file

@ -135,7 +135,7 @@ dependencies {
implementation libs.androidx.biometric implementation libs.androidx.biometric
api "org.threeten:threetenbp:1.4.0:no-tzdb" api "org.threeten:threetenbp:1.4.0:no-tzdb"
api "com.gabrielittner.threetenbp:lazythreetenbp:0.14.0" api "com.gabrielittner.threetenbp:lazythreetenbp:0.16.0"
implementation libs.squareup.moshi implementation libs.squareup.moshi
kapt libs.squareup.moshiKotlin kapt libs.squareup.moshiKotlin
@ -311,7 +311,7 @@ dependencies {
// Fix issue with Jitsi. Inspired from https://github.com/android/android-test/issues/861#issuecomment-872067868 // Fix issue with Jitsi. Inspired from https://github.com/android/android-test/issues/861#issuecomment-872067868
// Error was lots of `Duplicate class org.checkerframework.common.reflection.qual.MethodVal found in modules jetified-checker-3.1 (org.checkerframework:checker:3.1.1) and jetified-checker-qual-3.12.0 (org.checkerframework:checker-qual:3.12.0) // Error was lots of `Duplicate class org.checkerframework.common.reflection.qual.MethodVal found in modules jetified-checker-3.1 (org.checkerframework:checker:3.1.1) and jetified-checker-qual-3.12.0 (org.checkerframework:checker-qual:3.12.0)
//noinspection GradleDependency Cannot use latest 3.15.0 since it required min API 26. //noinspection GradleDependency Cannot use latest 3.15.0 since it required min API 26.
implementation "org.checkerframework:checker:3.32.0" implementation "org.checkerframework:checker:3.33.0"
androidTestImplementation libs.androidx.testCore androidTestImplementation libs.androidx.testCore
androidTestImplementation libs.androidx.testRunner androidTestImplementation libs.androidx.testRunner

View file

@ -164,6 +164,7 @@ class DefaultVectorAnalytics @Inject constructor(
// When opting out, ensure that the queue is flushed first, or it will be flushed later (after user has revoked consent) // When opting out, ensure that the queue is flushed first, or it will be flushed later (after user has revoked consent)
posthog?.flush() posthog?.flush()
posthog?.optOut(true) posthog?.optOut(true)
posthog?.shutdown()
posthog = null posthog = null
} }
} }

View file

@ -76,6 +76,7 @@ class AutocompleteMemberController @Inject constructor(private val context: Cont
roomMember.roomMemberSummary.let { user -> roomMember.roomMemberSummary.let { user ->
id(user.userId) id(user.userId)
matrixItem(user.toMatrixItem()) matrixItem(user.toMatrixItem())
subName(user.userId)
avatarRenderer(host.avatarRenderer) avatarRenderer(host.avatarRenderer)
clickListener { host.listener?.onItemClick(roomMember) } clickListener { host.listener?.onItemClick(roomMember) }
} }

View file

@ -112,8 +112,8 @@ class AutocompleteMemberPresenter @AssistedInject constructor(
* ========================================================================================== */ * ========================================================================================== */
private fun createQueryParams(query: CharSequence?) = roomMemberQueryParams { private fun createQueryParams(query: CharSequence?) = roomMemberQueryParams {
displayName = if (query.isNullOrBlank()) { displayNameOrUserId = if (query.isNullOrBlank()) {
QueryStringValue.IsNotEmpty QueryStringValue.NoCondition
} else { } else {
QueryStringValue.Contains(query.toString(), QueryStringValue.Case.INSENSITIVE) QueryStringValue.Contains(query.toString(), QueryStringValue.Case.INSENSITIVE)
} }

View file

@ -39,7 +39,7 @@ sealed class RoomDetailAction : VectorViewModelAction {
data class UndoReaction(val targetEventId: String, val reaction: String, val reason: String? = "") : RoomDetailAction() data class UndoReaction(val targetEventId: String, val reaction: String, val reason: String? = "") : RoomDetailAction()
data class RedactAction(val targetEventId: String, val reason: String? = "") : RoomDetailAction() data class RedactAction(val targetEventId: String, val reason: String? = "") : RoomDetailAction()
data class UpdateQuickReactAction(val targetEventId: String, val selectedReaction: String, val add: Boolean) : RoomDetailAction() data class UpdateQuickReactAction(val targetEventId: String, val selectedReaction: String, val add: Boolean) : RoomDetailAction()
data class NavigateToEvent(val eventId: String, val highlight: Boolean) : RoomDetailAction() data class NavigateToEvent(val eventId: String, val highlight: Boolean, val isFirstUnreadEvent: Boolean = false) : RoomDetailAction()
object MarkAllAsRead : RoomDetailAction() object MarkAllAsRead : RoomDetailAction()
data class DownloadOrOpen(val eventId: String, val senderId: String?, val messageFileContent: MessageWithAttachmentContent) : RoomDetailAction() data class DownloadOrOpen(val eventId: String, val senderId: String?, val messageFileContent: MessageWithAttachmentContent) : RoomDetailAction()
object JoinAndOpenReplacementRoom : RoomDetailAction() object JoinAndOpenReplacementRoom : RoomDetailAction()

View file

@ -41,7 +41,7 @@ sealed class RoomDetailViewEvents : VectorViewEvents {
data class OpenRoom(val roomId: String, val closeCurrentRoom: Boolean = false) : RoomDetailViewEvents() data class OpenRoom(val roomId: String, val closeCurrentRoom: Boolean = false) : RoomDetailViewEvents()
data class NavigateToEvent(val eventId: String) : RoomDetailViewEvents() data class NavigateToEvent(val eventId: String, val isFirstUnreadEvent: Boolean) : RoomDetailViewEvents()
data class JoinJitsiConference(val widget: Widget, val withVideo: Boolean) : RoomDetailViewEvents() data class JoinJitsiConference(val widget: Widget, val withVideo: Boolean) : RoomDetailViewEvents()
object LeaveJitsiConference : RoomDetailViewEvents() object LeaveJitsiConference : RoomDetailViewEvents()

View file

@ -139,7 +139,6 @@ import im.vector.app.features.home.room.detail.composer.MessageComposerViewModel
import im.vector.app.features.home.room.detail.composer.boolean import im.vector.app.features.home.room.detail.composer.boolean
import im.vector.app.features.home.room.detail.composer.voice.VoiceRecorderFragment import im.vector.app.features.home.room.detail.composer.voice.VoiceRecorderFragment
import im.vector.app.features.home.room.detail.error.RoomNotFound import im.vector.app.features.home.room.detail.error.RoomNotFound
import im.vector.app.features.home.room.detail.readreceipts.DisplayReadReceiptsBottomSheet
import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.TimelineEventController
import im.vector.app.features.home.room.detail.timeline.action.EventSharedAction import im.vector.app.features.home.room.detail.timeline.action.EventSharedAction
import im.vector.app.features.home.room.detail.timeline.action.MessageActionsBottomSheet import im.vector.app.features.home.room.detail.timeline.action.MessageActionsBottomSheet
@ -156,6 +155,7 @@ import im.vector.app.features.home.room.detail.timeline.item.MessageTextItem
import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceItem import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceItem
import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData
import im.vector.app.features.home.room.detail.timeline.reactions.ViewReactionsBottomSheet import im.vector.app.features.home.room.detail.timeline.reactions.ViewReactionsBottomSheet
import im.vector.app.features.home.room.detail.timeline.readreceipts.DisplayReadReceiptsBottomSheet
import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever
import im.vector.app.features.home.room.detail.upgrade.MigrateRoomBottomSheet import im.vector.app.features.home.room.detail.upgrade.MigrateRoomBottomSheet
import im.vector.app.features.home.room.detail.views.RoomDetailLazyLoadedViews import im.vector.app.features.home.room.detail.views.RoomDetailLazyLoadedViews
@ -748,7 +748,9 @@ class TimelineFragment :
} }
private fun navigateToEvent(action: RoomDetailViewEvents.NavigateToEvent) { private fun navigateToEvent(action: RoomDetailViewEvents.NavigateToEvent) {
val scrollPosition = timelineEventController.searchPositionOfEvent(action.eventId) val scrollPosition = timelineEventController.getPositionOfReadMarker().takeIf { action.isFirstUnreadEvent }
?: timelineEventController.searchPositionOfEvent(action.eventId)
if (scrollPosition == null) { if (scrollPosition == null) {
scrollOnHighlightedEventCallback.scheduleScrollTo(action.eventId) scrollOnHighlightedEventCallback.scheduleScrollTo(action.eventId)
} else { } else {
@ -1994,10 +1996,10 @@ class TimelineFragment :
private fun onJumpToReadMarkerClicked() = withState(timelineViewModel) { private fun onJumpToReadMarkerClicked() = withState(timelineViewModel) {
if (it.unreadState is UnreadState.HasUnread) { if (it.unreadState is UnreadState.HasUnread) {
timelineViewModel.handle(RoomDetailAction.NavigateToEvent(it.unreadState.firstUnreadEventId, false)) timelineViewModel.handle(RoomDetailAction.NavigateToEvent(it.unreadState.firstUnreadEventId, highlight = false, isFirstUnreadEvent = true))
} }
if (it.unreadState is UnreadState.ReadMarkerNotLoaded) { if (it.unreadState is UnreadState.ReadMarkerNotLoaded) {
timelineViewModel.handle(RoomDetailAction.NavigateToEvent(it.unreadState.readMarkerId, false)) timelineViewModel.handle(RoomDetailAction.NavigateToEvent(it.unreadState.readMarkerId, highlight = false))
} }
} }

View file

@ -1034,7 +1034,7 @@ class TimelineViewModel @AssistedInject constructor(
if (action.highlight) { if (action.highlight) {
setState { copy(highlightedEventId = targetEventId) } setState { copy(highlightedEventId = targetEventId) }
} }
_viewEvents.post(RoomDetailViewEvents.NavigateToEvent(targetEventId)) _viewEvents.post(RoomDetailViewEvents.NavigateToEvent(targetEventId, action.isFirstUnreadEvent))
} }
private fun handleResendEvent(action: RoomDetailAction.ResendMessage) { private fun handleResendEvent(action: RoomDetailAction.ResendMessage) {

View file

@ -58,6 +58,7 @@ import im.vector.app.features.home.room.detail.timeline.item.ReactionsSummaryEve
import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData
import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptsItem import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptsItem
import im.vector.app.features.home.room.detail.timeline.item.TypingItem_ import im.vector.app.features.home.room.detail.timeline.item.TypingItem_
import im.vector.app.features.home.room.detail.timeline.readreceipts.ReadReceiptsCache
import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever
import im.vector.app.features.media.AttachmentData import im.vector.app.features.media.AttachmentData
import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.ImageContentRenderer
@ -74,7 +75,6 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
import org.matrix.android.sdk.api.session.room.model.message.MessageImageInfoContent import org.matrix.android.sdk.api.session.room.model.message.MessageImageInfoContent
import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent
import org.matrix.android.sdk.api.session.room.read.ReadService
import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.Timeline
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import timber.log.Timber import timber.log.Timber
@ -201,7 +201,7 @@ class TimelineEventController @Inject constructor(
// Map eventId to adapter position // Map eventId to adapter position
private val adapterPositionMapping = HashMap<String, Int>() private val adapterPositionMapping = HashMap<String, Int>()
private val timelineEventsGroups = TimelineEventsGroups() private val timelineEventsGroups = TimelineEventsGroups()
private val receiptsByEvent = HashMap<String, MutableList<ReadReceipt>>() private val readReceiptsCache = ReadReceiptsCache()
private val modelCache = arrayListOf<CacheItemData?>() private val modelCache = arrayListOf<CacheItemData?>()
private var currentSnapshot: List<TimelineEvent> = emptyList() private var currentSnapshot: List<TimelineEvent> = emptyList()
private var inSubmitList: Boolean = false private var inSubmitList: Boolean = false
@ -417,7 +417,7 @@ class TimelineEventController @Inject constructor(
} }
Timber.v("Preprocess events took $preprocessEventsTiming ms") Timber.v("Preprocess events took $preprocessEventsTiming ms")
var numberOfEventsToBuild = 0 var numberOfEventsToBuild = 0
val lastSentEventWithoutReadReceipts = searchLastSentEventWithoutReadReceipts(receiptsByEvent) val lastSentEventWithoutReadReceipts = searchLastSentEventWithoutReadReceipts(readReceiptsCache.receiptsByEvent())
(0 until modelCache.size).forEach { position -> (0 until modelCache.size).forEach { position ->
val event = currentSnapshot[position] val event = currentSnapshot[position]
val nextEvent = currentSnapshot.nextOrNull(position) val nextEvent = currentSnapshot.nextOrNull(position)
@ -463,7 +463,7 @@ class TimelineEventController @Inject constructor(
} }
val itemCachedData = modelCache[position] ?: return@forEach val itemCachedData = modelCache[position] ?: return@forEach
// Then update with additional models if needed // Then update with additional models if needed
modelCache[position] = itemCachedData.enrichWithModels(event, nextEvent, position, receiptsByEvent) modelCache[position] = itemCachedData.enrichWithModels(event, nextEvent, position, readReceiptsCache.receiptsByEvent())
} }
Timber.v("Number of events to rebuild: $numberOfEventsToBuild on ${modelCache.size} total events") Timber.v("Number of events to rebuild: $numberOfEventsToBuild on ${modelCache.size} total events")
} }
@ -552,15 +552,15 @@ class TimelineEventController @Inject constructor(
} }
private fun preprocessReverseEvents() { private fun preprocessReverseEvents() {
receiptsByEvent.clear() readReceiptsCache.clear()
timelineEventsGroups.clear() timelineEventsGroups.clear()
val itr = currentSnapshot.listIterator(currentSnapshot.size) val itr = currentSnapshot.listIterator(currentSnapshot.size)
var lastShownEventId: String? = null var lastShownEventId: String? = null
while (itr.hasPrevious()) { while (itr.hasPrevious()) {
val event = itr.previous() val event = itr.previous()
timelineEventsGroups.addOrIgnore(event) timelineEventsGroups.addOrIgnore(event)
val currentReadReceipts = ArrayList(event.readReceipts).filter { val currentReadReceipts = event.readReceipts.filter {
it.roomMember.userId != session.myUserId && it.isVisibleInThisThread() it.roomMember.userId != session.myUserId
} }
if (timelineEventVisibilityHelper.shouldShowEvent( if (timelineEventVisibilityHelper.shouldShowEvent(
timelineEvent = event, timelineEvent = event,
@ -573,16 +573,7 @@ class TimelineEventController @Inject constructor(
if (lastShownEventId == null) { if (lastShownEventId == null) {
continue continue
} }
val existingReceipts = receiptsByEvent.getOrPut(lastShownEventId) { ArrayList() } readReceiptsCache.addReceiptsOnEvent(currentReadReceipts, lastShownEventId)
existingReceipts.addAll(currentReadReceipts)
}
}
private fun ReadReceipt.isVisibleInThisThread(): Boolean {
return if (partialState.isFromThreadTimeline()) {
this.threadId == partialState.rootThreadEventId
} else {
this.threadId == null || this.threadId == ReadService.THREAD_ID_MAIN
} }
} }

View file

@ -1,11 +1,11 @@
/* /*
* Copyright 2019 New Vector Ltd * Copyright (c) 2023 New Vector Ltd
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.app.features.home.room.detail.readreceipts package im.vector.app.features.home.room.detail.timeline.readreceipts
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView

View file

@ -1,11 +1,11 @@
/* /*
* Copyright 2019 New Vector Ltd * Copyright (c) 2023 New Vector Ltd
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.app.features.home.room.detail.readreceipts package im.vector.app.features.home.room.detail.timeline.readreceipts
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable

View file

@ -1,11 +1,11 @@
/* /*
* Copyright 2019 New Vector Ltd * Copyright (c) 2023 New Vector Ltd
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.app.features.home.room.detail.readreceipts package im.vector.app.features.home.room.detail.timeline.readreceipts
import com.airbnb.epoxy.TypedEpoxyController import com.airbnb.epoxy.TypedEpoxyController
import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.DateFormatKind

View file

@ -0,0 +1,54 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.home.room.detail.timeline.readreceipts
import im.vector.lib.core.utils.compat.removeIfCompat
import org.matrix.android.sdk.api.session.room.model.ReadReceipt
class ReadReceiptsCache {
private val receiptsByEventId = HashMap<String, MutableList<ReadReceipt>>()
// Key is userId, Value is eventId
private val receiptEventIdByUserId = HashMap<String, String>()
fun receiptsByEvent(): Map<String, List<ReadReceipt>> {
return receiptsByEventId
}
fun addReceiptsOnEvent(receipts: List<ReadReceipt>, eventId: String) {
val existingReceipts = receiptsByEventId.getOrPut(eventId) { ArrayList() }
receipts.forEach { readReceipt ->
val receiptUserId = readReceipt.roomMember.userId
val receiptEventId = receiptEventIdByUserId[receiptUserId]
// If we already have a read receipt for this user, move it so we only
// use the most recent. It can happen because of threaded read receipts.
if (receiptEventId != null) {
receiptsByEventId[receiptEventId]?.removeIfCompat {
it.roomMember.userId == receiptUserId
}
}
receiptEventIdByUserId[receiptUserId] = eventId
existingReceipts.add(readReceipt)
}
}
fun clear() {
receiptsByEventId.clear()
receiptEventIdByUserId.clear()
}
}

View file

@ -19,7 +19,7 @@ package im.vector.app.features.settings
object VectorSettingsUrls { object VectorSettingsUrls {
const val HELP = "https://element.io/help" const val HELP = "https://element.io/help"
const val COPYRIGHT = "https://element.io/copyright" const val COPYRIGHT = "https://element.io/copyright"
const val TAC = "https://element.io/terms-of-service" const val ACCEPTABLE_USE_POLICY = "https://element.io/acceptable-use-policy-terms"
const val PRIVACY_POLICY = "https://element.io/privacy" const val PRIVACY_POLICY = "https://element.io/privacy"
const val DISCLAIMER_URL = "https://element.io/previously-riot" const val DISCLAIMER_URL = "https://element.io/previously-riot"
const val THIRD_PARTY_LICENSES = "file:///android_asset/open_source_licenses.html" const val THIRD_PARTY_LICENSES = "file:///android_asset/open_source_licenses.html"

View file

@ -31,7 +31,7 @@ class ElementLegals @Inject constructor(
fun getData(): List<ServerPolicy> { fun getData(): List<ServerPolicy> {
return listOf( return listOf(
ServerPolicy(stringProvider.getString(R.string.settings_copyright), VectorSettingsUrls.COPYRIGHT), ServerPolicy(stringProvider.getString(R.string.settings_copyright), VectorSettingsUrls.COPYRIGHT),
ServerPolicy(stringProvider.getString(R.string.settings_app_term_conditions), VectorSettingsUrls.TAC), ServerPolicy(stringProvider.getString(R.string.settings_acceptable_use_policy), VectorSettingsUrls.ACCEPTABLE_USE_POLICY),
ServerPolicy(stringProvider.getString(R.string.settings_privacy_policy), VectorSettingsUrls.PRIVACY_POLICY) ServerPolicy(stringProvider.getString(R.string.settings_privacy_policy), VectorSettingsUrls.PRIVACY_POLICY)
) )
} }

View file

@ -218,7 +218,7 @@ class WidgetFragment :
override fun invalidate() = withState(viewModel) { state -> override fun invalidate() = withState(viewModel) { state ->
Timber.v("Invalidate state: $state") Timber.v("Invalidate state: $state")
when (state.formattedURL) { when (val formattedUrl = state.formattedURL) {
Uninitialized, Uninitialized,
is Loading -> { is Loading -> {
setStateError(null) setStateError(null)
@ -227,6 +227,9 @@ class WidgetFragment :
views.widgetProgressBar.isVisible = true views.widgetProgressBar.isVisible = true
} }
is Success -> { is Success -> {
if (views.widgetWebView.url == null) {
loadFormattedUrl(formattedUrl())
}
setStateError(null) setStateError(null)
when (state.webviewLoadedUrl) { when (state.webviewLoadedUrl) {
Uninitialized -> { Uninitialized -> {
@ -253,7 +256,7 @@ class WidgetFragment :
// we need to show Error // we need to show Error
views.widgetWebView.isInvisible = true views.widgetWebView.isInvisible = true
views.widgetProgressBar.isVisible = false views.widgetProgressBar.isVisible = false
setStateError(state.formattedURL.error.message) setStateError(formattedUrl.error.message)
} }
} }
} }
@ -323,8 +326,12 @@ class WidgetFragment :
} }
private fun loadFormattedUrl(event: WidgetViewEvents.OnURLFormatted) { private fun loadFormattedUrl(event: WidgetViewEvents.OnURLFormatted) {
loadFormattedUrl(event.formattedURL)
}
private fun loadFormattedUrl(formattedUrl: String) {
views.widgetWebView.clearHistory() views.widgetWebView.clearHistory()
views.widgetWebView.loadUrl(event.formattedURL) views.widgetWebView.loadUrl(formattedUrl)
} }
private fun setStateError(message: String?) { private fun setStateError(message: String?) {

File diff suppressed because one or more lines are too long