Почтиииии

This commit is contained in:
ElEgEv 2023-12-11 13:56:24 +04:00
parent 91a0de0cc9
commit 38cb371048
21 changed files with 178 additions and 154 deletions

Binary file not shown.

View File

@ -1,65 +0,0 @@
kotlin version: 1.9.10
error message: java.lang.Exception: Could not flush incremental caches in C:\Users\egore\Desktop\MyProjects\ULSTU\TankAppMobile\TanksApp\compose\app\build\kspCaches\debug\symbolLookups: lookups.tab
at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:64)
at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.flush(BasicMapsOwner.kt:48)
at org.jetbrains.kotlin.incremental.LookupStorage.flush(LookupStorage.kt:155)
at com.google.devtools.ksp.IncrementalContext.updateLookupCache(Incremental.kt:262)
at com.google.devtools.ksp.IncrementalContext.updateCaches(Incremental.kt:486)
at com.google.devtools.ksp.IncrementalContext.updateCachesAndOutputs(Incremental.kt:556)
at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.doAnalysis(KotlinSymbolProcessingExtension.kt:357)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:112)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:88)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:256)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:42)
at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:247)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.repeatAnalysisIfNeeded(KotlinToJVMBytecodeCompiler.kt:181)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:87)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:168)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:100)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:46)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1497)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Suppressed: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.io.OutputStream java.io.FilterOutputStream.out accessible: module java.base does not "opens java.io" to unnamed module @59fd97a8
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
at org.jetbrains.kotlin.com.intellij.util.io.IOUtil.syncStream(IOUtil.java:216)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMapValueStorage.appendBytes(PersistentHashMapValueStorage.java:188)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMapValueStorage.appendBytes(PersistentHashMapValueStorage.java:175)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl$2.onDropFromCache(PersistentMapImpl.java:237)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl$2.onDropFromCache(PersistentMapImpl.java:215)
at org.jetbrains.kotlin.com.intellij.util.containers.SLRUMap.clear(SLRUMap.java:172)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.flushAppendCache(PersistentMapImpl.java:930)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.clearAppenderCaches(PersistentMapImpl.java:754)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doForce(PersistentMapImpl.java:741)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.force(PersistentMapImpl.java:730)
at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.force(PersistentHashMap.java:194)
at org.jetbrains.kotlin.incremental.storage.CachingLazyStorage.flush(CachingLazyStorage.kt:115)
at org.jetbrains.kotlin.incremental.storage.BasicMap.flush(BasicMap.kt:40)
at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$flush$1.invoke(BasicMapsOwner.kt:48)
at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$flush$1.invoke(BasicMapsOwner.kt:48)
at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:56)
... 38 more

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="ModuleClassLoaderOverlays">
<paths>
<option value="C:\Users\egore\AppData\Local\Temp\overlay16197097467506260191" />
</paths>
</component>
</module>

View File

@ -66,7 +66,6 @@ import ru.ulstu.`is`.pmu.tank.composeui.TankList
import ru.ulstu.`is`.pmu.tanks.composeui.Account
import ru.ulstu.`is`.pmu.tanks.composeui.Constructor
import ru.ulstu.`is`.pmu.tanks.composeui.Hangar
import ru.ulstu.`is`.pmu.ui.theme.CustomYellow
@OptIn(ExperimentalMaterial3Api::class)
@Composable

View File

