Compare commits
8 Commits
95f84cafb7
...
315e7e4afe
Author | SHA1 | Date | |
---|---|---|---|
315e7e4afe | |||
55ff6e6cd1 | |||
5e15a75664 | |||
d7a2a26097 | |||
f1b330c1ce | |||
1ede1a4c2d | |||
08949c5f0d | |||
be230e8a11 |
@ -1,15 +1,9 @@
|
|||||||
/*
|
|
||||||
* Created by sweetbread
|
|
||||||
* Copyright (c) 2025. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.androidApplication)
|
alias(libs.plugins.androidApplication)
|
||||||
alias(libs.plugins.jetbrainsKotlinAndroid)
|
alias(libs.plugins.jetbrainsKotlinAndroid)
|
||||||
alias(libs.plugins.kotlin.compose)
|
|
||||||
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
|
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
|
||||||
id("com.google.devtools.ksp")
|
id("com.google.devtools.ksp")
|
||||||
}
|
}
|
||||||
@ -20,12 +14,12 @@ secrets {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "ru.sweetbread.unn"
|
namespace = "ru.sweetbread.unn"
|
||||||
compileSdk = 36
|
compileSdk = 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "ru.sweetbread.unn"
|
applicationId = "ru.sweetbread.unn"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 36
|
targetSdk = 34
|
||||||
versionCode = 1
|
versionCode = 1
|
||||||
versionName = "1.0"
|
versionName = "1.0"
|
||||||
setProperty("archivesBaseName", "$applicationId-v$versionCode($versionName)")
|
setProperty("archivesBaseName", "$applicationId-v$versionCode($versionName)")
|
||||||
@ -34,12 +28,6 @@ android {
|
|||||||
vectorDrawables {
|
vectorDrawables {
|
||||||
useSupportLibrary = true
|
useSupportLibrary = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// javaCompileOptions {
|
|
||||||
// annotationProcessorOptions {
|
|
||||||
// arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
@ -84,7 +72,6 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(libs.androidx.material.icons.core.android)
|
|
||||||
coreLibraryDesugaring(libs.desugar.jdk.libs)
|
coreLibraryDesugaring(libs.desugar.jdk.libs)
|
||||||
|
|
||||||
implementation(libs.androidx.core.ktx)
|
implementation(libs.androidx.core.ktx)
|
||||||
@ -116,7 +103,6 @@ dependencies {
|
|||||||
implementation(libs.ktor.client.logging)
|
implementation(libs.ktor.client.logging)
|
||||||
implementation(libs.ktor.client.android)
|
implementation(libs.ktor.client.android)
|
||||||
implementation(libs.coil.compose)
|
implementation(libs.coil.compose)
|
||||||
implementation(libs.glide)
|
|
||||||
|
|
||||||
implementation(libs.androidx.datastore.preferences)
|
implementation(libs.androidx.datastore.preferences)
|
||||||
implementation(libs.splitties.base)
|
implementation(libs.splitties.base)
|
||||||
@ -124,6 +110,8 @@ dependencies {
|
|||||||
|
|
||||||
implementation(libs.compose)
|
implementation(libs.compose)
|
||||||
|
|
||||||
|
implementation(libs.kefirbb)
|
||||||
|
|
||||||
implementation(libs.acra.http)
|
implementation(libs.acra.http)
|
||||||
|
|
||||||
implementation(libs.androidx.room.runtime)
|
implementation(libs.androidx.room.runtime)
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"artifactType": {
|
|
||||||
"type": "APK",
|
|
||||||
"kind": "Directory"
|
|
||||||
},
|
|
||||||
"applicationId": "ru.sweetbread.unn",
|
|
||||||
"variantName": "release",
|
|
||||||
"elements": [
|
|
||||||
{
|
|
||||||
"type": "SINGLE",
|
|
||||||
"filters": [],
|
|
||||||
"attributes": [],
|
|
||||||
"versionCode": 1,
|
|
||||||
"versionName": "1.0",
|
|
||||||
"outputFile": "ru.sweetbread.unn-v1(1.0)-release.apk"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"elementType": "File",
|
|
||||||
"baselineProfiles": [
|
|
||||||
{
|
|
||||||
"minApi": 28,
|
|
||||||
"maxApi": 30,
|
|
||||||
"baselineProfiles": [
|
|
||||||
"baselineProfiles/1/ru.sweetbread.unn-v1(1.0)-release.dm"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minApi": 31,
|
|
||||||
"maxApi": 2147483647,
|
|
||||||
"baselineProfiles": [
|
|
||||||
"baselineProfiles/0/ru.sweetbread.unn-v1(1.0)-release.dm"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"minSdkVersionForDexing": 26
|
|
||||||
}
|
|
Binary file not shown.
@ -5,12 +5,8 @@
|
|||||||
|
|
||||||
package ru.sweetbread.unn.ui.composes
|
package ru.sweetbread.unn.ui.composes
|
||||||
|
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
import android.text.Html
|
|
||||||
import android.text.method.LinkMovementMethod
|
|
||||||
import android.text.util.Linkify
|
import android.text.util.Linkify
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
@ -47,14 +43,15 @@ import androidx.compose.ui.text.font.FontWeight
|
|||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.viewinterop.AndroidView
|
import androidx.compose.ui.viewinterop.AndroidView
|
||||||
|
import androidx.core.text.HtmlCompat
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
import coil.ImageLoader
|
|
||||||
import coil.compose.AsyncImage
|
import coil.compose.AsyncImage
|
||||||
import coil.request.ImageRequest
|
import com.google.android.material.textview.MaterialTextView
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import org.kefirsf.bb.BBProcessorFactory
|
||||||
import ru.sweetbread.unn.AvatarSet
|
import ru.sweetbread.unn.AvatarSet
|
||||||
import ru.sweetbread.unn.Post
|
import ru.sweetbread.unn.Post
|
||||||
import ru.sweetbread.unn.R
|
import ru.sweetbread.unn.R
|
||||||
@ -176,6 +173,7 @@ fun UserItem(modifier: Modifier = Modifier, user: User, info: String? = null) {
|
|||||||
@NonRestartableComposable
|
@NonRestartableComposable
|
||||||
fun PostItem(modifier: Modifier = Modifier, post: Post, extended: Boolean = false) {
|
fun PostItem(modifier: Modifier = Modifier, post: Post, extended: Boolean = false) {
|
||||||
var user: User? by remember { mutableStateOf(null) }
|
var user: User? by remember { mutableStateOf(null) }
|
||||||
|
val processor = remember { BBProcessorFactory.getInstance().create() }
|
||||||
var html: String by remember { mutableStateOf("") }
|
var html: String by remember { mutableStateOf("") }
|
||||||
|
|
||||||
|
|
||||||
@ -200,10 +198,8 @@ fun PostItem(modifier: Modifier = Modifier, post: Post, extended: Boolean = fals
|
|||||||
val linkColor = MaterialTheme.colorScheme.primary.toArgb()
|
val linkColor = MaterialTheme.colorScheme.primary.toArgb()
|
||||||
|
|
||||||
AndroidView(
|
AndroidView(
|
||||||
modifier = Modifier,
|
|
||||||
factory = {
|
factory = {
|
||||||
TextView(it).apply {
|
MaterialTextView(it).apply {
|
||||||
movementMethod = LinkMovementMethod.getInstance()
|
|
||||||
autoLinkMask = Linkify.WEB_URLS
|
autoLinkMask = Linkify.WEB_URLS
|
||||||
linksClickable = true
|
linksClickable = true
|
||||||
setTextColor(textColor)
|
setTextColor(textColor)
|
||||||
@ -212,12 +208,7 @@ fun PostItem(modifier: Modifier = Modifier, post: Post, extended: Boolean = fals
|
|||||||
},
|
},
|
||||||
update = {
|
update = {
|
||||||
it.maxLines = if (extended) Int.MAX_VALUE else 5
|
it.maxLines = if (extended) Int.MAX_VALUE else 5
|
||||||
it.text = Html.fromHtml(
|
it.text = HtmlCompat.fromHtml(html, 0)
|
||||||
html,
|
|
||||||
Html.FROM_HTML_MODE_LEGACY,
|
|
||||||
CoilImageGetter(it),
|
|
||||||
null
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -269,76 +260,3 @@ fun PostItemPreview() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class CoilImageGetter(
|
|
||||||
private val textView: TextView,
|
|
||||||
private val maxImageWidth: Int = textView.width
|
|
||||||
) : Html.ImageGetter {
|
|
||||||
|
|
||||||
override fun getDrawable(source: String): Drawable {
|
|
||||||
val urlDrawable = UrlDrawable()
|
|
||||||
|
|
||||||
if (maxImageWidth <= 0)
|
|
||||||
textView.post { updateImage(source, urlDrawable, textView.width) }
|
|
||||||
else
|
|
||||||
updateImage(source, urlDrawable, maxImageWidth)
|
|
||||||
|
|
||||||
return urlDrawable
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateImage(source: String, urlDrawable: UrlDrawable, maxWidth: Int) {
|
|
||||||
val imageLoader = ImageLoader.Builder(textView.context)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val request = ImageRequest.Builder(textView.context)
|
|
||||||
.data(source)
|
|
||||||
.target { drawable ->
|
|
||||||
val (scaledWidth, scaledHeight) = calculateScaledSize(
|
|
||||||
drawable.intrinsicWidth,
|
|
||||||
drawable.intrinsicHeight,
|
|
||||||
maxWidth
|
|
||||||
)
|
|
||||||
|
|
||||||
drawable.setBounds(0, 0, scaledWidth, scaledHeight)
|
|
||||||
urlDrawable.drawable = drawable
|
|
||||||
urlDrawable.setBounds(0, 0, scaledWidth, scaledHeight)
|
|
||||||
|
|
||||||
textView.text = textView.text
|
|
||||||
}
|
|
||||||
.build()
|
|
||||||
|
|
||||||
imageLoader.enqueue(request)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun calculateScaledSize(
|
|
||||||
originalWidth: Int,
|
|
||||||
originalHeight: Int,
|
|
||||||
maxWidth: Int
|
|
||||||
): Pair<Int, Int> {
|
|
||||||
if (originalWidth <= maxWidth)
|
|
||||||
return Pair(originalWidth, originalHeight)
|
|
||||||
|
|
||||||
val ratio = maxWidth.toFloat() / originalWidth.toFloat()
|
|
||||||
return Pair(
|
|
||||||
maxWidth,
|
|
||||||
(originalHeight * ratio).toInt()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UrlDrawable() : Drawable() {
|
|
||||||
var drawable: Drawable? = null
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
invalidateSelf()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun draw(canvas: android.graphics.Canvas) {
|
|
||||||
drawable?.draw(canvas)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setAlpha(alpha: Int) {}
|
|
||||||
override fun setColorFilter(colorFilter: android.graphics.ColorFilter?) {}
|
|
||||||
override fun getOpacity(): Int = android.graphics.PixelFormat.TRANSLUCENT
|
|
||||||
}
|
|
@ -1,13 +1,7 @@
|
|||||||
/*
|
|
||||||
* Created by sweetbread
|
|
||||||
* Copyright (c) 2025. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ru.sweetbread.unn.ui.composes
|
package ru.sweetbread.unn.ui.composes
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.animateColorAsState
|
|
||||||
import androidx.compose.foundation.Canvas
|
import androidx.compose.foundation.Canvas
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
@ -147,20 +141,21 @@ fun ScheduleDay(modifier: Modifier = Modifier, date: LocalDate) {
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ScheduleItem(modifier: Modifier = Modifier, unit: ScheduleUnit, expanded: Boolean = false) {
|
fun ScheduleItem(modifier: Modifier = Modifier, unit: ScheduleUnit, expanded: Boolean = false) {
|
||||||
fun getRel(): Float {
|
fun getRel(begin: Long, end: Long, now: Long): Float {
|
||||||
val begin = LocalDateTime.of(unit.date, unit.begin).atZone(ZoneId.of("Europe/Moscow")).toEpochSecond()
|
if ((begin > now) or (now > end))
|
||||||
val end = LocalDateTime.of(unit.date, unit.end).atZone(ZoneId.of("Europe/Moscow")).toEpochSecond()
|
|
||||||
val now = LocalDateTime.now().atZone(ZoneId.of("Europe/Moscow")).toEpochSecond()
|
|
||||||
if (begin > now)
|
|
||||||
return -1f
|
return -1f
|
||||||
if (now > end)
|
|
||||||
return 1f
|
|
||||||
return (now - begin) / (end - begin).toFloat()
|
return (now - begin) / (end - begin).toFloat()
|
||||||
}
|
}
|
||||||
|
|
||||||
val begin = unit.begin.format(DateTimeFormatter.ofPattern("HH:mm"))
|
val begin = unit.begin.format(DateTimeFormatter.ofPattern("HH:mm"))
|
||||||
val end = unit.end.format(DateTimeFormatter.ofPattern("HH:mm"))
|
val end = unit.end.format(DateTimeFormatter.ofPattern("HH:mm"))
|
||||||
var rel by remember { mutableFloatStateOf(getRel()) }
|
var rel by remember {
|
||||||
|
mutableFloatStateOf(getRel(
|
||||||
|
LocalDateTime.of(unit.date, unit.begin).atZone(ZoneId.of("Europe/Moscow")).toEpochSecond(),
|
||||||
|
LocalDateTime.of(unit.date, unit.end).atZone(ZoneId.of("Europe/Moscow")).toEpochSecond(),
|
||||||
|
LocalDateTime.now().atZone(ZoneId.of("Europe/Moscow")).toEpochSecond()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -170,26 +165,24 @@ fun ScheduleItem(modifier: Modifier = Modifier, unit: ScheduleUnit, expanded: Bo
|
|||||||
val millisUntilNextMinute = (60 - seconds) * 1000L - calendar.get(Calendar.MILLISECOND)
|
val millisUntilNextMinute = (60 - seconds) * 1000L - calendar.get(Calendar.MILLISECOND)
|
||||||
|
|
||||||
delay(millisUntilNextMinute)
|
delay(millisUntilNextMinute)
|
||||||
rel = getRel()
|
rel = getRel(
|
||||||
|
LocalDateTime.of(unit.date, unit.begin).atZone(ZoneId.of("Europe/Moscow")).toEpochSecond(),
|
||||||
|
LocalDateTime.of(unit.date, unit.end).atZone(ZoneId.of("Europe/Moscow")).toEpochSecond(),
|
||||||
|
LocalDateTime.now().atZone(ZoneId.of("Europe/Moscow")).toEpochSecond()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val backgroundColor by animateColorAsState(
|
|
||||||
targetValue = if (rel == 1f)
|
|
||||||
MaterialTheme.colorScheme.surfaceContainer
|
|
||||||
else if (rel == -1f)
|
|
||||||
MaterialTheme.colorScheme.secondaryContainer
|
|
||||||
else
|
|
||||||
MaterialTheme.colorScheme.primaryContainer,
|
|
||||||
label = "backgroundTransition"
|
|
||||||
)
|
|
||||||
|
|
||||||
Row (
|
Row (
|
||||||
modifier
|
modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(4.dp)
|
.padding(4.dp)
|
||||||
.clip(RoundedCornerShape(8.dp))
|
.clip(RoundedCornerShape(8.dp))
|
||||||
.background(backgroundColor)
|
.background(
|
||||||
|
if (rel != -1f)
|
||||||
|
MaterialTheme.colorScheme.primaryContainer
|
||||||
|
else MaterialTheme.colorScheme.surfaceContainer
|
||||||
|
)
|
||||||
.padding(8.dp)
|
.padding(8.dp)
|
||||||
){
|
){
|
||||||
Column (Modifier.weight(1f)) {
|
Column (Modifier.weight(1f)) {
|
||||||
@ -282,18 +275,14 @@ fun ScheduleItem(modifier: Modifier = Modifier, unit: ScheduleUnit, expanded: Bo
|
|||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
verticalAlignment = Alignment.CenterVertically) {
|
verticalAlignment = Alignment.CenterVertically) {
|
||||||
Text(begin.toString(), fontWeight = FontWeight.Bold)
|
Text(begin.toString(), fontWeight = FontWeight.Bold)
|
||||||
AnimatedVisibility ((0f < rel) and (rel < 1f)) {
|
if (rel != -1f)
|
||||||
DividerWithMarker(
|
DividerWithMarker(
|
||||||
Modifier
|
Modifier.weight(1f).padding(horizontal = 2.dp),
|
||||||
.weight(1f)
|
|
||||||
.padding(horizontal = 2.dp),
|
|
||||||
positionPercentage = rel,
|
positionPercentage = rel,
|
||||||
color = MaterialTheme.colorScheme.outline,
|
color = MaterialTheme.colorScheme.outline,
|
||||||
thickness = 3.dp,
|
thickness = 3.dp,
|
||||||
markerSize = 8.dp,
|
markerSize = 8.dp,
|
||||||
markerColor = MaterialTheme.colorScheme.primary
|
markerColor = MaterialTheme.colorScheme.primary)
|
||||||
)
|
|
||||||
}
|
|
||||||
Text(end.toString())
|
Text(end.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,7 +302,7 @@ fun ScheduleItem(modifier: Modifier = Modifier, unit: ScheduleUnit, expanded: Bo
|
|||||||
@Composable
|
@Composable
|
||||||
fun DividerWithMarker(
|
fun DividerWithMarker(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
positionPercentage: Float,
|
positionPercentage: Float, // от 0f до 1f (например, 0.5f = 50%)
|
||||||
color: Color = Color.Gray,
|
color: Color = Color.Gray,
|
||||||
thickness: Dp = 1.dp,
|
thickness: Dp = 1.dp,
|
||||||
markerSize: Dp = 8.dp,
|
markerSize: Dp = 8.dp,
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
/*
|
|
||||||
* Created by sweetbread
|
|
||||||
* Copyright (c) 2025. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ru.sweetbread.unn.ui.layout
|
package ru.sweetbread.unn.ui.layout
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@ -27,10 +22,10 @@ import androidx.compose.runtime.mutableStateOf
|
|||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.core.view.WindowCompat
|
|
||||||
import androidx.navigation.compose.NavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
|
import androidx.room.Room
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.engine.android.Android
|
import io.ktor.client.engine.android.Android
|
||||||
import io.ktor.client.plugins.HttpRequestRetry
|
import io.ktor.client.plugins.HttpRequestRetry
|
||||||
@ -75,8 +70,6 @@ class MainActivity : ComponentActivity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
UNNTheme {
|
UNNTheme {
|
||||||
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
|
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="108dp"
|
|
||||||
android:height="108dp"
|
|
||||||
android:viewportWidth="108"
|
|
||||||
android:viewportHeight="108">
|
|
||||||
<path
|
|
||||||
android:fillColor="#3DDC84"
|
|
||||||
android:pathData="M0,0h108v108h-108z" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M9,0L9,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,0L19,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M29,0L29,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M39,0L39,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M49,0L49,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M59,0L59,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M69,0L69,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M79,0L79,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M89,0L89,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M99,0L99,108"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,9L108,9"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,19L108,19"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,29L108,29"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,39L108,39"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,49L108,49"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,59L108,59"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,69L108,69"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,79L108,79"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,89L108,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M0,99L108,99"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,29L89,29"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,39L89,39"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,49L89,49"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,59L89,59"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,69L89,69"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M19,79L89,79"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M29,19L29,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M39,19L39,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M49,19L49,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M59,19L59,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M69,19L69,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:pathData="M79,19L79,89"
|
|
||||||
android:strokeWidth="0.8"
|
|
||||||
android:strokeColor="#33FFFFFF" />
|
|
||||||
</vector>
|
|
@ -1,30 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:aapt="http://schemas.android.com/aapt"
|
|
||||||
android:width="108dp"
|
|
||||||
android:height="108dp"
|
|
||||||
android:viewportWidth="108"
|
|
||||||
android:viewportHeight="108">
|
|
||||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
|
||||||
<aapt:attr name="android:fillColor">
|
|
||||||
<gradient
|
|
||||||
android:endX="85.84757"
|
|
||||||
android:endY="92.4963"
|
|
||||||
android:startX="42.9492"
|
|
||||||
android:startY="49.59793"
|
|
||||||
android:type="linear">
|
|
||||||
<item
|
|
||||||
android:color="#44000000"
|
|
||||||
android:offset="0.0" />
|
|
||||||
<item
|
|
||||||
android:color="#00000000"
|
|
||||||
android:offset="1.0" />
|
|
||||||
</gradient>
|
|
||||||
</aapt:attr>
|
|
||||||
</path>
|
|
||||||
<path
|
|
||||||
android:fillColor="#FFFFFF"
|
|
||||||
android:fillType="nonZero"
|
|
||||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
|
||||||
android:strokeWidth="1"
|
|
||||||
android:strokeColor="#00000000" />
|
|
||||||
</vector>
|
|
Binary file not shown.
Before Width: | Height: | Size: 76 KiB |
@ -1,36 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Sample data extraction rules file; uncomment and customize as necessary.
|
|
||||||
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
|
|
||||||
for details.
|
|
||||||
-->
|
|
||||||
<data-extraction-rules>
|
|
||||||
<cloud-backup>
|
|
||||||
<!--
|
|
||||||
TODO: Use <include> and <exclude> to control what is backed up.
|
|
||||||
The domain can be file, database, sharedpref, external or root.
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
<include domain="file" path="file_to_include"/>
|
|
||||||
<exclude domain="file" path="file_to_exclude"/>
|
|
||||||
<include domain="file" path="include_folder"/>
|
|
||||||
<exclude domain="file" path="include_folder/file_to_exclude"/>
|
|
||||||
<exclude domain="file" path="exclude_folder"/>
|
|
||||||
<include domain="file" path="exclude_folder/file_to_include"/>
|
|
||||||
|
|
||||||
<include domain="sharedpref" path="include_shared_pref1.xml"/>
|
|
||||||
<include domain="database" path="db_name/file_to_include"/>
|
|
||||||
<exclude domain="database" path="db_name/include_folder/file_to_exclude"/>
|
|
||||||
<include domain="external" path="file_to_include"/>
|
|
||||||
<exclude domain="external" path="file_to_exclude"/>
|
|
||||||
<include domain="root" path="file_to_include"/>
|
|
||||||
<exclude domain="root" path="file_to_exclude"/>
|
|
||||||
-->
|
|
||||||
</cloud-backup>
|
|
||||||
<!--
|
|
||||||
<device-transfer>
|
|
||||||
<include .../>
|
|
||||||
<exclude .../>
|
|
||||||
</device-transfer>
|
|
||||||
-->
|
|
||||||
</data-extraction-rules>
|
|
@ -1,14 +1,8 @@
|
|||||||
/*
|
|
||||||
* Created by sweetbread
|
|
||||||
* Copyright (c) 2025. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.androidApplication) apply false
|
alias(libs.plugins.androidApplication) apply false
|
||||||
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
|
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
|
||||||
alias(libs.plugins.kotlin.compose) apply false
|
id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false
|
||||||
id("com.google.devtools.ksp") version "2.1.20-2.0.0" apply false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
|
@ -1,31 +1,30 @@
|
|||||||
[versions]
|
[versions]
|
||||||
acraHttp = "5.11.3"
|
acraHttp = "5.11.3"
|
||||||
agp = "8.7.3"
|
agp = "8.7.0"
|
||||||
calendar = "2.6.2"
|
calendar = "2.5.4"
|
||||||
coilCompose = "2.7.0"
|
coilCompose = "2.7.0"
|
||||||
compose = "1.8.0"
|
compose = "1.6.4" # Updating this will cause an error!
|
||||||
coreSplashscreen = "1.0.1"
|
coreSplashscreen = "1.0.1"
|
||||||
datastorePreferences = "1.1.5"
|
datastorePreferences = "1.1.1"
|
||||||
desugar_jdk_libs = "2.1.5"
|
desugar_jdk_libs = "2.1.2"
|
||||||
glide = "4.16.0"
|
kotlin = "1.9.0"
|
||||||
kotlin = "2.1.20"
|
coreKtx = "1.13.1"
|
||||||
coreKtx = "1.16.0"
|
|
||||||
junitVersion = "1.2.1"
|
junitVersion = "1.2.1"
|
||||||
espressoCore = "3.6.1"
|
espressoCore = "3.6.1"
|
||||||
ktor = "2.3.12"
|
ktor = "2.3.12"
|
||||||
lifecycle = "2.8.7"
|
lifecycle = "2.8.5"
|
||||||
activityCompose = "1.10.1"
|
activityCompose = "1.9.2"
|
||||||
composeBom = "2025.04.01"
|
composeBom = "2024.03.00" # Updating this will cause an error!
|
||||||
appcompat = "1.7.0"
|
appcompat = "1.7.0"
|
||||||
material = "1.12.0"
|
material = "1.12.0"
|
||||||
annotation = "1.9.1"
|
annotation = "1.8.2"
|
||||||
constraintlayout = "2.2.1"
|
constraintlayout = "2.1.4"
|
||||||
activity = "1.10.1"
|
activity = "1.9.2"
|
||||||
navigationCompose = "2.8.9"
|
navigationCompose = "2.7.7" # Updating this will cause an error!
|
||||||
roomRuntime = "2.7.1"
|
roomRuntime = "2.6.1"
|
||||||
secretsGradlePlugin = "2.0.1"
|
secretsGradlePlugin = "2.0.1"
|
||||||
splitties = "3.0.0"
|
splitties = "3.0.0"
|
||||||
materialIconsCoreAndroid = "1.7.8"
|
kefirbb = "1.5"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
acra-http = { module = "ch.acra:acra-http", version.ref = "acraHttp" }
|
acra-http = { module = "ch.acra:acra-http", version.ref = "acraHttp" }
|
||||||
@ -52,7 +51,6 @@ androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-man
|
|||||||
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
|
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
|
||||||
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
|
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
|
||||||
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
|
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
|
||||||
glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
|
|
||||||
ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" }
|
ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" }
|
||||||
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
|
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
|
||||||
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
|
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
|
||||||
@ -66,10 +64,9 @@ androidx-activity = { group = "androidx.activity", name = "activity", version.re
|
|||||||
secrets-gradle-plugin = { module = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin", version.ref = "secretsGradlePlugin" }
|
secrets-gradle-plugin = { module = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin", version.ref = "secretsGradlePlugin" }
|
||||||
splitties-base = { module = "com.louiscad.splitties:splitties-fun-pack-android-base-with-views-dsl", version.ref = "splitties" }
|
splitties-base = { module = "com.louiscad.splitties:splitties-fun-pack-android-base-with-views-dsl", version.ref = "splitties" }
|
||||||
splitties-room = { module = "com.louiscad.splitties:splitties-arch-room", version.ref = "splitties" }
|
splitties-room = { module = "com.louiscad.splitties:splitties-arch-room", version.ref = "splitties" }
|
||||||
androidx-material-icons-core-android = { group = "androidx.compose.material", name = "material-icons-core-android", version.ref = "materialIconsCoreAndroid" }
|
kefirbb = { group = "org.kefirsf", name = "kefirbb", version.ref = "kefirbb" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
androidApplication = { id = "com.android.application", version.ref = "agp" }
|
androidApplication = { id = "com.android.application", version.ref = "agp" }
|
||||||
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
|
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
|
||||||
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
ACRA_URL=https://bugs.coders-squad.com/report
|
|
||||||
ACRA_LOGIN=pMJkqPlNLX4kQ3kK
|
|
||||||
ACRA_PASS=HYY72oV4ybmpCggC
|
|
Loading…
x
Reference in New Issue
Block a user