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.
This commit is contained in:
2026-02-13 23:24:09 +05:00
parent 93ce53d3d5
commit 815ffa478b
174 changed files with 934 additions and 494 deletions

View File

@@ -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<ImageSourceBounds?>(null) }
var imageViewerImages by remember { mutableStateOf<List<ViewableImage>>(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

View File

@@ -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)
)
}
}

View File

@@ -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)
),

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
)
}
}
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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),