@ -23,15 +23,23 @@ import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@ -42,6 +50,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import ru.ulstu.`is`.pmu.R
import ru.ulstu.`is`.pmu.composeui.navigation.Screen
import ru.ulstu.`is`.pmu.tank.composeui.edit.NationDropDownViewModel
@ -127,7 +137,7 @@ fun ColumnItem(
) {
CuteImage(
imageBitmap = tank.miniature.asImageBitmap(),
modifier = Modifier.weight(0.5F)
modifier = Modifier.fillMaxWidth()
)
Text(
text = tank.name,
@ -156,20 +166,20 @@ fun ColumnItem(
}
}
} else {
Column(
modifier = Modifier.width(400.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
){
Text(
text = "Скоро!!!",
fontSize = 30.sp,
fontWeight = FontWeight.Bold,
color = CustomDark,
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxSize()
)
}
Column(
modifier = Modifier.width(400.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
){
Text(
text = "Скоро!!!",
fontSize = 30.sp,
fontWeight = FontWeight.Bold,
color = CustomDark,
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxSize()
)
}
}
}
}
@ -182,7 +192,7 @@ private fun TankList(
nations: NationsListUiState,
listTanks: List<Tank>,
onClick: (uid: Long) -> Unit,
) {
) {
LazyColumn(
verticalArrangement = Arrangement.Bottom,
modifier = Modifier.height(300.dp * nations.nationList.size),

View File

@ -49,7 +49,7 @@ class TankEditViewModel(
suspend fun saveTank() {
if (validateInput()) {
val image: Bitmap = tankUiState.tankDetails.image!!
val image: Bitmap = tankUiState.tankDetails.miniature!!
if (tankUid > 0) {
tankRepository.updateTank(tankUiState.tankDetails.toTank(tankUid), image = image)
} else {
@ -65,7 +65,7 @@ class TankEditViewModel(
&& levelId!! != 0L
&& nationId!! != 0L
&& imageId !! != 0L
&& image != null
&& miniature != null
}
}
}
@ -81,7 +81,6 @@ data class TankDetails(
val levelId: Long? = 0,
val nationId: Long? = 0,
val miniature: Bitmap = getEmptyBitmap(),
val image: Bitmap? = null,
val imageId: Long = -1
)

View File

@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@ -213,8 +214,7 @@ private fun Constructor(
fun handleImageUpload(bitmap: Bitmap) {
tankViewModel.updateUiState(
tankUiState.tankDetails.copy(
image = bitmap.resize(tankImageBound),
miniature = bitmap.resize(miniatureBound)
miniature = bitmap.resize(miniatureBound),
)
)
}
@ -236,67 +236,113 @@ private fun Constructor(
){
Text(text="Добавить танк", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
}
Spacer(Modifier.height(10.dp))
Row(
horizontalArrangement = Arrangement.SpaceAround,
modifier = Modifier.fillMaxWidth()
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth().padding(5.dp)
){
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(0.dp, 5.dp)
) {
Text(text="Название:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
Spacer(Modifier.height(40.dp))
Text(text="Изображение:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
Spacer(Modifier.height(40.dp))
Text(text="Уровень:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
Spacer(Modifier.height(40.dp))
Text(text="Нация:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
Spacer(Modifier.height(40.dp))
Text(text="Стоимость:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
Text(
text = "Название:",
fontSize = 30.sp,
color = Color.Black,
fontWeight = FontWeight.Bold
)
}
Column {
TextField(
value = tankUiState.tankDetails.name,
placeholder = { Text(text = "Название", color = CustomDark) },
onValueChange = { onUpdate(tankUiState.tankDetails.copy(name = it)) },
modifier = Modifier
.width(200.dp),
)
Spacer(Modifier.height(10.dp))
TextField(
value = tankUiState.tankDetails.name,
placeholder = { Text(text = "Название", color = CustomDark) },
onValueChange = { onUpdate(tankUiState.tankDetails.copy(name = it)) },
modifier = Modifier
.width(200.dp),
)
}
Spacer(Modifier.height(10.dp))
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth().padding(5.dp)
){
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(0.dp, 5.dp)
) {
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxWidth()
){
Text(text="Изображение", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
}
CuteImageUploader(
bitmap = tankUiState.tankDetails.image,
bitmap = tankUiState.tankDetails.miniature,
onResult = { bitmap: Bitmap -> handleImageUpload(bitmap) }
)
Spacer(Modifier.height(10.dp))
// Выпадающий список уровней
LevelDropDown(
levelUiState = levelUiState,
levelsListUiState = levelsListUiState,
onLevelUpdate = {
onUpdate(tankUiState.tankDetails.copy(levelId = it.uid))
onLevelUpdate(it)
},
)
Spacer(Modifier.height(10.dp))
// Выпадающий список наций
NationDropDown(
nationUiState = nationUiState,
nationsListUiState = nationsListUiState,
onNationUpdate = {
onUpdate(tankUiState.tankDetails.copy(nationId = it.uid))
onNationUpdate(it)
},
)
Spacer(Modifier.height(10.dp))
TextField(
value = tankUiState.tankDetails.price.toString(),
placeholder = { Text(text = "Стоимость", color = CustomDark) },
onValueChange = { onUpdate(tankUiState.tankDetails.copy(price = it.toInt())) },
modifier = Modifier
.width(200.dp),
)
}
}
Spacer(Modifier.height(10.dp))
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth().padding(5.dp)
){
Column(
verticalArrangement = Arrangement.Center,
modifier = Modifier.padding(0.dp, 5.dp).fillMaxHeight()
) {
Text(text="Уровень:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
}
// Выпадающий список уровней
LevelDropDown(
levelUiState = levelUiState,
levelsListUiState = levelsListUiState,
onLevelUpdate = {
onUpdate(tankUiState.tankDetails.copy(levelId = it.uid))
onLevelUpdate(it)
},
)
}
Spacer(Modifier.height(10.dp))
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth().padding(5.dp)
){
Column(
verticalArrangement = Arrangement.Center,
modifier = Modifier.padding(0.dp, 5.dp).fillMaxHeight()
) {
Text(text="Нация:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
}
// Выпадающий список наций
NationDropDown(
nationUiState = nationUiState,
nationsListUiState = nationsListUiState,
onNationUpdate = {
onUpdate(tankUiState.tankDetails.copy(nationId = it.uid))
onNationUpdate(it)
},
)
}
Spacer(Modifier.height(10.dp))
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth().padding(5.dp)
){
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(0.dp, 5.dp)
) {
Text(text="Стоимость:", fontSize = 30.sp, color = Color.Black, fontWeight = FontWeight.Bold)
}
TextField(
value = tankUiState.tankDetails.price.toString(),
placeholder = { Text(text = "Стоимость", color = CustomDark) },
onValueChange = { onUpdate(tankUiState.tankDetails.copy(price = it.toInt())) },
modifier = Modifier
.width(200.dp),
)
}
Spacer(Modifier.height(10.dp))
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier

View File

@ -13,6 +13,7 @@ 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.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
@ -57,6 +58,8 @@ import ru.ulstu.`is`.pmu.tank.model.Tank
import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel
import ru.ulstu.`is`.pmu.tank.model.UserWithTanks
import ru.ulstu.`is`.pmu.tanks.composeui.image.CuteImage
import ru.ulstu.`is`.pmu.tanks.composeui.image.Dimensions
import ru.ulstu.`is`.pmu.tanks.composeui.image.RoundedCorderImage
import ru.ulstu.`is`.pmu.ui.AppViewModelProvider
import ru.ulstu.`is`.pmu.ui.theme.CustomDark
import ru.ulstu.`is`.pmu.ui.theme.CustomYellow
@ -102,7 +105,7 @@ private fun Hangar(
horizontalArrangement = Arrangement.SpaceAround,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp, 0.dp, 10.dp, 0.dp)
.padding(5.dp, 0.dp, 5.dp, 0.dp)
) {
var supportSizeRow = 1
@ -113,11 +116,13 @@ private fun Hangar(
//цикл для заполнения строки карточек
for (m in 0..supportSizeRow) {
Column(
modifier = Modifier.background(CustomYellow)
modifier = Modifier.background(
color = CustomYellow
)
) {
Box(
Modifier
.background(CustomYellow)
.background(CustomYellow, shape = RoundedCornerShape(Dimensions.cornerRadius))
.height(260.dp),
)
{
@ -126,10 +131,10 @@ private fun Hangar(
containerColor = CustomYellow,
),
modifier = Modifier
.size(width = 170.dp, height = 250.dp)
.size(width = 185.dp, height = 250.dp)
.padding(10.dp, 0.dp, 10.dp, 0.dp)
) {
CuteImage(
RoundedCorderImage(
imageBitmap = tankList[index].image.asImageBitmap(),
modifier = Modifier.weight(0.5F)
)
@ -171,7 +176,6 @@ private fun Hangar(
index++
}
}
Spacer(Modifier.height(20.dp))
}
}
}

View File

@ -19,7 +19,7 @@ fun CuteImage(
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = modifier
.aspectRatio(1F)
.clip(RoundedCornerShape(Dimensions.cornerRadius))
.aspectRatio(16F/12F)
.clip(RoundedCornerShape(topStart = Dimensions.cornerRadius, topEnd = Dimensions.cornerRadius))
)
}

View File

@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
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.width
@ -66,7 +67,7 @@ fun CuteImageUploader(
}
Row(
modifier = Modifier.height(IntrinsicSize.Min)
modifier = Modifier.height(IntrinsicSize.Min).padding(5.dp)
) {
Box(
contentAlignment = Alignment.Center,
@ -75,11 +76,10 @@ fun CuteImageUploader(
color = MaterialTheme.colorScheme.surface,
shape = RoundedCornerShape(Dimensions.cornerRadius)
)
.weight(0.25F)
.aspectRatio(1F)
.weight(1F)
) {
if (bitmap != null) {
CuteImage(
RoundedCorderImage(
imageBitmap = bitmap.asImageBitmap(),
modifier = Modifier.fillMaxSize()
)
@ -93,23 +93,21 @@ fun CuteImageUploader(
}
Spacer(modifier = Modifier.width(10.dp))
Column(
modifier = Modifier
Modifier
.background(
color = MaterialTheme.colorScheme.surface,
shape = RoundedCornerShape(Dimensions.cornerRadius)
)
.fillMaxHeight()
.padding(10.dp)
.weight(0.75F)
.padding(10.dp).align(Alignment.CenterVertically)
) {
Text(
text = title,
color = MaterialTheme.colorScheme.onBackground
)
Spacer(modifier = Modifier.weight(1F))
Spacer(modifier = Modifier.height(10.dp))
Button(
modifier = Modifier
.width(200.dp)
.width(130.dp)
.height(50.dp),
colors = ButtonDefaults.buttonColors(
containerColor = CustomOrange,

View File

@ -0,0 +1,25 @@
package ru.ulstu.`is`.pmu.tanks.composeui.image
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.layout.ContentScale
@Composable
fun RoundedCorderImage(
imageBitmap: ImageBitmap,
modifier: Modifier = Modifier
) {
Image(
bitmap = imageBitmap,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = modifier
.aspectRatio(16F/12F)
.clip(RoundedCornerShape(Dimensions.cornerRadius))
)
}