[update] Comic sort policy
This commit is contained in:
@@ -46,6 +46,9 @@ class ApiClient @Inject constructor(
|
||||
fun getBase(): String{
|
||||
return replaceAbyssProtocol(base)
|
||||
}
|
||||
|
||||
fun getDomain(): String = domain
|
||||
|
||||
private var base: String = ""
|
||||
private var domain: String = ""
|
||||
private var cert: String = ""
|
||||
@@ -236,7 +239,7 @@ class ApiClient @Inject constructor(
|
||||
throw Exception("No reachable URL found")
|
||||
}
|
||||
|
||||
domain = selectedUrl.toHttpUrlOrNull()?.host ?: ""
|
||||
domain = replaceAbyssProtocol(selectedUrl).toHttpUrlOrNull()?.host ?: ""
|
||||
cert = crt
|
||||
base = selectedUrl
|
||||
withContext(Dispatchers.IO)
|
||||
|
||||
@@ -156,7 +156,7 @@ class MediaManager @Inject constructor(
|
||||
{
|
||||
try{
|
||||
val j = apiClient.api!!.getComics()
|
||||
return j
|
||||
return j.sorted()
|
||||
}catch (_: Exception)
|
||||
{
|
||||
return listOf()
|
||||
|
||||
@@ -178,9 +178,9 @@ fun ComicScreen(
|
||||
|
||||
VariableGrid(
|
||||
modifier = Modifier
|
||||
.heightIn(max = 88.dp)
|
||||
.heightIn(max = 72.dp)
|
||||
.padding(4.dp),
|
||||
rowHeight = 32.dp
|
||||
rowHeight = 30.dp
|
||||
)
|
||||
{
|
||||
for (i in comicScreenViewModel.tags) {
|
||||
|
||||
@@ -15,6 +15,7 @@ import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Key
|
||||
import androidx.compose.material.icons.filled.Link
|
||||
import androidx.compose.material.icons.filled.Person
|
||||
import androidx.compose.material.icons.filled.Textsms
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.Checkbox
|
||||
@@ -41,6 +42,7 @@ fun MeScreen(meScreenViewModel: MeScreenViewModel = hiltViewModel<MeScreenViewMo
|
||||
var privateKey by meScreenViewModel.privateKey
|
||||
var url by meScreenViewModel.url
|
||||
var cert by meScreenViewModel.cert
|
||||
var pak by meScreenViewModel.pak
|
||||
|
||||
val uss by meScreenViewModel.uss.collectAsState(initial = false)
|
||||
|
||||
@@ -50,7 +52,8 @@ fun MeScreen(meScreenViewModel: MeScreenViewModel = hiltViewModel<MeScreenViewMo
|
||||
.padding(8.dp),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Top
|
||||
) {
|
||||
)
|
||||
{
|
||||
// Card component for a clean, contained UI block
|
||||
item{
|
||||
Card(
|
||||
@@ -196,6 +199,54 @@ fun MeScreen(meScreenViewModel: MeScreenViewModel = hiltViewModel<MeScreenViewMo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)
|
||||
)
|
||||
{
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(16.dp)
|
||||
.fillMaxWidth(),
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Text(
|
||||
text = "Toolbox",
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
modifier = Modifier
|
||||
.padding(bottom = 16.dp)
|
||||
.align(Alignment.Start)
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
|
||||
OutlinedTextField(
|
||||
value = pak,
|
||||
onValueChange = { pak = it },
|
||||
label = { Text("Packet") },
|
||||
leadingIcon = {
|
||||
Icon(Icons.Default.Textsms, contentDescription = "Packet")
|
||||
},
|
||||
singleLine = true,
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
|
||||
Row{
|
||||
Button(
|
||||
onClick = {
|
||||
meScreenViewModel.sendPacket(pak)
|
||||
},
|
||||
modifier = Modifier.weight(0.5f).padding(8.dp)
|
||||
) {
|
||||
Text("Send")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ class ComicScreenViewModel @Inject constructor(
|
||||
val m = mediaManager.queryComicInfoBulk(l)
|
||||
|
||||
if(m != null) {
|
||||
comics.addAll(m.sortedWith(compareBy(naturalOrder()) { it.comic.comic_name }))
|
||||
comics.addAll(m.sortedBy { it.id.toInt() }.reversed())
|
||||
tags.addAll(m.flatMap { it.comic.tags }.groupingBy { it }.eachCount()
|
||||
.entries.sortedByDescending { it.value }
|
||||
.map { it.key })
|
||||
|
||||
@@ -18,6 +18,9 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.net.DatagramPacket
|
||||
import java.net.DatagramSocket
|
||||
import java.net.InetAddress
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
@@ -33,6 +36,7 @@ class MeScreenViewModel @Inject constructor(
|
||||
val privateKey = mutableStateOf("")
|
||||
val url = mutableStateOf("")
|
||||
val cert = mutableStateOf("")
|
||||
val pak = mutableStateOf("")
|
||||
|
||||
val uss = settingsDataStoreManager.useSelfSignedFlow
|
||||
|
||||
@@ -108,7 +112,8 @@ class MeScreenViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun updateAccount(u: String, p: String) {
|
||||
fun updateAccount(u: String, p: String)
|
||||
{
|
||||
viewModelScope.launch {
|
||||
settingsDataStoreManager.saveUserName(u)
|
||||
settingsDataStoreManager.savePrivateKey(p)
|
||||
@@ -142,4 +147,22 @@ class MeScreenViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun sendPacket(p: String)
|
||||
{
|
||||
val b = (p + "\r\n").toByteArray(Charsets.UTF_8)
|
||||
|
||||
viewModelScope.launch {
|
||||
withContext(Dispatchers.IO) {
|
||||
val addr = InetAddress.getByName(apiClient.getDomain())
|
||||
|
||||
val socket = DatagramSocket()
|
||||
val packet = DatagramPacket(
|
||||
b, b.size, addr, 4096
|
||||
)
|
||||
|
||||
socket.send(packet)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user