init
This commit is contained in:
319
app/src/main/java/com/sffteam/voidclient/ProfileViewActivity.kt
Normal file
319
app/src/main/java/com/sffteam/voidclient/ProfileViewActivity.kt
Normal file
@@ -0,0 +1,319 @@
|
||||
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)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user