[update] Comic sort policy
This commit is contained in:
@@ -46,6 +46,9 @@ class ApiClient @Inject constructor(
|
|||||||
fun getBase(): String{
|
fun getBase(): String{
|
||||||
return replaceAbyssProtocol(base)
|
return replaceAbyssProtocol(base)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getDomain(): String = domain
|
||||||
|
|
||||||
private var base: String = ""
|
private var base: String = ""
|
||||||
private var domain: String = ""
|
private var domain: String = ""
|
||||||
private var cert: String = ""
|
private var cert: String = ""
|
||||||
@@ -236,7 +239,7 @@ class ApiClient @Inject constructor(
|
|||||||
throw Exception("No reachable URL found")
|
throw Exception("No reachable URL found")
|
||||||
}
|
}
|
||||||
|
|
||||||
domain = selectedUrl.toHttpUrlOrNull()?.host ?: ""
|
domain = replaceAbyssProtocol(selectedUrl).toHttpUrlOrNull()?.host ?: ""
|
||||||
cert = crt
|
cert = crt
|
||||||
base = selectedUrl
|
base = selectedUrl
|
||||||
withContext(Dispatchers.IO)
|
withContext(Dispatchers.IO)
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ class MediaManager @Inject constructor(
|
|||||||
{
|
{
|
||||||
try{
|
try{
|
||||||
val j = apiClient.api!!.getComics()
|
val j = apiClient.api!!.getComics()
|
||||||
return j
|
return j.sorted()
|
||||||
}catch (_: Exception)
|
}catch (_: Exception)
|
||||||
{
|
{
|
||||||
return listOf()
|
return listOf()
|
||||||
|
|||||||
@@ -178,9 +178,9 @@ fun ComicScreen(
|
|||||||
|
|
||||||
VariableGrid(
|
VariableGrid(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.heightIn(max = 88.dp)
|
.heightIn(max = 72.dp)
|
||||||
.padding(4.dp),
|
.padding(4.dp),
|
||||||
rowHeight = 32.dp
|
rowHeight = 30.dp
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (i in comicScreenViewModel.tags) {
|
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.Key
|
||||||
import androidx.compose.material.icons.filled.Link
|
import androidx.compose.material.icons.filled.Link
|
||||||
import androidx.compose.material.icons.filled.Person
|
import androidx.compose.material.icons.filled.Person
|
||||||
|
import androidx.compose.material.icons.filled.Textsms
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.Card
|
import androidx.compose.material3.Card
|
||||||
import androidx.compose.material3.Checkbox
|
import androidx.compose.material3.Checkbox
|
||||||
@@ -41,6 +42,7 @@ fun MeScreen(meScreenViewModel: MeScreenViewModel = hiltViewModel<MeScreenViewMo
|
|||||||
var privateKey by meScreenViewModel.privateKey
|
var privateKey by meScreenViewModel.privateKey
|
||||||
var url by meScreenViewModel.url
|
var url by meScreenViewModel.url
|
||||||
var cert by meScreenViewModel.cert
|
var cert by meScreenViewModel.cert
|
||||||
|
var pak by meScreenViewModel.pak
|
||||||
|
|
||||||
val uss by meScreenViewModel.uss.collectAsState(initial = false)
|
val uss by meScreenViewModel.uss.collectAsState(initial = false)
|
||||||
|
|
||||||
@@ -50,7 +52,8 @@ fun MeScreen(meScreenViewModel: MeScreenViewModel = hiltViewModel<MeScreenViewMo
|
|||||||
.padding(8.dp),
|
.padding(8.dp),
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
verticalArrangement = Arrangement.Top
|
verticalArrangement = Arrangement.Top
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
// Card component for a clean, contained UI block
|
// Card component for a clean, contained UI block
|
||||||
item{
|
item{
|
||||||
Card(
|
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)
|
val m = mediaManager.queryComicInfoBulk(l)
|
||||||
|
|
||||||
if(m != null) {
|
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()
|
tags.addAll(m.flatMap { it.comic.tags }.groupingBy { it }.eachCount()
|
||||||
.entries.sortedByDescending { it.value }
|
.entries.sortedByDescending { it.value }
|
||||||
.map { it.key })
|
.map { it.key })
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import java.net.DatagramPacket
|
||||||
|
import java.net.DatagramSocket
|
||||||
|
import java.net.InetAddress
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
@@ -33,6 +36,7 @@ class MeScreenViewModel @Inject constructor(
|
|||||||
val privateKey = mutableStateOf("")
|
val privateKey = mutableStateOf("")
|
||||||
val url = mutableStateOf("")
|
val url = mutableStateOf("")
|
||||||
val cert = mutableStateOf("")
|
val cert = mutableStateOf("")
|
||||||
|
val pak = mutableStateOf("")
|
||||||
|
|
||||||
val uss = settingsDataStoreManager.useSelfSignedFlow
|
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 {
|
viewModelScope.launch {
|
||||||
settingsDataStoreManager.saveUserName(u)
|
settingsDataStoreManager.saveUserName(u)
|
||||||
settingsDataStoreManager.savePrivateKey(p)
|
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