Merge branch 'develop' into feature-oled-black

This commit is contained in:
Timur Gilfanov 2026-04-14 10:13:46 +04:00 committed by GitHub
commit f7cfa6cda8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
428 changed files with 5680 additions and 2018 deletions

View file

@ -432,6 +432,10 @@ class MessagesFlowNode(
override fun handleForwardEventClick(eventId: EventId) {
backstack.push(NavTarget.ForwardEvent(eventId = eventId, fromPinnedEvents = true))
}
override fun navigateToThread(threadRootId: ThreadId) {
backstack.push(NavTarget.Thread(threadRootId, null))
}
}
createNode<PinnedMessagesListNode>(buildContext, plugins = listOf(callback))
}

View file

@ -250,12 +250,11 @@ class MessagesPresenter(
is MessagesEvent.OnUserClicked -> {
roomMemberModerationState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(event.user))
}
is MessagesEvent.MarkAsFullyReadAndExit -> coroutineScope.launch {
if (!markingAsReadAndExiting.getAndSet(true)) {
is MessagesEvent.MarkAsFullyReadAndExit -> if (!markingAsReadAndExiting.getAndSet(true)) {
coroutineScope.launch {
val latestEventId = room.liveTimeline.getLatestEventId().getOrElse {
Timber.w(it, "Failed to get latest event id to mark as fully read")
navigator.close()
return@launch
null
}
latestEventId?.let { eventId ->
sessionCoroutineScope.launch {
@ -263,7 +262,6 @@ class MessagesPresenter(
}
}
navigator.close()
markingAsReadAndExiting.set(false)
}
}
}

View file

@ -10,7 +10,9 @@ package io.element.android.features.messages.impl.pinned.list
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.libraries.matrix.api.core.ThreadId
sealed interface PinnedMessagesListEvent {
data class HandleAction(val action: TimelineItemAction, val event: TimelineItem.Event) : PinnedMessagesListEvent
data class OpenThread(val threadRootId: ThreadId) : PinnedMessagesListEvent
}

View file

@ -9,10 +9,12 @@
package io.element.android.features.messages.impl.pinned.list
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
interface PinnedMessagesListNavigator {
fun viewInTimeline(eventId: EventId)
fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo)
fun forwardEvent(eventId: EventId)
fun navigateToThread(threadRootId: ThreadId)
}

View file

@ -31,6 +31,7 @@ import io.element.android.libraries.androidutils.system.openUrlInExternalApp
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.libraries.matrix.api.permalink.PermalinkParser
@ -55,6 +56,7 @@ class PinnedMessagesListNode(
fun handlePermalinkClick(data: PermalinkData.RoomLink)
fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo)
fun handleForwardEventClick(eventId: EventId)
fun navigateToThread(threadRootId: ThreadId)
}
private val callback: Callback = callback()
@ -95,6 +97,10 @@ class PinnedMessagesListNode(
callback.handleForwardEventClick(eventId)
}
override fun navigateToThread(threadRootId: ThreadId) {
callback.navigateToThread(threadRootId)
}
@Composable
override fun View(modifier: Modifier) {
CompositionLocalProvider(

View file

@ -137,6 +137,7 @@ class PinnedMessagesListPresenter(
fun handleEvent(event: PinnedMessagesListEvent) {
when (event) {
is PinnedMessagesListEvent.HandleAction -> sessionCoroutineScope.handleTimelineAction(event.action, event.event)
is PinnedMessagesListEvent.OpenThread -> navigator.navigateToThread(event.threadRootId)
}
}

View file

@ -30,6 +30,7 @@ import io.element.android.features.messages.impl.actionlist.ActionListView
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
import io.element.android.features.messages.impl.link.LinkEvent
import io.element.android.features.messages.impl.link.LinkView
import io.element.android.features.messages.impl.timeline.TimelineEvent
import io.element.android.features.messages.impl.timeline.components.TimelineItemRow
import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView
import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData
@ -235,7 +236,12 @@ private fun PinnedMessagesListLoaded(
onReadReceiptClick = {},
onSwipeToReply = {},
onJoinCallClick = {},
eventSink = {},
eventSink = { timelineItemEvent ->
when (timelineItemEvent) {
is TimelineEvent.OpenThread -> state.eventSink(PinnedMessagesListEvent.OpenThread(timelineItemEvent.threadRootEventId))
else -> Unit
}
},
eventContentView = { event, contentModifier, onContentLayoutChange ->
TimelineItemEventContentViewWrapper(
event = event,

View file

@ -747,7 +747,7 @@ private fun MessageEventBubbleContent(
}
Box(
modifier = talkbackCompatModifier
.border(1.dp, ElementTheme.colors.borderInteractiveSecondary, RoundedCornerShape(6.dp))
.border(1.dp, ElementTheme.colors.separatorPrimary, RoundedCornerShape(6.dp))
.background(ElementTheme.colors.bgCanvasDefault, RoundedCornerShape(6.dp))
.padding(4.dp)
) {

View file

@ -35,7 +35,7 @@
<string name="screen_room_attachment_source_camera_video">"Registra video"</string>
<string name="screen_room_attachment_source_files">"Allegato"</string>
<string name="screen_room_attachment_source_gallery">"Libreria di foto e video"</string>
<string name="screen_room_attachment_source_location">"Posizione"</string>
<string name="screen_room_attachment_source_location">"Condividi posizione"</string>
<string name="screen_room_attachment_source_poll">"Sondaggio"</string>
<string name="screen_room_attachment_text_formatting">"Formattazione del testo"</string>
<string name="screen_room_encrypted_history_banner">"La cronologia dei messaggi non è attualmente disponibile."</string>

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="crypto_event_authenticity_mismatched_sender">"イベントの送信者と、使用された端末の所有者が一致しません。"</string>
<string name="crypto_event_authenticity_not_guaranteed">"この暗号化されたメッセージの真正性を、この端末では保証できません。"</string>
<string name="crypto_event_authenticity_previously_verified">"以前に検証されたユーザーにより暗号化されています。"</string>
<string name="crypto_event_authenticity_sent_in_clear">"暗号化されていません。"</string>
<string name="crypto_event_authenticity_unknown_device">"削除されたまたは不明な端末により暗号化されています。"</string>
<string name="crypto_event_authenticity_unsigned_device">"所有者に検証されていない端末により暗号化されています。"</string>
<string name="crypto_event_authenticity_unverified_identity">"未検証のユーザーにより暗号化されています。"</string>
<string name="emoji_picker_category_activity">"アクティビティ"</string>
<string name="emoji_picker_category_flags">"旗"</string>
<string name="emoji_picker_category_foods">"食べ物"</string>
<string name="emoji_picker_category_nature">"動物・自然"</string>
<string name="emoji_picker_category_objects">"物"</string>
<string name="emoji_picker_category_people">"顔・人"</string>
<string name="emoji_picker_category_places">"旅・場所"</string>
<string name="emoji_picker_category_recent">"最近使用"</string>
<string name="emoji_picker_category_symbols">"記号"</string>
<string name="screen_media_upload_preview_caption_warning">"古いアプリケーションを使用しているユーザーはキャプションを見られない可能性があります。"</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"動画のアップロード画質を変更するにはタップしてください"</string>
<string name="screen_media_upload_preview_error_could_not_be_uploaded">"ファイルをアップロードに失敗しました。"</string>
<string name="screen_media_upload_preview_error_failed_processing">"ファイルの処理に失敗しました。再試行してください。"</string>
<string name="screen_media_upload_preview_error_failed_sending">"ファイルのアップロードに失敗しました。再試行してください。"</string>
<string name="screen_media_upload_preview_error_too_large_message">"許容されている最大サイズは %1$s です。"</string>
<string name="screen_media_upload_preview_error_too_large_title">"ファイルが大きすぎるためアップロードできません"</string>
<string name="screen_media_upload_preview_item_count">"個数 %1$d / %2$d"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"画像の品質を最適化"</string>
<string name="screen_media_upload_preview_processing">"処理中…"</string>
<string name="screen_report_content_block_user">"ユーザーをブロック"</string>
<string name="screen_report_content_block_user_hint">"このユーザーからのメッセージをすべて非表示にする場合はチェックしてください。"</string>
<string name="screen_report_content_explanation">"このメッセージはホームサーバーの管理者に報告されます。暗号化されたメッセージを確認することはできません。"</string>
<string name="screen_report_content_hint">"このコンテンツを通報する理由"</string>
<string name="screen_room_attachment_source_camera">"カメラ"</string>
<string name="screen_room_attachment_source_camera_photo">"写真を撮影"</string>
<string name="screen_room_attachment_source_camera_video">"動画を撮影"</string>
<string name="screen_room_attachment_source_files">"添付ファイル"</string>
<string name="screen_room_attachment_source_gallery">"アルバムの写真・動画"</string>
<string name="screen_room_attachment_source_location">"場所を共有"</string>
<string name="screen_room_attachment_source_poll">"投票"</string>
<string name="screen_room_attachment_text_formatting">"書式設定"</string>
<string name="screen_room_encrypted_history_banner">"過去のメッセージを現在表示できません。"</string>
<string name="screen_room_encrypted_history_banner_unverified">"このルームの過去のメッセージを表示できません。確認するには、この端末を検証してください。"</string>
<string name="screen_room_invite_again_alert_message">"招待し直しますか?"</string>
<string name="screen_room_invite_again_alert_title">"このチャットにはあなた一人だけです"</string>
<string name="screen_room_mentions_at_room_subtitle">"ルーム全体に通知"</string>
<string name="screen_room_mentions_at_room_title">"全員"</string>
<string name="screen_room_retry_send_menu_send_again_action">"再送信する"</string>
<string name="screen_room_retry_send_menu_title">"メッセージの送信に失敗しました"</string>
<string name="screen_room_timeline_add_reaction">"リアクションを追加"</string>
<string name="screen_room_timeline_beginning_of_room">"%1$s の始まりです。"</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"ここが会話の開始点です。"</string>
<string name="screen_room_timeline_legacy_call">"非対応の着信です。新しい Element X を使用できないか確認してください。"</string>
<string name="screen_room_timeline_less_reactions">"一部を表示"</string>
<string name="screen_room_timeline_message_copied">"メッセージをコピーしました"</string>
<string name="screen_room_timeline_no_permission_to_post">"このルームに発言する権限がありません"</string>
<plurals name="screen_room_timeline_reaction_a11y">
<item quantity="other">"%1$d 人の反応 %2$s"</item>
</plurals>
<plurals name="screen_room_timeline_reaction_including_you_a11y">
<item quantity="other">"あなたと %1$d 人の反応 %2$s"</item>
</plurals>
<string name="screen_room_timeline_reaction_you_a11y">"%1$s と反応"</string>
<string name="screen_room_timeline_reactions_show_less">"一部を表示"</string>
<string name="screen_room_timeline_reactions_show_more">"さらに表示"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"リアクションのまとめを表示"</string>
<string name="screen_room_timeline_read_marker_title">"新着"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="other">"%1$d 個のルーム更新点"</item>
</plurals>
<string name="screen_room_timeline_tombstoned_room_action">"新しいルームに移動"</string>
<string name="screen_room_timeline_tombstoned_room_message">"このルームは移行して非アクティブ状態です"</string>
<string name="screen_room_timeline_upgraded_room_action">"古いメッセージを表示"</string>
<string name="screen_room_timeline_upgraded_room_message">"このルームは他のルームからの移行先です"</string>
<plurals name="screen_room_typing_many_members">
<item quantity="other">"%1$s, %2$s 他 %3$d 人"</item>
</plurals>
<plurals name="screen_room_typing_notification">
<item quantity="other">"%1$s が入力中"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s と %2$s"</string>
</resources>

View file

@ -33,7 +33,7 @@
<string name="screen_room_attachment_source_camera_video">"Spela in video"</string>
<string name="screen_room_attachment_source_files">"Bilaga"</string>
<string name="screen_room_attachment_source_gallery">"Foto- och videobibliotek"</string>
<string name="screen_room_attachment_source_location">"Plats"</string>
<string name="screen_room_attachment_source_location">"Dela plats"</string>
<string name="screen_room_attachment_source_poll">"Omröstning"</string>
<string name="screen_room_attachment_text_formatting">"Textformatering"</string>
<string name="screen_room_encrypted_history_banner">"Meddelandehistoriken är för närvarande otillgänglig."</string>

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="crypto_event_authenticity_mismatched_sender">"Người gửi sự kiện không khớp với chủ sở hữu của thiết bị đã gửi nó."</string>
<string name="crypto_event_authenticity_not_guaranteed">"Tin nhắn mã hóa này không thể được xác thực trên thiết bị này."</string>
<string name="crypto_event_authenticity_previously_verified">"Được mã hóa bởi một người dùng đã từng được xác minh."</string>
<string name="crypto_event_authenticity_sent_in_clear">"Không được mã hóa"</string>
<string name="crypto_event_authenticity_unknown_device">"Được mã hóa bởi một thiết bị không xác định hoặc đã bị xóa."</string>
<string name="crypto_event_authenticity_unsigned_device">"Được mã hóa bởi một thiết bị chưa được chủ sở hữu xác minh."</string>
<string name="crypto_event_authenticity_unverified_identity">"Được mã hóa bởi một người dùng chưa được xác minh."</string>
<string name="emoji_picker_category_activity">"Hoạt động"</string>
<string name="emoji_picker_category_flags">"Cờ"</string>
<string name="emoji_picker_category_foods">"Thực phẩm và đồ uống"</string>
<string name="emoji_picker_category_nature">"Động vật và thiên nhiên"</string>
<string name="emoji_picker_category_objects">"Đồ vật"</string>
<string name="emoji_picker_category_people">"Mặt cười &amp; mọi người"</string>
<string name="emoji_picker_category_places">"Du lịch và địa danh"</string>
<string name="emoji_picker_category_symbols">"Biểu tượng"</string>
<string name="screen_media_upload_preview_error_failed_processing">"Xử lý phương tiện tải lên không thành công, vui lòng thử lại."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Không thể tải lên tệp phương tiện. Vui lòng thử lại."</string>
<string name="screen_report_content_block_user">"Chặn người dùng"</string>
<string name="screen_report_content_block_user_hint">"Chọn tùy chọn này nếu bạn muốn ẩn tất cả tin nhắn hiện tại và tương lai từ người dùng này."</string>
<string name="screen_report_content_explanation">"Tin nhắn này sẽ được báo cáo cho quản trị viên máy chủ của bạn. Họ sẽ không thể đọc bất kỳ tin nhắn được mã hóa nào."</string>
<string name="screen_report_content_hint">"Lý do báo cáo nội dung này"</string>
<string name="screen_room_attachment_source_camera">"Máy ảnh"</string>
<string name="screen_room_attachment_source_camera_photo">"Chụp ảnh"</string>
<string name="screen_room_attachment_source_camera_video">"Quay video"</string>
<string name="screen_room_attachment_source_files">"Tệp đính kèm"</string>
<string name="screen_room_attachment_source_gallery">"Thư viện ảnh và video"</string>
<string name="screen_room_attachment_source_location">"Chia sẻ vị trí"</string>
<string name="screen_room_attachment_source_poll">"Bỏ phiếu"</string>
<string name="screen_room_attachment_text_formatting">"Định dạng văn bản"</string>
<string name="screen_room_encrypted_history_banner">"Lịch sử tin nhắn hiện không khả dụng."</string>
<string name="screen_room_encrypted_history_banner_unverified">"Lịch sử tin nhắn không khả dụng trong phòng này. Vui lòng xác minh thiết bị này để xem lịch sử tin nhắn của bạn."</string>
<string name="screen_room_invite_again_alert_message">"Bạn có muốn mời họ quay lại không?"</string>
<string name="screen_room_invite_again_alert_title">"Bạn đang một mình trong cuộc trò chuyện này"</string>
<string name="screen_room_mentions_at_room_subtitle">"Thông báo cho cả phòng"</string>
<string name="screen_room_mentions_at_room_title">"Mọi người"</string>
<string name="screen_room_retry_send_menu_send_again_action">"Gửi lại"</string>
<string name="screen_room_retry_send_menu_title">"Gửi tin nhắn không thành công"</string>
<string name="screen_room_timeline_add_reaction">"Thêm biểu cảm"</string>
<string name="screen_room_timeline_beginning_of_room">"Đây là sự kiện khởi đầu của phòng %1$s ."</string>
<string name="screen_room_timeline_beginning_of_room_no_name">"Đây là khởi đầu của cuộc trò chuyện này."</string>
<string name="screen_room_timeline_legacy_call">"Cuộc gọi không được hỗ trợ. Hãy hỏi xem người gọi có thể sử dụng ứng dụng Element X mới hay không."</string>
<string name="screen_room_timeline_less_reactions">"Thu gọn"</string>
<string name="screen_room_timeline_message_copied">"Đã sao chép tin nhắn"</string>
<string name="screen_room_timeline_no_permission_to_post">"Bạn không có quyền gửi tin nhắn trong phòng này"</string>
<string name="screen_room_timeline_reactions_show_less">"Thu gọn"</string>
<string name="screen_room_timeline_reactions_show_more">"Xem thêm"</string>
<string name="screen_room_timeline_read_marker_title">"Mới"</string>
<plurals name="screen_room_timeline_state_changes">
<item quantity="other">"%1$d số lượng phòng thay đổi"</item>
</plurals>
<plurals name="screen_room_typing_many_members">
<item quantity="other">"%1$s,%2$s và %3$d người khác"</item>
</plurals>
<plurals name="screen_room_typing_notification">
<item quantity="other">"%1$s đang gõ"</item>
</plurals>
<string name="screen_room_typing_two_members">"%1$s và %2$s"</string>
</resources>

View file

@ -26,7 +26,7 @@
<string name="screen_media_upload_preview_item_count">"第%1$d/%2$d项"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"优化图像质量"</string>
<string name="screen_media_upload_preview_processing">"处理中…"</string>
<string name="screen_report_content_block_user">"封禁用户"</string>
<string name="screen_report_content_block_user">"屏蔽用户"</string>
<string name="screen_report_content_block_user_hint">"请确认是否要隐藏该用户当前和未来的所有信息"</string>
<string name="screen_report_content_explanation">"此消息将举报给您的服务器管理员。他们无法读取任何加密消息。"</string>
<string name="screen_report_content_hint">"举报此内容的原因"</string>
@ -35,13 +35,13 @@
<string name="screen_room_attachment_source_camera_video">"录制视频"</string>
<string name="screen_room_attachment_source_files">"附件"</string>
<string name="screen_room_attachment_source_gallery">"照片和视频库"</string>
<string name="screen_room_attachment_source_location">"位置"</string>
<string name="screen_room_attachment_source_location">"共享位置"</string>
<string name="screen_room_attachment_source_poll">"投票"</string>
<string name="screen_room_attachment_text_formatting">"文本格式化"</string>
<string name="screen_room_encrypted_history_banner">"消息历史记录当前不可用。"</string>
<string name="screen_room_encrypted_history_banner_unverified">"此聊天室无法查看消息历史记录。请验证此设备以查看之。"</string>
<string name="screen_room_invite_again_alert_message">"您想邀请他们回来吗?"</string>
<string name="screen_room_invite_again_alert_title">"聊天中只有你一个人"</string>
<string name="screen_room_invite_again_alert_title">"此聊天室中只有您一个人"</string>
<string name="screen_room_mentions_at_room_subtitle">"通知整个聊天室"</string>
<string name="screen_room_mentions_at_room_title">"所有人"</string>
<string name="screen_room_retry_send_menu_send_again_action">"再次发送"</string>

View file

@ -9,6 +9,7 @@
package io.element.android.features.messages.impl.pinned.list
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
class FakePinnedMessagesListNavigator : PinnedMessagesListNavigator {
@ -26,4 +27,9 @@ class FakePinnedMessagesListNavigator : PinnedMessagesListNavigator {
override fun forwardEvent(eventId: EventId) {
onForwardEventClickLambda?.invoke(eventId)
}
var onOpenThreadLambda: ((ThreadId) -> Unit)? = null
override fun navigateToThread(threadRootId: ThreadId) {
onOpenThreadLambda?.invoke(threadRootId)
}
}