Files
Void-Client/app/src/main/java/com/sffteam/voidclient/ProfileViewActivity.kt
2026-03-02 18:49:17 +02:00

319 lines
15 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.sffteam.voidclient
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBackIos
import androidx.compose.material.icons.filled.Block
import androidx.compose.material.icons.filled.ChatBubble
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.Text
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage
import com.sffteam.voidclient.ui.theme.AppTheme
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonArray
import java.util.Locale.getDefault
class ProfileViewActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
val userId = intent.getLongExtra("userId", 0L)
setContent {
AppTheme() {
val users by UserManager.usersList.collectAsState()
val currentUser = users[userId]
val avatarUrl = currentUser?.avatarUrl
val description = currentUser?.description
val coroutineScope = rememberCoroutineScope()
val fullName = currentUser?.firstName + if (currentUser?.lastName?.isNotEmpty() == true) {
" " + currentUser.lastName
} else {
""
}
val context = LocalContext.current
var userMap : MutableMap<String, String> = mutableMapOf(
)
if (description?.isNotEmpty() == true) {
userMap["О себе"] = description
}
userMap["ID"] = userId.toString()
LazyColumn(
modifier = Modifier
.fillMaxSize()
.background(colorScheme.background)
.windowInsetsPadding(WindowInsets.statusBars)
) {
item {
IconButton({
finish()
}) {
Icon(
Icons.AutoMirrored.Filled.ArrowBackIos,
"",
modifier = Modifier.size(25.dp),
tint = colorScheme.primary
)
}
}
item {
Column(modifier = Modifier
.padding(8.dp)
.fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(10.dp, Alignment.CenterVertically)
) {
if (avatarUrl?.isNotEmpty() == true) {
AsyncImage(
avatarUrl,
"",
modifier = Modifier
.align(Alignment.CenterHorizontally)
.size(110.dp)
.clip(CircleShape)
.clickable {
val intent = Intent(context, ImageViewerActivity::class.java)
intent.putExtra("isSingleImage", true)
intent.putExtra("image", avatarUrl)
context.startActivity(intent)
},
contentScale = ContentScale.FillBounds
)
} else {
val initial =
fullName?.split(" ")?.mapNotNull { it.firstOrNull() }
?.take(2)?.joinToString("")?.uppercase(getDefault())
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.width(100.dp)
.height(100.dp)
.clip(CircleShape)
.background(
brush = Brush.linearGradient(
colors = listOf(
Utils.getColorForAvatar(fullName).first,
Utils.getColorForAvatar(fullName).second
)
)
)
.align(Alignment.CenterHorizontally),
) {
Text(
text = initial.toString(),
color = Color.White,
style = MaterialTheme.typography.labelLarge,
fontSize = 40.sp
)
}
}
Text(
fullName,
fontSize = 24.sp,
modifier = Modifier.align(Alignment.CenterHorizontally).padding(start = 8.dp, end = 8.dp),
color = colorScheme.secondary,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
item {
Row(modifier = Modifier
.fillMaxWidth()
.padding(4.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally)
) {
Button(onClick = {
val chatId = AccountManager.accountID xor userId
val packet = SocketManager.packPacket(
OPCode.CHAT_INFO.opcode, JsonObject(
mapOf(
"chatIds" to JsonArray(listOf(Json.encodeToJsonElement(Long.serializer(), chatId))),
)
)
)
val intent = Intent(context, ChatActivity::class.java)
try {
GlobalScope.launch {
SocketManager.sendPacket(
packet, { packet ->
println(packet)
GlobalScope.launch {
if (packet.payload is JsonObject) ChatManager.processChats(
packet.payload["chats"]!!.jsonArray
)
}
}
)
}
} catch (e : Exception) {
println(e)
}
intent.putExtra("chatID", chatId)
intent.putExtra("chatTitle", fullName);
intent.putExtra("chatType", "DIALOG")
intent.putExtra("chatIcon", avatarUrl);
context.startActivity(intent)
},
modifier = Modifier.padding(4.dp).width(160.dp),
colors = ButtonColors(
containerColor = colorScheme.primaryContainer,
contentColor = colorScheme.onPrimaryContainer,
disabledContainerColor = colorScheme.primaryContainer,
disabledContentColor = colorScheme.onPrimaryContainer,
)
) {
Column {
Icon(
Icons.Filled.ChatBubble,
"",
modifier = Modifier.size(25.dp).align(Alignment.CenterHorizontally)
)
Text("Чат",
fontSize = 18.sp,
modifier = Modifier.align(Alignment.CenterHorizontally),
)
}
}
Button(onClick = {
},
modifier = Modifier.padding(4.dp).width(160.dp),
colors = ButtonColors(
containerColor = colorScheme.primaryContainer,
contentColor = colorScheme.onPrimaryContainer,
disabledContainerColor = colorScheme.primaryContainer,
disabledContentColor = colorScheme.onPrimaryContainer,
)
) {
Column() {
Icon(
Icons.Filled.Block,
"",
modifier = Modifier.size(25.dp).align(Alignment.CenterHorizontally)
)
Text("Заблокировать",
fontSize = 18.sp,
modifier = Modifier.align(Alignment.CenterHorizontally),
maxLines = 1
)
}
}
//
// For future updates
// Button(onClick = {
// },
// modifier = Modifier.padding(4.dp).widthIn(min = 100.dp),
// colors = ButtonColors(
// containerColor = colorScheme.primaryContainer,
// contentColor = colorScheme.onPrimaryContainer,
// disabledContainerColor = colorScheme.primaryContainer,
// disabledContentColor = colorScheme.onPrimaryContainer,
// )
// ) {
// Column() {
// Icon(
// Icons.Filled.Folder,
// "",
// modifier = Modifier.size(25.dp).align(Alignment.CenterHorizontally)
// )
// Text("Добавить в папку",
// fontSize = 18.sp,
// modifier = Modifier.align(Alignment.CenterHorizontally),
// maxLines = 1
// )
// }
// }
}
}
item {
Box(modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
.background(colorScheme.secondaryContainer, RoundedCornerShape(16.dp))
) {
Column(modifier = Modifier.padding(8.dp)) {
for (setting in userMap.toList()) {
Text(setting.first, modifier = Modifier.alpha(0.7f),
color = colorScheme.onSecondaryContainer, fontSize = 16.sp)
Text(setting.second,
color = colorScheme.onSecondaryContainer,
fontSize = 20.sp,
modifier = Modifier.padding(bottom = 4.dp)
)
}
}
}
}
}
}
}
}
}