From 815ffa478b696bba42feb272a00b5c6dc9f6a90a Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Fri, 13 Feb 2026 23:24:09 +0500 Subject: [PATCH] Add new drawable resources for messaging features across multiple resolutions - Added various icons including msg_palette, msg_photos, msg_pin, msg_retry, msg_secret, msg_send, msg_sendfile, msg_theme, msg_unpin, msg_views, and msg_warning in drawable-hdpi, drawable-mdpi, drawable-xhdpi, and drawable-xxhdpi directories. - Included fingerprint, ic_ab_done, ic_ab_other, ic_ab_reply, ic_arrow_drop_down, input_attach, input_keyboard, input_smile, and menu_unlock icons in respective drawable directories. - Enhanced user interface with new icons for better visual representation in messaging functionalities. --- .../messenger/ui/auth/SetPasswordScreen.kt | 20 +- .../rosetta/messenger/ui/auth/UnlockScreen.kt | 9 +- .../messenger/ui/chats/ChatDetailScreen.kt | 93 ++-- .../messenger/ui/chats/ChatsListScreen.kt | 261 ++++++++---- .../ui/chats/ForwardChatPickerBottomSheet.kt | 2 +- .../messenger/ui/chats/RequestsListScreen.kt | 3 +- .../messenger/ui/chats/SearchScreen.kt | 18 +- .../chats/components/AttachmentComponents.kt | 25 +- .../chats/components/ChatDetailComponents.kt | 398 +++++++++--------- .../chats/components/DebugLogsBottomSheet.kt | 4 +- .../ui/chats/components/ImageEditorScreen.kt | 7 +- .../components/MediaPickerBottomSheet.kt | 27 +- .../ui/chats/input/ChatDetailInput.kt | 13 +- .../messenger/ui/icons/TelegramIcons.kt | 93 ++++ .../messenger/ui/settings/AppearanceScreen.kt | 20 +- .../ui/settings/BiometricEnableScreen.kt | 17 +- .../ui/settings/OtherProfileScreen.kt | 190 +++++++-- .../ui/settings/ProfileLogsScreen.kt | 16 +- .../ui/settings/ProfilePhotoPicker.kt | 9 +- .../messenger/ui/settings/ProfileScreen.kt | 170 +++++--- .../messenger/ui/settings/ThemeScreen.kt | 18 +- .../messenger/ui/settings/UpdatesScreen.kt | 15 +- .../main/res/drawable-hdpi/fingerprint.png | Bin 0 -> 827 bytes app/src/main/res/drawable-hdpi/ic_ab_done.png | Bin 0 -> 244 bytes .../main/res/drawable-hdpi/ic_ab_other.png | Bin 0 -> 149 bytes .../main/res/drawable-hdpi/ic_ab_reply.png | Bin 0 -> 305 bytes .../res/drawable-hdpi/ic_arrow_drop_down.png | Bin 0 -> 148 bytes .../main/res/drawable-hdpi/input_attach.png | Bin 0 -> 1767 bytes .../main/res/drawable-hdpi/input_keyboard.png | Bin 0 -> 385 bytes .../main/res/drawable-hdpi/input_smile.png | Bin 0 -> 558 bytes .../main/res/drawable-hdpi/menu_unlock.png | Bin 0 -> 753 bytes app/src/main/res/drawable-hdpi/msg_add.png | Bin 0 -> 189 bytes .../main/res/drawable-hdpi/msg_addcontact.png | Bin 0 -> 433 bytes .../main/res/drawable-hdpi/msg_addphoto.png | Bin 0 -> 468 bytes .../main/res/drawable-hdpi/msg_arrow_back.png | Bin 0 -> 257 bytes .../main/res/drawable-hdpi/msg_arrowright.png | Bin 0 -> 193 bytes .../main/res/drawable-hdpi/msg_autodelete.png | Bin 0 -> 461 bytes app/src/main/res/drawable-hdpi/msg_block.png | Bin 0 -> 401 bytes app/src/main/res/drawable-hdpi/msg_camera.png | Bin 0 -> 457 bytes app/src/main/res/drawable-hdpi/msg_close.png | Bin 0 -> 268 bytes .../main/res/drawable-hdpi/msg_contact.png | Bin 0 -> 249 bytes .../main/res/drawable-hdpi/msg_customize.png | Bin 0 -> 395 bytes app/src/main/res/drawable-hdpi/msg_delete.png | Bin 0 -> 411 bytes app/src/main/res/drawable-hdpi/msg_edit.png | Bin 0 -> 334 bytes app/src/main/res/drawable-hdpi/msg_info.png | Bin 0 -> 447 bytes app/src/main/res/drawable-hdpi/msg_leave.png | Bin 0 -> 340 bytes .../main/res/drawable-hdpi/msg_message.png | Bin 0 -> 380 bytes app/src/main/res/drawable-hdpi/msg_mute.png | Bin 0 -> 490 bytes .../res/drawable-hdpi/msg_notifications.png | Bin 0 -> 348 bytes .../main/res/drawable-hdpi/msg_palette.png | Bin 0 -> 460 bytes app/src/main/res/drawable-hdpi/msg_photos.png | Bin 0 -> 370 bytes app/src/main/res/drawable-hdpi/msg_pin.png | Bin 0 -> 391 bytes app/src/main/res/drawable-hdpi/msg_retry.png | Bin 0 -> 434 bytes app/src/main/res/drawable-hdpi/msg_secret.png | Bin 0 -> 344 bytes app/src/main/res/drawable-hdpi/msg_send.png | Bin 0 -> 428 bytes .../main/res/drawable-hdpi/msg_sendfile.png | Bin 0 -> 339 bytes app/src/main/res/drawable-hdpi/msg_theme.png | Bin 0 -> 513 bytes app/src/main/res/drawable-hdpi/msg_unpin.png | Bin 0 -> 446 bytes app/src/main/res/drawable-hdpi/msg_views.png | Bin 0 -> 267 bytes .../main/res/drawable-hdpi/msg_warning.png | Bin 0 -> 104 bytes .../main/res/drawable-mdpi/fingerprint.png | Bin 0 -> 532 bytes app/src/main/res/drawable-mdpi/ic_ab_done.png | Bin 0 -> 182 bytes .../main/res/drawable-mdpi/ic_ab_other.png | Bin 0 -> 120 bytes .../main/res/drawable-mdpi/ic_ab_reply.png | Bin 0 -> 244 bytes .../res/drawable-mdpi/ic_arrow_drop_down.png | Bin 0 -> 124 bytes .../main/res/drawable-mdpi/input_attach.png | Bin 0 -> 320 bytes .../main/res/drawable-mdpi/input_keyboard.png | Bin 0 -> 284 bytes .../main/res/drawable-mdpi/input_smile.png | Bin 0 -> 403 bytes .../main/res/drawable-mdpi/menu_unlock.png | Bin 0 -> 553 bytes app/src/main/res/drawable-mdpi/msg_add.png | Bin 0 -> 122 bytes .../main/res/drawable-mdpi/msg_addcontact.png | Bin 0 -> 330 bytes .../main/res/drawable-mdpi/msg_addphoto.png | Bin 0 -> 331 bytes .../main/res/drawable-mdpi/msg_arrow_back.png | Bin 0 -> 148 bytes .../main/res/drawable-mdpi/msg_arrowright.png | Bin 0 -> 142 bytes .../main/res/drawable-mdpi/msg_autodelete.png | Bin 0 -> 335 bytes app/src/main/res/drawable-mdpi/msg_block.png | Bin 0 -> 275 bytes app/src/main/res/drawable-mdpi/msg_camera.png | Bin 0 -> 335 bytes app/src/main/res/drawable-mdpi/msg_close.png | Bin 0 -> 155 bytes .../main/res/drawable-mdpi/msg_contact.png | Bin 0 -> 236 bytes .../main/res/drawable-mdpi/msg_customize.png | Bin 0 -> 280 bytes app/src/main/res/drawable-mdpi/msg_delete.png | Bin 0 -> 231 bytes app/src/main/res/drawable-mdpi/msg_edit.png | Bin 0 -> 239 bytes app/src/main/res/drawable-mdpi/msg_info.png | Bin 0 -> 249 bytes app/src/main/res/drawable-mdpi/msg_leave.png | Bin 0 -> 259 bytes .../main/res/drawable-mdpi/msg_message.png | Bin 0 -> 251 bytes app/src/main/res/drawable-mdpi/msg_mute.png | Bin 0 -> 357 bytes .../res/drawable-mdpi/msg_notifications.png | Bin 0 -> 266 bytes .../main/res/drawable-mdpi/msg_palette.png | Bin 0 -> 348 bytes app/src/main/res/drawable-mdpi/msg_photos.png | Bin 0 -> 236 bytes app/src/main/res/drawable-mdpi/msg_pin.png | Bin 0 -> 294 bytes app/src/main/res/drawable-mdpi/msg_retry.png | Bin 0 -> 325 bytes app/src/main/res/drawable-mdpi/msg_secret.png | Bin 0 -> 265 bytes app/src/main/res/drawable-mdpi/msg_send.png | Bin 0 -> 317 bytes .../main/res/drawable-mdpi/msg_sendfile.png | Bin 0 -> 242 bytes app/src/main/res/drawable-mdpi/msg_theme.png | Bin 0 -> 364 bytes app/src/main/res/drawable-mdpi/msg_unpin.png | Bin 0 -> 312 bytes app/src/main/res/drawable-mdpi/msg_views.png | Bin 0 -> 175 bytes .../main/res/drawable-mdpi/msg_warning.png | Bin 0 -> 73 bytes .../main/res/drawable-xhdpi/fingerprint.png | Bin 0 -> 991 bytes .../main/res/drawable-xhdpi/ic_ab_done.png | Bin 0 -> 216 bytes .../main/res/drawable-xhdpi/ic_ab_other.png | Bin 0 -> 159 bytes .../main/res/drawable-xhdpi/ic_ab_reply.png | Bin 0 -> 318 bytes .../res/drawable-xhdpi/ic_arrow_drop_down.png | Bin 0 -> 146 bytes .../main/res/drawable-xhdpi/input_attach.png | Bin 0 -> 530 bytes .../res/drawable-xhdpi/input_keyboard.png | Bin 0 -> 359 bytes .../main/res/drawable-xhdpi/input_smile.png | Bin 0 -> 662 bytes .../main/res/drawable-xhdpi/menu_unlock.png | Bin 0 -> 987 bytes app/src/main/res/drawable-xhdpi/msg_add.png | Bin 0 -> 143 bytes .../res/drawable-xhdpi/msg_addcontact.png | Bin 0 -> 501 bytes .../main/res/drawable-xhdpi/msg_addphoto.png | Bin 0 -> 512 bytes .../res/drawable-xhdpi/msg_arrow_back.png | Bin 0 -> 250 bytes .../res/drawable-xhdpi/msg_arrowright.png | Bin 0 -> 164 bytes .../res/drawable-xhdpi/msg_autodelete.png | Bin 0 -> 532 bytes app/src/main/res/drawable-xhdpi/msg_block.png | Bin 0 -> 458 bytes .../main/res/drawable-xhdpi/msg_camera.png | Bin 0 -> 477 bytes app/src/main/res/drawable-xhdpi/msg_close.png | Bin 0 -> 245 bytes .../main/res/drawable-xhdpi/msg_contact.png | Bin 0 -> 268 bytes .../main/res/drawable-xhdpi/msg_customize.png | Bin 0 -> 408 bytes .../main/res/drawable-xhdpi/msg_delete.png | Bin 0 -> 404 bytes app/src/main/res/drawable-xhdpi/msg_edit.png | Bin 0 -> 313 bytes app/src/main/res/drawable-xhdpi/msg_info.png | Bin 0 -> 499 bytes app/src/main/res/drawable-xhdpi/msg_leave.png | Bin 0 -> 340 bytes .../main/res/drawable-xhdpi/msg_message.png | Bin 0 -> 444 bytes app/src/main/res/drawable-xhdpi/msg_mute.png | Bin 0 -> 553 bytes .../res/drawable-xhdpi/msg_notifications.png | Bin 0 -> 375 bytes .../main/res/drawable-xhdpi/msg_palette.png | Bin 0 -> 611 bytes .../main/res/drawable-xhdpi/msg_photos.png | Bin 0 -> 399 bytes app/src/main/res/drawable-xhdpi/msg_pin.png | Bin 0 -> 409 bytes app/src/main/res/drawable-xhdpi/msg_retry.png | Bin 0 -> 498 bytes .../main/res/drawable-xhdpi/msg_secret.png | Bin 0 -> 381 bytes app/src/main/res/drawable-xhdpi/msg_send.png | Bin 0 -> 444 bytes .../main/res/drawable-xhdpi/msg_sendfile.png | Bin 0 -> 318 bytes app/src/main/res/drawable-xhdpi/msg_theme.png | Bin 0 -> 579 bytes app/src/main/res/drawable-xhdpi/msg_unpin.png | Bin 0 -> 420 bytes app/src/main/res/drawable-xhdpi/msg_views.png | Bin 0 -> 285 bytes .../main/res/drawable-xhdpi/msg_warning.png | Bin 0 -> 80 bytes .../main/res/drawable-xxhdpi/fingerprint.png | Bin 0 -> 1394 bytes .../main/res/drawable-xxhdpi/ic_ab_done.png | Bin 0 -> 260 bytes .../main/res/drawable-xxhdpi/ic_ab_other.png | Bin 0 -> 171 bytes .../main/res/drawable-xxhdpi/ic_ab_reply.png | Bin 0 -> 380 bytes .../drawable-xxhdpi/ic_arrow_drop_down.png | Bin 0 -> 163 bytes .../main/res/drawable-xxhdpi/input_attach.png | Bin 0 -> 668 bytes .../res/drawable-xxhdpi/input_keyboard.png | Bin 0 -> 329 bytes .../main/res/drawable-xxhdpi/input_smile.png | Bin 0 -> 749 bytes .../main/res/drawable-xxhdpi/menu_unlock.png | Bin 0 -> 1242 bytes app/src/main/res/drawable-xxhdpi/msg_add.png | Bin 0 -> 163 bytes .../res/drawable-xxhdpi/msg_addcontact.png | Bin 0 -> 533 bytes .../main/res/drawable-xxhdpi/msg_addphoto.png | Bin 0 -> 576 bytes .../res/drawable-xxhdpi/msg_arrow_back.png | Bin 0 -> 235 bytes .../res/drawable-xxhdpi/msg_arrowright.png | Bin 0 -> 176 bytes .../res/drawable-xxhdpi/msg_autodelete.png | Bin 0 -> 673 bytes .../main/res/drawable-xxhdpi/msg_block.png | Bin 0 -> 584 bytes .../main/res/drawable-xxhdpi/msg_camera.png | Bin 0 -> 601 bytes .../main/res/drawable-xxhdpi/msg_close.png | Bin 0 -> 261 bytes .../main/res/drawable-xxhdpi/msg_contact.png | Bin 0 -> 315 bytes .../res/drawable-xxhdpi/msg_customize.png | Bin 0 -> 514 bytes .../main/res/drawable-xxhdpi/msg_delete.png | Bin 0 -> 417 bytes app/src/main/res/drawable-xxhdpi/msg_edit.png | Bin 0 -> 373 bytes app/src/main/res/drawable-xxhdpi/msg_info.png | Bin 0 -> 644 bytes .../main/res/drawable-xxhdpi/msg_leave.png | Bin 0 -> 376 bytes .../main/res/drawable-xxhdpi/msg_message.png | Bin 0 -> 524 bytes app/src/main/res/drawable-xxhdpi/msg_mute.png | Bin 0 -> 745 bytes .../res/drawable-xxhdpi/msg_notifications.png | Bin 0 -> 438 bytes .../main/res/drawable-xxhdpi/msg_palette.png | Bin 0 -> 656 bytes .../main/res/drawable-xxhdpi/msg_photos.png | Bin 0 -> 495 bytes app/src/main/res/drawable-xxhdpi/msg_pin.png | Bin 0 -> 507 bytes .../main/res/drawable-xxhdpi/msg_retry.png | Bin 0 -> 511 bytes .../main/res/drawable-xxhdpi/msg_secret.png | Bin 0 -> 436 bytes app/src/main/res/drawable-xxhdpi/msg_send.png | Bin 0 -> 609 bytes .../main/res/drawable-xxhdpi/msg_sendfile.png | Bin 0 -> 380 bytes .../main/res/drawable-xxhdpi/msg_theme.png | Bin 0 -> 725 bytes .../main/res/drawable-xxhdpi/msg_unpin.png | Bin 0 -> 530 bytes .../main/res/drawable-xxhdpi/msg_views.png | Bin 0 -> 373 bytes .../main/res/drawable-xxhdpi/msg_warning.png | Bin 0 -> 83 bytes 174 files changed, 934 insertions(+), 494 deletions(-) create mode 100644 app/src/main/java/com/rosetta/messenger/ui/icons/TelegramIcons.kt create mode 100644 app/src/main/res/drawable-hdpi/fingerprint.png create mode 100644 app/src/main/res/drawable-hdpi/ic_ab_done.png create mode 100644 app/src/main/res/drawable-hdpi/ic_ab_other.png create mode 100644 app/src/main/res/drawable-hdpi/ic_ab_reply.png create mode 100644 app/src/main/res/drawable-hdpi/ic_arrow_drop_down.png create mode 100644 app/src/main/res/drawable-hdpi/input_attach.png create mode 100644 app/src/main/res/drawable-hdpi/input_keyboard.png create mode 100644 app/src/main/res/drawable-hdpi/input_smile.png create mode 100644 app/src/main/res/drawable-hdpi/menu_unlock.png create mode 100644 app/src/main/res/drawable-hdpi/msg_add.png create mode 100644 app/src/main/res/drawable-hdpi/msg_addcontact.png create mode 100644 app/src/main/res/drawable-hdpi/msg_addphoto.png create mode 100644 app/src/main/res/drawable-hdpi/msg_arrow_back.png create mode 100644 app/src/main/res/drawable-hdpi/msg_arrowright.png create mode 100644 app/src/main/res/drawable-hdpi/msg_autodelete.png create mode 100644 app/src/main/res/drawable-hdpi/msg_block.png create mode 100644 app/src/main/res/drawable-hdpi/msg_camera.png create mode 100644 app/src/main/res/drawable-hdpi/msg_close.png create mode 100644 app/src/main/res/drawable-hdpi/msg_contact.png create mode 100644 app/src/main/res/drawable-hdpi/msg_customize.png create mode 100644 app/src/main/res/drawable-hdpi/msg_delete.png create mode 100644 app/src/main/res/drawable-hdpi/msg_edit.png create mode 100644 app/src/main/res/drawable-hdpi/msg_info.png create mode 100644 app/src/main/res/drawable-hdpi/msg_leave.png create mode 100644 app/src/main/res/drawable-hdpi/msg_message.png create mode 100644 app/src/main/res/drawable-hdpi/msg_mute.png create mode 100644 app/src/main/res/drawable-hdpi/msg_notifications.png create mode 100644 app/src/main/res/drawable-hdpi/msg_palette.png create mode 100644 app/src/main/res/drawable-hdpi/msg_photos.png create mode 100644 app/src/main/res/drawable-hdpi/msg_pin.png create mode 100644 app/src/main/res/drawable-hdpi/msg_retry.png create mode 100644 app/src/main/res/drawable-hdpi/msg_secret.png create mode 100644 app/src/main/res/drawable-hdpi/msg_send.png create mode 100644 app/src/main/res/drawable-hdpi/msg_sendfile.png create mode 100644 app/src/main/res/drawable-hdpi/msg_theme.png create mode 100644 app/src/main/res/drawable-hdpi/msg_unpin.png create mode 100644 app/src/main/res/drawable-hdpi/msg_views.png create mode 100644 app/src/main/res/drawable-hdpi/msg_warning.png create mode 100644 app/src/main/res/drawable-mdpi/fingerprint.png create mode 100644 app/src/main/res/drawable-mdpi/ic_ab_done.png create mode 100644 app/src/main/res/drawable-mdpi/ic_ab_other.png create mode 100644 app/src/main/res/drawable-mdpi/ic_ab_reply.png create mode 100644 app/src/main/res/drawable-mdpi/ic_arrow_drop_down.png create mode 100644 app/src/main/res/drawable-mdpi/input_attach.png create mode 100644 app/src/main/res/drawable-mdpi/input_keyboard.png create mode 100644 app/src/main/res/drawable-mdpi/input_smile.png create mode 100644 app/src/main/res/drawable-mdpi/menu_unlock.png create mode 100644 app/src/main/res/drawable-mdpi/msg_add.png create mode 100644 app/src/main/res/drawable-mdpi/msg_addcontact.png create mode 100644 app/src/main/res/drawable-mdpi/msg_addphoto.png create mode 100644 app/src/main/res/drawable-mdpi/msg_arrow_back.png create mode 100644 app/src/main/res/drawable-mdpi/msg_arrowright.png create mode 100644 app/src/main/res/drawable-mdpi/msg_autodelete.png create mode 100644 app/src/main/res/drawable-mdpi/msg_block.png create mode 100644 app/src/main/res/drawable-mdpi/msg_camera.png create mode 100644 app/src/main/res/drawable-mdpi/msg_close.png create mode 100644 app/src/main/res/drawable-mdpi/msg_contact.png create mode 100644 app/src/main/res/drawable-mdpi/msg_customize.png create mode 100644 app/src/main/res/drawable-mdpi/msg_delete.png create mode 100644 app/src/main/res/drawable-mdpi/msg_edit.png create mode 100644 app/src/main/res/drawable-mdpi/msg_info.png create mode 100644 app/src/main/res/drawable-mdpi/msg_leave.png create mode 100644 app/src/main/res/drawable-mdpi/msg_message.png create mode 100644 app/src/main/res/drawable-mdpi/msg_mute.png create mode 100644 app/src/main/res/drawable-mdpi/msg_notifications.png create mode 100644 app/src/main/res/drawable-mdpi/msg_palette.png create mode 100644 app/src/main/res/drawable-mdpi/msg_photos.png create mode 100644 app/src/main/res/drawable-mdpi/msg_pin.png create mode 100644 app/src/main/res/drawable-mdpi/msg_retry.png create mode 100644 app/src/main/res/drawable-mdpi/msg_secret.png create mode 100644 app/src/main/res/drawable-mdpi/msg_send.png create mode 100644 app/src/main/res/drawable-mdpi/msg_sendfile.png create mode 100644 app/src/main/res/drawable-mdpi/msg_theme.png create mode 100644 app/src/main/res/drawable-mdpi/msg_unpin.png create mode 100644 app/src/main/res/drawable-mdpi/msg_views.png create mode 100644 app/src/main/res/drawable-mdpi/msg_warning.png create mode 100644 app/src/main/res/drawable-xhdpi/fingerprint.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_ab_done.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_ab_other.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_ab_reply.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_arrow_drop_down.png create mode 100644 app/src/main/res/drawable-xhdpi/input_attach.png create mode 100644 app/src/main/res/drawable-xhdpi/input_keyboard.png create mode 100644 app/src/main/res/drawable-xhdpi/input_smile.png create mode 100644 app/src/main/res/drawable-xhdpi/menu_unlock.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_add.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_addcontact.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_addphoto.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_arrow_back.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_arrowright.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_autodelete.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_block.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_camera.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_close.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_contact.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_customize.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_delete.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_edit.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_info.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_leave.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_message.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_mute.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_notifications.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_palette.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_photos.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_pin.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_retry.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_secret.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_send.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_sendfile.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_theme.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_unpin.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_views.png create mode 100644 app/src/main/res/drawable-xhdpi/msg_warning.png create mode 100644 app/src/main/res/drawable-xxhdpi/fingerprint.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_ab_done.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_ab_other.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_ab_reply.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_arrow_drop_down.png create mode 100644 app/src/main/res/drawable-xxhdpi/input_attach.png create mode 100644 app/src/main/res/drawable-xxhdpi/input_keyboard.png create mode 100644 app/src/main/res/drawable-xxhdpi/input_smile.png create mode 100644 app/src/main/res/drawable-xxhdpi/menu_unlock.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_add.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_addcontact.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_addphoto.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_arrow_back.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_arrowright.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_autodelete.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_block.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_camera.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_close.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_contact.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_customize.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_delete.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_edit.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_info.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_leave.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_message.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_mute.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_notifications.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_palette.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_photos.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_pin.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_retry.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_secret.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_send.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_sendfile.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_theme.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_unpin.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_views.png create mode 100644 app/src/main/res/drawable-xxhdpi/msg_warning.png diff --git a/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt index 52c2725..7e0bb54 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/auth/SetPasswordScreen.kt @@ -9,12 +9,14 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType @@ -75,7 +77,15 @@ fun SetPasswordScreen( var visible by remember { mutableStateOf(false) } // Track keyboard visibility - val view = androidx.compose.ui.platform.LocalView.current + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } var isKeyboardVisible by remember { mutableStateOf(false) } DisposableEffect(view) { @@ -106,7 +116,7 @@ fun SetPasswordScreen( ) { IconButton(onClick = onBack, enabled = !isCreating) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = textColor.copy(alpha = 0.6f) ) @@ -280,7 +290,7 @@ fun SetPasswordScreen( else -> Color(0xFF4CAF50) } Icon( - imageVector = TablerIcons.Shield, + painter = TelegramIcons.Secret, contentDescription = null, tint = strengthColor, modifier = Modifier.size(16.dp) @@ -306,7 +316,7 @@ fun SetPasswordScreen( verticalAlignment = Alignment.Top ) { Icon( - imageVector = TablerIcons.AlertTriangle, + painter = TelegramIcons.Warning, contentDescription = null, tint = Color(0xFFE53935), modifier = Modifier.size(16.dp) @@ -446,7 +456,7 @@ fun SetPasswordScreen( verticalAlignment = Alignment.Top ) { Icon( - imageVector = TablerIcons.InfoCircle, + painter = TelegramIcons.Info, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(20.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt index 6e53dcd..0b484f3 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/auth/UnlockScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -504,7 +505,7 @@ fun UnlockScreen( if (isSelected) { Icon( - TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(20.dp) @@ -645,7 +646,7 @@ fun UnlockScreen( ) } else { Icon( - imageVector = TablerIcons.LockOpen, + painter = TelegramIcons.Unlock, contentDescription = null, modifier = Modifier.size(20.dp) ) @@ -663,7 +664,7 @@ fun UnlockScreen( enabled = !isUnlocking ) { Icon( - imageVector = TablerIcons.Fingerprint, + painter = TelegramIcons.Fingerprint, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(22.dp) @@ -719,7 +720,7 @@ fun UnlockScreen( TextButton(onClick = onSwitchAccount) { Icon( - imageVector = TablerIcons.UserPlus, + painter = TelegramIcons.AddContact, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(18.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt index 9367aa3..5e83c1a 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt @@ -27,6 +27,9 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* +import compose.icons.TablerIcons +import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.collectAsState @@ -117,6 +120,15 @@ fun ChatDetailScreen( val database = RosettaDatabase.getDatabase(context) val hapticFeedback = LocalHapticFeedback.current + // 🔇 Mute state — read from PreferencesManager + val preferencesManager = remember { com.rosetta.messenger.data.PreferencesManager(context) } + val isChatMuted = remember { mutableStateOf(false) } + LaunchedEffect(currentUserPublicKey, user.publicKey) { + if (currentUserPublicKey.isNotBlank()) { + isChatMuted.value = preferencesManager.isChatMuted(currentUserPublicKey, user.publicKey) + } + } + // UI Theme val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFF2F2F7) val textColor = if (isDarkTheme) Color.White else Color.Black @@ -192,17 +204,24 @@ fun ChatDetailScreen( var imageViewerSourceBounds by remember { mutableStateOf(null) } var imageViewerImages by remember { mutableStateOf>(emptyList()) } - // 🎨 Управление статус баром - DisposableEffect(isDarkTheme, showImageViewer, window, view) { - if (showImageViewer) { - // 📸 При просмотре фото - чёрные system bars - SystemBarsStyleUtils.applyFullscreenDark(window, view) - } else { - // Обычный режим чата - SystemBarsStyleUtils.applyChatStatusBar(window, view, isDarkTheme) + // 🎨 Управление статус баром — ВСЕГДА чёрные иконки в светлой теме + if (!view.isInEditMode) { + SideEffect { + if (showImageViewer) { + SystemBarsStyleUtils.applyFullscreenDark(window, view) + } else { + if (window != null && view != null) { + val ic = androidx.core.view.WindowCompat.getInsetsController(window, view) + window.statusBarColor = android.graphics.Color.TRANSPARENT + ic.isAppearanceLightStatusBars = !isDarkTheme + } + } } + } + DisposableEffect(Unit) { onDispose { + // Восстановить при уходе с экрана SystemBarsStyleUtils.applyChatStatusBar(window, view, isDarkTheme) } } @@ -562,16 +581,10 @@ fun ChatDetailScreen( } ) { Icon( - Icons.Default - .Close, + painter = TelegramIcons.Close, contentDescription = "Cancel", - tint = - if (isDarkTheme - ) - Color.White - else - Color.Black, + tint = headerIconColor, modifier = Modifier.size( 24.dp @@ -657,12 +670,7 @@ fun ChatDetailScreen( .ContentCopy, contentDescription = "Copy", - tint = - if (isDarkTheme - ) - Color.White - else - Color.Black, + tint = headerIconColor, modifier = Modifier.size( 22.dp @@ -697,12 +705,7 @@ fun ChatDetailScreen( .Delete, contentDescription = "Delete", - tint = - if (isDarkTheme - ) - Color.White - else - Color.Black, + tint = headerIconColor, modifier = Modifier.size( 22.dp @@ -735,8 +738,7 @@ fun ChatDetailScreen( ) ) { Icon( - Icons.Default - .KeyboardArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = @@ -749,7 +751,7 @@ fun ChatDetailScreen( ), modifier = Modifier.size( - 32.dp + 28.dp ) ) } @@ -987,6 +989,16 @@ fun ChatDetailScreen( isDarkTheme ) } + // 🔇 Mute icon + if (isChatMuted.value) { + Spacer(modifier = Modifier.width(4.dp)) + Icon( + painter = TelegramIcons.Mute, + contentDescription = "Muted", + modifier = Modifier.size(16.dp), + tint = secondaryTextColor + ) + } } // Typing indicator или // subtitle @@ -1886,6 +1898,16 @@ fun ChatDetailScreen( avatarRepository, onLongClick = { // 📳 Haptic feedback при долгом нажатии + // Не разрешаем выделять avatar-сообщения + val hasAvatar = + message.attachments + .any { + it.type == + AttachmentType + .AVATAR + } + if (hasAvatar) return@MessageBubble + hapticFeedback .performHapticFeedback( HapticFeedbackType @@ -1922,7 +1944,14 @@ fun ChatDetailScreen( } }, onClick = { - if (isSelectionMode + val hasAvatar = + message.attachments + .any { + it.type == + AttachmentType + .AVATAR + } + if (isSelectionMode && !hasAvatar ) { selectedMessages = if (selectedMessages diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt index d131b03..b59ddca 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* @@ -23,6 +24,7 @@ import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.lerp +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.positionChange @@ -57,6 +59,7 @@ import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import java.text.SimpleDateFormat import java.util.* import kotlinx.coroutines.launch @@ -220,21 +223,22 @@ fun ChatsListScreen( focusManager.clearFocus() } - // Update status bar appearance — SideEffect overrides global Theme.kt SideEffect - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as android.app.Activity).window - val insetsController = - androidx.core.view.WindowCompat.getInsetsController(window, view) + // Update status bar appearance — only set once on entry, not every recomposition + // This prevents overriding ChatDetailScreen's status bar when ChatsListScreen is in back stack + DisposableEffect(isDarkTheme) { + val window = (view.context as android.app.Activity).window + val insetsController = + androidx.core.view.WindowCompat.getInsetsController(window, view) - // Status bar — always white icons (header is blue) - insetsController.isAppearanceLightStatusBars = false - window.statusBarColor = android.graphics.Color.TRANSPARENT + // Status bar — always white icons (header is blue) + insetsController.isAppearanceLightStatusBars = false + window.statusBarColor = android.graphics.Color.TRANSPARENT - // Navigation bar: показываем только если есть нативные кнопки - com.rosetta.messenger.ui.utils.NavigationModeUtils - .applyNavigationBarVisibility(insetsController, context, isDarkTheme) - } + // Navigation bar + com.rosetta.messenger.ui.utils.NavigationModeUtils + .applyNavigationBarVisibility(insetsController, context, isDarkTheme) + + onDispose { } } // Colors - instant change, no animation - 🔥 КЭШИРУЕМ для производительности @@ -490,21 +494,35 @@ fun ChatsListScreen( ) val headerColor = avatarColors.backgroundColor - // Header с размытым фоном аватарки + // Header с blur аватарки (fallback = голубой) или акцентным цветом (light) Box(modifier = Modifier.fillMaxWidth()) { - BlurredAvatarBackground( - publicKey = accountPublicKey, - avatarRepository = avatarRepository, - fallbackColor = headerColor, - blurRadius = 40f, - alpha = 0.6f, - overlayColors = - BackgroundBlurPresets - .getOverlayColors( - backgroundBlurColorId - ), - isDarkTheme = isDarkTheme - ) + if (isDarkTheme) { + if (backgroundBlurColorId == "solid_blue") { + // Голубой фон + Box( + modifier = Modifier + .matchParentSize() + .background(PrimaryBlueDark) + ) + } else { + // Avatar blur (default) + BlurredAvatarBackground( + publicKey = accountPublicKey, + avatarRepository = avatarRepository, + fallbackColor = PrimaryBlueDark, + blurRadius = 40f, + alpha = 0.6f, + overlayColors = emptyList(), + isDarkTheme = isDarkTheme + ) + } + } else { + Box( + modifier = Modifier + .matchParentSize() + .background(PrimaryBlue) + ) + } // Content поверх фона Column( @@ -689,7 +707,7 @@ fun ChatsListScreen( contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = Color.White, modifier = Modifier.size(8.dp) @@ -734,7 +752,7 @@ fun ChatsListScreen( contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.Plus, + painter = TelegramIcons.Add, contentDescription = "Add Account", tint = if (isDarkTheme) Color(0xFF828282) else Color(0xFF889198), modifier = Modifier.size(22.dp) @@ -866,7 +884,7 @@ fun ChatsListScreen( // Logout DrawerMenuItemEnhanced( - icon = TablerIcons.Logout, + painter = TelegramIcons.Leave, text = "Log Out", iconColor = Color(0xFFFF4444), textColor = Color(0xFFFF4444), @@ -923,7 +941,7 @@ fun ChatsListScreen( navigationIcon = { IconButton(onClick = { selectedChatKeys = emptySet() }) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Close", tint = Color.White ) @@ -950,7 +968,7 @@ fun ChatsListScreen( } }) { Icon( - if (allMuted) TablerIcons.Bell else TablerIcons.BellOff, + painter = if (allMuted) TelegramIcons.Notifications else TelegramIcons.Mute, contentDescription = if (allMuted) "Unmute" else "Mute", tint = Color.White ) @@ -964,7 +982,7 @@ fun ChatsListScreen( selectedChatKeys = emptySet() }) { Icon( - TablerIcons.Trash, + painter = TelegramIcons.Delete, contentDescription = "Delete", tint = Color.White ) @@ -974,7 +992,7 @@ fun ChatsListScreen( Box { IconButton(onClick = { showSelectionMenu = true }) { Icon( - TablerIcons.DotsVertical, + painter = TelegramIcons.More, contentDescription = "More", tint = Color.White ) @@ -1000,7 +1018,7 @@ fun ChatsListScreen( }, leadingIcon = { Icon( - if (allPinned) TablerIcons.PinnedOff else TablerIcons.Pin, + painter = if (allPinned) TelegramIcons.Unpin else TelegramIcons.Pin, contentDescription = null, tint = if (isDarkTheme) Color.White else Color.Black ) @@ -1028,7 +1046,7 @@ fun ChatsListScreen( }, leadingIcon = { Icon( - TablerIcons.Ban, + painter = TelegramIcons.Block, contentDescription = null, tint = Color(0xFFE53935) ) @@ -1089,10 +1107,10 @@ fun ChatsListScreen( modifier = Modifier .align(Alignment.TopEnd) - .offset(x = 2.dp, y = (-2).dp) - .size(8.dp) + .offset(x = 4.dp, y = (-4).dp) + .size(10.dp) .clip(CircleShape) - .background(if (isDarkTheme) PrimaryBlueDark else PrimaryBlue) + .background(if (isDarkTheme) Color.White else PrimaryBlue) ) } } @@ -1208,7 +1226,7 @@ fun ChatsListScreen( shape = CircleShape ) { Icon( - TablerIcons.Edit, + painter = TelegramIcons.Edit, contentDescription = "New Chat" ) } @@ -1444,9 +1462,55 @@ fun ChatsListScreen( } } + // Track scroll direction to hide/show Requests + val chatListState = rememberLazyListState() + var isRequestsVisible by remember { mutableStateOf(true) } + val hapticFeedback = LocalHapticFeedback.current + + // NestedScroll — ловим направление свайпа даже без скролла + // Для появления: накапливаем pull down дельту, нужен сильный жест + val requestsNestedScroll = remember(hapticFeedback) { + var accumulatedPullDown = 0f + object : androidx.compose.ui.input.nestedscroll.NestedScrollConnection { + override fun onPreScroll( + available: androidx.compose.ui.geometry.Offset, + source: androidx.compose.ui.input.nestedscroll.NestedScrollSource + ): androidx.compose.ui.geometry.Offset { + if (available.y < -10f) { + // Свайп вверх — прячем легко + accumulatedPullDown = 0f + isRequestsVisible = false + } else if (available.y > 0f && !isRequestsVisible) { + // Свайп вниз — накапливаем для появления + accumulatedPullDown += available.y + if (accumulatedPullDown > 120f) { + isRequestsVisible = true + accumulatedPullDown = 0f + hapticFeedback.performHapticFeedback( + HapticFeedbackType.LongPress + ) + } + } else if (available.y <= 0f) { + accumulatedPullDown = 0f + } + return androidx.compose.ui.geometry.Offset.Zero + } + + override suspend fun onPostFling( + consumed: androidx.compose.ui.unit.Velocity, + available: androidx.compose.ui.unit.Velocity + ): androidx.compose.ui.unit.Velocity { + accumulatedPullDown = 0f + return androidx.compose.ui.unit.Velocity.Zero + } + } + } + LazyColumn( + state = chatListState, modifier = Modifier.fillMaxSize() + .nestedScroll(requestsNestedScroll) .background( listBackgroundColor ) @@ -1456,23 +1520,35 @@ fun ChatsListScreen( key = "requests_section" ) { - RequestsSection( - count = - requestsCount, - requests = - requests, - isDarkTheme = - isDarkTheme, - onClick = { - onRequestsClick() + AnimatedVisibility( + visible = isRequestsVisible, + enter = expandVertically( + animationSpec = tween(250, easing = FastOutSlowInEasing) + ) + fadeIn(animationSpec = tween(200)), + exit = shrinkVertically( + animationSpec = tween(250, easing = FastOutSlowInEasing) + ) + fadeOut(animationSpec = tween(200)) + ) { + Column { + RequestsSection( + count = + requestsCount, + requests = + requests, + isDarkTheme = + isDarkTheme, + onClick = { + onRequestsClick() + } + ) + Divider( + color = + dividerColor, + thickness = + 0.5.dp + ) } - ) - Divider( - color = - dividerColor, - thickness = - 0.5.dp - ) + } } } @@ -1980,7 +2056,7 @@ fun ChatItem( if (isMuted) { Spacer(modifier = Modifier.width(4.dp)) Icon( - TablerIcons.BellOff, + painter = TelegramIcons.Mute, contentDescription = "Muted", tint = secondaryTextColor, modifier = Modifier.size(14.dp) @@ -1990,7 +2066,7 @@ fun ChatItem( Row(verticalAlignment = Alignment.CenterVertically) { // Read status Icon( - TablerIcons.Checks, + painter = TelegramIcons.Done, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(16.dp) @@ -2028,7 +2104,7 @@ fun ChatItem( // Pin icon if (chat.isPinned) { Icon( - TablerIcons.Pin, + painter = TelegramIcons.Pin, contentDescription = "Pinned", tint = secondaryTextColor.copy( @@ -2262,9 +2338,9 @@ fun SwipeableDialogItem( verticalArrangement = Arrangement.Center ) { Icon( - imageVector = - if (isPinned) TablerIcons.PinnedOff - else TablerIcons.Pin, + painter = + if (isPinned) TelegramIcons.Unpin + else TelegramIcons.Pin, contentDescription = if (isPinned) "Unpin" else "Pin", tint = Color.White, @@ -2303,9 +2379,9 @@ fun SwipeableDialogItem( verticalArrangement = Arrangement.Center ) { Icon( - imageVector = - if (isBlocked) TablerIcons.LockOpen - else TablerIcons.Ban, + painter = + if (isBlocked) TelegramIcons.Unlock + else TelegramIcons.Block, contentDescription = if (isBlocked) "Unblock" else "Block", @@ -2343,7 +2419,7 @@ fun SwipeableDialogItem( verticalArrangement = Arrangement.Center ) { Icon( - imageVector = TablerIcons.Trash, + painter = TelegramIcons.Delete, contentDescription = "Delete", tint = Color.White, modifier = Modifier.size(22.dp) @@ -2742,7 +2818,7 @@ fun DialogItemContent( if (isBlocked) { Spacer(modifier = Modifier.width(4.dp)) Icon( - imageVector = TablerIcons.Lock, + painter = TelegramIcons.Secret, contentDescription = "Blocked", tint = Color(0xFFFF3B30), modifier = Modifier.size(14.dp) @@ -2751,7 +2827,7 @@ fun DialogItemContent( if (isMuted) { Spacer(modifier = Modifier.width(4.dp)) Icon( - imageVector = TablerIcons.BellOff, + painter = TelegramIcons.Mute, contentDescription = "Muted", tint = secondaryTextColor, modifier = Modifier.size(14.dp) @@ -2767,7 +2843,7 @@ fun DialogItemContent( // галочки (прочитано) if (dialog.isSavedMessages) { Icon( - imageVector = TablerIcons.Checks, + painter = TelegramIcons.Done, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(16.dp) @@ -2810,8 +2886,8 @@ fun DialogItemContent( // READ (delivered=3) - две синие // галочки Icon( - imageVector = - TablerIcons.Checks, + painter = + TelegramIcons.Done, contentDescription = null, tint = PrimaryBlue, modifier = @@ -2825,8 +2901,8 @@ fun DialogItemContent( 1 -> { // DELIVERED - одна серая галочка Icon( - imageVector = - TablerIcons.Check, + painter = + TelegramIcons.Done, contentDescription = null, tint = secondaryTextColor @@ -2845,8 +2921,8 @@ fun DialogItemContent( else -> { // SENDING (0) - часики Icon( - imageVector = - TablerIcons.Clock, + painter = + TelegramIcons.Clock, contentDescription = "Sending", tint = @@ -2988,7 +3064,7 @@ fun DialogItemContent( Row(verticalAlignment = Alignment.CenterVertically) { Spacer(modifier = Modifier.width(6.dp)) Icon( - imageVector = TablerIcons.Pin, + painter = TelegramIcons.Pin, contentDescription = "Pinned", tint = secondaryTextColor.copy(alpha = 0.5f), modifier = Modifier.size(16.dp) @@ -3057,12 +3133,20 @@ fun RequestsSection( isDarkTheme: Boolean, onClick: () -> Unit ) { - val textColor = remember(isDarkTheme) { if (isDarkTheme) Color.White else Color.Black } - val secondaryTextColor = - remember(isDarkTheme) { if (isDarkTheme) Color(0xFF8E8E93) else Color(0xFF666666) } + // Telegram archived chats uses muted colors: + // Title: #525252 (light) vs regular #222222 + // Message: #919191 (light) + // Badge: always grey #c6c9cc (light) + // Avatar bg: #B8C2CC (light) / #3A3A3C (dark) + val titleColor = remember(isDarkTheme) { + if (isDarkTheme) Color(0xFFAAAAAA) else Color(0xFF525252) + } + val subtitleColor = + remember(isDarkTheme) { if (isDarkTheme) Color(0xFF6E6E6E) else Color(0xFF919191) } val iconBgColor = - remember(isDarkTheme) { if (isDarkTheme) Color(0xFF3A3A3C) else Color(0xFFC7C7CC) } - val accentColor = if (isDarkTheme) PrimaryBlueDark else PrimaryBlue + remember(isDarkTheme) { if (isDarkTheme) Color(0xFF3A3A3C) else Color(0xFFB8C2CC) } + val badgeColor = + remember(isDarkTheme) { if (isDarkTheme) Color(0xFF4E4E4E) else Color(0xFFC6C9CC) } // Последний запрос — показываем имя отправителя как subtitle val lastRequest = remember(requests) { requests.firstOrNull() } @@ -3096,7 +3180,7 @@ fun RequestsSection( contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.MailForward, + painter = painterResource(id = R.drawable.archive_filled), contentDescription = null, tint = Color.White, modifier = Modifier.size(26.dp) @@ -3116,7 +3200,7 @@ fun RequestsSection( text = "Requests", fontWeight = FontWeight.SemiBold, fontSize = 16.sp, - color = textColor, + color = titleColor, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.weight(1f) @@ -3130,7 +3214,7 @@ fun RequestsSection( Modifier .defaultMinSize(minWidth = 22.dp, minHeight = 22.dp) .clip(CircleShape) - .background(accentColor), + .background(badgeColor), contentAlignment = Alignment.Center ) { Text( @@ -3151,20 +3235,13 @@ fun RequestsSection( Text( text = subtitle, fontSize = 14.sp, - color = secondaryTextColor, + color = subtitleColor, maxLines = 1, overflow = TextOverflow.Ellipsis ) } } } - - // Разделитель как у обычных чатов - Divider( - color = if (isDarkTheme) Color(0xFF3A3A3A) else Color(0xFFE8E8E8), - thickness = 0.5.dp, - modifier = Modifier.padding(start = 84.dp) - ) } } diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt index 14f2e31..dccf5ba 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt @@ -417,7 +417,7 @@ private fun ForwardDialogItem( .size(24.dp) .clip(CircleShape) .background( - if (isSelected) Color(0xFF4CD964) + if (isSelected) PrimaryBlue else if (isDarkTheme) Color(0xFF3A3A3A) else Color(0xFFE0E0E0) ), diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/RequestsListScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/RequestsListScreen.kt index 273c22d..3bdc6de 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/RequestsListScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/RequestsListScreen.kt @@ -22,8 +22,9 @@ import androidx.compose.ui.unit.sp import com.rosetta.messenger.network.SearchUser import com.rosetta.messenger.repository.AvatarRepository import com.rosetta.messenger.ui.onboarding.PrimaryBlue +import com.rosetta.messenger.ui.icons.TelegramIcons import compose.icons.TablerIcons -import compose.icons.tablericons.ChevronLeft +import compose.icons.tablericons.* import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt index c7ecc66..a5fd0e6 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt @@ -11,9 +11,9 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import com.rosetta.messenger.ui.icons.TelegramIcons import compose.icons.TablerIcons -import compose.icons.tablericons.ArrowLeft -import compose.icons.tablericons.X +import compose.icons.tablericons.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Verified import androidx.compose.material3.* @@ -61,6 +61,14 @@ fun SearchScreen( val context = LocalContext.current val view = LocalView.current val focusManager = LocalFocusManager.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } // 🔥 Функция мгновенного закрытия клавиатуры val hideKeyboardInstantly: () -> Unit = { @@ -173,7 +181,7 @@ fun SearchScreen( } ) { Icon( - TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = textColor.copy(alpha = 0.6f) ) @@ -233,7 +241,7 @@ fun SearchScreen( ) { IconButton(onClick = { searchViewModel.clearSearchQuery() }) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Clear", tint = secondaryTextColor.copy(alpha = 0.6f) ) @@ -424,7 +432,7 @@ private fun RecentUserItem( // Remove button IconButton(onClick = onRemove, modifier = Modifier.size(40.dp)) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Remove", tint = secondaryTextColor.copy(alpha = 0.6f), modifier = Modifier.size(20.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt index 65bdbc5..cd34e02 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt @@ -57,8 +57,7 @@ import com.rosetta.messenger.ui.onboarding.PrimaryBlue import com.rosetta.messenger.utils.AttachmentFileManager import com.rosetta.messenger.utils.AvatarFileManager import com.vanniktech.blurhash.BlurHash -import compose.icons.TablerIcons -import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first @@ -1174,7 +1173,7 @@ fun ImageAttachment( when (messageStatus) { MessageStatus.SENDING -> { Icon( - compose.icons.TablerIcons.Clock, + painter = TelegramIcons.Clock, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(14.dp) @@ -1182,7 +1181,7 @@ fun ImageAttachment( } MessageStatus.SENT -> { Icon( - compose.icons.TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(14.dp) @@ -1190,7 +1189,7 @@ fun ImageAttachment( } MessageStatus.DELIVERED -> { Icon( - compose.icons.TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(14.dp) @@ -1198,7 +1197,7 @@ fun ImageAttachment( } MessageStatus.READ -> { Icon( - compose.icons.TablerIcons.Checks, + painter = TelegramIcons.Done, contentDescription = null, tint = Color.White, modifier = Modifier.size(14.dp) @@ -1546,7 +1545,7 @@ fun FileAttachment( when (messageStatus) { MessageStatus.SENDING -> { Icon( - compose.icons.TablerIcons.Clock, + painter = TelegramIcons.Clock, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(14.dp) @@ -1554,7 +1553,7 @@ fun FileAttachment( } MessageStatus.SENT -> { Icon( - compose.icons.TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(14.dp) @@ -1562,7 +1561,7 @@ fun FileAttachment( } MessageStatus.DELIVERED, MessageStatus.READ -> { Icon( - compose.icons.TablerIcons.Checks, + painter = TelegramIcons.Done, contentDescription = null, tint = if (messageStatus == MessageStatus.READ) { @@ -1934,7 +1933,7 @@ fun AvatarAttachment( when (messageStatus) { MessageStatus.SENDING -> { Icon( - compose.icons.TablerIcons.Clock, + painter = TelegramIcons.Clock, contentDescription = "Sending", tint = Color.White.copy(alpha = 0.6f), modifier = Modifier.size(14.dp) @@ -1942,7 +1941,7 @@ fun AvatarAttachment( } MessageStatus.SENT -> { Icon( - compose.icons.TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = "Sent", tint = Color.White.copy(alpha = 0.6f), modifier = Modifier.size(14.dp) @@ -1950,7 +1949,7 @@ fun AvatarAttachment( } MessageStatus.DELIVERED -> { Icon( - compose.icons.TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = "Delivered", tint = Color.White.copy(alpha = 0.6f), modifier = Modifier.size(14.dp) @@ -1958,7 +1957,7 @@ fun AvatarAttachment( } MessageStatus.READ -> { Icon( - compose.icons.TablerIcons.Checks, + painter = TelegramIcons.Done, contentDescription = "Read", tint = Color.White, modifier = Modifier.size(14.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt index d39d40c..2cf1e8e 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt @@ -50,6 +50,8 @@ import com.rosetta.messenger.utils.AttachmentFileManager import com.vanniktech.blurhash.BlurHash import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons +import androidx.compose.ui.graphics.painter.Painter import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -392,7 +394,7 @@ fun MessageBubble( contentAlignment = Alignment.Center ) { Icon( - TablerIcons.CornerUpLeft, + painter = TelegramIcons.Reply, contentDescription = "Reply", tint = if (swipeProgress >= 1f) Color.White @@ -449,11 +451,11 @@ fun MessageBubble( Modifier.padding(start = 12.dp, end = 4.dp) .size(24.dp) .clip(CircleShape) - .background(Color(0xFF4CD964)), + .background(PrimaryBlue), contentAlignment = Alignment.Center ) { Icon( - TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = "Selected", tint = Color.White, modifier = Modifier.size(16.dp) @@ -1026,28 +1028,33 @@ fun AnimatedMessageStatus( ) { currentStatus -> val iconSize = with(LocalDensity.current) { 14.sp.toDp() } - Icon( - imageVector = - when (currentStatus) { - MessageStatus.SENDING -> TablerIcons.Clock - MessageStatus.SENT -> TablerIcons.Check - MessageStatus.DELIVERED -> TablerIcons.Check - MessageStatus.READ -> TablerIcons.Checks - MessageStatus.ERROR -> TablerIcons.AlertCircle - }, - contentDescription = null, - tint = animatedColor, - modifier = - Modifier.size(iconSize) - .scale(scale) - .then( - if (currentStatus == MessageStatus.ERROR) { - Modifier.clickable { - showErrorMenu = true - } - } else Modifier - ) - ) + if (currentStatus == MessageStatus.ERROR) { + Icon( + imageVector = TablerIcons.AlertCircle, + contentDescription = null, + tint = animatedColor, + modifier = + Modifier.size(iconSize) + .scale(scale) + .clickable { + showErrorMenu = true + } + ) + } else { + Icon( + painter = + when (currentStatus) { + MessageStatus.SENDING -> TelegramIcons.Clock + MessageStatus.SENT -> TelegramIcons.Done + MessageStatus.DELIVERED -> TelegramIcons.Done + MessageStatus.READ -> TelegramIcons.Done + else -> TelegramIcons.Clock + }, + contentDescription = null, + tint = animatedColor, + modifier = Modifier.size(iconSize).scale(scale) + ) + } } DropdownMenu( @@ -1062,7 +1069,7 @@ fun AnimatedMessageStatus( }, leadingIcon = { Icon( - TablerIcons.Refresh, + painter = TelegramIcons.Retry, contentDescription = null, modifier = Modifier.size(18.dp) ) @@ -1076,7 +1083,7 @@ fun AnimatedMessageStatus( }, leadingIcon = { Icon( - TablerIcons.Trash, + painter = TelegramIcons.Delete, contentDescription = null, tint = Color(0xFFE53935), modifier = Modifier.size(18.dp) @@ -1370,7 +1377,7 @@ fun ReplyBubble( contentAlignment = Alignment.Center ) { Icon( - TablerIcons.Photo, + painter = TelegramIcons.Photos, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(28.dp) @@ -1631,7 +1638,7 @@ private fun ForwardedImagePreview( } else { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Icon( - TablerIcons.Photo, + painter = TelegramIcons.Photos, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(28.dp) @@ -1721,85 +1728,86 @@ fun KebabMenu( onDeleteClick: () -> Unit, onLogsClick: () -> Unit = {} ) { - val dividerColor = - if (isDarkTheme) Color.White.copy(alpha = 0.1f) else Color.Black.copy(alpha = 0.08f) + val menuBgColor = if (isDarkTheme) Color(0xFF272829) else Color.White + val textColor = if (isDarkTheme) Color.White else Color(0xFF222222) + val iconColor = if (isDarkTheme) Color.White.copy(alpha = 0.47f) else Color(0xFF676B70) + val dividerColor = if (isDarkTheme) Color(0xFF1C1D1F) else Color(0xFFF5F5F5) - DropdownMenu( - expanded = expanded, - onDismissRequest = onDismiss, - modifier = Modifier.width(220.dp), - properties = - PopupProperties( - focusable = true, - dismissOnBackPress = true, - dismissOnClickOutside = true - ) + MaterialTheme( + colorScheme = MaterialTheme.colorScheme.copy( + surface = menuBgColor, + onSurface = textColor + ) ) { - if (!isSavedMessages) { - KebabMenuItem( - icon = if (isBlocked) TablerIcons.CircleCheck else TablerIcons.Ban, - text = if (isBlocked) "Unblock User" else "Block User", - onClick = { if (isBlocked) onUnblockClick() else onBlockClick() }, - tintColor = PrimaryBlue, - textColor = if (isDarkTheme) Color.White else Color.Black - ) + DropdownMenu( + expanded = expanded, + onDismissRequest = onDismiss, + modifier = Modifier + .defaultMinSize(minWidth = 196.dp) + .background(menuBgColor), + properties = + PopupProperties( + focusable = true, + dismissOnBackPress = true, + dismissOnClickOutside = true + ) + ) { + if (!isSavedMessages) { + KebabMenuItem( + icon = if (isBlocked) TelegramIcons.Done else TelegramIcons.Block, + text = if (isBlocked) "Unblock User" else "Block User", + onClick = { if (isBlocked) onUnblockClick() else onBlockClick() }, + tintColor = iconColor, + textColor = textColor + ) + } - Box( - modifier = - Modifier.fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 4.dp) - .height(0.5.dp) - .background(dividerColor) + // Delete chat + KebabMenuItem( + icon = TelegramIcons.Delete, + text = "Delete Chat", + onClick = onDeleteClick, + tintColor = Color(0xFFFF3B30), + textColor = Color(0xFFFF3B30) ) } - - // Delete chat - KebabMenuItem( - icon = TablerIcons.Trash, - text = "Delete Chat", - onClick = onDeleteClick, - tintColor = Color(0xFFFF3B30), - textColor = Color(0xFFFF3B30) - ) } } @Composable private fun KebabMenuItem( - icon: ImageVector, + icon: Painter, text: String, onClick: () -> Unit, tintColor: Color, textColor: Color ) { - val interactionSource = remember { MutableInteractionSource() } - - DropdownMenuItem( - text = { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() - ) { - Icon( - imageVector = icon, - contentDescription = null, - tint = tintColor, - modifier = Modifier.size(24.dp) - ) - Spacer(modifier = Modifier.width(14.dp)) - Text( - text = text, - color = textColor, - fontSize = 16.sp, - fontWeight = FontWeight.Medium - ) - } - }, - onClick = onClick, - modifier = Modifier.fillMaxWidth().padding(horizontal = 4.dp), - interactionSource = interactionSource, - contentPadding = PaddingValues(horizontal = 12.dp, vertical = 12.dp) - ) + // Telegram-style: 48dp height, 18dp horizontal padding + Box( + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minWidth = 196.dp, minHeight = 48.dp) + .clickable(onClick = onClick) + .padding(horizontal = 18.dp), + contentAlignment = Alignment.CenterStart + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = icon, + contentDescription = null, + tint = tintColor, + modifier = Modifier.size(24.dp) + ) + Spacer(modifier = Modifier.width(19.dp)) + Text( + text = text, + color = textColor, + fontSize = 16.sp + ) + } + } } /** 🖼️ Превью изображения для reply в input bar (как в Telegram) */ @@ -1949,7 +1957,7 @@ fun ReplyImagePreview( contentAlignment = Alignment.Center ) { Icon( - TablerIcons.Photo, + painter = TelegramIcons.Photos, contentDescription = null, tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(20.dp) @@ -1958,7 +1966,7 @@ fun ReplyImagePreview( } } } -/** Profile photo menu for avatar */ +/** Profile photo menu for avatar — Telegram style */ @Composable fun ProfilePhotoMenu( expanded: Boolean, @@ -1968,45 +1976,48 @@ fun ProfilePhotoMenu( onDeletePhotoClick: (() -> Unit)? = null, hasAvatar: Boolean = false ) { - val dividerColor = - if (isDarkTheme) Color.White.copy(alpha = 0.1f) else Color.Black.copy(alpha = 0.08f) + // Telegram popup colors + val menuBgColor = if (isDarkTheme) Color(0xFF272829) else Color.White + val textColor = if (isDarkTheme) Color.White else Color(0xFF222222) + val iconColor = if (isDarkTheme) Color.White.copy(alpha = 0.47f) else Color(0xFF676B70) + val dividerColor = if (isDarkTheme) Color(0xFF1C1D1F) else Color(0xFFF5F5F5) - DropdownMenu( - expanded = expanded, - onDismissRequest = onDismiss, - modifier = Modifier.width(220.dp), - properties = - PopupProperties( - focusable = true, - dismissOnBackPress = true, - dismissOnClickOutside = true - ) - ) { - ProfilePhotoMenuItem( - icon = TablerIcons.CameraPlus, - text = "Set Profile Photo", - onClick = onSetPhotoClick, - tintColor = if (isDarkTheme) Color.White else Color.Black, - textColor = if (isDarkTheme) Color.White else Color.Black + MaterialTheme( + colorScheme = MaterialTheme.colorScheme.copy( + surface = menuBgColor, + onSurface = textColor ) - - // Показываем Delete только если есть аватар - if (hasAvatar && onDeletePhotoClick != null) { - Box( - modifier = - Modifier.fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 4.dp) - .height(0.5.dp) - .background(dividerColor) - ) - + ) { + DropdownMenu( + expanded = expanded, + onDismissRequest = onDismiss, + modifier = Modifier + .defaultMinSize(minWidth = 196.dp) + .background(menuBgColor), + properties = + PopupProperties( + focusable = true, + dismissOnBackPress = true, + dismissOnClickOutside = true + ) + ) { ProfilePhotoMenuItem( - icon = TablerIcons.Trash, - text = "Delete Photo", - onClick = onDeletePhotoClick, - tintColor = Color(0xFFFF3B30), - textColor = Color(0xFFFF3B30) + icon = TelegramIcons.AddPhoto, + text = if (hasAvatar) "Set Profile Photo" else "Add Photo", + onClick = onSetPhotoClick, + tintColor = iconColor, + textColor = textColor ) + + if (hasAvatar && onDeletePhotoClick != null) { + ProfilePhotoMenuItem( + icon = TelegramIcons.Delete, + text = "Delete Photo", + onClick = onDeletePhotoClick, + tintColor = Color(0xFFFF3B30), + textColor = Color(0xFFFF3B30) + ) + } } } } @@ -2021,80 +2032,81 @@ fun OtherProfileMenu( onBlockClick: () -> Unit, onClearChatClick: () -> Unit ) { - val dividerColor = - if (isDarkTheme) Color.White.copy(alpha = 0.1f) else Color.Black.copy(alpha = 0.08f) + val menuBgColor = if (isDarkTheme) Color(0xFF272829) else Color.White + val textColor = if (isDarkTheme) Color.White else Color(0xFF222222) + val iconColor = if (isDarkTheme) Color.White.copy(alpha = 0.47f) else Color(0xFF676B70) + val dividerColor = if (isDarkTheme) Color(0xFF1C1D1F) else Color(0xFFF5F5F5) - DropdownMenu( - expanded = expanded, - onDismissRequest = onDismiss, - modifier = Modifier.width(220.dp), - properties = - PopupProperties( - focusable = true, - dismissOnBackPress = true, - dismissOnClickOutside = true - ) + MaterialTheme( + colorScheme = MaterialTheme.colorScheme.copy( + surface = menuBgColor, + onSurface = textColor + ) ) { - ProfilePhotoMenuItem( - icon = if (isBlocked) TablerIcons.CircleCheck else TablerIcons.Ban, - text = if (isBlocked) "Unblock User" else "Block User", - onClick = onBlockClick, - tintColor = PrimaryBlue, - textColor = if (isDarkTheme) Color.White else Color.Black - ) + DropdownMenu( + expanded = expanded, + onDismissRequest = onDismiss, + modifier = Modifier + .defaultMinSize(minWidth = 196.dp) + .background(menuBgColor), + properties = + PopupProperties( + focusable = true, + dismissOnBackPress = true, + dismissOnClickOutside = true + ) + ) { + ProfilePhotoMenuItem( + icon = if (isBlocked) TelegramIcons.Done else TelegramIcons.Block, + text = if (isBlocked) "Unblock User" else "Block User", + onClick = onBlockClick, + tintColor = iconColor, + textColor = textColor + ) - Box( - modifier = - Modifier.fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 4.dp) - .height(0.5.dp) - .background(dividerColor) - ) - - ProfilePhotoMenuItem( - icon = TablerIcons.Trash, - text = "Clear Chat History", - onClick = onClearChatClick, - tintColor = Color(0xFFFF3B30), - textColor = Color(0xFFFF3B30) - ) + ProfilePhotoMenuItem( + icon = TelegramIcons.Delete, + text = "Clear Chat History", + onClick = onClearChatClick, + tintColor = Color(0xFFFF3B30), + textColor = Color(0xFFFF3B30) + ) + } } } @Composable private fun ProfilePhotoMenuItem( - icon: ImageVector, + icon: Painter, text: String, onClick: () -> Unit, tintColor: Color, textColor: Color ) { - val interactionSource = remember { MutableInteractionSource() } - - DropdownMenuItem( - text = { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() - ) { - Icon( - imageVector = icon, - contentDescription = null, - tint = tintColor, - modifier = Modifier.size(24.dp) - ) - Spacer(modifier = Modifier.width(14.dp)) - Text( - text = text, - color = textColor, - fontSize = 16.sp, - fontWeight = FontWeight.Medium - ) - } - }, - onClick = onClick, - modifier = Modifier.fillMaxWidth().padding(horizontal = 4.dp), - interactionSource = interactionSource, - contentPadding = PaddingValues(horizontal = 12.dp, vertical = 12.dp) - ) + // Telegram: 48dp height, 18dp horizontal padding, 16sp text, icon→text gap 43dp + Box( + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minWidth = 196.dp, minHeight = 48.dp) + .clickable(onClick = onClick) + .padding(horizontal = 18.dp), + contentAlignment = Alignment.CenterStart + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = icon, + contentDescription = null, + tint = tintColor, + modifier = Modifier.size(24.dp) + ) + Spacer(modifier = Modifier.width(19.dp)) + Text( + text = text, + color = textColor, + fontSize = 16.sp + ) + } + } } diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/DebugLogsBottomSheet.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/DebugLogsBottomSheet.kt index caafc91..596c50a 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/DebugLogsBottomSheet.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/DebugLogsBottomSheet.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.unit.sp import com.rosetta.messenger.ui.onboarding.PrimaryBlue import compose.icons.TablerIcons import compose.icons.tablericons.Bug -import compose.icons.tablericons.Trash +import com.rosetta.messenger.ui.icons.TelegramIcons import kotlinx.coroutines.launch /** @@ -165,7 +165,7 @@ fun DebugLogsBottomSheet( Row { IconButton(onClick = onClearLogs) { Icon( - TablerIcons.Trash, + painter = TelegramIcons.Delete, contentDescription = "Clear logs", tint = secondaryTextColor.copy(alpha = 0.6f), modifier = Modifier.size(22.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt index e12fe0f..53558d4 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt @@ -66,6 +66,7 @@ import com.rosetta.messenger.ui.utils.SystemBarsStyleUtils import com.yalantis.ucrop.UCrop import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import ja.burhanrashid52.photoeditor.PhotoEditor import ja.burhanrashid52.photoeditor.PhotoEditorView import ja.burhanrashid52.photoeditor.SaveSettings @@ -472,7 +473,7 @@ fun ImageEditorScreen( modifier = Modifier.align(Alignment.CenterStart) ) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Close", tint = Color.White, modifier = Modifier.size(28.dp) @@ -1102,7 +1103,7 @@ private fun TelegramCaptionBar( modifier = Modifier.size(32.dp) ) { Icon( - if (showEmojiPicker) TablerIcons.Keyboard else TablerIcons.MoodSmile, + painter = if (showEmojiPicker) TelegramIcons.Keyboard else TelegramIcons.Smile, contentDescription = if (showEmojiPicker) "Keyboard" else "Emoji", tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(26.dp) @@ -1699,7 +1700,7 @@ fun MultiImageEditorScreen( modifier = Modifier.align(Alignment.CenterStart) ) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Close", tint = Color.White, modifier = Modifier.size(28.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/MediaPickerBottomSheet.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/MediaPickerBottomSheet.kt index 55167d7..ac22315 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/MediaPickerBottomSheet.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/MediaPickerBottomSheet.kt @@ -64,6 +64,7 @@ import coil.compose.AsyncImage import coil.request.ImageRequest import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import com.rosetta.messenger.ui.onboarding.PrimaryBlue import com.rosetta.messenger.ui.components.AppleEmojiTextField import com.rosetta.messenger.ui.components.KeyboardHeightProvider @@ -597,7 +598,7 @@ fun MediaPickerBottomSheet( horizontalAlignment = Alignment.CenterHorizontally ) { Icon( - TablerIcons.Photo, + painter = TelegramIcons.Photos, contentDescription = null, tint = secondaryTextColor, modifier = Modifier.size(64.dp) @@ -862,7 +863,7 @@ private fun MediaPickerHeader( contentPadding = PaddingValues(horizontal = 20.dp, vertical = 8.dp) ) { Icon( - TablerIcons.Send, + painter = TelegramIcons.Send, contentDescription = "Send", modifier = Modifier.size(18.dp), tint = Color.White @@ -897,7 +898,7 @@ private fun QuickActionsRow( ) { // Camera button QuickActionButton( - icon = TablerIcons.Camera, + icon = TelegramIcons.Camera, label = "Camera", backgroundColor = PrimaryBlue, iconColor = Color.White, @@ -907,7 +908,7 @@ private fun QuickActionsRow( // Avatar button QuickActionButton( - icon = TablerIcons.User, + icon = TelegramIcons.Contact, label = "Avatar", backgroundColor = buttonColor, iconColor = iconColor, @@ -917,7 +918,7 @@ private fun QuickActionsRow( // File button QuickActionButton( - icon = TablerIcons.File, + icon = TelegramIcons.File, label = "File", backgroundColor = buttonColor, iconColor = iconColor, @@ -929,7 +930,7 @@ private fun QuickActionsRow( @Composable private fun QuickActionButton( - icon: androidx.compose.ui.graphics.vector.ImageVector, + icon: androidx.compose.ui.graphics.painter.Painter, label: String, backgroundColor: Color, iconColor: Color, @@ -969,7 +970,7 @@ private fun QuickActionButton( contentAlignment = Alignment.Center ) { Icon( - imageVector = icon, + painter = icon, contentDescription = label, tint = iconColor, modifier = Modifier.size(24.dp) @@ -1125,7 +1126,7 @@ private fun CameraGridItem( contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.Camera, + painter = TelegramIcons.Camera, contentDescription = "Camera", tint = Color.White, modifier = Modifier @@ -1143,7 +1144,7 @@ private fun CameraGridItem( verticalArrangement = Arrangement.Center ) { Icon( - imageVector = TablerIcons.Camera, + painter = TelegramIcons.Camera, contentDescription = "Camera", tint = PrimaryBlue, modifier = Modifier @@ -1262,7 +1263,7 @@ private fun MediaGridItem( ) { if (isSelected) { Icon( - imageVector = TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = Color.White, modifier = Modifier.size(16.dp) @@ -1586,7 +1587,7 @@ fun PhotoPreviewWithCaptionScreen( modifier = Modifier.align(Alignment.CenterStart) ) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Close", tint = Color.White, modifier = Modifier.size(28.dp) @@ -1634,7 +1635,7 @@ fun PhotoPreviewWithCaptionScreen( label = "emojiIcon" ) { isEmoji -> Icon( - if (isEmoji) TablerIcons.Keyboard else TablerIcons.MoodSmile, + painter = if (isEmoji) TelegramIcons.Keyboard else TelegramIcons.Smile, contentDescription = if (isEmoji) "Keyboard" else "Emoji", tint = Color.White.copy(alpha = 0.7f), modifier = Modifier.size(26.dp) @@ -1676,7 +1677,7 @@ fun PhotoPreviewWithCaptionScreen( contentAlignment = Alignment.Center ) { Icon( - TablerIcons.Send, + painter = TelegramIcons.Send, contentDescription = "Send", tint = Color.White, modifier = Modifier diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt index 60ef793..a0d8c5a 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/input/ChatDetailInput.kt @@ -10,8 +10,7 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* -import compose.icons.TablerIcons -import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import androidx.compose.runtime.* import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment @@ -272,7 +271,7 @@ fun MessageInputBar( horizontalArrangement = Arrangement.Center ) { Icon( - TablerIcons.Ban, + painter = TelegramIcons.Block, contentDescription = null, tint = Color(0xFFFF6B6B), modifier = Modifier.size(20.dp) @@ -419,7 +418,7 @@ fun MessageInputBar( contentAlignment = Alignment.Center ) { Icon( - TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Cancel", tint = if (isDarkTheme) Color.White.copy(alpha = 0.5f) else Color.Black.copy(alpha = 0.4f), @@ -442,7 +441,7 @@ fun MessageInputBar( modifier = Modifier.size(40.dp) ) { Icon( - TablerIcons.Paperclip, + painter = TelegramIcons.Attach, contentDescription = "Attach", tint = if (isDarkTheme) Color(0xFF8E8E93).copy(alpha = 0.6f) else Color(0xFF8E8E93).copy(alpha = 0.6f), @@ -485,8 +484,8 @@ fun MessageInputBar( modifier = Modifier.size(40.dp) ) { Icon( - if (showEmojiPicker) TablerIcons.Keyboard - else TablerIcons.MoodSmile, + painter = if (showEmojiPicker) TelegramIcons.Keyboard + else TelegramIcons.Smile, contentDescription = "Emoji", tint = if (isDarkTheme) Color(0xFF8E8E93).copy(alpha = 0.6f) else Color(0xFF8E8E93).copy(alpha = 0.6f), diff --git a/app/src/main/java/com/rosetta/messenger/ui/icons/TelegramIcons.kt b/app/src/main/java/com/rosetta/messenger/ui/icons/TelegramIcons.kt new file mode 100644 index 0000000..64f787a --- /dev/null +++ b/app/src/main/java/com/rosetta/messenger/ui/icons/TelegramIcons.kt @@ -0,0 +1,93 @@ +package com.rosetta.messenger.ui.icons + +import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import com.rosetta.messenger.R + +/** + * Centralized Telegram icon provider. + * Maps to Telegram's native PNG drawable resources. + * Use with Icon(painter = TelegramIcons.ArrowBack, ...) + */ +object TelegramIcons { + + // ═══════════════════════════════════════════════════════════ + // 🧭 NAVIGATION + // ═══════════════════════════════════════════════════════════ + val ArrowBack: Painter @Composable get() = painterResource(R.drawable.msg_arrow_back) + val Close: Painter @Composable get() = painterResource(R.drawable.msg_close) + val ChevronDown: Painter @Composable get() = painterResource(R.drawable.ic_arrow_drop_down) + val ChevronRight: Painter @Composable get() = painterResource(R.drawable.msg_arrowright) + val More: Painter @Composable get() = painterResource(R.drawable.ic_ab_other) + + // ═══════════════════════════════════════════════════════════ + + // ═══════════════════════════════════════════════════════════ + val Done: Painter @Composable get() = painterResource(R.drawable.ic_ab_done) + val Add: Painter @Composable get() = painterResource(R.drawable.msg_add) + val Edit: Painter @Composable get() = painterResource(R.drawable.msg_edit) + val Delete: Painter @Composable get() = painterResource(R.drawable.msg_delete) + val Reply: Painter @Composable get() = painterResource(R.drawable.ic_ab_reply) + val Retry: Painter @Composable get() = painterResource(R.drawable.msg_retry) + val Send: Painter @Composable get() = painterResource(R.drawable.msg_send) + + // ═══════════════════════════════════════════════════════════ + // 🔔 NOTIFICATIONS + // ═══════════════════════════════════════════════════════════ + val Notifications: Painter @Composable get() = painterResource(R.drawable.msg_notifications) + val Mute: Painter @Composable get() = painterResource(R.drawable.msg_mute) + + // ═══════════════════════════════════════════════════════════ + // 📌 CHAT ACTIONS + // ═══════════════════════════════════════════════════════════ + val Pin: Painter @Composable get() = painterResource(R.drawable.msg_pin) + val Unpin: Painter @Composable get() = painterResource(R.drawable.msg_unpin) + val Block: Painter @Composable get() = painterResource(R.drawable.msg_block) + val Message: Painter @Composable get() = painterResource(R.drawable.msg_message) + + // ═══════════════════════════════════════════════════════════ + // 🔒 SECURITY + // ═══════════════════════════════════════════════════════════ + val Secret: Painter @Composable get() = painterResource(R.drawable.msg_secret) + val Unlock: Painter @Composable get() = painterResource(R.drawable.menu_unlock) + val Fingerprint: Painter @Composable get() = painterResource(R.drawable.fingerprint) + + // ═══════════════════════════════════════════════════════════ + // 📷 MEDIA + // ═══════════════════════════════════════════════════════════ + val Camera: Painter @Composable get() = painterResource(R.drawable.msg_camera) + val AddPhoto: Painter @Composable get() = painterResource(R.drawable.msg_addphoto) + val Photos: Painter @Composable get() = painterResource(R.drawable.msg_photos) + val File: Painter @Composable get() = painterResource(R.drawable.msg_sendfile) + val Attach: Painter @Composable get() = painterResource(R.drawable.input_attach) + + // ═══════════════════════════════════════════════════════════ + // 😊 INPUT + // ═══════════════════════════════════════════════════════════ + val Smile: Painter @Composable get() = painterResource(R.drawable.input_smile) + val Keyboard: Painter @Composable get() = painterResource(R.drawable.input_keyboard) + + // ═══════════════════════════════════════════════════════════ + // ⚙️ SETTINGS + // ═══════════════════════════════════════════════════════════ + val Palette: Painter @Composable get() = painterResource(R.drawable.msg_palette) + val Theme: Painter @Composable get() = painterResource(R.drawable.msg_theme) + val Customize: Painter @Composable get() = painterResource(R.drawable.msg_customize) + val Leave: Painter @Composable get() = painterResource(R.drawable.msg_leave) + + // ═══════════════════════════════════════════════════════════ + // 👤 CONTACTS + // ═══════════════════════════════════════════════════════════ + val Contact: Painter @Composable get() = painterResource(R.drawable.msg_contact) + val AddContact: Painter @Composable get() = painterResource(R.drawable.msg_addcontact) + + // ═══════════════════════════════════════════════════════════ + // ℹ️ STATUS & INFO + // ═══════════════════════════════════════════════════════════ + val Clock: Painter @Composable get() = painterResource(R.drawable.msg_autodelete) + val Warning: Painter @Composable get() = painterResource(R.drawable.msg_warning) + val Info: Painter @Composable get() = painterResource(R.drawable.msg_info) + val Views: Painter @Composable get() = painterResource(R.drawable.msg_views) +} diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/AppearanceScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/AppearanceScreen.kt index 8755152..4ab277e 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/AppearanceScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/AppearanceScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -28,6 +29,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -55,6 +57,16 @@ fun AppearanceScreen( accountName: String = "", avatarRepository: AvatarRepository? = null ) { + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } + val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFFFFFFF) val textColor = if (isDarkTheme) Color.White else Color.Black val secondaryTextColor = if (isDarkTheme) Color(0xFF8E8E93) else Color(0xFF666666) @@ -101,7 +113,7 @@ fun AppearanceScreen( ) { IconButton(onClick = onBack) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = Color.White ) @@ -441,7 +453,7 @@ private fun ColorCircleItem( val borderColor by animateColorAsState( targetValue = if (isSelected) { - Color.White + if (isDarkTheme) Color.White else Color(0xFF222222) } else { Color.Transparent }, @@ -456,7 +468,7 @@ private fun ColorCircleItem( .clip(CircleShape) .border( width = if (isSelected) 2.5.dp else 0.5.dp, - color = if (isSelected) borderColor else Color.White.copy(alpha = 0.12f), + color = if (isSelected) borderColor else if (isDarkTheme) Color.White.copy(alpha = 0.12f) else Color.Black.copy(alpha = 0.12f), shape = CircleShape ) .clickable(onClick = onClick), @@ -509,7 +521,7 @@ private fun ColorCircleItem( contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = "Selected", tint = Color.White, modifier = Modifier.size(18.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/BiometricEnableScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/BiometricEnableScreen.kt index 07e3a50..ca55f62 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/BiometricEnableScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/BiometricEnableScreen.kt @@ -30,6 +30,7 @@ import com.airbnb.lottie.compose.* import com.rosetta.messenger.ui.onboarding.PrimaryBlue import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import kotlinx.coroutines.delay // Auth colors @@ -82,6 +83,14 @@ fun BiometricEnableScreen( val focusManager = LocalFocusManager.current val context = LocalContext.current val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } // Function to hide keyboard fun hideKeyboard() { @@ -141,7 +150,7 @@ fun BiometricEnableScreen( ) { IconButton(onClick = onBack, enabled = !isLoading) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = textColor.copy(alpha = 0.6f) ) @@ -312,7 +321,7 @@ fun BiometricEnableScreen( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = TablerIcons.AlertCircle, + painter = TelegramIcons.Warning, contentDescription = null, tint = errorRed, modifier = Modifier.size(16.dp) @@ -377,7 +386,7 @@ fun BiometricEnableScreen( ) } else { Icon( - imageVector = TablerIcons.Fingerprint, + painter = TelegramIcons.Fingerprint, contentDescription = null, modifier = Modifier.size(22.dp) ) @@ -408,7 +417,7 @@ fun BiometricEnableScreen( verticalAlignment = Alignment.Top ) { Icon( - imageVector = TablerIcons.ShieldLock, + painter = TelegramIcons.Secret, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(20.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/OtherProfileScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/OtherProfileScreen.kt index 7c56633..1b8a348 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/OtherProfileScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/OtherProfileScreen.kt @@ -32,8 +32,6 @@ import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.outlined.Block import androidx.compose.material3.* import androidx.compose.runtime.* @@ -43,6 +41,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.graphicsLayer @@ -62,6 +61,7 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp @@ -93,6 +93,7 @@ import com.rosetta.messenger.ui.components.metaball.ProfileMetaballEffect import com.rosetta.messenger.ui.onboarding.PrimaryBlue import com.rosetta.messenger.utils.AttachmentFileManager import com.rosetta.messenger.utils.AvatarFileManager +import com.rosetta.messenger.ui.icons.TelegramIcons import compose.icons.TablerIcons import compose.icons.tablericons.* import kotlinx.coroutines.CoroutineScope @@ -220,6 +221,10 @@ fun OtherProfileScreen( val chatsListViewModel: ChatsListViewModel = viewModel() val coroutineScope = rememberCoroutineScope() + // 🔕 Mute state + val preferencesManager = remember { com.rosetta.messenger.data.PreferencesManager(context) } + var notificationsEnabled by remember { mutableStateOf(true) } + // 🔥 Загружаем статус блокировки при открытии экрана LaunchedEffect(user.publicKey) { isBlocked = chatsListViewModel.isUserBlocked(user.publicKey) } @@ -244,6 +249,14 @@ fun OtherProfileScreen( remember(currentUserPublicKey) { currentUserPublicKey.trim() } val activeAccountPrivateKey = remember(currentUserPrivateKey) { currentUserPrivateKey.trim() } + + // 🔕 Load mute state from preferences + LaunchedEffect(activeAccountPublicKey, user.publicKey) { + if (activeAccountPublicKey.isNotBlank()) { + notificationsEnabled = !preferencesManager.isChatMuted(activeAccountPublicKey, user.publicKey) + } + } + val dialogKey = remember(activeAccountPublicKey, user.publicKey) { if (activeAccountPublicKey.isBlank()) { @@ -522,14 +535,14 @@ fun OtherProfileScreen( ) ) { item { - Spacer(modifier = Modifier.height(16.dp)) - - Spacer(modifier = Modifier.height(6.dp)) - // ═══════════════════════════════════════════════════════════ - // 📋 ACCOUNT SECTION + // 📋 INFORMATION SECTION — первый элемент // ═══════════════════════════════════════════════════════════ - TelegramSectionTitle(title = "Account", isDarkTheme = isDarkTheme) + TelegramSectionTitle( + title = "Information", + isDarkTheme = isDarkTheme, + color = PrimaryBlue + ) if (user.username.isNotBlank()) { TelegramCopyField( @@ -538,6 +551,12 @@ fun OtherProfileScreen( label = "Username", isDarkTheme = isDarkTheme ) + + Divider( + color = if (isDarkTheme) Color(0xFF3A3A3A) else Color(0xFFE0E0E0), + thickness = 0.5.dp, + modifier = Modifier.padding(start = 16.dp) + ) } TelegramCopyField( @@ -547,11 +566,21 @@ fun OtherProfileScreen( isDarkTheme = isDarkTheme ) - Spacer(modifier = Modifier.height(12.dp)) + // ═══════════════════════════════════════════════════════════ + // Разделитель секций + // ═══════════════════════════════════════════════════════════ + Box( + modifier = Modifier + .fillMaxWidth() + .height(8.dp) + .background(if (isDarkTheme) Color(0xFF0F0F0F) else Color(0xFFF0F0F0)) + ) // ═══════════════════════════════════════════════════════════ // ✉️ WRITE MESSAGE BUTTON // ═══════════════════════════════════════════════════════════ + Spacer(modifier = Modifier.height(12.dp)) + Box( modifier = Modifier .fillMaxWidth() @@ -573,7 +602,7 @@ fun OtherProfileScreen( ) ) { Icon( - TablerIcons.MessageCircle2, + painter = TelegramIcons.Message, contentDescription = null, modifier = Modifier.size(20.dp), tint = Color.White @@ -588,13 +617,32 @@ fun OtherProfileScreen( } } - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.height(12.dp)) // ═══════════════════════════════════════════════════════════ - // 📚 SHARED CONTENT + // 🔔 NOTIFICATIONS SECTION // ═══════════════════════════════════════════════════════════ - TelegramSectionTitle(title = "Shared", isDarkTheme = isDarkTheme) + TelegramToggleItem( + icon = if (notificationsEnabled) TelegramIcons.Notifications else TelegramIcons.Mute, + title = "Notifications", + subtitle = if (notificationsEnabled) "On" else "Off", + isEnabled = notificationsEnabled, + onToggle = { + notificationsEnabled = !notificationsEnabled + coroutineScope.launch { + preferencesManager.setChatMuted( + activeAccountPublicKey, + user.publicKey, + !notificationsEnabled + ) + } + }, + isDarkTheme = isDarkTheme + ) + // ═══════════════════════════════════════════════════════════ + // 📚 SHARED CONTENT (без разделителя — сразу табы) + // ═══════════════════════════════════════════════════════════ OtherProfileSharedTabs( selectedTab = selectedTab, onTabSelected = { tab -> @@ -1202,7 +1250,7 @@ private fun OtherProfileActionButtons( horizontalArrangement = Arrangement.spacedBy(12.dp) ) { OtherProfileActionButton( - icon = TablerIcons.MessageCircle2, + icon = TelegramIcons.Message, title = "Message", subtitle = "Open chat", accent = PrimaryBlue, @@ -1211,7 +1259,7 @@ private fun OtherProfileActionButtons( onClick = onMessageClick ) OtherProfileActionButton( - icon = if (isMuted) TablerIcons.BellOff else TablerIcons.BellRinging2, + icon = if (isMuted) TelegramIcons.Mute else TelegramIcons.Notifications, title = if (isMuted) "Muted" else "Mute", subtitle = if (isMuted) "Tap to unmute" else "Silence notifications", accent = @@ -1229,7 +1277,7 @@ private fun OtherProfileActionButtons( @Composable private fun OtherProfileActionButton( - icon: ImageVector, + icon: Painter, title: String, subtitle: String, accent: Color, @@ -1260,7 +1308,7 @@ private fun OtherProfileActionButton( contentAlignment = Alignment.Center ) { Icon( - imageVector = icon, + painter = icon, contentDescription = title, tint = accent, modifier = Modifier.size(19.dp) @@ -1504,7 +1552,7 @@ private fun OtherProfileFileList( contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.File, + painter = TelegramIcons.File, contentDescription = null, tint = PrimaryBlue, modifier = Modifier.size(18.dp) @@ -1661,8 +1709,11 @@ private fun CollapsingOtherProfileHeader( val avatarFontSize = androidx.compose.ui.unit.lerp(40.sp, 12.sp, collapseProgress) // Text animation - always centered - val textDefaultY = expandedHeight - 48.dp - val textCollapsedY = statusBarHeight + COLLAPSED_HEADER_HEIGHT_OTHER / 2 + val textDefaultY = expandedHeight - 70.dp + // Collapsed: center text block vertically in collapsed header + // Text block is ~42dp tall (name 18sp ~22dp + 2dp spacer + online 13sp ~18dp) + val textBlockHeight = 42.dp + val textCollapsedY = statusBarHeight + (COLLAPSED_HEADER_HEIGHT_OTHER - textBlockHeight) / 2 val textY = androidx.compose.ui.unit.lerp(textDefaultY, textCollapsedY, collapseProgress) val nameFontSize = androidx.compose.ui.unit.lerp(24.sp, 18.sp, collapseProgress) @@ -1673,7 +1724,19 @@ private fun CollapsingOtherProfileHeader( // ═══════════════════════════════════════════════════════════ val textColor = Color.White + // ═══════════════════════════════════════════════════════════ + // 🔙 BUTTONS Y - At top when expanded, centered when collapsed + // ═══════════════════════════════════════════════════════════ + val buttonsExpandedY = statusBarHeight + 8.dp + val buttonsCollapsedY = statusBarHeight + (COLLAPSED_HEADER_HEIGHT_OTHER - 48.dp) / 2 + val buttonsY = androidx.compose.ui.unit.lerp(buttonsExpandedY, buttonsCollapsedY, collapseProgress) + Box(modifier = Modifier.fillMaxWidth().height(headerHeight).clipToBounds()) { + // Solid opaque background floor — prevents content from bleeding through + Box(modifier = Modifier.matchParentSize().background( + if (isDarkTheme) Color(0xFF1C1C1E) else Color(0xFFEFEFF4) + )) + // Expansion fraction — computed early so blur can fade during expansion val expandFractionEarly = expansionProgress.coerceIn(0f, 1f) val blurAlpha = (1f - expandFractionEarly * 2.5f).coerceIn(0f, 1f) @@ -1695,6 +1758,28 @@ private fun CollapsingOtherProfileHeader( } } + // ═══════════════════════════════════════════════════════════ + // 🌅 BOTTOM GRADIENT — плавно исчезает когда аватарка раскрывается + // ═══════════════════════════════════════════════════════════ + val gradientAlpha = (1f - expandFractionEarly * 1.2f).coerceIn(0f, 1f) + if (gradientAlpha > 0.01f) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(80.dp) + .align(Alignment.BottomCenter) + .graphicsLayer { alpha = gradientAlpha } + .background( + Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.35f) + ) + ) + ) + ) + } + // ═══════════════════════════════════════════════════════════ // 👤 AVATAR — Telegram-style expansion on pull-down // При скролле вверх: metaball merge с Dynamic Island @@ -1795,19 +1880,56 @@ private fun CollapsingOtherProfileHeader( } } + // Gradient overlays when avatar is expanded + if (expansionAvatarAlpha > 0.01f) { + // Top gradient + Box( + modifier = Modifier + .fillMaxWidth() + .height(120.dp) + .align(Alignment.TopCenter) + .graphicsLayer { alpha = expandFraction.coerceIn(0f, 1f) } + .background( + Brush.verticalGradient( + colors = listOf( + Color.Black.copy(alpha = 0.6f), + Color.Transparent + ) + ) + ) + ) + // Bottom gradient + Box( + modifier = Modifier + .fillMaxWidth() + .height(120.dp) + .align(Alignment.BottomCenter) + .graphicsLayer { alpha = expandFraction.coerceIn(0f, 1f) } + .background( + Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.6f) + ) + ) + ) + ) + } + // ═══════════════════════════════════════════════════════════ - // 🔙 BACK BUTTON + // 🔙 BACK BUTTON - At top when expanded, centered when collapsed // ═══════════════════════════════════════════════════════════ Box( modifier = - Modifier.padding(top = statusBarHeight) - .padding(start = 4.dp, top = 4.dp) + Modifier + .align(Alignment.TopStart) + .offset(x = 4.dp, y = buttonsY) .size(48.dp), contentAlignment = Alignment.Center ) { IconButton(onClick = onBack, modifier = Modifier.size(48.dp)) { Icon( - imageVector = Icons.Filled.ArrowBack, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = Color.White, modifier = Modifier.size(24.dp) @@ -1816,19 +1938,17 @@ private fun CollapsingOtherProfileHeader( } // ═══════════════════════════════════════════════════════════ - // ⋮ MENU BUTTON (top right corner) + // ⋮ MENU BUTTON - At top when expanded, centered when collapsed // ═══════════════════════════════════════════════════════════ Box( modifier = Modifier.align(Alignment.TopEnd) - .padding(top = statusBarHeight) - .padding(end = 4.dp, top = 4.dp) - .size(48.dp), + .offset(x = -4.dp, y = buttonsY), contentAlignment = Alignment.Center ) { IconButton(onClick = { onAvatarMenuChange(true) }, modifier = Modifier.size(48.dp)) { Icon( - imageVector = Icons.Default.MoreVert, + painter = TelegramIcons.More, contentDescription = "Profile menu", tint = Color.White, modifier = Modifier.size(24.dp) @@ -1857,17 +1977,7 @@ private fun CollapsingOtherProfileHeader( // ═══════════════════════════════════════════════════════════ Column( modifier = - Modifier.align(Alignment.TopCenter).offset(y = textY).graphicsLayer { - val centerOffsetY = - with(density) { - androidx.compose - .ui - .unit - .lerp(24.dp, 18.dp, collapseProgress) - .toPx() - } - translationY = -centerOffsetY - }, + Modifier.align(Alignment.TopCenter).offset(y = textY), horizontalAlignment = Alignment.CenterHorizontally ) { // Name + Verified Badge diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileLogsScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileLogsScreen.kt index 2ed3b07..fe8c2b1 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileLogsScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileLogsScreen.kt @@ -7,12 +7,14 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.* +import com.rosetta.messenger.ui.icons.TelegramIcons import compose.icons.TablerIcons import compose.icons.tablericons.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -25,6 +27,16 @@ fun ProfileLogsScreen( onBack: () -> Unit, onClearLogs: () -> Unit ) { + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } + val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFFFFFFF) val surfaceColor = if (isDarkTheme) Color(0xFF2C2C2E) else Color(0xFFF2F2F7) val textColor = if (isDarkTheme) Color.White else Color.Black @@ -63,7 +75,7 @@ fun ProfileLogsScreen( ) { IconButton(onClick = onBack) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = textColor ) @@ -79,7 +91,7 @@ fun ProfileLogsScreen( ) IconButton(onClick = onClearLogs) { Icon( - imageVector = TablerIcons.Trash, + painter = TelegramIcons.Delete, contentDescription = "Clear logs", tint = secondaryTextColor ) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfilePhotoPicker.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfilePhotoPicker.kt index 298071e..8582e5b 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfilePhotoPicker.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfilePhotoPicker.kt @@ -43,8 +43,7 @@ import androidx.compose.ui.window.PopupProperties import androidx.core.content.ContextCompat import coil.compose.AsyncImage import coil.request.ImageRequest -import compose.icons.TablerIcons -import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -292,7 +291,7 @@ fun ProfilePhotoPicker( modifier = Modifier.align(Alignment.CenterStart) ) { Icon( - imageVector = TablerIcons.X, + painter = TelegramIcons.Close, contentDescription = "Close", tint = textColor, modifier = Modifier.size(24.dp) @@ -350,7 +349,7 @@ fun ProfilePhotoPicker( horizontalAlignment = Alignment.CenterHorizontally ) { Icon( - imageVector = TablerIcons.Photo, + painter = TelegramIcons.Photos, contentDescription = null, tint = textColor.copy(alpha = 0.4f), modifier = Modifier.size(64.dp) @@ -501,7 +500,7 @@ private fun PermissionRequest( modifier = Modifier.padding(32.dp) ) { Icon( - imageVector = TablerIcons.Photo, + painter = TelegramIcons.Photos, contentDescription = null, tint = textColor.copy(alpha = 0.5f), modifier = Modifier.size(64.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt index fb4fa06..d9790bf 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt @@ -44,6 +44,7 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -74,6 +75,11 @@ import java.util.Locale import com.rosetta.messenger.utils.ImageCropHelper import compose.icons.TablerIcons import compose.icons.tablericons.* +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import com.rosetta.messenger.R +import com.rosetta.messenger.ui.icons.TelegramIcons +import androidx.compose.ui.graphics.vector.rememberVectorPainter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first @@ -278,6 +284,16 @@ fun ProfileScreen( dialogDao: com.rosetta.messenger.database.DialogDao? = null, backgroundBlurColorId: String = "avatar" ) { + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = false + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } + val context = LocalContext.current val activity = context as? FragmentActivity val biometricManager = remember { BiometricAuthManager(context) } @@ -817,7 +833,7 @@ fun ProfileScreen( val scope = rememberCoroutineScope() TelegramToggleItem( - icon = TablerIcons.Bell, + icon = TelegramIcons.Notifications, title = "Push Notifications", isEnabled = notificationsEnabled, onToggle = { @@ -837,7 +853,7 @@ fun ProfileScreen( TelegramSectionTitle(title = "Settings", isDarkTheme = isDarkTheme) TelegramSettingsItem( - icon = TablerIcons.Palette, + icon = TelegramIcons.Theme, title = "Theme", onClick = onNavigateToTheme, isDarkTheme = isDarkTheme, @@ -845,7 +861,7 @@ fun ProfileScreen( ) TelegramSettingsItem( - icon = TablerIcons.Brush, + icon = TelegramIcons.Customize, title = "Appearance", onClick = onNavigateToAppearance, isDarkTheme = isDarkTheme, @@ -853,7 +869,7 @@ fun ProfileScreen( ) TelegramSettingsItem( - icon = TablerIcons.Lock, + icon = TelegramIcons.Secret, title = "Safety", onClick = onNavigateToSafety, isDarkTheme = isDarkTheme, @@ -863,7 +879,7 @@ fun ProfileScreen( // Biometric settings (only show if available) if (biometricAvailable is BiometricAvailability.Available && activity != null) { TelegramSettingsItem( - icon = TablerIcons.Fingerprint, + icon = TelegramIcons.Fingerprint, title = "Biometric Authentication", onClick = { onNavigateToBiometric() @@ -972,10 +988,9 @@ fun ProfileScreen( // Positioned at bottom-right of header, half overlapping content area // Fades out when collapsed or when avatar is expanded // ═══════════════════════════════════════════════════════════ - val cameraButtonAlpha = (1f - collapseProgress * 2.5f).coerceIn(0f, 1f) * - (1f - expansionProgress * 4f).coerceIn(0f, 1f) + val cameraButtonSize = 60.dp + val cameraButtonAlpha = (1f - collapseProgress * 2f).coerceIn(0f, 1f) if (cameraButtonAlpha > 0.01f) { - val cameraButtonSize = 52.dp Box( modifier = Modifier .align(Alignment.TopEnd) @@ -991,15 +1006,15 @@ fun ProfileScreen( clip = false ) .clip(CircleShape) - .background(Color.White) + .background(if (isDarkTheme) Color.White else PrimaryBlue) .clickable { showPhotoPicker = true }, contentAlignment = Alignment.Center ) { Icon( - imageVector = TablerIcons.CameraPlus, + painter = TelegramIcons.AddPhoto, contentDescription = "Change avatar", - tint = Color(0xFF8E8E93), - modifier = Modifier.size(24.dp) + tint = if (isDarkTheme) Color(0xFF8E8E93) else Color.White, + modifier = Modifier.size(26.dp).offset(x = 2.dp) ) } } @@ -1089,7 +1104,10 @@ private fun CollapsingProfileHeader( // 📝 TEXT - внизу header зоны, внутри блока // ═══════════════════════════════════════════════════════════ val textDefaultY = expandedHeight - 70.dp // Ближе к аватарке - val textCollapsedY = statusBarHeight + COLLAPSED_HEADER_HEIGHT / 2 + // Collapsed: center text block vertically in collapsed header + // Text block is ~35dp tall (name 18sp + 2dp spacer + online 13sp) + val textBlockHeight = 35.dp + val textCollapsedY = statusBarHeight + (COLLAPSED_HEADER_HEIGHT - textBlockHeight) / 2 // Текст меняет позицию только при collapse, НЕ при overscroll val textY = androidx.compose.ui.unit.lerp(textDefaultY, textCollapsedY, collapseProgress) @@ -1210,31 +1228,60 @@ private fun CollapsingProfileHeader( } } + // Gradient overlays when avatar is expanded + if (expandFraction > 0.01f) { + // Top gradient + Box( + modifier = Modifier + .fillMaxWidth() + .height(120.dp) + .align(Alignment.TopCenter) + .graphicsLayer { alpha = expandFraction } + .background( + Brush.verticalGradient( + colors = listOf( + Color.Black.copy(alpha = 0.6f), + Color.Transparent + ) + ) + ) + ) + // Bottom gradient + Box( + modifier = Modifier + .fillMaxWidth() + .height(120.dp) + .align(Alignment.BottomCenter) + .graphicsLayer { alpha = expandFraction } + .background( + Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.6f) + ) + ) + ) + ) + } + // ═══════════════════════════════════════════════════════════ - // 🔙 BACK BUTTON - Aligned with text vertical center + // 🔙 BACK BUTTON - At top when expanded, centered when collapsed // ═══════════════════════════════════════════════════════════ + val buttonsExpandedY = statusBarHeight + 8.dp + val buttonsCollapsedY = statusBarHeight + (COLLAPSED_HEADER_HEIGHT - 48.dp) / 2 + val buttonsY = androidx.compose.ui.unit.lerp(buttonsExpandedY, buttonsCollapsedY, collapseProgress) + Box( modifier = Modifier .align(Alignment.TopStart) - .offset(x = 4.dp, y = textY) - .graphicsLayer { - val centerOffsetY = - with(density) { - androidx.compose - .ui - .unit - .lerp(24.dp, 18.dp, collapseProgress) - .toPx() - } - translationY = -centerOffsetY - } + .offset(x = 4.dp, y = buttonsY) .size(48.dp), contentAlignment = Alignment.Center ) { IconButton(onClick = onBack, modifier = Modifier.size(48.dp)) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = Color.White, modifier = Modifier.size(24.dp) @@ -1243,23 +1290,12 @@ private fun CollapsingProfileHeader( } // ═══════════════════════════════════════════════════════════ - // ⋮ MENU BUTTON / 💾 SAVE BUTTON - Aligned with text vertical center + // ⋮ MENU BUTTON / 💾 SAVE BUTTON - At top when expanded, centered when collapsed // ═══════════════════════════════════════════════════════════ Box( modifier = Modifier.align(Alignment.TopEnd) - .offset(x = -4.dp, y = textY) - .graphicsLayer { - val centerOffsetY = - with(density) { - androidx.compose - .ui - .unit - .lerp(24.dp, 18.dp, collapseProgress) - .toPx() - } - translationY = -centerOffsetY - }, + .offset(x = -4.dp, y = buttonsY), contentAlignment = Alignment.Center ) { AnimatedVisibility(visible = hasChanges, enter = fadeIn(), exit = fadeOut()) { @@ -1283,7 +1319,7 @@ private fun CollapsingProfileHeader( modifier = Modifier.size(48.dp) ) { Icon( - imageVector = TablerIcons.DotsVertical, + painter = TelegramIcons.More, contentDescription = "Profile menu", tint = Color.White, modifier = Modifier.size(24.dp) @@ -1312,17 +1348,7 @@ private fun CollapsingProfileHeader( // ═══════════════════════════════════════════════════════════ Column( modifier = - Modifier.align(Alignment.TopCenter).offset(y = textY).graphicsLayer { - val centerOffsetY = - with(density) { - androidx.compose - .ui - .unit - .lerp(24.dp, 18.dp, collapseProgress) - .toPx() - } - translationY = -centerOffsetY - }, + Modifier.align(Alignment.TopCenter).offset(y = textY), horizontalAlignment = Alignment.CenterHorizontally ) { Text( @@ -1445,7 +1471,7 @@ fun ProfileCard( modifier = Modifier.align(Alignment.TopStart).statusBarsPadding().padding(4.dp) ) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = if (isDarkTheme) Color.White else Color.Black ) @@ -1690,7 +1716,7 @@ fun TelegramCopyField(value: String, fullValue: String, label: String, isDarkThe @Composable private fun TelegramSettingsItem( - icon: ImageVector, + icon: Painter, title: String, onClick: () -> Unit, isDarkTheme: Boolean, @@ -1712,7 +1738,7 @@ private fun TelegramSettingsItem( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = icon, + painter = icon, contentDescription = null, tint = iconColor, modifier = Modifier.size(24.dp) @@ -1740,8 +1766,8 @@ private fun TelegramSettingsItem( } @Composable -private fun TelegramToggleItem( - icon: ImageVector, +fun TelegramToggleItem( + icon: Painter, title: String, subtitle: String? = null, isEnabled: Boolean, @@ -1764,7 +1790,7 @@ private fun TelegramToggleItem( verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = icon, + painter = icon, contentDescription = null, tint = iconColor, modifier = Modifier.size(24.dp) @@ -1852,7 +1878,7 @@ private fun TelegramToggleItem( @Composable private fun TelegramBiometricItem(isEnabled: Boolean, onToggle: () -> Unit, isDarkTheme: Boolean) { TelegramToggleItem( - icon = TablerIcons.Fingerprint, + icon = TelegramIcons.Fingerprint, title = "Biometric Authentication", isEnabled = isEnabled, onToggle = onToggle, @@ -1872,7 +1898,7 @@ private fun TelegramLogoutItem(onClick: () -> Unit, isDarkTheme: Boolean) { verticalAlignment = Alignment.CenterVertically ) { Icon( - imageVector = TablerIcons.Logout, + painter = TelegramIcons.Leave, contentDescription = null, tint = redColor, modifier = Modifier.size(24.dp) @@ -1903,7 +1929,7 @@ private fun ProfileSectionTitle(title: String, isDarkTheme: Boolean) { @Composable fun ProfileNavigationItem( - icon: ImageVector, + icon: Painter, iconBackground: Color, title: String, subtitle: String, @@ -1934,7 +1960,7 @@ fun ProfileNavigationItem( contentAlignment = Alignment.Center ) { Icon( - imageVector = icon, + painter = icon, contentDescription = null, tint = Color.White, modifier = Modifier.size(20.dp) @@ -2120,6 +2146,22 @@ fun FullScreenAvatarViewer( ) ) + // Bottom gradient shadow + Box( + modifier = Modifier + .fillMaxWidth() + .height(120.dp) + .align(Alignment.BottomCenter) + .background( + Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.6f) + ) + ) + ) + ) + // Header: back button + name + date Row( modifier = Modifier @@ -2130,7 +2172,7 @@ fun FullScreenAvatarViewer( ) { IconButton(onClick = { showContent = false }) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Close", tint = Color.White, modifier = Modifier.size(24.dp) @@ -2158,7 +2200,7 @@ fun FullScreenAvatarViewer( IconButton(onClick = { /* menu */ }) { Icon( - imageVector = TablerIcons.DotsVertical, + painter = TelegramIcons.More, contentDescription = "Menu", tint = Color.White, modifier = Modifier.size(24.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt index 69a48df..d49b25c 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt @@ -14,6 +14,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import compose.icons.TablerIcons import compose.icons.tablericons.* +import com.rosetta.messenger.ui.icons.TelegramIcons import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -21,6 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -33,6 +35,16 @@ fun ThemeScreen( onBack: () -> Unit, onThemeModeChange: (String) -> Unit ) { + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } + val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFFFFFFF) val surfaceColor = if (isDarkTheme) Color(0xFF2C2C2E) else Color(0xFFF2F2F7) val textColor = if (isDarkTheme) Color.White else Color.Black @@ -63,7 +75,7 @@ fun ThemeScreen( ) { IconButton(onClick = onBack) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = textColor ) @@ -209,7 +221,7 @@ private fun TelegramThemeOption( // Radio button if (isSelected) { Icon( - imageVector = TablerIcons.Check, + painter = TelegramIcons.Done, contentDescription = null, tint = Color(0xFF007AFF), modifier = Modifier.size(20.dp) @@ -358,7 +370,7 @@ private fun MessageBubble( if (isMe) { // Read checkmarks (DoneAll icon like in real chat) Icon( - imageVector = TablerIcons.Checks, + painter = TelegramIcons.Done, contentDescription = null, tint = Color(0xFF4FC3F7), // Blue checkmarks for read messages modifier = Modifier.size(14.dp) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/UpdatesScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/UpdatesScreen.kt index 178a1b1..fc64bfd 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/UpdatesScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/UpdatesScreen.kt @@ -7,13 +7,16 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* +import com.rosetta.messenger.ui.icons.TelegramIcons import compose.icons.TablerIcons import compose.icons.tablericons.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -24,6 +27,16 @@ fun UpdatesScreen( isDarkTheme: Boolean, onBack: () -> Unit ) { + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as android.app.Activity).window + val insetsController = androidx.core.view.WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = !isDarkTheme + window.statusBarColor = android.graphics.Color.TRANSPARENT + } + } + val versionName = remember { BuildConfig.VERSION_NAME } val buildNumber = remember { BuildConfig.VERSION_CODE.toString() } val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFFFFFFF) @@ -52,7 +65,7 @@ fun UpdatesScreen( ) { IconButton(onClick = onBack) { Icon( - imageVector = TablerIcons.ArrowLeft, + imageVector = TablerIcons.ChevronLeft, contentDescription = "Back", tint = if (isDarkTheme) Color.White else Color.Black ) diff --git a/app/src/main/res/drawable-hdpi/fingerprint.png b/app/src/main/res/drawable-hdpi/fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bd37382449f7a1933388c0b6afe2ba370e20a8 GIT binary patch literal 827 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2H;>5jgR3=A9lx&I`x0{M)^LGDfr z>(0r%1ad3`d_r8^3w-{Q1!`@k`2r0QDhcunW?=a$@N(wfyR8m!GJa=`3f5~al=WT1 zz`)ex>EamTar|xA&9YYpJV&~o)^`8o;%bp6HmiZ|2bo-AhYOy?fx)rTg4=*@K4oD=Bfu^X4gUtodxhYI*PZ^n=zn zHvBD0+rA~fAuK@Hde^Jk)V+^tCa+&+`yf(ZB3x+R1;;Jhl$Qu4dnUfPe!u8v=E<(t z+b@|}o?CW(Lv!k1&r2$LP1TI|Zm?fX*G>$%sO_`YEagM$YEy;iEyw4HZeHQqHBUh= zdG!Iew?(XrTeh3|EQ7rztdz{)10bp zPyCwpawy$7m2;&pIbpu<$s8H?_uJ-O6g!ufwQB3kXS+|xHh#FcN4<@OY3u2n-V3{5 zJ$<^v=}P>SnI0D6dXe@9Jm-Zy%1fI{r&~x(epGDkdA+dFH}ui-!#)aC&2ojOZCj?K z%RZ@9iRw+gps^$?ZD*=X>p#Y*>5?31 zq>__eXOvP`bNcO1=9tuF;~4JgesoRHTF&?-2g3Hbf0}jeXN0Qly&&P20h_*;t3`Ug z+`0UOUw?j+%{!?xLM4308yxaZT|NELU*%LXpXJ};gKFlYW^(e)cB|doBd*?DF>98d zaSl^zYFFcQ=l9KFsdg-$?LItNYn;-}+l_U?_cv|w+1-?9)xIkK;a-7n;lh^2qW9t) zD<3ZFHs`&3hKc>x6|v_TNCT!-22WQ%mvv4FO#m;loU;G` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_ab_done.png b/app/src/main/res/drawable-hdpi/ic_ab_done.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1d205bcc7e6946c6bc4af4782323d87d92f423 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICa0X`wF?gc*o@q&JqbH9O#xk`fkf*IC#vy{zE;Ck!F8$yq9Bxcm(t2mK8Y@|M6I9&`;@-<@VM%%X1d^;6unjCuFA6&p@&{v z+qf<&qajUp^EIu)5_7|~QH>AP)`v>)r5_A9a$v#>gCD|-4AoAum(*_7ssXKG@O1Ta JS?83{1OU?~VORhF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_ab_other.png b/app/src/main/res/drawable-hdpi/ic_ab_other.png new file mode 100644 index 0000000000000000000000000000000000000000..7cfc685efc472d39bfb42762658e3ccf3c9d6b64 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pp#Yx{SN8&+|EQot(xx6L%UTlT z7tHW+GTU_Ps~2_y1#~@K978nDCnrc~9C)LV(x7%kNNN?3l#tSLi0I%9R^F`C_HnVF eY>1z#Bm)DtH}}_`ZI&PhFnGH9xvX|l3?zm1T2})p-2k5uSN8&+|3rhcad(-38u?0s z{DK)i_J`O#zFH*nb3c#P;#C*&w*zICdb&76wFbRI6WbN9eB+Dl zQ08-f@xr=9ah?Uw!shq)_RikK7}?^=r}5?8%TyJ|`%H2?f>Nv;N8}}Rko=9X7v0)Hh z-CQ-h^6qY?79$Uj4Nr6v8nm0)&MjkM+hNqRA$`MPktDwa2@3{>GewO|+mo0M03FQW M>FVdQ&MBb@0Kn~w2mk;8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-hdpi/ic_arrow_drop_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f5df4ae737ecc7fe624fb07440f3854045ed5195 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|n3?%2|6>tM7o&cW^SN8&+|1iKd{{lz@b4ie2 zFoVLw9si9c0l6lgE{-7*my;7DCN;bTDiuDUbL{W`|CSCcpa1`F@$&v(&lGOKcq-}6 kbB4=vInCW$;`rDYstx(r3(m@)1?p$;boFyt=akR{00&GpcK`qY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/input_attach.png b/app/src/main/res/drawable-hdpi/input_attach.png new file mode 100644 index 0000000000000000000000000000000000000000..7c46426bf8d9876a6588bbb7359b554ddef01426 GIT binary patch literal 1767 zcmbVMeQXnD7{6sv=5P?l5*CnoJEn2S_3qlP>z&leu4OCkX44g!nTl`k-mbUxKD@ip zZb~GO7^a3T43})o#TetqbYM`Tftaa87eEr7d@TfGGD(D(7$&fPCi-62Hp9#hxa8XR z-skuJp6BvztgK&8N=?vuORu5Zj@JM`5e1`iS3-j1jmj`H0O`0xjq~jLY?125jnTjEG(BA}bL! zkKyZ593oJl1@M%TP)#o7BhtJaTHD(cfu|u>yN_6JJH(rX5YB4`#H$=0Qe@m!cs1)_ zJT5oOuEm`+BKV+fxH<~j0^iWWPG779}%}KoujB^GU-UV9GcNe zF)Yhcw3Bi=NrWKHPSpY_QZ-j+8T`-`4OzEjO~q|S5Y;*?AAusBlc4B1TGh;?2_=k5 z0i9wTv@IzOl*AlP?=TW+=aNXl1XQ4EnF!0|uzFmxG&8RK19i@PivyHeLCE=7FcwA0 zxiGE3RwN^nkOk3Zq*I4f7@As#A;Q2`6y|DMjn44~1eRt*G%b<6s8BX!oagO}Vey9r zAj+z(qjKIU=m!?`5jKLP(Y;kioHR$X9PN69c5^g62Ng6)j&&{sb-FmW_ZBFs8wpt8 zKf#j7#WX_!NVTkhR!He;D}m>7$?;l3Gmv8xoooJnkmo~&7LyamV20~z@nC@WFs#Qz zIvq?pTtVQ1s%ZgLgh9WLKpAq#vc!qd>#2$|PO>Um&5&*ob&^pp14sryWbpu3Ocb-{ z{hHWe*FpBYberd&G-T9=AaTb$c6ZtZ#MR3ty4uc6|1`lDGOL7)r)!1-qTLHVLbQtj zN%k^W0v%)v}8W+j0E*SDf<{lDU)kOInX-8nJT-*u*K^V&QMN3+9T z=7tvf$c;UyqFHC4q4tY#yble;d-VFJO$=MS%zpE*!J$&L=?OJN0(E-BpSS9D|iv#eY&Fa!Vly_ zM~C)~evtoFXk?J9zRbVcP||X(a&pam$?0tP^ zHhJugLx-0v9oaN_Wm8>Q(dEGj_dD|OGuXFq;MbAahD(uy?|(A<-t_$skbtP^>!0us zuk`lp*#FWO{agBoJn+mOc<%e(%WjPRc=EuZtK)0)N_UI>pNE!iT)DjQr+6*Rbie%Z aP3+o+;?jL*+saYeuwbCkzrXhR9e)9}*LU^+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/input_keyboard.png b/app/src/main/res/drawable-hdpi/input_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..d57fe9d54e6231ad9586e2489398faf76f51403a GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^S|H5A3?$9pUdaGb1_3@HuI>ds|49KZc5j$~dihI& z{DK)iHYc%hy$qYEu<+_$tCHCDmurAhA3a?hLp07OCrDH+Q2TGs^kjwu%i@2F8|;M- zEPB0PQ(C#<+yBK1j`#knPwY*O{V(ZKSUbBR$@`1Ez{$VdSM&DuD@^(*yh`JD{frfD zhkE1oson2u5?{*^cZD8Bb zV$i}Q>7n+Esr#xc}o!Jc?M5cKbLh*2~7Y{qPh71 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/input_smile.png b/app/src/main/res/drawable-hdpi/input_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..51fa28a7d78d02bf8671263a0255dcc8f67563c4 GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^S|H593?x6vT4n+%`v9L1SN8&+{}ceP-dPerqeM!A z{DK+S?uRUH7kFEtb?~f%+}EioM!(mx-!TSCGj@5pIEGl9z8d14)T+Rv!^pz;H2Gcq zH8*d8Ul&SePd#QRsphG3q9WyV*898uuq?~VJBr*=x}dsiB!FfE!t@4=dd?QU{sn+*;< zyjMS|#eQj?7iv8&Jx|+-~D_OwJw=>%IsR#x?as-N%C(_ zRePuADz$xYc%|}J9J#dMz@@pymwhwm3EP^j$lN2I8_6YU9G%ED*NvaGC;!5{hQo`C zrq1nkS;eJxC)()KhM;tRtE8_XZ;p6%H12(%U8ZPQm%;g9naJ$KO)7gXMt11_OiQ@Q zvaWB1O0J{Mu{q*@B5t%^h@2^N(2aXtjQQ>5w-;2I+`60M8+H4@|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM315>o8i(^Ox z=i3?ky=4Lgj@w>b;1b}Iy->i#z}L!q=QSs%4LlrCOL-Rc{%@G{Um;b2bIE7^2_X*^ zI(i#LnkKPKI(F`l(3ej?U-8_zckg!X?7MTg%s<@So`3I5d0P7YyR&!i+b6BIwf^k# zn>lx6Y-JA2 ze;6h|5S+m_$$x?0)_t+(R_&Y6qqTVX^f!&{Zw)W-Hux5>sqh-y$P2IHdnxeY`jQl* z<_-TOcG&37b+BeUlH;FaC+;5;O0>_mlS)ha^DDXM zjGKIJr&+<24KwYNDzc8foBuLeWnuNPl1V3L#FbQk_mAF^(WMgdL;KL9J;{GK?QZOu z)o5Fg^E+{;hH~BEjdreDBBy6=O4k4DrODj2PDP~SZlLXjz}t(K+zIx1op9&M>KD)6 z+Lc{U&y{}@w03dC@)lXg-v_OJ@U9Xn>@@z7wn=M?TU+$Br{Qk3xBD2kiauY^vBGpF zv+x1S?Ta}pnlv9wtvvX5ZpQP5g%%AvR32Rm>k#ec(Dt3_XhYOH6f ze7!x5zcP89^G2wOP>;RcDSpq-U(Nlwy71+d=@mVzBd>`b&$fQsykEs5YwnW0<$?B3 z>NQeqy))Ksm7jE$jXk%|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc*oQ9*~KO+8SSwIs+dn4$4gTe~DWM4fmf}Hc literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_addcontact.png b/app/src/main/res/drawable-hdpi/msg_addcontact.png new file mode 100644 index 0000000000000000000000000000000000000000..7094e21869760c2f1d7f923e58291951be31f392 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZECYN(T-^(N{*wi2ZKnAG4G}5{ z@(X6r_{nv*WWLzR*Ad$-GP*rhGp#8 zrq`o8qV&Es_sP!5*9DfnR5!RS@i}Rp#=BOoI5`WJj5PiG1;-5qD>NTQ@vhJF=q^~c zDblgKv~$wK*v;V=d_VX6Fk{{#rS6rw{YCI%kEcI9HeFcj!BYPGMx}b^)kD0Er#r7y zg-C@w?#{^CZRE9*XYYxPe>XRr-|VF`>-$5cdlxdr7dFP~yUGW7%fFf%VAr+8iDPxj z#KR@m|Ex{U|HBx|baGO>^`#lP(wXYIf#1arX1?hDylnQ$-_J6SyFGuH)HOjSyf3(p~;=BcI{DSPu>F8j&lv hPfzzM{Pp|?bJJ>mZL_?lGGOpAc)I$ztaD0e0sxll+hqU% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_addphoto.png b/app/src/main/res/drawable-hdpi/msg_addphoto.png new file mode 100644 index 0000000000000000000000000000000000000000..176e9748a4c1254d139bdaedd477a1bfe72266ac GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slL2Ka=yx)=ETCkxctO!EaAB2*IO7tGLje7A$#&94P7*}Zf&v8=E4>A$8{-+R&@KeF1_O5gW3_Y8^OaNk4MYWWvd>ACAJOnq}H z>dec_77W)H=0%lWe8u$2LAPY-zl*n8|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*oi38nilgFVdQ&MBb@0P4hPeE|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wF?gc*oF~IgyjJJRa*h+%@f*JTu9-nMow{|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm$1o(uwx)=ETCl~ae-0&4>j&MnkUogXGA&KVW8BSM?l!6|1FXh@=!Q#Bl z#RX`kfTxRNh{frxAvd=*D+o+>O%cBG=l}k)C3zfE+N4f*rDyP;RDsH*Au9+pp_dVB|=^MCChRpU`wscnGArZOBX=RNyg@IGt>kGY1S~s0M zykBhv!|Y1=g74y5a#JF{$$xqywp->h=LLQr59K{?E^@H{ICy)R%$>LX0cF8VJD0!o zZoNDw-K8=-Slz{R%T<;=r_J5mpFa7PT-N?|dq*1A2?n*Q%AkH5)5$ySCf_{u<5@*| zblBC~yFIF>v#+@GAkkiD?)C)#V^?ZJ7yZ5c`^qZ*^|E}|@5J=;1A~si)78&qol`;+ E0BGXlasU7T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_block.png b/app/src/main/res/drawable-hdpi/msg_block.png new file mode 100644 index 0000000000000000000000000000000000000000..cd62187af6f8c8189639511994a8d83c2875dd68 GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*oi38nilg4v*=8N!bo;M_JzdX3m3j*L@mI|N(= zLpT-*F5*}vn4=UTc%@>4@`A1feGHbO%Q#+zOlVK&N|;x?PlqG;2*+2m+jrGwDDh=H zF!*w>RVyi?npy4w`$c9cAz7Xi7aLVCZE)4y#?qiVa{?nnwQE*NX=uh|puZVBUHx3v IIVCg!02Pa-T>t<8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_camera.png b/app/src/main/res/drawable-hdpi/msg_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..103cda3c4beeee056c6d07b03e4137ad07e6beef GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm01^9%x{{R2qy}$=Zk_5DW=d%G#5Go1s3;xg0czWSi9hQlF_g&=TYBuLp zEL62g0NN$&>Eak-aeC{N=ylBoJTAU6w=0Eq{XZKg%n{(R>Xp}AeG%E8mTb%PS?rsF z=JjU9Rd7^tx6k>a*k2&{OIqb(ME2B!J6Inqy8p}MI2-47fv0BzqYi9w)MN^+4*Tet- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_close.png b/app/src/main/res/drawable-hdpi/msg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..0d213d7d2034b2d32fc94a3ddbbd80ed6837ca9f GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICC0X`wF?gc*oaf6eL1`B~IIZJ~4f*H7Wd;RRx`W~=PXSNJbu-wzdF+}5h za)LyXgMgE&f{VmyUWX|cLR1!dr3RFfIBL@x`3dagw*rmy~LdoH^&D@KknzI&YG4Je@43)g$yW-S=Jg2~8Y=x6g ms;Go6OfWZGZOBv0!0?7eJn+}k@D`vG7(8A5T-G@yGywp`qh}8Q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_contact.png b/app/src/main/res/drawable-hdpi/msg_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..da35681a5bf9e00c1198e9df30507dfd39a77422 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)Ikh{DMH86K3d7FMG*)L#m}oGIlZ7in z#l}%6c!NhqlZskmm$5gHk`mBwysU9&n(@OTJwN`YrX`Hk35L=Wr1n^pw1{wWt=gTm zOEXhVV#UJU+J$N&9f==hSr+`-D5Pj8>*@p~Ct7sQ^k8sx65#AfQ(48xz@g;BEw``M Q2|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc*oNdYc)Z0vlX1z+HWG`_x9(^hy?<({{yA& zdAc};Xq-<@SYR|`VuRkLU;no=ui`ijv}C{Z0*n9vja6J;=lJZ+}3~_y2YWpVSz13H<(l z|Ns95yYBz^_y2!lhTNkGQ;imA^vn>C%W)9)`uqRC{;GvJ&;P&wAK##q^6U7_&HuQ& zE>tO8|6)GFQuI~w-}4Iu*s34f>LiFrNbLC6{MMwgO->_4^1r`>nYO%yx@UY~Px>GE yO#%PeS3Q2+_-vv3i+}$GU(8E+y`=0C6GK>9lxj{Y!z!Rp89ZJ6T-G@yGywoecEn-; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_delete.png b/app/src/main/res/drawable-hdpi/msg_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..521ea76d4907eb0c183b42a5fdd4d9216391b231 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc*oNdYc)Zt<@b5~VNxPxTOf8hmd>X;*b{EcTweW`um&L4Y* zQ>*M5Qa2oE{$XdcCUH{DfAa$^Z=^5qw$AR_AoWh>+JE5(eft=`9;;`cap7P6i+Qc= z4D3p3&z+sm$;uV*oT=yMYHF}m;@oghX*;8!yYVYWruwzA5*myQ{%+Z`J*)zr0e#Nk M>FVdQ&MBb@0OAq6TL1t6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_edit.png b/app/src/main/res/drawable-hdpi/msg_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4bae26b52610a13507ac90a5d66cb8d00b0736 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc*oi3Vrm?lJ*2@|6Vn1v41E&zK#tRp{(@yW4ec*(^0yK$)eU zE{-7@=aUl_@Fr~MbP%6Z_k9sVXiMPxySvLm6c?61t6OnO;;WqTh6P%}RnHF`c<`O& zs){Zf+ctNNu0L^l2?>>*NkXr8NAi@NpCBq}aAa@HA3wpPR&3YGKg)40&`3(?a1K9m zAfbI>$4s@Z8-}7A6M$mXjq5rZA4~31>JaEsVtbeVqN~BFDd>5Ch+)BgW+o9=9vg>= m*O^ub?lAeXj-mIG2*YMO4@0$=J6(VdX7F_Nb6Mw<&;$UD5R(Z2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_info.png b/app/src/main/res/drawable-hdpi/msg_info.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd75f73061802ac8d098a342b6924f04af79db9 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}zx)=ETClQ>#*p&#>E>IHW7tD|m_47WP&{GqpgB5eTH=j-3zH}4N z8a_`K#}JFtQ$ubGwJLCgd~RF$@qc`^#$2IIlKuX1*HR;0mj08w_h#p{J<|VM3#@W) z9G|vjc4E)ozQctr*-2-u1FXJ#w{#m%`|KvWrDH1}HTREnC-fH-C zWV1Kpg0e?dO3OH($+UQt$BAUW<8pmtY1N&0A-U~Jti$a-lSOg{-&4z`T{tApkrVvX zT<1*Xvyy{nx3B)V`^iSZ;CTkumS0;a#c+0RPorz{tSMa6ZAJSprq5d)#C}cOYww3Ag@<(1f#Xs0gUFyF5Tg~&{1un`u zTd!Q6(=59FnMf|*XS4X<24ef?ZS{Xs{f9v#M_^^U`@F-zP-F0P^>bP0l+XkKO~2Y1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_leave.png b/app/src/main/res/drawable-hdpi/msg_leave.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf0ff1fcb7510bf3cc796006a26d3e102d14d4d GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*oi38nilg;2+sn~XDo66-x( z978nDCnqd0OxV1Sn@yCfVBya4g$p>;4n5iJEWneKf1oAey_$o>nd^y8J>?fAS2%GS zv`FY{FW@K)H7K}a>SW54v0FDna+5%_QG{fdfQw{AN3a0bk@r##tq|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}zx)=ETClQ>#*p&#>E>IHW7tA2A-;Lwp>jIgOsM+10S7+6*bMph` zPJ6mIhFF}w8+=-**?_}jl0%%<|NmQ6ofj=jwvLJR^O}}wJ|XpIf5C(fp&j}hQ9F-& zowo=#-*+@jK4GV$Q|pVE7AYy6{f;%6whz1|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm01^9%xx)=ETCmpl}orwmTAXpOQ7tE0G_p_PO%d+Wi9Acdz$8WBkb3X1A z&?-|;7sn8b(|fOYPCKH&!4Q!Cc!I|F{W;8O2Ap$4_m`!H{uOcwSy?Z?a`(^0*Kh5= z$W|6~ks;!*)9RTaEK=82zj@~s&*fXdsqpBRVp?FP$&7#oR>5fon9mh8{Z0D#rpi_gu517rFVrs z3OCU_ZY^}^?5ajl;rUY^@A)qDKyA{Ec+!pv{iEM%2Rt+ozJ~!8*q1xyjI`sq@NA@Ly8~&un&2fBvIdT|H$*^ pdrhBry$pEje$4%4=+D_7nfEseTIm;je*g?!22WQ%mvv4FO#q8c^4S0Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_notifications.png b/app/src/main/res/drawable-hdpi/msg_notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..3e46463cf8714c1913883d89514cf403e0d4e625 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*oi38nilgYc%M*L!-G1gapcfcCUHx3vIVCg! E0A;0>ApigX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_palette.png b/app/src/main/res/drawable-hdpi/msg_palette.png new file mode 100644 index 0000000000000000000000000000000000000000..f92617f15333d965861ba0d6619a52e919ab8e69 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZYyx~jT-^(N{*w#(Pj2`MG)K53 z$S;^-rO;OvuB_c>gDUPi&3>*IqtJcQAkKt=fla**>L>fk z7w1~48hB=XX1`r79BkX?@a7Buk2Nm^{AzBW_>%Qb>&m*9qKkFX?9#rsDb8KXwAIhQ zV{@{e^U>^XHD|F8FM5vOE!}#xN!~eH+~l5*i_Y3V6SZE?wO-M>(>R!SO3atvP2c70 znIEygnl){q{l4e#=DmK-(*Egp^aq){yQl7`+WY73|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*oi38nilgdx0Z;{>m&>eRPL^2<&NE7J@w{yz5qduhSGyh z(;LJj@3LwpCEVZ>WwL7by)K!fYwq&+EU!b+XSNjnL^j1~4abCJBb0c(uOxXhL`>qW bWMJ6e9k=vp^Pgs*#~3_a{an^LB{Ts5qg0k{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_pin.png b/app/src/main/res/drawable-hdpi/msg_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5b5b304cd897201d43431045c8941ea30df8f3 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm01^9%xx)=ETCmpl}orwmTAXpOQ7tFvUba}qX&#d8qCy3biV5um%KdHo5%c|NPo3mp!j!$S-0hXj!KtEh3@h{yl=CnvENy@Nzd#TKYKjM>Ph#>Y+m7l o=?^E=6dc~NxXS)I$NbguSB1Hsz5T7R8t6L)Pgg&ebxsLQ01!RDB>(^b literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_retry.png b/app/src/main/res/drawable-hdpi/msg_retry.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8571e9feb1ccf79bec5af3e44bad86f9381580 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZYyx~jT-^(N{*w#(Pj2`MG)K53 z$S;`T{a%kMA(lLz=7%TMeoI*_Pnf=hC+`pg1EY|qi(`nz>8De?H?=76xH=#5cM075 ze{Y$Cx81GF-`Q%}qYiks6eu6C&r;p1m^bU%@kz_L3s>y$SSW4C7dJ1geUsj)_X}$I zHJK-*Mb0#JeXRV_$V1sh$Zqo9=Nzh=aa-5Lu#A&W0~^^+O?`D|zV+7|5_c2*;)~?!obLHf|B@FVdQ&MBb@07y*R*#H0l literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_secret.png b/app/src/main/res/drawable-hdpi/msg_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..9e428aadb6a9af0f3ece4408302db36600f86afd GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>Bx_=LE+7x?@q1VpN0(}C)_OM?7@85(m$4BU1u{rh}2dwb^=pzv-_7sn8d z^T`Pf49^ronb|}ROxjpoKAX8~!m&Js3@5R~TX&!4Y)abBG-<-|a|~>3*KX>1INe;U zV3Z{7)UvahvE$LL#tlI>z?fgV^7T4%j%Pz@Al(xmGF#7_ZkEq-Sgm8JnQ+wY0d6~ip@Gl zwn)nuv4kWVc6<396%vX##O=KziL;tb%+*mtz{$6?fPq2eP;!>M*aJ?WHyAu!{an^L HB{Ts5H`9;i literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_send.png b/app/src/main/res/drawable-hdpi/msg_send.png new file mode 100644 index 0000000000000000000000000000000000000000..dc70ab6d110fca1068993bd6bf3c90c7e587073d GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slL2Ka=yx)=ETCkxctO!EaAB3u&W7tHYAj^(|;@7r4IV`Lf&`aR~K-M?N) zj29^V$YUp5C4_I6l}$(bzArCi^^h8Ec$clpTViw%BtIvGr~Q5C#!b-ebj&O-!i%7 XUhFQn75#4keb3gTe~DWM4fG`i36 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_sendfile.png b/app/src/main/res/drawable-hdpi/msg_sendfile.png new file mode 100644 index 0000000000000000000000000000000000000000..1236cec8a55427a9d8da92333093c1b7b395ed00 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*oi38nilgH#a))iv}uBN zga<=pN9yK{8$U*hC>l(VEpo~^;Uti69PiF?Rmx$}$9GIKIIiDi<52z{HCad^<4Iie wDc`-^>=O;Xo=#K>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slL2Ka=yx)=ETCkxctO!EaAB2*IO7tHW^tw#dK)6*iYIkW$&?A2qsYdQ5$ zI?y@~PZ!4!i_=F#PA4@e@HBsNb9wQ<{tcIg)&suXJ={^wv$i=N`&al@u7~ed!}fTA z#0~2cjxbI97Galm;||*{n`6n#9(LS`{djol^@(TLdERLrvFiF^?my$aV0pzczP>p| znhzHIDsx>gdRx-7DD}Qp{hL-!m+)_bN6e1+rA`Px>ueQtUT~eA`J&LzW=~$~$QP!2 zd3{~wn;mGpy@u1knC-^Q*Nc|Dp5+oZ=|%C&4?LSX{#D&iTQ=<-TkE3gDdnF( zH6@=UzWvS;q_us|)qkm1*qU!SnRNYaN_r_!mvupC#=kGOe=!>B2>y6o~v#2GwY L{an^LB{Ts5n79Gn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_unpin.png b/app/src/main/res/drawable-hdpi/msg_unpin.png new file mode 100644 index 0000000000000000000000000000000000000000..7a23866af05e4e13a95b941191f429c28147b6bf GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}z{{R2qy}$=Z5)a-t?g5!4SQ6wH{GXv!;qhmt%kxD{d=77n%i@@1 zv~(uW9v)8@#}JFtN3Y!GYgQ0oxgeM_vHRNp|F@bN-UJE#zOZDE$;RadK7u;&Jb%RI z{^Ax{c;s+!WU{%sfGfw-@FyGD3@69!{KVFg#qJ|;aObIKQ|+9?OUq+TgQq<2m{qiW z=M-C4|InX#)1I=*$o$lOw&&&Zefg7pPBv6O%U+Ux-DnfmRkGUPo9(!z4+!w-LqK=UeR+_ z_i4DAhE{U0=B-($Z3U!aPA^^Wd9`6x=F873lXfcj2AVORy(GRQFZjyW((o1k*O$Jz z+VlIOUrB=dQ;YQVEak7ak(_WQ|N#K2Y2X|z}`hXS3z;OXk;vd$@?2>_KVgDU_4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/msg_warning.png b/app/src/main/res/drawable-hdpi/msg_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..d42de374c73e50c8839d9a64e73076e7b3c66e32 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y?2qG_3m?!}$wg8_HSN8&+|NsBbpR&jqD8g70 zY()X(yI^N8D3d>_hV?3vE+fO_dGL9!kg4DrYU|~ zYJY7e&$i5`3p3hEUQQ6HnX)jvWzExzp^O*hemvbB*8C#fmU~$?+wAj(=iV&HVD`NK zNbuC9i?=SsDr7dQ?`JK3^^)Pv`Gg6zAFk*-UuDsAWB1f9Gn1Q>wkOQzs(g~b*D1L_ zr(6kKzVO|fn43*Ar#dUoKh?DQZhPaRX;lZ$)lA|JQ(U!Jl#loOD-pYsEt=mCZ@zDB zmNZ}dr1Y`Q>kT^2(Q-bw`~1s`6Q&hp9E#h$eWx&gn6M}REt5H~4?HQp(%il~dwW5~ z!E=%oqQ+NJS6V-4>zfp0w5MQq;xE7b@)ef%QqJC3ca`bd!QHC_gTLj?`#*tUN0I4+ a^Y$|i2+ucN7AXyk7zR&QKbLh*2~7Y-^B8>q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_ab_done.png b/app/src/main/res/drawable-mdpi/ic_ab_done.png new file mode 100644 index 0000000000000000000000000000000000000000..ac961f1d6bc48508fe4d9e3a5bc7c928d7de4f90 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w#Q>iWSN8&+|9C+^%emh`#atyp ze!&c4E&&l4740*Bx_aD$J-hMDQC3Z6Rd(=-m~AH30`a&Su! zqo@1z6cyPw+H)uNtcvPP5xK3UVl6Rcds|6zb_{soW*=8_=4 zUJN5uBEsyM}GZ+{?E#zeX7_@FBPz{5ptDnm{ Hr-UW|Atxq` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_ab_reply.png b/app/src/main/res/drawable-mdpi/ic_ab_reply.png new file mode 100644 index 0000000000000000000000000000000000000000..68c18c0776d9909da3ca7c1ad55e43f0f15732a4 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA83g!*xVjhk{3ivt*u7x_>g6v9 z@(X6*;FB})iYuDBa_{Ne?|(|f^j8C=QaoK8Ln?0VJ@3lIY{w#(RV}8|$)?-s{sbp5aKJl+W;4q!SrAn)*9#$X-9ezP(l3P77!sgQu&X%Q~loCID^@b!-3t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-mdpi/ic_arrow_drop_down.png new file mode 100644 index 0000000000000000000000000000000000000000..a671753648537309ca3be2d889080bd2e49be1dd GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wloB=)|uI>ds|H0r{fvW*fkf|id zFPNe6jZR%3kf-43;uunKD|rEDLd@1vj4tVGS&ElVYtY=rDd5R&n{URHUT~%uI>ds|H%dYCpUZrnj>5i zbd#32A z3f0)p=?hso;q%80NeeRUTIIzzM=Z*!iF)>Xi^L40A1|LWwQMh5bp5I3{C_cj3f~>P zIe)rJyqxcwrwh3!{CQ|Mxxi*w#Df}@slo<+?4cpEWA{8hl3Drli0(YbL)Y0~otWTr QALv#FPgg&ebxsLQ0I}k)umAu6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/input_keyboard.png b/app/src/main/res/drawable-mdpi/input_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..3bda68846beaa442a3b41fead6e911b4b77e9666 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{UR#sNMduI>ds|49VrFLosYwF{I4 z`2{nu@ktq3xMfuI&)<0Q?#s{Om3lEixeiYk$B>F!XD4{`9X8-#^*nK2;&J)^%io;W zip+XvEXC=qyt(1si5MxRwPzM@=Ti&X#s literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/input_smile.png b/app/src/main/res/drawable-mdpi/input_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..a531c296027009f0bebb431703e3e91e09d9cc6d GIT binary patch literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{UR_5nU2uI>ds|0w`oy|W~MMv0UJ z`2{nu3CO7!dBtT^v`${UasSzykKh0FZ+)Hzlz;E(;uunKYinR=604#BvsiiCo&Rfe z4^N(Y-%Q)XNbeuRscG}V@fd%HF}aT@-R>1r)1LIL*lyjuCC}Kc zWZ`1H-uC-TYPKHcXApV1HB&5f)2WEf?}h$oZmpS_?_xRE=v8@>*5bM9io$6|Ict>* u@1@^h>xs%@-zCg{<4Q)*`LM44NBO06xLrd!Q)7T$XYh3Ob6Mw<&;$S=Qp<1v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/menu_unlock.png b/app/src/main/res/drawable-mdpi/menu_unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..e882b1778b83a7d28f5642fd98d8746c4adfcddc GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY_g||V~7Xu z+o>D9m>mV$iXEdB7lpAob~GiVDzk{_<4{mnXd=7Z!K3Wv z?FLe1?wdp=JW^M<*v1>t8e7q>p5b!pM&_AKMV-F!M`M^%!o>r=er`P$wIH|i} z^E!=^!+PhOf5uA}{Bxf1?COp~6>1?ZcbMnAoY=bblZylUskRESKd*KcyD4bzZ%egR=~MzilPNLc%5 z(|@*$n}2;){&hu_*KPVW{Q|jg<=`LIJA&>P?YFmjY_rZS?Zf>P$@xt+?cW}XJ*k%G z`gr30GqIRMLiwBCKFnQnka5q;*^y6_qCQ^9n9zNPugbXN>5sO9S60M@{XVp6f9agv Ze;9V_nf;X&>fa2CCQnyCmvv4FO#mYn;<*3- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_add.png b/app/src/main/res/drawable-mdpi/msg_add.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbd428d08603716db79f92465d265a52c43a33d GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wloB=)|uI>ds|H0r{fvW*fkf|id zFPLHL*%@8dK%ShZi(^Q|t>gpz60!$Gf|)0VTw4{Yy-?)huLQA&tPHzZxib$Rd8iLm O$>8bg=d#Wzp$P!_xh41j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_addcontact.png b/app/src/main/res/drawable-mdpi/msg_addcontact.png new file mode 100644 index 0000000000000000000000000000000000000000..435cff3477e1709d1a6b234911d062c607899c1f GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA*$4Q9xVjhk{HFkT_09sBD^e2V z7tFvVB&TL(;}H;*QPw?w_4boDUw-cl2+sq`FY|P945_%acfwWCBMKreh2_ishdn;` z{hjZI=jkW%FYNrj#(g()5!;{ZdR3yQ;}q@r`qy?j?eOthQ_U33f9rGRa@)1;2cC&{ zJYkvb{NBCA?o~v4(%J~$qdPb4D3>yuRwHF~f!S8(QiMqIk88fCF8_JqxWlaKr)8zT zsxjXtE89u=RVwLXF-&)y?L#V$hR#?W^|mSI!?kmgXQG4otF_{OUOu>5`F{f2fo~k_ UnX7f1fG%e6boFyt=akR{0M}`$)&Kwi literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_addphoto.png b/app/src/main/res/drawable-mdpi/msg_addphoto.png new file mode 100644 index 0000000000000000000000000000000000000000..a8921ed9efb4a00f1e57096a86a53aed52991433 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaASqAuoxVjhk{3i?4+D!8W8X{B@ zvD?g<)Mk+X=uGm; e`Xf5en6>vXbIw;)OmqP{ox#)9&t;ucLK6T(#jf=L literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_arrow_back.png b/app/src/main/res/drawable-mdpi/msg_arrow_back.png new file mode 100644 index 0000000000000000000000000000000000000000..53ebd2ec8423a09de2db287619ac4c9845450974 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iXipc%kcwN$68j$PKUmKkH0Af7 z|9|V%Gf&0;yRP78C>-&#ctMenPrcoPWy({U4?X*zwdMkQu=B}1OUN{EPPgDTRxXoFi!tg6nXahPm?@I_h=YHUn2HZi bGdlyrvJ{41=DqBtKwS);u6{1-oD!M<9cwG) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_autodelete.png b/app/src/main/res/drawable-mdpi/msg_autodelete.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ca24359b4801ec639821e0bd63efa7933125a5 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaASqAuoxVjhk{3i?4+D!8W8X{B@ z)6*U7EWildndY8`M?~%e|w!`ey`ueDDWa>h9Bp)9tNScKPCsuw<*{jIH$R>s*2&= zOuvUtYx|^s+>KgzxHb9S+4Tzxj8Y_Aww=B-|De|H#snKaqwvC_jZ4>8&5bcWc;YBu g&MI3*sr?`24^^?PFEiM_3g~z~PXGV_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_block.png b/app/src/main/res/drawable-mdpi/msg_block.png new file mode 100644 index 0000000000000000000000000000000000000000..2c97a69a6203445b3c53f7ba229230fd57d70e50 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAX$AO%xVjhk{3i}{vrRe!)Wus8 zb=^>q68bP0l+XkKjb4hT literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_camera.png b/app/src/main/res/drawable-mdpi/msg_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..cc07a5276c90fd055597dd30f94173c3d0383d1e GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA*#!86xVjhk{3jRmpWN^jXpV46 zkY6wZ6OWvZT~ty<_w1#sx9>lE^X1Q{J7X(>((654978H@&7Ba)*P_7VqPtGii}BQ* z|Lb-;_1vtpl3(`i<&&kif7c|1UH$U0T5g8q^Ud5Fue8-&_!{rNS}OCMbz9`k>*3Xg z(i!5N9S`?U6IyqOXP5P1TZcOTqg9XjO5%*aFmkFTdC1AEcz8Xq&_dzHa*-pAX{+zf zVy;ksbFq2Qa6qz0P{K};a-%Hy%Jn$=>|D?r2C`BuPvF22cirC+7 dgIxVjthpZCYV$r@=mMS2;OXk;vd$@?2>>&rr>y`0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_close.png b/app/src/main/res/drawable-mdpi/msg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c2164aa0599a7eb48fc4f1779ec60001c8ff071f GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iBu^K|kcwMxCu|gKP!M3@UD0%@ zBcq>56Z54d?;AgNy21OcfB)^pmo(2$_jz$(0Y@Fv*I137XwE&H6EwT5Pi^@S zpcb)XnOk?~_7mR=&TcQ*8=>~)Kkr*yo$FIC$j`g%GSD^#Pgg&ebxsLQ E04>}-ApigX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_contact.png b/app/src/main/res/drawable-mdpi/msg_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..594b1fdc9ba2aea38b3669df4db2139c8c1417f7 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvtpJ}8SN8&+|HOfAwn=Azx_C>1 z{DK*n&WGi6FBf<(x6|OJQ-SJqphSwNi(`n!`Q!wNm;*YJQ}s)~zjG34ys^7{z0zma z>i75dDmJJbs1xVlnlN?F-syK2k; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_customize.png b/app/src/main/res/drawable-mdpi/msg_customize.png new file mode 100644 index 0000000000000000000000000000000000000000..602f2ddc99216060d0955b069228988850cb0bca GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAnFaWSxVjhk{3ji>1)Yfonjlyb zmTJKw0V14=e{x;TbZ+**6Fd8&h<0P6*D>C5#SyYqj` zwJF#5w2G))(+N~GiV!j_J`p4-#`E%7WS8yr|4U{)w(`jE=wk3bvQb2%-A7LQjHs5_ z>}isBcO-L*ZZCW`+lFZxiz=JTq>Lq28CJ_qEP9xvZyH^7Hz2H=<$P$uNfY4>5t9{J cTl4=ios(f(A>tR61au37r>mdKI;Vst0HFqg+5i9m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_delete.png b/app/src/main/res/drawable-mdpi/msg_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..3de3ae789310db5fc3a0753f01e29e0b42f69da8 GIT binary patch literal 231 zcmV$kffNfxFsnNlm}MbeDgC!v&h~ zn3wN(3*kh}8(vuM?^Daqn4$I!o48qhcZ{1~<&Utstcg|~zaKX|hvg5vMjP~Z=1Mwe zvRfO+NtMlE3GZ^3D0J`M=HG$lXi)&hsgjkz~VB#!zvJj!m;> h4U5q9sP^(v`~cG~02!jAZrT6<002ovPDHLkV1na|ZD0TZ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_edit.png b/app/src/main/res/drawable-mdpi/msg_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ba2e419e00d77d66c2ccf92b15d8b0a87883da GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA83g!*xVjhk{3ivt*u7x_>g6v9 z@(X6*kkWDUOKYCG_x#O=Z-1tL+Q9*oiuZJJ45_%a^^BzugCmDiU{(Co-}lRU+%K!u z?C08ZJK*I+|97Y5etP}fP<@^0$>OK)+tr!pp8Z>*?W*!$_Qjq>SFH^sswbM?OJZm9 uej!%$V#b+;(Ko7Bmrv3CuJhUbH^a#{EYJUb+VC1^6@#a%pUXO@geCwA@_Tsz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_info.png b/app/src/main/res/drawable-mdpi/msg_info.png new file mode 100644 index 0000000000000000000000000000000000000000..13519f6f5ac9c04ea90adf1be61ff1f50c6d4d37 GIT binary patch literal 249 zcmV^kbw+T#2Z3JK*aEMHK1U>-e!@N$GN?nLYuOKs%dI@4&5*TOhYe^pb2mZ z!w@bI+Ac)55PEV9EZIlLaw{9SS@=!StgMpcmh~%`KvvH##P2wfez?1*H}M_IKz~Z; z808J7tNa5l^X*a*B|&W8QHzFA5-cmfGtkZnIZ`I%Nc%?b375I=)=bFVx*fP_?gsAR z)KJy!)ObAk)Xn5Op5DK4x`67z5g6v9 z@(X5I9rF9JLL6I(K=1MGPI?9|8#94Y#hxyXAr-f_p0|{8R^)I^tXW{O`TyNz6OW(0 zqPqOk2ZWBZ zpgu;j29ljbvZqN5RuUtQlB7X6@sXXp31^_8005@*Qh1?Qd}aUu002ovPDHLkV1ing BX2<{l literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_mute.png b/app/src/main/res/drawable-mdpi/msg_mute.png new file mode 100644 index 0000000000000000000000000000000000000000..d682c493337c6065c4b27386e06193cc5f71317d GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA*$4Q9xVjhk{HFkT_09sBD^e2V z7tFvmyJ&m2kJNF2ud8GB+T2chtFpBH+mB|T{6S9_$B>F!bI)8~t70hN92gdUx|;WM zf9XQO1-19?-e(r7KPmCXMgO;u+@1|w^Om$)D|`=La=~YrSAP6ySLP$pJ}Hx?FJj|v z`0(Jb$jh{M+j+CsFceG~MaC>b!G?vKB&%l!6(LUn}1Bu)`s$gkj3+XMGNt8)jXLs@0suvizJ_gVp>` xT1)vQIOR`S#V5seD;{T2SoxszGF#1U`F!O9NT^m<w&m<{HME*Q~5 r$#?a!oj%!AM$St`X8twaKg{8qyV*B{cuWol`h&sK)z4*}Q$iB}n_RH| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_photos.png b/app/src/main/res/drawable-mdpi/msg_photos.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4fcb956f44590061e1d235d6a1a71da90e9529 GIT binary patch literal 236 zcmVYC|BR8D)BD0A zJjIKO)Zb1xA67pL?y3m2;YUgpEtQp*Jr?<1$S;Nb5rQvQ^S=eN9o6@t zU^aJnwch^Mr-BtEQ^PN}Q^EQm2y6oJi!ZH{jJ+3jB$G)(#nQd=_9(0^TWv0dA9oD<`sK(g;oVhLf(^;j^X;bYncZ#p>}sRUkykS>Z#tmsA-49) zzl76GsYzR6>uY7^KixU~r2l`3Z<~IvT``-v@TabOx%Hl7Kjr+ZzZ=-*a+Sy56V8yc qn`*bqqW;pOhSgtdm|Kp8e`h`=$W}5nRz?KqDh5wiKbLh*2~7YQznU}v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_retry.png b/app/src/main/res/drawable-mdpi/msg_retry.png new file mode 100644 index 0000000000000000000000000000000000000000..43dbb8463370694869ec75ea0f0628537bf7de78 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaASqAuoxVjhk{3i?4+D!8W8X{B@ z)&rWu@Ti|l^oF!0prKgKyNX4zK7hM-UHQ;f%xXED7o?HKu zcFX=dlb*E0nDc((3a4e;=BgA#rYWeY-}N*LU$j7lJRdXctOwJ8v ztFj%H1vj1TKNbF$PvP&F*qgMJclwOZxu#Dpbe0_6wbE(MGqs=bX2uOOJ_Pmi|6yKk W#?H}YQ(y*kG=rzBpUXO@geCwc529B9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_secret.png b/app/src/main/res/drawable-mdpi/msg_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..ad359949bd466cfff387d0bc7f73f80dcd674222 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAX$AO%xVjhk{3i}{vrRe!)Wus8 za{HDll&WyBO aAJ_zTvmMoNFI)q341=eupUXO@geCwb>w5M8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_send.png b/app/src/main/res/drawable-mdpi/msg_send.png new file mode 100644 index 0000000000000000000000000000000000000000..513330831beb4dd7518d561ae7f645b52e6ed109 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA*$4Q9xVjhk{HFkT_09sBD^e2V z7tFxIBcWpE7M4;}(>Z_R{>yitfBb14?>Gx6Khx92F{I+w(hH$Z2Mh#QE@VE=EB?Ru zQKN3&d+l9q`winBD>tV6eDG?D}Ug{L=5+6PE~wudXvXV)*BH@^_WZ$Jn=A{;}VB0w0IUgZdekKu0ooy85}S Ib4q9e02N=UbN~PV literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_sendfile.png b/app/src/main/res/drawable-mdpi/msg_sendfile.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c5e02c8418c4af4a7d3bdffe3e90c851a00aa7 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAX$AO%xVjhk{3i}{vrRe!)Wus8 zYaj043zW$6ba4!+xOMjAR>lJcJS+#yo4@?-mu7RGu613` zu4w0+P0rdur`L659XOq3cq8@Jp)@Ajbq$&77ws;d5xCtkS2;)Mutei>6SkNeM-=70 z$qOFuu&8V^W3tr?ZK`Eixnt)kx6+EAGxRP#UMzZZHS4BF8w-G)=T5 z$S;_|>EX|bB5bGAr1rnnXuTd%wSI1q*}USfbAbwuc)B=-RNR_-p4E@VK*aT8^!L7f zfAgoBFdqAQL@WO1ypJm_qxoC8k89oB+*eCKY)W|AxYnpU(!9$&p@uPOwocq!xu0AAeT(|pes$C|#*D9jlE41{ zTVQ?8>#rz#&ZD58xpA>i=4`z6=iT0i(=C6@o%(xk`?u{cCp>v(_90uF|8&mrLo*{x zBg*s&6jiP&ZwP!A^d(5DGUN2tefg7e9`@z=JlHBPS<3#ow`@-?&_4{Gu6{1-oD!M< DGgrp| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_unpin.png b/app/src/main/res/drawable-mdpi/msg_unpin.png new file mode 100644 index 0000000000000000000000000000000000000000..f5075a8c3bce788f04706600a67e64ddad2ecde7 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaASqAuoxVjhk{3i?4+D!8W8X{B@ zc@2?kZ4rj;D)bNX4xr1$Ki?%u({)EFF#t9DMK0 z{{PROleRN|{v@qqD*L9Iwn*q*ZaElZ;xj|7sBq%#Jh^$S6CW=tdn{Kso8{rBs|Q#< z{#*L7HsF!A=x#@ib5ZVZ(k#zAA2a3Kee-o%`5ReIWm``}7&b%>VBOcPVncE^>~pS+f5b%m0}i9wpL0`hf0a@O1Ta JS?83{1OQW{pH~0? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_views.png b/app/src/main/res/drawable-mdpi/msg_views.png new file mode 100644 index 0000000000000000000000000000000000000000..526c8485a583a0bb52491bf5489671842c14ec9b GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^fF!$qo(wqy8uVyZ(1R z&k@7_TLm6*y!`op{^A2aHBS9o?$CPu|Ms8y3`brs{3BArI{BattAVAYr(ghoOR><3 zcy5oTh$x3|o-20nGT*sy(&1_J!Z&L@o~==L;wtsJT=7^0;d)&5EN+D a;boZ4@WsEpLOdJj0tQc4KbLh*2~7YEIYb2j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/msg_warning.png b/app/src/main/res/drawable-mdpi/msg_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..46f4c82ea5c5856179fb342702c06250e994c022 GIT binary patch literal 73 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Z!2%>VRhZ@gDFIIx$B>F!$v^m6c5n(f6fk}b WmVek8Bk~p~$KdJe=d#Wzp$Py21`$*M literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/fingerprint.png b/app/src/main/res/drawable-xhdpi/fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a2fa8ecb773d24e04cd01de11f2676572dfeb0 GIT binary patch literal 991 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVB%mREuT-^(N{*w;cg3d$(O%N;z z@(X70`*=}fFHhQI2^O2VtAAH@$E|6UV_;x*_jGX#skrqvJbcj|1)d&MPgZ*udirGrC*Zp~?(x=QNX`i9KON4}jbGJ5A}5mdRrr0kO1 zjmU}hO>^$rZ(BJ*dcL(5=l0%x?c(3w=kVUQS@qjkFpu%rx6VcLn=i^OujWa$GXBuF z)0*$G#>*3pMElcx9X z;$B%^w&;_&`qkKn7w=Ac=>Mqo#nE1q>2Cfa^$aXVO9LJ}W{8(M9V7m*riz7AuCl9W zS;RC0mJQjr^&elI_(K2gF|iLi{mEaY;+CCb+BI>bM6#D_vOvRU1Qf0HgXNzvI#1(#XU%Sz2QTnZq`(ICd$Z~t~ zg&G6ZV@XZ(6K^hYoBjB{=B!5t&p+~=RqU!V$1&-Pv$OZ9z+T64RgH#&PtF`)wC>@g zQtP5OM|fHtBpNUBpS_?Z_guH#*0|`o$!^}a<}#lW!)LE;(kc0EGuz+r+zIx3Q5zdJ z%TL_$kh`|~S4JJjcB_v(U7-eUjv-o$zHVmNy2ImQw{J#<&6%{@JhHkCQs&RY890Ty z)q4+5=?*Xa9I@L^%h@1EkX?u&$Mn&w_y{BCm;L(cK~KOP^> z)Gv3tn|?o}pm({n@`*FGh1|<60`>A7`3&>TJ72_TPZYGieRrmd z^LNRgbNR(3mwOz>hgQwBj#O21TT`fPd zH*)@GaIm`6A*cR8HSSJxU;t<6L_u3?bGhK;y&EM~J6FBDvxbT7O0DzHtc#5oGdAXZ zjNQ@~z%b#N#(@`S4DY19+_xb0ecP_mm+oIV$qvKJ+63Z6#|8Gu5*heM>R$YCh5h43KzM-0v@3qJGz7N6Q zl$L}sf5*PeG^}jXWMo6_nQJ>eq-=-^>bP0l+XkK{(SDc literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_ab_done.png b/app/src/main/res/drawable-xhdpi/ic_ab_done.png new file mode 100644 index 0000000000000000000000000000000000000000..5493ed89cc51d0d166c3e57716eadb7f1be516bf GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sasfUeuI>ds|8awpj0OvVDmhDn z{DK)|^qg|~x88qSE+V)FWQwPYV@SoVw`UcFTnu@d9-8>hF8a^C{?Oqyl}az(%O{!r z&OiP5=8kFg4BK8#TxS1x|I6~qeGPGK{oG=+`kBSLp0iqoo`1CT!Op`@Uv##;i99in nb?=r>Hr!`7zX&({Z2p_^Sr=PmhRzo`pj`}}u6{1-oD!Mds|A_W~V^D5Q(pUMMXGxxeKb9TKKq*@NuoNWq!oK`b{o$p9b%nwC$5R z{%(Fa)1)voc&Fd_ziOSgnKuXg4&_xh`0+JZBVwX`r`qxvAGEgwe46eg9JWF|tH-lg zuQVs%sNiq8q;2A}4hnL=DLU*m_y3x?^YxR?h3?ruwe#7XiLo|c-o?!043tutVBw*# eQGDm`_j2X?rJj7>a8m&20|rl5KbLh*2~7YLsFe-? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-xhdpi/ic_arrow_drop_down.png new file mode 100644 index 0000000000000000000000000000000000000000..41ff50ef898deb648c237efa5e87af6efbdd4f14 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-soB=)|uI>ds|H0r{fh$M_Q%R6t zFhk=Tow`0C&&<=sF{I+w+l$*785DS!9c_Q}pJfP%pIEYWb8u*>*)gV>jc*#~aP4F- mDt@wd!gbew%^DMKhx*FjXE-^x;KeJT2@IaDelF{r5}E*`doz;& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/input_attach.png b/app/src/main/res/drawable-xhdpi/input_attach.png new file mode 100644 index 0000000000000000000000000000000000000000..b839d1f3dfcf1a35550eaec7ac8a73765a137c10 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q3?%1AoYnzSW&u7SuI>ds|49dJL1&_YCJ2@U z`2{nu2}miKxP_!tOkBSG^ySB&k5s>iWME*d@^oM(t|B?g0%i_ zs0y6D=YE96O4FaweYa_d9jwW_|q5&&rI~&$ZuaKJ!aC{Op|!C7b72b0=)x z_^nMYs8%C2=EY-=MLT5|OLB^{PkMH>Y+dMsWEHD;_H)w>n;M+8eGl(eEsHOD+F2YC z#hikA({RimYM_7_WQ1eY@k5wV(FW|L4{oew6d(=aI~_%3b_k&kei6 z@;$uQmsUMnH1E)9vwcM${%+ZPk++ZignrQv^&`@D&$#Y>7A-z`^#9LK+m0Qa{&Ldi z@O}Jq9xh&OC-O?XR-$LitHUa{c5VrhkBZnZ<=2NU$3=r*KQKE lb;j9W56TzUP0s(v(7aLIOHS}sEHH`~JYD@<);T3K0RVD$6o&u+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/input_keyboard.png b/app/src/main/res/drawable-xhdpi/input_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..6a76dc6a4cba6eda458b62cd6152ae6f62af90e8 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q3?%1AoYnzSS^+*GuI>ds|A_;Jo2hL@Aol1{mI)$)JYw1PuJ+|`XGNaS{6 zW3!&Use)ygP{(nueRXoz`HR*xtc_wcUpl!s*s51N`&~-L+KBK~G09W+?^*MKwLe-Z VcD2`+>p-tEc)I$ztaD0e0s#Gvsa^m8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/input_smile.png b/app/src/main/res/drawable-xhdpi/input_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8fd10b0935b135ab3fe5bc5b48d1ba930d20cb GIT binary patch literal 662 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q3?%1AoYnzSW&u7SuI>ds|49dJL1&_YCJ2@U z`2{oFJ}L22t?WHl%Fa%c5T}(hPdsJ&$H2h&&(p;*q~g}wuUW zk0D}}hffFV&RBH!aL%0VtNu9^e|)pyYnE5lt&UR#Wmih-AGNRgq`mjx=E}s{vn8cZ zCik(PNvP|w`g3tQSH;!OKLyNJuRC5*?pw6og|&P8iIX*4$M+UnygC>ew2Qkfx&6xG z?Yk2!x2=c`lIzgiF+Jo=>dU5|bGM&-aj4<@1=c%T<`Vnz85Y?DH_XIx*!wPJsF@5=N~Yx*rLd1F1c8OQydV7vWH+SR?s zKk^(nBc_yUwmQ{EJM54;l+N(8PY_};v9 zQ7pW{_?v5Rh#vQXyVBj&QL_wocwOl^n%=}5^r3c5u%>5`{l^C<7Eg<3zovgLLpm+& z!e-7l^W$Ev{Jrk@zs^lR!dBlrZyJ1*f6>fbIljo_#ez>m*YXG#H|iK#uV3X~G^xa} zgzv&L=@qMI6{~5KOsMFaYh9*sbsoPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFMM*?KRA>e5noo#LQ5?tL8wM+r zKQly0l9Y{JS&+<%SjeB9rO8s(RMz8zA}U1D3}*JkmxN$5;c;z30A6PexW}A zFTfO70k(pTK+7#E2iaENbz@;V$;-^Y14e$JoC3>QB|&=)+y+{%Q;D9)R`Hx|1lHT8 zL4CW^2?Oj-04+y-{BpG+`T>=J%)D3fCJF3MD}NchoL0pN0p+wYGMY6qj{V@JA)q{# zl_S`mU_-zhm2#rA-1Dvg_#FX8?zrr8>nEa|_eSo95<@Tu{v<@xl$n3beSyK{32Q`- z${^wRY~c7Qab8H7c_l*!FsL$?Bx2;Fa$c@D0| z=s0$d!AZ8%gs0D}+5B0pOA1NLAs{!`AnAn_2uj>Il>;y{(XCRSCe9pq&8t@r_a|IHjr;x4lAjx3lAd!h&5B7o)Aa#j(CaF^d2(v#7jL4;HUjR)e7h=do z(OmE(_Kr*h+8F1H!jQ-%-PcK-c$ZC3$_utweYQ^eHmQEuHbse!rE{1Q-!*_G%Hx&N zJFV(iOKrhi1JI{b?5)$5N4ihP(mABwE}e&O8&-Gl;~J*gM;!iF``~9Ceig*>0n-) zqr?E8Roufidutyg3&6M{dxO3k_`FM7xznA(nQ+%BjXXo?PuuFc^{y?35NxJ+0yNPy z^*Ye^cB;W5d8`GC6vGVq7QRZ1tF|zeLF@t(peT`8JHxVV;{~C7+&T|FfKG{Up95YW zwIo&N7D|r?a`BOW=8*U0%>HSK|t9yaZe;8n!e*vU{xg^Lh zn8D-m@2i^xfn0r07srr_TgeNw6J|FYc~}R;{|!7WfBrxCKz+t$`9nY3&pB#Hzxn6L eVx#2sf|H@&&{DQ=ed|)7Rt8U3KbLh*2~7aYAT#^` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_addcontact.png b/app/src/main/res/drawable-xhdpi/msg_addcontact.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c34d229eb2238384ea5d7582059f9a86bd7844 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sW&u7SuI>ds|49dJL1&_YCJ2@U z`2{m@2*_Eug`||V&tJLq^!?Aj@67uy&cMJJ>*?YcQgJJ30YeWHgZkA)j}15u_l2Lf ze)7Nm+nKdq-HUo(uJM#kNZ;0K;GX58EBnlP-};(`Kl6X6Z)|upPoAyAR@Ob|hhd-W z{n8DKes&9S25lEq>FIsM*S$rPqw)1#9ge(heRA9QpM0CItbFkBR@E1!@1Mr7e0vzc z$-pe`c%-?#-aD`g(6bN73>tWs|P{J25FHwU;Z{&-dqt1r?X_ zrnCDjd=O%vuxj^L!-#U9Wl8tBbC&-3y!#-N8zY0pZ^`0a!pA28V}Zfb)z4*}Q$iB} Dds|49dJL1&_YCJ2@U z`2{m@h^bk4grwv(PF}qJ==GOB7in7DVqjp*@N{tuskn7@YHQJJ0|5qBwU2NA*XJC3 z{LwR4*tU%~_T1(qgL;|mdE(us#W8LZEkdUqb0~eLx%z;|*Js`}9zS^*C+%OY?NEJw zdGeQ>3zMAZU*|h{k=waWp>VRvZswqS*?j+k*C*92=GbuebP0l+XkKu~+=J literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_arrow_back.png b/app/src/main/res/drawable-xhdpi/msg_arrow_back.png new file mode 100644 index 0000000000000000000000000000000000000000..1441aed72e92344be433e3380bdbc7aa4276d56c GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sS^+*GuI>ds|A_i_YwZujpB@%=tu!*}~0;F?_N5UtL{zcC`P(!n$$ zQRZZd!MT(}dm|V5s7#u1AjPRZ^s9>`zm2fiBe#|*F9hG8nXlcU%q_J1Pv$?M?F^o- KelF{r5}E)h2z9ss literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_arrowright.png b/app/src/main/res/drawable-xhdpi/msg_arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc08bb9e196db93fd9eb46cbc6fae9be4cc3040 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DY)==*kcwMxuNm?-7%;e8F=frRKTZH{o zN|SHcReA03{9XMCPAxjztn!R0L_1GJXG M)78&qol`;+0B6xS7XSbN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_autodelete.png b/app/src/main/res/drawable-xhdpi/msg_autodelete.png new file mode 100644 index 0000000000000000000000000000000000000000..891ffc3246e951d13448c3753cc675217c3b488a GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sW&u7SuI>ds|49dJL1&_YCJ2@U z`2{m@NEx|AWR$e_F5GvQx2XC8aC_N{yke{Q~%yOEb$ll=ex&dZy2FMfW`<@W`a z3u2p9Ll}O|OZuVomLZ4Dp07c9SMgegue0_uTv^d)`D$yTWWv=_Zb6BYcf8+zTziQz za&pnjxDY;t`}g;sZpyv)C7ff$g}b>sb`_XMHnA-2;+(bn*;Y;4x9eBlH86X?AHmCi zXzEPnS69zUn<#fZE}783T(E3u8gr(rgwONtIHy+(GDWv9FK6pE5?oMu)1Z~#W79&W z_YY64Z(Dcmnqyn6S;*6Gi~&>5r0sg5Eux>juIEozQegCj*&?qd9Jf7iJJB@YLB*pb zyE^6yy#MKVqO7(rchRAOPhBO)&!70QgUwl5Qzc~Twr9EWUngh>yzNV^Qh9tiH&kjJ zLvrCNJO1mk)()rhzwohmzo==rW4ZOh*_%!ex%bM={=KcK$UJh5&l>sp%|i3%zr307 lSB%Tds|49dJL1&_YCJ2@U z`2{m@i76S`d1MteFWkBR?8~n|`{(VKW?*16@^oY&Cv|x3beev1r(~|>(6u4IQ zOwYf1VCCtnu`k*~wq?u>iMwOj8?dzOi0<2#JN4TCj_Lki_XWk^MFyx+`p!s5*(hm{`s-^#JpU$BZQ>pIubtk*eg8 zy1eT1j4+)!=aL_8FfEabW}fZ;eB;jzdrReRNwb}JRM=40v*M__WMD3*M9qx=(}>Ah z`@fXl%&$#c+H1A$)a%?GU0z+>$%l^GJ{9G9sMY<+OK|fo*>%7G^^`9vxf}Wg$YStx L^>bP0l+XkK1)A<{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_camera.png b/app/src/main/res/drawable-xhdpi/msg_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..36881c971b1cd132fabdccb98a76015c43207544 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s#sNMduI>ds|49VrFLosYwF{I4 z`2{nu3CQVK1!YwAFW!Cqbw_-!eXB}JB) z6;xLomMJPsxTW`O#ta>Eqh~#3{}|8wTj{n_IQ##X(40?e51!Flx0WGv-YBF4GYJb^b_~LH9LzP_1`XujXlL&*g zH`KPwww^Ux+Jm+4b@bXt?7um$tlyj`YEiDfA%BkP^Qv2R&sfTu2@5=Oq7yd{J;aoscN9 hclXIBU0VN-TZgi%ovm8V+5il222WQ%mvv4FO#nTR?8^WE literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_close.png b/app/src/main/res/drawable-xhdpi/msg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..64ce0d18d3d8e934f8adedf43e6eab0b2c45dc7b GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sasfUeuI>ds|8awpj0OvVDmhDn z{DK(-Y~0G)x1au8yeg;-C|K+1;uunK>+NM$E@npomy5FRcl~c|=C!{iBBo#SLw{4z zp5y<1uRpG1t}e-u8QY<_QZ*rq`(*VL-DG#`6U+D25l#ObDr^tE)4ljoP?Dp{<=?Tla)M7iu6Y%Gy7l+_ea>U%Y&s8< S11x|JVeoYIb6Mw<&;$SixNYPB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_contact.png b/app/src/main/res/drawable-xhdpi/msg_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..81e3a39cad60671b0e73a168d837f2387226ad21 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!R04cLT-^(N{u2TsRk7(n_1q;v ze!&bJGCD3{Q#T*I`Td{xyoEsF9#0p?kcwMxFFP}_I`XhwFkAJm{$761L>=|~yBv2_ zC6bd~I_O_K`QuRkBiHZJ^|PL|9%@uNF<&`Qs6nsg+{Ab1nA{iCIm~U^)$z(Ki`~=q z)UDJ@>o!l|+2kN@$sfZfC#4 kvc27U-G>IlV;*-ITVIJyJl^6i1audJr>mdKI;Vst0LQI-;s5{u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_customize.png b/app/src/main/res/drawable-xhdpi/msg_customize.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1f731dcaf868fcb33e093e1252e0ba58970a10 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s#sNMduI>ds|49VrFLosYwF{I4 z`2{n)KbrJ53# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_delete.png b/app/src/main/res/drawable-xhdpi/msg_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..b614b6fc596c21a71af2feb84afc64a57163a470 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s#sNMduI>ds|49VrFLosYwF{I4 z`2{oZN$9x*gr!vUFWh+i{@1@6pMSP9FfcNBx;TbZ+`4;-wTRh}r!`TxS@-q+|EZ^+ zMDE|kytJk{SLovAzg?=94nHh!h0od3q0#*{wyGGWrYsgmQ8%d zUsmulDk*EuQX0t!%Ya<(u!$s$Q!ol`2b literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_edit.png b/app/src/main/res/drawable-xhdpi/msg_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..34e09c504c52a9761bebb51eb38bec2a0d07f929 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sS^+*GuI>ds|A_#PIzt0vbzUvCw9KyTCA`|q{ZO#ZUAz02M{=Y6P7{nUo=i668c$(c>sxBtU@_iNXe z9QUa5xnz8Ag~Bt@7F)iestei)o)sdjg6kLDwLZV`JJ*&D_G6FTk37zJ9QS_j&b|Lw b_Wxx{F&12E^xA|C=y(QCS3j3^P6ds|49dJL1&_YCJ2@U z`2{nua7k#GxkOb>U3&cD?WZ4q9^aL5fq{WB+SA1`q~cc60zQU-uvku!CWD@}IXnKR z&Ofq!iN%S2=3C36wUVc#^dIQ$UCN{yb@-;~l+#}u-dqtCj@In5eY)*k$fVdFA*Y!~ zm)$*e%1t2e`ttwvS=_3AJTF-0czlwtV){E@O7bk*1&dcIE|=f?@0q;srp2bB-gB8} zEc^IBX8zJIIx@TW>-n^WDl5BxmM?zlz1jQ4+pfRYm?h*Af{fOD-?U=?_r43q6iSzz z3fDfrp-h+I-pu#UI@y)IJ{+oX5w33dqA2vyh~cTo$4!-+CumgpKiZSCvGMnVYl)}V zystYL{_|W@()Yk$F)a%!loT9N;}Rwb70%)aST1;NBLlCtr;MmVr}T6;ssEd|{8+)D zyYJ;EInw}^`}GgTe~DWM4f Dvz`7{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_leave.png b/app/src/main/res/drawable-xhdpi/msg_leave.png new file mode 100644 index 0000000000000000000000000000000000000000..60d6baa3ad8ac156ab9b1253210fdfbcc0ddbe82 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sS^+*GuI>ds|A_?JFhQTC->IWV*T=^JN~wxcmDjl-{GFwzu&3_kHTXnzF*3_yhY!o zh{Gyj`&+96eudHZ{})yYm9F*-JANxadh^oi|JRjwuN2=^Dj$3Z=r0COS3j3^P6ds|H%TiHq(58h6t4e z`2{nuHGcGpJ3jmSMTH!P$3l9`w_2L~OJQJORPc0h45_&FHk37w!H`G0xcbBY{4IgZ_)_QE# z-lyT@ExmC0=X(=Pdya(Zd7bBd^tp6?gk_M#IR@ROt$xqFlT*SEtjJY$UVg=rzv%9Z zy<&G&q(1$!iV0|9RWk~)o|DS4Wr4`l&5qkx0u`g1&V^l_FM2hx^^J$w!+?jYE}i0u znqYZYjVG#y;pGdaB+rt|=BH2bO`E!{@VNV7$;W;DY=1up_I-cLn#3;NQQ*3=pW*Aw sg?1@NmQVU3A?;fKZl(OG?)n4lQ$8!2c;3i+4Gc*JPgg&ebxsLQ07x6#SpWb4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_mute.png b/app/src/main/res/drawable-xhdpi/msg_mute.png new file mode 100644 index 0000000000000000000000000000000000000000..92c588df840ea4e7a24c28b5cdc941309ce443d1 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sW&u7SuI>ds|49dJL1&_YCJ2@U z`2{mPWRcrkHv6hW$a@2UjPLt9XHDR|!@$5e(bL5-q~g}yE8(;5DDW^OT-?q3eSeO_ zwdczko||4Y+kSt+Cg%U%8rdqlXY8HDbaz%A=hp4lTIM%T|FAK!<>a&@-YQl5IB#y8 zp6z)4dd#nU{-v8&O=I%cYIw7*K~_80?HsGzt->q(JSy$8i?g(JZ2cJyWcwUH-=bK- zWD(Yxsg$BAG>>74Z1#%dkGsOf8C_++uQS|Gc;%^(OvApffr;~FUb8p0%s$WbyF=QB zEBt{fN6WQ0JA}@uURsfSYELuAhBLcu{L1&lMRo7l#gcJYbi+OAdj>n|^*9=e{+_IP zbELSSOW0u%kMdmM2Tqrz6YblMKD=gO;c6CAQN3jK#li!>KCT#DG8T}m__1<@)xrBpJc44yM_sL3%cK5jnE4xrKVT2^IN;`8%T-)6X<0Fo zoolY`w+`njPHy?8d6uow46pW{E8r4mUZW%#ZTm;~BfH{#6?K;#MZbVC$KdJe=d#Wz Gp$PzN#tmKo literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_notifications.png b/app/src/main/res/drawable-xhdpi/msg_notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..e19e99c6207b83ddbc2bf3030223d111c6581011 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sx&b~RuI>ds|A_`?Po-U3d6}R4AZ9KI`LFC9sLtoRc|Nr$@bF!@X zn!_e;*YKB7psG!V^HTk$r9$y%%@<_EK63=J;*m33Y5q}KJj>8uJFS`4!{T5a{c{kGxq6y|R)RZo84{=<~d^t5`x z3pM7@Hm)bds|H%dYCpUZrnj>5i z?ahUczibxd91VX{ zyXU#ko?=DOUkyu+Sj+vM^5*?Mlky{3aYxErH0~7-0xkx>FHVaZ^d^-0nR9eWwjc8d>3U7^*%VTL%#9W%*4sIE{Tdk{2R_mmKQH( za9A-f@Xh=gX{kDfSBp0#C2+i2z;jB{r|N0-zT=Y*C9STPT(d*cbHhrFM@JjC^4~uq zyXnWIOA-QNi52>besXwa%#i(-!0=|yC9yjr(&aJk$5cCx)F8yPNst zrdxUWkBholN31qKmUWMI!$@jIOmNEcxO8gSm2|^10Pd-aY`vHiM_D KpUXO@geCwb;5Tsq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_photos.png b/app/src/main/res/drawable-xhdpi/msg_photos.png new file mode 100644 index 0000000000000000000000000000000000000000..846090d4c9dbccde1fdab848dc5b4944a96edf2f GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sx&b~RuI>ds|A_`?Y4r!z1xGJCo>hE&{oGnIAPVFMnQvm%-A>Tk2!+OI!! z(&%rIwSC&vKUy(omgWT&m8{-zwujl`_R**6a||r!ZlAO~%sf-2E!3&5kA1UuMcAfS z0?a9A8K*JSy$oRyIHSnuaK%=snCYdR=z_VNyc&<4Szpamm|6cYyTv8s4)4MToS&w* zGBqCFY4GXFu8q1aL6>#T$HfV3Z*5VZW$HAoroMTL;*CZAzfXLB{bZ^_Df1QHlkBAm zhPo|oLV~?>PIVt-&}VsPtjD%`k3fZY#-+;J$DU~0tZgYgk}F%8tHbJ*HX-Wc`_0k$ z(`QDv_B7V)4!Ngyto-!ful6E!GE1Bkx1L(GCP*dbEuT6ALwTwEt(QN3M*{_tzZazapE58oa(cQrhE&{2l3-C%e%Ht z{3N`pe!sZce?zlrlbUVCE*&too%3+ngUK_`{|uWYb-m_$|89#TJD%KqeUG2v=Y;=~ z#GmD9xWIcA40#W&H+<^hTGp^qJ737)Z9U`XgRKwd zU%dH@Ens`9RI;4wBKFO4?Gu2YRW&pm(p)X+x5?}h=qJxmN|y+uxV?3Q5x Ph8KgUtDnm{r-UW|+eyaM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_retry.png b/app/src/main/res/drawable-xhdpi/msg_retry.png new file mode 100644 index 0000000000000000000000000000000000000000..01dfd414aefc5839409dcf7a8f1aaffad3908160 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sW&u7SuI>ds|49dJL1&_YCJ2@U z`2{m@2+0`Og`|{CT)J`p<-2dcZXL^4Vn-g%&GA_JZi3g-&-pk8n2tJhpv5!JLK~|cNCBf9~Ho!Dj!bki%4I-hVg7?$ye9cY5|reC@I8|L?0GFYdg2^v9p|tJO9v zR%3kpuXO{g^DMnm>XJkh#__m>V@rC}%z}Gd?zKPBA6J_SvB@^BX-Lq;cKOFX5 z5kGp_I9yEPM9Xc>ix&c%ICLiUa2v9vdmOrdK>x)OxfFNXGoOJ`z~JfX=d#Wzp$PzN Cefj(V literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_secret.png b/app/src/main/res/drawable-xhdpi/msg_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..2e00602e93e269aee14b31e4139d7dd0e7c44912 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sx&b~RuI>ds|A_`?x;TbZ+-S9MJD&7D_T2`tA1|A>zRvpA zD8R5$UxY#9wiA29KHVA2JKmmO!0^j+O?q~E-`Dc#Y%d;t={>3%c}J9Wl^lOY>mA1p p3i5i<5{Z*8O4t}UJ$?Oyxm-}{{k%5+8ldMHJYD@<);T3K0RS!-xQGA% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_send.png b/app/src/main/res/drawable-xhdpi/msg_send.png new file mode 100644 index 0000000000000000000000000000000000000000..7956eff625fda4d2a0fef757f219cd512558d132 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s#sNMduI>ds|49VrFLosYwF{I4 z`2{m@i76Sl#Z~pM+!}7*& zkJ6j;f2*8NvZ=V#OUVWmb@dg#sPIgexU^{F&-iJj|e}^n%=T=GV2GI_mj45JIdT@ zH{stT3&XoDOB^>91(m&a3z>0yQsaSEi&&wC3=XO8-w5s!{m;tvK?}>-4;_oN1 ziAZJqIP%%kLPX-(743jD?@O#2-6k9JES9kzsgdbqQ~Dh3FS5=>uy|FUq`cATUuJGH zae{9rZQSpY{HQ+>e0sJjBOs`O;3;i|H(FQuEZ^gb4_!A;mP3X>gTe~DWM4fKPB15 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_sendfile.png b/app/src/main/res/drawable-xhdpi/msg_sendfile.png new file mode 100644 index 0000000000000000000000000000000000000000..d96bbdbc75aa5df146550a82faa2bc15ea2bfacb GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s>H$6>uI>ds|A_#+i)MBKweXY# z`2{m@DVR7#RCTXDeD|}y(8h&8@m-!Sjv*Dd-kx)BVo~I92t32||KIhwbEdvqb#=)< z>%+oN*H4X>mw%;udTG}tlSwV6>61k{S20-Ko7KQ1*O8L&^|6D)toB8X=|8!av?U#y zAnMWC;&i()Kw^sM5hb>X90$8M7&~ZPIL9Dqu)dM&MUAK9`obP0l+XkKB21Yr literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_theme.png b/app/src/main/res/drawable-xhdpi/msg_theme.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad4f9f83e287efaa347103b0fd0742268e23d90 GIT binary patch literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sHUT~%uI>ds|H%dYCpUZrnj>5i zi$xpPmx;c%O9-a zo_Ndu^MUKHUw-3~jPZT={%U?XlS!eAkarKy z6YS<1)z4)Rf9{u_crs_{VU5zFRUyI#YxYN;NnX7n^}+s*MT_khsU=HY&1c`I>vvr} zNBGExcJIv#Py369R5N}2`M=#rcdE%NC&f4FMWqfB-4ir^ifGqtk(EAVw|{PLsNmfm zzNP7UOursY?2gSo?q1yKc|u5z$-wSWrP-RTE1OkxJiZ?ado9_`7Qh@g%vcViG5R-Y@E9y ztLp9L@+a>yF5G6jd`{tiz1k7)mJdt6+FcIXFj4qKKpDepmdKI;Vst0JXm$pa1{> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_unpin.png b/app/src/main/res/drawable-xhdpi/msg_unpin.png new file mode 100644 index 0000000000000000000000000000000000000000..8512c1aa8b6bb5ae3951515b9c82d89bdb8de657 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sx&b~RuI>ds|A_`?eg5&+zZHA`9bjN!l<;(M45_&F_DZMM0Rw@ShjY$uwSND9$EJji zmlGD8SbO-Q*#Gk$+`IPgHgGGknV-G-rga=^%TeVGy=N4db)@W;x4K3qy{?un+u41! zKV|vpuRUw|&xt)PWBVFx6CRkpzvWo>hvE`>2NKmvv+8m7wpC6$-;Q+<(WfDJPeuaiM7%~*FGpijhKsT*i=KzwhT?xIt2A=lff%z|dpxboFyt=akR{0E_<8V*mgE literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/msg_views.png b/app/src/main/res/drawable-xhdpi/msg_views.png new file mode 100644 index 0000000000000000000000000000000000000000..eb357328ffd3fc7e3c9487b7de504d80c6451f64 GIT binary patch literal 285 zcmV+&0pk9NP)~&p1?C?f~y1ugjz*OA9Qd8%-JU$ ze&Q0qjkpjCu@N`HHpUm$9a+yayAvzUq4K=brT`}51K)w?Pp+xxZo_+QBg)LW@hy)2 zrE6`Ny~;mKCQH5Q&_q!t7vhz_YP`TklBT0lGomgRAG@@Pox7-F`cBl7G_77VL$?~5 zRTX8SvW7(o1g|;(GxjlisSP9+HQ49}JAjJ0!$u1+4T(2qBmLmW^ix5<&m~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/fingerprint.png b/app/src/main/res/drawable-xxhdpi/fingerprint.png new file mode 100644 index 0000000000000000000000000000000000000000..039e11591c068419a080d713e61ed8309c9cb916 GIT binary patch literal 1394 zcmV-&1&#WNP){h#*U`*lRn zby~;yXLMFqB7+4e?&;rv0|yQqIB?*=0UL5{je6&WJ5j4Sy1h9~$gM9=z^z2HTcok_ z@&;U^-67W4-moI@$#L7H65MOaDaH_DOgUF#`CYQ}Xfy6iCHcpod@O{p%N(tl!YgZj zb4!=NU1uab-B^=meaoFE5SI&WIDLfBE+J1K_Pi`De7rFyUzdgbX#!ky51*u5YWss) zGWwRhU^-kv^{im35WpVrnUnOLOJye{CAzb%lnnGi00AslxbC*5!5jr?5<=1R?R zMx$PuyYEeF=StB(S47#6ZqqJ#Q#uWhFodqiL%+z|j`G?IZxc80(5^<$PF}c)+0y-J zjc+=p9${&a8N3_>t!`cA52|vzQ&h;<5T0u-r@PY6f>r04D`I3 z=kV10uDv6IdB}=H#p~M5yS|LT6&6Mh%;|GZTokZjA9N9WEqZdd%NE?^Q;=A!x$;)~ z;SlRyYP)|$%wl^YHV-f^#FS!iR(tS8ZBhMs^PRLH$cX%*d6BX_Qe`Y-Htk!BZ9=qi zx0{tJdS`ijKQr6g8vW>0>}OsB1@U{gg)26}kS@k7Xgg77P-k5cW&2n}%e4&_==zz3 zy8xQlqn%jZch0Zm{EbmL{+)VAFrz z*kNK4iMAbs@0BUU91NTE6=cHN!(_MKnFpUl`1yFq6%sK~wS|+r&S0+5+=#7g@By#C zh7|$ZF0!t>2u7uoJ4*=v3m`}*d_Yt#5+EnbsEF5oIMeMKB8&A$Nvfw&!&(gwS5(K9 zNi08HyGV4#`qUOFW-oTOVci2=%d4B9oSW0`U5c5oST>`@WFWJI4Nw+NiCO5vf4|9C zaTm9<$itdJD836ZB)FJ3IG7q<66DS9i6afjbwNSpK~Wdnt>SL=nG6fABDsc5#Dte3 zf4P$v$w5XsZcqnDVn##>GV`l=nwEopS!NPDs5WZxF=}BRF+GbofXzeorlEsO*ki0= z6|fO(R&{cBLeETt#8s{x;sRU1%23?frUaylH6VE1%Q3tF+ehbO!i8ucSc58A%a~E{ zBV&yV;(=;qo$7g=UgS42!dS?v_H=@OC60Hw)!{JKb zp?9{3kn?>`ZAdxAEv(XMX>adXdn~OYvyl^a%_8kdgdEYI@XahZ!9Xfx*dNz%lsFHB z@|7VcJio2X3^`3e;Pnv2bn(zeu$tn0f=awRKDrRMCcrp-0$rr3FXBW7V20i{17Ujk z_>|S(5E^x2-sKZ=k_WXI3qYPntRG(T{ofTP7Fx*}OWFw3Y*NfUDoJ=BVvOFN=0YEw zrKiJSW~4w?f(?vg%)L>SvG9a{JNJb#w5X@W#H*Ti=C-6y&V0iWjMA-;l2M!!KaNr+~--j}Qp1u|uzW@LL07*qoM6N<$g7=-g A^Z)<= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_ab_done.png b/app/src/main/res/drawable-xxhdpi/ic_ab_done.png new file mode 100644 index 0000000000000000000000000000000000000000..115e4ab8ea910af5187126f3f56e80fc23f5af5e GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~T!2rAt9yaZf85|CqrpO;O3soX zzhDM75sjRwo6kR9=^$4C6zuVIaSW-r_4Z64*I@&m=7&cLAOHF%K2Os}^}JC}on!x^EZ}=-c53Ci^;`JbCwe@e%E2!5QXyUT$(rUlr4u&u i8GSdM67=f-F9wBlzH0gKSrR~ZF?hQAxvX~)y|$5;S&^shBF~`- zYhGmvT%B*$6|vLouRG&@_y0G&W8Yp{SUUT&FOU#joD|a26=La?Wrwu zc&|@%qJ{OE)UM5&FX^aDFYB77!N;(Ea$j;>oCTl2)CX@aeGxFyIrT|dV}nk;O6i0p zOLRQNyr)G>;__bQRP}gXM3C?#kxo_9nYxvA>!;k>b&EIU(~fT`qMl2$9_%rSF50=S zcm3a;?xn}Cy|3Eyv&#I4`@U&jdgrs& wU5S0$BBJ8q^+uuZiPNMx<#E3qd)*d?tKBxbvTy!*P^dC^y85}Sb4q9e0J6ud7XSbN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_down.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_drop_down.png new file mode 100644 index 0000000000000000000000000000000000000000..d5fca2245f31354ef24284637fdc0331f57c5f3c GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAifXMj(Lt9yaZe=vAf;A#LAWGV^r z3ub71qf^%hk z@(X5Q5z%o-E19@(_3pDTzy2+^@nK+K67Y0!45_&Fc1CyCV*?&n)t@s@eEVPjE=^rL z!)3S1wuHnNjf{&Ln~QQa1AcvaI{lzw{w=YY{jz5jzVne6aAmOb6F46KscCZZ)oWY!%qw@bIX_2QxZ_vatEbBap3m74 zQ#Rp3*4&!%&B2dUubMqHsg3jB)5|=waM6N5mWyIc)>8A!ganf(NbP?%NpAi`%^AY_ z6V6#`b4`DyaJIWPieD~l?u#pSI+lgqi){aP+PppVy5{@5qW{|`cY554++`d1>E_8J z>@IueU)KMg9&i8c??!znAE@zTInlk$KWxfz-R6C*8EHs-g;_ zGzB7yopw!3JlWa5oESLXfRE}X| zIBeznV)-Hm?bHPh+%6IA*Me5@1!OX&MXXneQdtqY&11E}^KYx(w4P-4`^_+`wI)HS i@1+9Q-=KXpKbeKh-GcrFT)hlTH4L7velF{r5}E+!IZAv0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/input_keyboard.png b/app/src/main/res/drawable-xxhdpi/input_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..8323676cb53c832fbb844dd5ede748011ac448a9 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^At21b3?#L;KKKlzqyv0HT-^(N{^I~*e`WcA$~a1b z{DK)|+%l#fzWwtCgB&YR?5d}WV@SoVw>KEsj~MW(1rBt=9*c+Q3?X{l!_uWOUIV}4hCTv#q zIlS=r?ClqW+Lo`|apC5qw1`#fv%D{_Q2VL(%zNsK`BmPpFZ%uU-OgKg?%=I5jeGpD z_sYcO*R>srtx0(Cn?3YOP)^-9&Drx8^2l~I^sNnW_1Nwtc$i;%tNOi_SL0Q?_4cY> z|2)a@QRBqpVSfw4%-pW=>|tHJQ+UbA-Se$K$)|O6{JY0~ctwKo2r_y85}S Ib4q9e0DyO%UH||9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/input_smile.png b/app/src/main/res/drawable-xxhdpi/input_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..5881a5e6903e67bfc74b8008d328520eb1433533 GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^At21b3?#L;KKKlzbOU@sT-^(N{u2$(#@%HCYUC>k z@(X6*5K=O63oGcJzyIvr&(q$_m1baIO7wJb45_&FCgOI{YXc6K6T76o{GVT)CbRTq zVK`ryd+jMZq4R9I9E@KMve)y92d!MR)^uuAP{EhzoSoZ@v+iZc&H2{0QGMQ$Gq;Xi zuyK6tH>Km-x?PU@=9(^laC2g^e9*sT9WBv$)51d*S^t-a->6-d{&%{0>&81zUyIzE z<>qg?dG~}rE8nC|4sM*DoNpRo@q7Ekdy3!c`LAt0op#YPhpS@m6?ylN_4~_yHw(LD z{QLdsN83rRx((B|I|})iRa6S=s7I7Lr=)5eP+q8f*SRJ}{OTy#Q(oIh+&8#L&bh&HMYq)Z8WP*R`zBviLg$v#sxOluWi~U@1 z&Ehu)%(?E?hO6+;zE^8}r#4{eCca&w>(*u_u8~`{{P~Sge#`S~<<>1<@JakmK=F2I zE&GbadrTgzUf&)nu|M#GDeK++%cf5a-p+bCyX)THa~HO_yg%_XVqP1|y;|?~OOb*i zwt^?`c(XFj5lYZcefR5t&f1x8W92LF%>T9Ke_)k!eb$R5u_r>eth^#KXYb^=8=v)O z_=%kf<9^qVmfkcP+Pn{rvCO*(0-Lxo&*xk=vJZ|J#GTB6ACi^;^B;Y|S!! zYH}`UX*6n=)xO?7>Gk*J64C!o?tb1|$8A@3$$cV__!D`#{zLv@VB(z PGGy>{^>bP0l+XkKysvcU literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/menu_unlock.png b/app/src/main/res/drawable-xxhdpi/menu_unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..608f1ba64837a0e6e0e65bd9d35410185cfd85ce GIT binary patch literal 1242 zcmV<01SR{4P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS-zVw=JymE9JxlXRj@V!%oW{s9%6)K=+4A{Gi3Mu>$`{EA=%UC)6h z440do@8x~Wg~RTA-FxoYnR##Do2jW{MS&OvdNG4jj2(?em*HmsoB>V)CxOqv2Vf6) z*6a0N;IlghQ5JxEz%Jlo?8p8KtyT#M&I0SeArN95$MLhR6ADQ!0{cJ;qo2jrh=gR8 zf!`KoexUsguw8w!JkIEEx$z<~i7{EeL)$Ijl9njzt9JG~%9<+@GUBq*X3lri4}lY! zFtU#Qs{R}&jsBar+(4QevbN{EMg0XSf=ij>0FIZ&IL+F)L6}z?X-qCE5sn8mk=9*A zu0O6y6w7-ckOq~wWDi4kmi4@dC`9p|ECT`T~x91w<(;=SMf!4crm#^pfXVC zJXPvaRB3*-_`$Jq2*iKorXAqd-Z3jueXsl;2!ArZX!a}S5QvW~OygsVoF@It_))QQ z2y{v?`Y6h&i_*W09~Cc$K*t56KcbwvDE-U$QSovJ6h$atFrPY_Cd+1<_xCmkbQ@X! zUuOJdIhiG$j>%YgIKq|e74Ch`VaR#lHOfCdhFiNfULa;ziSpcx` zELs(Tia-_xEX_$bXT(qS!s#bq51aP4Q~{!2JtO%!khuX|1umu{ z7U}0D#yL#+KsUtz-`Ob=KA1|7c~zbfwaC}_Y^9F{FNF1MinQ z_u|lJ22o+2kT8u01Rj_bHTzC(@(_c}AsuDRpw1m$(02H-ib5op<1gFl;PyMia3o4^{BV^-a}$}Qs>8J}Vm;dkBqZ;^&OJDdUV6=3p(O+CdoSQaPIbd5d6GKVBUk6U{>*Ko(O69VU*x{!3EF&m z(Q!2WL&jq78?Dk69dU|#9QO)ExVUott(dSk@ndZ6Q#t#`8%rPk{A}IS_t*K=k*}Q= zO?v~n{d!L=Sr{L!s`lWZpwj+Ifo{`}xw{CBqoadn(-15+R-L92JIb5;5Pb4@V z@@XE?$*Q_>MsV)d4ugh`FMSTJv-Le@D5hFnwms{qfsXUGMX$ci3*!t6yeq|=@>L*5 zVRh%V?MjI^j%>2p6Zt(aMIyXCZz~QXzcVl}Zt-++45_&Fc6$4!I|@9mtpeLt{{O#S^U2-Z z4QVM$)zfcXGZym@pZ%{`kZym&f&&Mo28bSc4%18&T7u9fob7Fl-m__sr=Pi{}&v|Ll~ z%IDZK@_VhdSGdh(?uz!!^N(g+>O3XDF7a)V zfMU3e?c)hj_Ak5MWT)IWt(I4fS+sR?ZQjk>X}ks#D}Oaw_BYrnHrj4({44TshH~_I z(-N0Ia_YH%Gt>V!x&GM@x@7;ws3mSD-3I(g;ydqEna*(C@$q~iw|a$01OKo2AKExq zZ*eORx(c9U*VO?`I}R^uJU)N_=9M*gxnMLK40Re nTznh0WSiC(+l2F9tUpV7YkLL=J@|YL7_$tXu6{1-oD!M+MxXE@np#m%y#+S$F>*icGQhnY>7O;Xg*X zN6X&)5At#iknmUVrh`=6++>j{wWCLecsp*ZJd^-zxAZjxvlOV znUb2VOKeqDm%jIQ_HFVdQ&MBb@010?Qc>n+a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_autodelete.png b/app/src/main/res/drawable-xxhdpi/msg_autodelete.png new file mode 100644 index 0000000000000000000000000000000000000000..97bdce6b580a73a5630bc9d31e2f5ea5640b6875 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~aez;Vt9yaZe-gp@i(QF8?E)o1 ze!&bZ0!k)s0Z9e@OV=O1{QT#XaQ+Ym1}0ul7srr_TW@D@o)b3YX`R10U9J0leU!r1 zRevU|3|=PW@gZ~VwCPpb+3R`#E51(ly7+)k?a8gm3w80Ghb&!MI^=(R=Ey&_6V**qb@EbW&CXq&@t?awz=I$z~?r zV3%bUIvbs}91n)cU1{*X6KO2c^CIPt?va_ciR`nP5<8!Ge!g+A^qH{tBj@8u-H$K5 zT*trL=AOW-)i=cE-MdiO{~=Ct+D6}bw+^vv{m76gz3Q~z)V8_g^nkHKN1?LGca-WvctljhaYeT1xAe|55y*pS4rp{FDr*FHRbErCckWZV0{-({CwBj}}wXYkd^ zsOXkfmD-wa>nG2cefjvruBq4a`8*64 z*JPzE_tzEtvU6+N-p*y;jh0<{d-eRuid{Q!jDsfXJwHvVwjQ`)6;#`)c`LY}kl?iRqOW8Z$7{Oz@Ic#h^sU;OXk;vd$@?2>|K7RHy&| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_block.png b/app/src/main/res/drawable-xxhdpi/msg_block.png new file mode 100644 index 0000000000000000000000000000000000000000..69af526e232531331f4851f49cff0bfe815968e4 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~Zh%jSt9yaZf1<(JxVub1jeI3R ze!&bJVoGK~1yyr59)J4wyTC1~)nRb!yi2{e~(X3G2fB&E71(i>h zEY>QU-#*>b>KTW)!=2{8Z_7m| zwLf*&=$Cd*VV}V-zVjO#&J^Zd5#C|)FL3|K!Z`VNqNzV;eAYMBin%;Jr+7|G%>7oI z)N{+lT9v!?E%cId821^a@3IaEoi2NBiQA$l^VeIvQ;F2}NGWLZD7C7Vx8>pc>NMN# zp6kQ-!a4iB^M6&OJH!>vxifQ{gIT+yj8u_=iP-ID8*a?0n|=7@^QII&ah2^IXCI0^ zT$ajbqT44pn>m?;N;T|2IDN`EN2i zZ#=AsQChaO&0>$|(y#XqBsQ*EBfIVI$-B3fG)c`loBHLvMy_1&y@cg^xE(8(xAEQ8 wIb~fprQB8Xy-e`E*yS}0jH?|NCx|dGJil+%#8rF07Z}3~p00i_>zopr0IudAIsgCw literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_camera.png b/app/src/main/res/drawable-xxhdpi/msg_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3f1ae49c6a1d7868295651fdd9dc3124ff9d99 GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~R)9~4t9yaZf8szl+oUr!)qJjg?56RbvRlt~rn%i(cUs`gQmOeo?M;7o64iuV$@`_@c#{%QZ`5v>lKCooArfR#KBto?d$_ zUa&Q}IPl50A2Yl>FY+YE{oSQu9?5>`6Mx60hI-prk)LUY4hAc6Xs59Fu_W3=ug!Jx zTHx|_+pHDKKh~Y=n&f%G(?rfhjGc^Mb|7}>^bK}*&x)5|(>B09d6YCc3c@00)93CZ~h%naP@{1*E!fQ<@>D*6m zWsd(9ThMs1C0e2U4ZohUp!r*)n~afq=hSDfcolAA`;NK9Xi_Erlk$5%IoyQZgw8!s Rt_H?BgQu&X%Q~loCIA literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_close.png b/app/src/main/res/drawable-xxhdpi/msg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..ea22067fc92bb324d001603a697637f3f02c4be4 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7gaUj*T-^(N{-c5pNt=40ENe-S zUoZooO5D?zD}GJ}3e5F%aSW-rl_VjSAkxE>=&ZuGcq4bP0l+XkKrHE>q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_contact.png b/app/src/main/res/drawable-xxhdpi/msg_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..b8aa0dfe503f29efdf4722200d55f7e714d511a0 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$21AIbU-3xsF;{alRW%+>0I7)*2 zf*GXLA}ZFOeEnyF*-fC>aZeY=kcwMxuU$<%W+1?v@cY1}f5P9F{wNlj`jt1qMk@Z? znKNf}Ryi)xK9=6`Z1p^6y`OSL9iskI{{2xe;_#h!SjOrschw0N{aLT%?LvQv|5{_t zq<<*jq3Hf}=D)%(?IY!vO>+5dyEMs1qkHaxnAg&M4o>%s{C#RK+ndH8n`T+3viZa- z)(Hn*ow{)Tt$ImtjYtJ6OZAgSzS^ayUvHmrR=RKcJ_h-g3+wf7Bo;QS&T3t!{gIU= poWcCyjV|d*=KK$@X9B@Z;jd9DPv)$&%L00d!PC{xWt~$(699-$kn;cl literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_customize.png b/app/src/main/res/drawable-xxhdpi/msg_customize.png new file mode 100644 index 0000000000000000000000000000000000000000..0f4f2ccea24e3a11a72b3036b73ca569afc3eaaa GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~R)9~4t9yaZf8szl+oUrv#Tn=^YP&iDy@Kn9R0v zEy{~Kwp-)wK97pTrUxhN;}Z(4emnk{*7o=K2dyaS4`R}`th zzhx6{ZQZAztAFL~ESr0Mym>1BPp8jPSW{5^@EK;f$Hb$=mec z+O~rn3@TzdC(a)+*F=j0T}U*^GVrO`*U7S75JJ$`b}Av4aqEuqTX((_K&#;M*4h!g6zGu~t; z&YakK>6h{EJy-S|ox11GmD7(W?25g-SHS+ngQ(xW3zwAjZd2cSpl@E*>;LNdvbWup zb=BP-roQ}l)rHfa{om=hJmK7mf^HMRi;JsOc%wgjobvET$*BU}!;LZRzNa|S4aA>0 fefaqC+&{*h5xPCBoApwG(Zk^B>gTe~DWM4fZFv55 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_delete.png b/app/src/main/res/drawable-xxhdpi/msg_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..76b1f17dae45a8412c097091eb65f016d2786ffe GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7)B}7%T-^(N{u2Rs7tQPfYT+pf z@(X5QlQIg(X`Q?C^7F4*FAL8wFfht`x;TbZ+Xydb5~DT^!LEK&*f&ne}sO_ z(^R@{{ly@;veaR_Yh|!%iPY)cwY!dddMGyMME8Tt%^F?0-gm@f&os7gR^Z|@XE?ie zwl=rYJI9k=nc+`=UEZ23?rXL9rFs6V`sMbzyS?n^%brwRkbaNA(+mpH!LoFt2 zm-zlUsS{ajKjl}o8F;N&D{q<`$n5;YSSi?+Gk;cc6Ng+g$7*FAXP4)0uN_;Wincz| z%PP6@VR7Iq*Oh%M5@p*fTzpSVF^Voep5gpNDAnKTwuX12v3I~CPl36MC;s%EdMWMc g71eTe%l}8XMWT(n9oL+h4GcgAPgg&ebxsLQ0Af4F)&PaSdb&7kyZ93b#EIpy9 zZR;0y^P|rV^#1zpj@8ZAu(|qX0+&(hjq+Ot>9^EV?{o@1S&=l!`qoOn=?d+S^DlIY zKWW*W=vT2)@_1iW<>a1Xby>~hCSIYrq4TU(P4|87UHhuwa{TOHmFoM#fA8!(U!1nD z`p%QS!b6?2?ap~vCQi2AykyP>&Z0#u)_Mp1rUbM{Y~MWhZ35rkr(dSeS+wG@>5Y#^ z!kEisgzgk_lxN&n^|;S@$76vv7DskCUsk+Q$Wba2l=$r4?h_|0AMVeOyR|S;?uEeP rbAMIdPU$@!(>t|ei_`yYci(ZhrYN~urfMt(1^|PntDnm{r-UW|tTedU literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_info.png b/app/src/main/res/drawable-xxhdpi/msg_info.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8c8bb2d0bab6bc9322c11c98e3b6dc1df78b18 GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~L4Z$)t9yaZe^P*p-5VyLUjC9G zzhDNA_M+v#pWf7nIP0=kMx@|I)+7c7#xI^Ojv*Dd?u1{Q)U3dx;~>ED_5c5Gw^qd- zf8A7AvGeq7waq%-948;IpV?`-bNN!4v$+#Ae>zUvPnQ# zUev(*s-BZ%b&7D;cK^?+GLbjAPd#UF%rPsNk>md0xme$1+bhTPXK%Z0q_l3I?*79T z&Pp*irW%RPVdA|dB_@?(#(V6>i7U3}0_+~#32P|6wI^U>QeO1r-zv6xkwV+D;%s$g zj;w$EEdDlMPV1|8DsxgdrJOfdw9o!Rs|@Gi8`gehKZb zP!rL*n9^IY$i(~Uk$VRhmK7QAvs7d#^hz)&`c{)&&^P}!&smYA$5W< zT<*!$wEpL2d+atzF_)L$aG7wu{h{dMDK2xL&1GO~V(nuV%_wu(plz}#rXXGCB=-ph z(F{Y+6WP_`CzQ7THw;kUSoo((LB`(GgH=FCDBOj=McYYlEtAIKZlgtPPLdB>dzn8T zY71J;?zED1O(?^}NBz$|SX-WV*iDe>u%BRI&N;R3!uI(&8Ezq6=U)iun+Ps&xi#zL z&X>EL9af|-zPj-1>kBgTe~DWM4f DF&Qtw literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_leave.png b/app/src/main/res/drawable-xxhdpi/msg_leave.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccd1aee7a95f62a556bc81b3e32cd0c083d7e57 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~Vt`MGt9yaZf4rcd<=k(eVy==P zzhDL)m9VVNoln32eKpOW2`Ku<)5S5Q;?~>i2lEaqavcBYD9Q2u|AEtcDt`L!kF+r9 z-M{%~NYttyUoY<5DfszBm0#Ozhv%YO{r5~rF72E6SL9@+zYqskV(ZR-KOJAKv6#;n zS#)BJ&vx&UYh_Jo|4)>4o~g5P{3^ZaS+1htWIm5YT3_~GSg~s3Ej?$!FLyllEoirO z^r+pj?$R=r1U2wmvS$2-)Uh~|;cmMxO_I1*@opxf|O0lyy xPdRg6$!rkErSMERf zb1jRFdBwNr^Y5i5Ue{D+DQPM5y(Sxr=agL5>pPruPNMHq za@s6wyL+}(t)>CR5jqma5qGw^DCry%uk=wnR+Q3ia>v!SN2GjZ3yCQs|m-FkNUxnuq9_0Gx+4h$`ej{oz{-aKQ6cp`J?1LnRq z{n@tmzbCA9{iNgMqn&(&{kDEqu!}BFeYpD?h1gWzopr0CbW2VgLXD literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_mute.png b/app/src/main/res/drawable-xxhdpi/msg_mute.png new file mode 100644 index 0000000000000000000000000000000000000000..9538eaf3b29671a8669e700b79a6e7400933d676 GIT binary patch literal 745 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~aez;Vt9yaZe-gp@i(QF8?E)o1 ze!&bZd@@=tL1`8J3%4J?{``A*mslhN15>D{i(^Q|t+&?$`yMOsuq8OlFbN#^ZvQrH z;aX1}|G95ZuQU07nJ3gf(O_ZYe~bMGcUb` zN~%@QH@C!2RVw`TDKKj35kB>U%8IPz(YM$pi0gdusJ>+T&^GgN=a0w5{1=Wz9Fz`9 zU|(=a*Qgo^#1tX5y@^F{vRTHzvU1)szWZhF{j@S!Y@Q z`yv#i(zauPQNOpxBp1DCd#oct-88g9F~hiQ{t=$Q$d z9zDCnBcxv@9)C^I_tdnv<{k&{O;~m0{N^-UrClPGP7|&=XHQUCKOy^1?7O1XPqZ(t zv%6t*XTqUZ%Q&BYe!sHiwD!My`i6Bs%6BbsO`o_SKC4q@lm2|w@T06VmtL{+_KdqJ zuzSKQ^~^OMrPsy#f^KX3pZu?*d;FSmjL~6>6@QzjxYxfn^g5TDX}WK&$oJ-y(^@L> zAEY(UUp=;e5)*Hx-OYc}nw{Few{6*Y%ZPV&-h(!L;tOxH0v=i@iBP1`njxg HN@xNAk4bZS literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_notifications.png b/app/src/main/res/drawable-xxhdpi/msg_notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f7b2628c0ad6bc23a07a04c83436e2b5df0411 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~dVo)et9yaZe9ze$1`VTEIeaEXzJ^UwyLJDZyL`?S?ygr>43^hVQ&_`Z5iD_B<31@ zgTe~DWM4f DO_t79 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_palette.png b/app/src/main/res/drawable-xxhdpi/msg_palette.png new file mode 100644 index 0000000000000000000000000000000000000000..fb96c369a4de51687eeffd1308cfd148db2c90d4 GIT binary patch literal 656 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~L4Z$)t9yaZe^P*p-5VyLUjC9G zzhH)s>zmc)x*fkCA!d+P#>JrdvXy~>iNVvwF{I+wn}~zk-UtY^csL*V|Nm{Zdg1Rh zKhuLdPp_PNbjrI`Lb+GOnkamSexoransz&T&&NuwJ2llRqdUQgOXn zL0q)+KHD2Vxztb2b+BUiQnAwUmGDekMnj1OR(Wx6c^BF8oH!`@US)|@Qi8;c;Cp{N zPt0>{v3B9(NxHks<-#o2+kAF%McEo=!l^S?D4X5rmnxiC`$c3JUO=)X3w?Bw3&wb>x=dq2=y?=-2 z-;&t0_kqvBlWg|?gb!<~-aLCRb)R?(v+Rc^mWl<2H^ky@7TxBr*uB^P=)zEeo7_Kd z7;gU*(cISS!kq4Wcz=Zb#Xfg4lMwAACk(oz7V>_6ym4}Fgv5=n1)c|<9KL_}D5V#k_W*!;`&o5_1|t3pmS66mOKyU|Fnb%h%>R<%2}c2BQum4W{_$eeznf z4W8D8KiixWwBqAmgYV96FCN6cy1+U20_V*MbD2`I-^-p^zL4kdM4{9Rf9ls;X&#a3 zDG%zflvAx1=n`ITbw^_ZyF&DWYT@>CuT`I@ik#>(YR?IabLf4eQTTyD*Zh#22>05$ z8O=d&`)61_u~}cYqPbJ!s$|ReFDVaIEzipseKh=1Xg1+{o8^ox%!vwQ0<&=F=ArdI`>&TkTQEapdEVre>aEJyQ*{XhLhVZT<2F3x&d zctz{R*C>vy%iPwUy_EguN>t$9XA$dTr`tOOR4w`Vz4#edLALctdAkT9U|cYGy85}S Ib4q9e03c@PkpKVy literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_pin.png b/app/src/main/res/drawable-xxhdpi/msg_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..455413b5db0d0fcc2d2548761dd433484cb2b6fc GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~Zh%jSt9yaZf1<(JxVub1jeI3R ze!&cEToP(dA$e1Go_zZAcleouM;RCx^F3W0Ln>~)z1E&}*g&N9VfNd<|N5f?_!x^< zh3s0I`ZK*{s{i$4n{@u)zI<7<=2>dGTZ>ORtp^7EfO1_TFV~%FjDDZcUr;MS#y_+8v3-*OS{-+dKW{-c!80 zpy*x8hiM@KbHrTUU1Ih4%vdztX2Io352g|;esAGZ$3JfnDcmM^);Xv%GjHpP+3c5c z{+WE=T>R0dJhObkiO&lz9C&m0)s}w_pDV(bXR~u@rw3^+%}8Az(KX%vB@l4${H;^- U-R~45Fj5#iUHx3vIVCg!0LI$@TmS$7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_retry.png b/app/src/main/res/drawable-xxhdpi/msg_retry.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d6c37e453ea2dcca16567716059b8767af2447 GIT binary patch literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~R)9~4t9yaZf8szl+oUrfq}8y)5S5Q;?~<4-CZpPJg%3Q_xk?(UoNg8(j6YW z>Ae)OAh& zhuK~sq0g7!_%c=OCFkC*qWw#Pin|n#Ov&CYbIy8Ea$KECl*jQB*<~8@tSq=0Pua-c zcg>7hvG)@5*4GA0%>!-DT4-)ts-`0)xAKeE)Wj+=*~61hDscPMbbb1gGs{TqsGaTX zWpWEMS|T#Lt@bgwe!e31cpGPz+s4^F3O_tUGG-fnI<{!C!31HKh2<@m!#ocPt=u$o z`<;IpT>?fNTetdfCxx?gGX4oTxcTS)&mTWdj3{9|W3h3olh_)Dom<5XeHV39m%m)s zC1Ufxd+tQdtaW89E;p|#G?*pVN4%chbY~^(G?wFa7vo aT*pwp&Lk-+-di3RHw>PxelF{r5}E*^!}8_; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_secret.png b/app/src/main/res/drawable-xxhdpi/msg_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed96e8b4dbaff1bf15d685d94f0481250e14163 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~dVo)et9yaZemj!(-k>m_J=qA1JBJ-^S#~y7>($LFm=KXo(-$TVO`7IjT z_1LOTvsf)W#bP>xZ9=18)#7>1nfF7Nt^CE3bbC|7#H%-_TzAW5iOep1d&%W3?@r%R zMep=Y%h&v6FXE7O>JLcN+Y+yF(&?7A%O)r5)~+>E<~r$UztMW~|N5V^|NedWt-9o# zVhP92-kj~KhjP~zMsJY`xBs7drQUX4{EffzivP^t-@0PH@y~>GZeW-)c)I$ztaD0e F0sy)))#U&H literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/msg_send.png b/app/src/main/res/drawable-xxhdpi/msg_send.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb8269072443084c30f310aef7d7eb43a68ee48 GIT binary patch literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~L4Z$)t9yaZe^P*p-5VyLUjC9G zzhDL?9tkxIzoeq(*&C1F{k-_^-2es##*3aVjv*Dd-cG-G?zI9>bFv15?t$O?-$qWf z`j<9E_{Q6P*=d=_{51Cd{OByXxpChynWwINv-UCV3-Qx*jep>!{JT^$I8TK=>am8p z=CkcnmWl?jGI_Lb4~dz0YnAB&@hW}six*T@IK2$AJ#}>BMVVD|R#Y$1+PzFOsPdvu zW9QQ(y@gk2%)Qr;6XmsHuTRziQ_X(M$!2l0ZRTHi)tT(H zy7I7x_aVM@Dk5JuESFOde#-gvj7nQ?Q^eL?PY=%AzcJ|0v@ea`lOht=AC=;Ctn^$H zbC!$u=j;ozSKOxy`#LvFyHI;mMNZpVO4YDn&a1bV0wZ!>PQK#&s!PgcQ+xHNg8|~^ z$|CbyH=O)0b>>A^?BA(Ja(2X=51Rj2@m9sEuKBY(=4^{oTH&4U#&_KF(x;VYck)`8 z-chd8DBkc=_eRd+ld`=9*Zaynw_JK_eysJ33rlZI@-< znrY?5F%z6W=baPwQr(z$Zt>^i?eZC%r&F$NoH;d1^hJTyls${`8DHkcJw4uE|0>Vy UZ$|N2P`opEy85}Sb4q9e0G4ns8vpxZeClaQL0YP0qmj!63zBCnRHJX%IQlOz4+N0IJV+shxE%_v| zOQoJKc9L!Tk&_^1 zH^aH6T}4(RvTU`gY0s4RH*NM^n{akM&y&;JIqFZXR}RaZ@%7AJH>+EnksqGg$Dh5w vWzCA8+Ow~k)_$LSDEF_r(nr;ew`&=%EY{j+-K}5_3pH%`MPu*=ro7nJn{>RX$E7_0p9n=l%0%9*+~{>@E9Yaq4l>b(#3oV=H<6 zHm#~VIg|Zi%9a(Y+n=;=S$o57?zt(`-Dceop6|2b(%P+RQ-rL9-8Q*wl56^Pc*VMx zqRfl^x@s>aTK`gc)|SiY=Jd|a^2v%C{pf4KjThG%dNOt_5zKdNmoN95yU^3^^(7b2 zdk0#UJaOObn)hJRgT*}0-X1UivE$^tlIon3-MQf#Rko*~-`Z0<#um zEI;mSIyp-zY0~WX`&WAZ@mzUu_1DhSdmTXykMs~`L4OQ>j{Juo-@d%*xKKse(^EJNfd(39pqVBr1_eo!F=DHJ|$IUPOIGES3|J35J`mgOq n^M2Z|Fy85kJ5JY5_^DsH{K&f0gxfTuOF{o?oi?^a!`P<*v| zug~XhtzV}Yca^`_c=kilFYTFA_|A~yPcCj+zM4%tNUA1VY`J4Z(bV}@|9)MYc+#}) zB1eRl(#yVBCco}`N0X*E7#pvBRIymaZ&CC?J;vv}LIq|ktv7k^{_M0WW!k4_IY9>A zp>y^c98_i0)Mx+4#cZrN{oLwjV%AklHs9H^%lv+Y-_MimvD?mxzuaQ+qw?w63F609 zV(&zyZu8E(yKnJi8~Lx3`e!NqEVSUApKOsE61nr7J1767sUFjhyj&75IPJ*6{rjIU zUgq`ajK_j5RRgESKN~#ObvJtlPZv3^XL@v_*TrWqf{d(IJ!!ibs2cBeK`?gGyGgJA zFi!e2EzPs=&7?gTe~DWM4f@0iD*VN{qH?9l zE3e6!(=?9yu!Y$aY&)Bpeg literal 0 HcmV?d00001