|
|
|
@ -23,6 +23,8 @@ import androidx.compose.material.icons.filled.HeadsetMic |
|
|
|
import androidx.compose.material.icons.automirrored.filled.VolumeUp |
|
|
|
import androidx.compose.material.icons.automirrored.filled.VolumeUp |
|
|
|
import androidx.compose.material.icons.filled.Link |
|
|
|
import androidx.compose.material.icons.filled.Link |
|
|
|
import androidx.compose.material.icons.filled.People |
|
|
|
import androidx.compose.material.icons.filled.People |
|
|
|
|
|
|
|
import androidx.compose.material.icons.filled.Settings |
|
|
|
|
|
|
|
import androidx.compose.material.icons.filled.MoreVert |
|
|
|
import androidx.compose.material3.* |
|
|
|
import androidx.compose.material3.* |
|
|
|
import androidx.compose.runtime.* |
|
|
|
import androidx.compose.runtime.* |
|
|
|
import androidx.compose.ui.Alignment |
|
|
|
import androidx.compose.ui.Alignment |
|
|
|
@ -51,6 +53,8 @@ import com.utun.chat.data.RadioOverlayService |
|
|
|
import com.utun.chat.ui.components.ConversationMessages |
|
|
|
import com.utun.chat.ui.components.ConversationMessages |
|
|
|
import com.utun.chat.ui.components.ConversationComposer |
|
|
|
import com.utun.chat.ui.components.ConversationComposer |
|
|
|
import com.utun.chat.ui.components.PortableRadioIcon |
|
|
|
import com.utun.chat.ui.components.PortableRadioIcon |
|
|
|
|
|
|
|
import com.utun.chat.ui.components.GroupAvatar |
|
|
|
|
|
|
|
import com.utun.chat.ui.components.GroupPropertiesDialog |
|
|
|
import com.utun.chat.data.ConversationTarget |
|
|
|
import com.utun.chat.data.ConversationTarget |
|
|
|
import com.utun.chat.viewmodel.ChatViewModel |
|
|
|
import com.utun.chat.viewmodel.ChatViewModel |
|
|
|
import kotlinx.coroutines.Dispatchers |
|
|
|
import kotlinx.coroutines.Dispatchers |
|
|
|
@ -77,6 +81,8 @@ fun ChatScreen( |
|
|
|
val view = LocalView.current |
|
|
|
val view = LocalView.current |
|
|
|
val pttCenterOffset = with(LocalDensity.current) { 60.dp.toPx() } |
|
|
|
val pttCenterOffset = with(LocalDensity.current) { 60.dp.toPx() } |
|
|
|
val scope = rememberCoroutineScope() |
|
|
|
val scope = rememberCoroutineScope() |
|
|
|
|
|
|
|
var properties by remember(channel.id) { mutableStateOf(false) } |
|
|
|
|
|
|
|
var menu by remember(channel.id) { mutableStateOf(false) } |
|
|
|
|
|
|
|
|
|
|
|
/* рация */ |
|
|
|
/* рация */ |
|
|
|
val radioActive by viewModel.radioActive.collectAsState() |
|
|
|
val radioActive by viewModel.radioActive.collectAsState() |
|
|
|
@ -114,14 +120,16 @@ fun ChatScreen( |
|
|
|
modifier = Modifier.fillMaxSize().imePadding() |
|
|
|
modifier = Modifier.fillMaxSize().imePadding() |
|
|
|
) { |
|
|
|
) { |
|
|
|
TopAppBar( |
|
|
|
TopAppBar( |
|
|
|
title = { Text(channel.name) }, |
|
|
|
title = { |
|
|
|
|
|
|
|
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { |
|
|
|
|
|
|
|
GroupAvatar(channel.id, channel.name, size = 32.dp) |
|
|
|
|
|
|
|
Text(channel.name, maxLines = 1, overflow = androidx.compose.ui.text.style.TextOverflow.Ellipsis) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
navigationIcon = { |
|
|
|
navigationIcon = { |
|
|
|
IconButton(onClick = onBack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, stringResource(R.string.back)) } |
|
|
|
IconButton(onClick = onBack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, stringResource(R.string.back)) } |
|
|
|
}, |
|
|
|
}, |
|
|
|
actions = { |
|
|
|
actions = { |
|
|
|
IconButton(onClick = { viewModel.toggleSound() }) { |
|
|
|
|
|
|
|
Text(if (soundOn) "\uD83D\uDD14" else "\uD83D\uDD15", fontSize = 18.sp) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
IconButton( |
|
|
|
IconButton( |
|
|
|
onClick = { viewModel.toggleRadio() }, |
|
|
|
onClick = { viewModel.toggleRadio() }, |
|
|
|
modifier = Modifier.background( |
|
|
|
modifier = Modifier.background( |
|
|
|
@ -130,10 +138,21 @@ fun ChatScreen( |
|
|
|
val action = stringResource(if (radioActive) R.string.radio_turn_off else R.string.radio_turn_on) |
|
|
|
val action = stringResource(if (radioActive) R.string.radio_turn_off else R.string.radio_turn_on) |
|
|
|
PortableRadioIcon(stringResource(R.string.radio_toggle, action)) |
|
|
|
PortableRadioIcon(stringResource(R.string.radio_toggle, action)) |
|
|
|
} |
|
|
|
} |
|
|
|
IconButton(onClick = onInvite) { Icon(Icons.Filled.Link, stringResource(R.string.invite)) } |
|
|
|
IconButton(onClick = { properties = true }) { Icon(Icons.Filled.Settings, stringResource(R.string.group_properties)) } |
|
|
|
IconButton(onClick = onMembersClick) { Icon(Icons.Filled.People, stringResource(R.string.members)) } |
|
|
|
IconButton(onClick = onMembersClick) { Icon(Icons.Filled.People, stringResource(R.string.members)) } |
|
|
|
|
|
|
|
Box { |
|
|
|
|
|
|
|
IconButton(onClick = { menu = true }) { Icon(Icons.Filled.MoreVert, stringResource(R.string.options)) } |
|
|
|
|
|
|
|
DropdownMenu(expanded = menu, onDismissRequest = { menu = false }) { |
|
|
|
|
|
|
|
DropdownMenuItem(text = { Text(stringResource(R.string.invite)) }, |
|
|
|
|
|
|
|
leadingIcon = { Icon(Icons.Filled.Link, null) }, onClick = { menu = false; onInvite() }) |
|
|
|
|
|
|
|
DropdownMenuItem(text = { Text(stringResource(R.string.sound)) }, |
|
|
|
|
|
|
|
trailingIcon = { Text(if (soundOn) "\uD83D\uDD14" else "\uD83D\uDD15") }, |
|
|
|
|
|
|
|
onClick = { menu = false; viewModel.toggleSound() }) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
if (properties) GroupPropertiesDialog(channel, onDismiss = { properties = false }) |
|
|
|
if (radioActive) { |
|
|
|
if (radioActive) { |
|
|
|
RadioSourceBar(viewModel) |
|
|
|
RadioSourceBar(viewModel) |
|
|
|
} |
|
|
|
} |
|
|
|
|