diff --git a/compose/.gradle/8.0/executionHistory/executionHistory.bin b/compose/.gradle/8.0/executionHistory/executionHistory.bin index 3ce9ac9..67b0401 100644 Binary files a/compose/.gradle/8.0/executionHistory/executionHistory.bin and b/compose/.gradle/8.0/executionHistory/executionHistory.bin differ diff --git a/compose/.gradle/8.0/executionHistory/executionHistory.lock b/compose/.gradle/8.0/executionHistory/executionHistory.lock index e89ba80..3877a20 100644 Binary files a/compose/.gradle/8.0/executionHistory/executionHistory.lock and b/compose/.gradle/8.0/executionHistory/executionHistory.lock differ diff --git a/compose/.gradle/8.0/fileHashes/fileHashes.bin b/compose/.gradle/8.0/fileHashes/fileHashes.bin index 331bcfc..cd71440 100644 Binary files a/compose/.gradle/8.0/fileHashes/fileHashes.bin and b/compose/.gradle/8.0/fileHashes/fileHashes.bin differ diff --git a/compose/.gradle/8.0/fileHashes/fileHashes.lock b/compose/.gradle/8.0/fileHashes/fileHashes.lock index d5fcbb6..b34941e 100644 Binary files a/compose/.gradle/8.0/fileHashes/fileHashes.lock and b/compose/.gradle/8.0/fileHashes/fileHashes.lock differ diff --git a/compose/.gradle/8.0/fileHashes/resourceHashesCache.bin b/compose/.gradle/8.0/fileHashes/resourceHashesCache.bin index 143cac9..9d934c7 100644 Binary files a/compose/.gradle/8.0/fileHashes/resourceHashesCache.bin and b/compose/.gradle/8.0/fileHashes/resourceHashesCache.bin differ diff --git a/compose/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/compose/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 8625175..80b8640 100644 Binary files a/compose/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/compose/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/compose/.gradle/buildOutputCleanup/outputFiles.bin b/compose/.gradle/buildOutputCleanup/outputFiles.bin index cf52a3a..43f6183 100644 Binary files a/compose/.gradle/buildOutputCleanup/outputFiles.bin and b/compose/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/compose/.gradle/file-system.probe b/compose/.gradle/file-system.probe index 8713283..4137f46 100644 Binary files a/compose/.gradle/file-system.probe and b/compose/.gradle/file-system.probe differ diff --git a/compose/.gradle/kotlin/errors/errors-1702209062312.log b/compose/.gradle/kotlin/errors/errors-1702209062312.log new file mode 100644 index 0000000..8923219 --- /dev/null +++ b/compose/.gradle/kotlin/errors/errors-1702209062312.log @@ -0,0 +1,65 @@ +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 + + diff --git a/compose/.idea/modules/app/pmu-demo.app.iml b/compose/.idea/modules/app/pmu-demo.app.iml deleted file mode 100644 index c8f76d2..0000000 --- a/compose/.idea/modules/app/pmu-demo.app.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/compose/.idea/modules/app/pmu-demo.app.main.iml b/compose/.idea/modules/app/pmu-demo.app.main.iml new file mode 100644 index 0000000..3a09fcb --- /dev/null +++ b/compose/.idea/modules/app/pmu-demo.app.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/compose/app/src/main/assets/1.jpg b/compose/app/src/main/assets/1.jpg new file mode 100644 index 0000000..0b14bcf Binary files /dev/null and b/compose/app/src/main/assets/1.jpg differ diff --git a/compose/app/src/main/assets/10.jpg b/compose/app/src/main/assets/10.jpg new file mode 100644 index 0000000..4fbe54c Binary files /dev/null and b/compose/app/src/main/assets/10.jpg differ diff --git a/compose/app/src/main/assets/11.jpg b/compose/app/src/main/assets/11.jpg new file mode 100644 index 0000000..6caa7bc Binary files /dev/null and b/compose/app/src/main/assets/11.jpg differ diff --git a/compose/app/src/main/assets/2.jpg b/compose/app/src/main/assets/2.jpg new file mode 100644 index 0000000..c50d054 Binary files /dev/null and b/compose/app/src/main/assets/2.jpg differ diff --git a/compose/app/src/main/assets/3.jpg b/compose/app/src/main/assets/3.jpg new file mode 100644 index 0000000..d74b8fe Binary files /dev/null and b/compose/app/src/main/assets/3.jpg differ diff --git a/compose/app/src/main/assets/4.jpg b/compose/app/src/main/assets/4.jpg new file mode 100644 index 0000000..9f888bf Binary files /dev/null and b/compose/app/src/main/assets/4.jpg differ diff --git a/compose/app/src/main/assets/5.jpg b/compose/app/src/main/assets/5.jpg new file mode 100644 index 0000000..3e5b52b Binary files /dev/null and b/compose/app/src/main/assets/5.jpg differ diff --git a/compose/app/src/main/assets/6.jpg b/compose/app/src/main/assets/6.jpg new file mode 100644 index 0000000..19db238 Binary files /dev/null and b/compose/app/src/main/assets/6.jpg differ diff --git a/compose/app/src/main/assets/7.jpg b/compose/app/src/main/assets/7.jpg new file mode 100644 index 0000000..39eb99f Binary files /dev/null and b/compose/app/src/main/assets/7.jpg differ diff --git a/compose/app/src/main/assets/8.jpg b/compose/app/src/main/assets/8.jpg new file mode 100644 index 0000000..48044c9 Binary files /dev/null and b/compose/app/src/main/assets/8.jpg differ diff --git a/compose/app/src/main/assets/9.jpg b/compose/app/src/main/assets/9.jpg new file mode 100644 index 0000000..2b2a3c7 Binary files /dev/null and b/compose/app/src/main/assets/9.jpg differ diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt index b84af96..b00d741 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/TankList.kt @@ -29,6 +29,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -42,6 +43,7 @@ import ru.ulstu.`is`.pmu.R import ru.ulstu.`is`.pmu.composeui.navigation.Screen import ru.ulstu.`is`.pmu.tank.composeui.list.TankListViewModel import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tanks.composeui.image.CuteImage import ru.ulstu.`is`.pmu.ui.AppViewModelProvider import ru.ulstu.`is`.pmu.ui.theme.CustomDark import ru.ulstu.`is`.pmu.ui.theme.CustomOrange @@ -121,12 +123,9 @@ fun ColumnItem( .padding(all = 5.dp) .clickable { onClick(tank.tankId) } ) { - Image( - painter = painterResource(id = tank.image), - contentDescription = stringResource(id = R.string.tanks_main_title), - modifier = Modifier - .height(150.dp) - .padding(all = 5.dp) + CuteImage( + imageBitmap = tank.miniature.asImageBitmap(), + modifier = Modifier.weight(0.5F) ) Text( text = tank.name, diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt index 94dae88..06cba66 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/composeui/edit/TankEditViewModel.kt @@ -12,7 +12,10 @@ import com.application.ui.getEmptyBitmap import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import ru.ulstu.`is`.pmu.tank.model.Level import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tank.model.TankExtra +import ru.ulstu.`is`.pmu.tank.model.TankImage import ru.ulstu.`is`.pmu.tank.repository.TankRepository import kotlin.math.tan @@ -61,6 +64,7 @@ class TankEditViewModel( && price > 0 && levelId!! > 0 && nationId!! > 0 + && imageId !! > 0 && image != null } } @@ -87,6 +91,7 @@ fun TankDetails.toTank(uid: Long = 0): Tank = Tank( price = price, levelId = levelId, nationId = nationId, + miniature = miniature, imageId = imageId ) @@ -95,6 +100,7 @@ fun Tank.toDetails(): TankDetails = TankDetails( price = price, levelId = levelId, nationId = nationId, + miniature = miniature, imageId = imageId ) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt index 37f720f..1199cf5 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/TankDao.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.Flow import ru.ulstu.`is`.pmu.tank.model.LevelWithTanks import ru.ulstu.`is`.pmu.tank.model.Nation import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tank.model.TankExtra import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel @Dao @@ -18,12 +19,14 @@ interface TankDao { fun getAll(): Flow> //получить конкретный танк - @Query("select * from tanks where tanks.tankId = :uid") + @Query("select t.*, ti.data from tanks AS t " + + "LEFT JOIN tank_images as ti on t.image_id = ti.image_id " + + "where t.tankId = :uid") fun getTankUid(uid: Long): Flow //получаем все танки пользователя по его Id @Query( - "SELECT t.tankId, t.name, t.price, t.image_id, l.level, n.nationName FROM UserTankCrossRef AS ut " + + "SELECT t.tankId, t.name, t.price, t.image_id, l.level, n.nationName, ti.data AS image FROM UserTankCrossRef AS ut " + "LEFT JOIN tanks as t on ut.tankId = t.tankId " + "LEFT JOIN tank_images as ti on t.image_id = ti.image_id " + "LEFT JOIN levels as l on t.levelId = l.uid " + diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt index 307d88c..c37cd8e 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/dao/UserDao.kt @@ -20,9 +20,10 @@ interface UserDao { //получить конкретного пользователя @Query( - "SELECT u.*, t.*, l.level, n.nationName FROM users AS u " + + "SELECT u.*, t.*, l.level, n.nationName, ti.data AS image FROM users AS u " + "LEFT JOIN UserTankCrossRef as ut on u.userId = ut.userId " + "LEFT JOIN tanks as t on ut.tankId = t.tankId " + + "LEFT JOIN tank_images as ti on ut.tankId = ti.image_id " + "LEFT JOIN levels as l on t.levelId = l.uid " + "LEFT JOIN nations as n on t.nationId = n.uid " + "WHERE u.userId = :uid" diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt index 246f672..8aef640 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/AppDatabase.kt @@ -4,6 +4,7 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -17,12 +18,14 @@ import ru.ulstu.`is`.pmu.tank.dao.UserDao import ru.ulstu.`is`.pmu.tank.model.Level import ru.ulstu.`is`.pmu.tank.model.Nation import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tank.model.TankImage import ru.ulstu.`is`.pmu.tank.model.User import ru.ulstu.`is`.pmu.tank.model.UserTankCrossRef import ru.ulstu.`is`.pmu.tank.model.UserWithTanks //тут, собственно говоря, всё и мутится с БД :))) -@Database(entities = [Nation::class, Level::class, Tank::class, User::class, UserTankCrossRef::class], version = 1, exportSchema = false) +@Database(entities = [Nation::class, Level::class, Tank::class, User::class, UserTankCrossRef::class, TankImage::class], version = 1, exportSchema = false) +@TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun nationDao(): NationDao abstract fun levelDao(): LevelDao @@ -31,7 +34,7 @@ abstract class AppDatabase : RoomDatabase() { abstract fun tankImageDao() : TankImageDao companion object { - private const val DB_NAME: String = "13-db" + private const val DB_NAME: String = "17-db" @Volatile private var INSTANCE: AppDatabase? = null @@ -92,17 +95,17 @@ abstract class AppDatabase : RoomDatabase() { //Tanks val tankDao = database.tankDao() - val tank1 = Tank(20L,"МС-1", 1000, 1L, level1.uid, nation1.uid) - val tank2 = Tank(21L, "Т-34-85", 960000, 1L, level6.uid, nation1.uid) - val tank10 = Tank(22L, "Pershing", 1260000,3L, level8.uid, nation3.uid) - val tank6 = Tank(23L, "Ferdinand", 2500000, 2L, level8.uid, nation2.uid) - val tank3 = Tank(24L, "ИС-2", 1230000, 1L, level7.uid, nation1.uid) - val tank4 = Tank(25L, "ИСУ-152", 2350000, 1L, level8.uid, nation1.uid) - val tank5 = Tank(26L, "Tiger 1", 1430000,2L, level7.uid, nation2.uid) - val tank7 = Tank(27L, "Tiger 2", 2500000, 2L, level8.uid, nation2.uid) - val tank8 = Tank(28L, "Panther", 1350000, 2L, level7.uid, nation2.uid) - val tank9 = Tank(29L, "M4A2E3", 990000, 3L, level6.uid, nation3.uid) - val tank11 = Tank(30L, "Hellcat", 940000, 3L, level7.uid, nation3.uid) + val tank1 = Tank(20L,"МС-1", 1000, PrepopulateStore.getProductMiniature(context, 1L), 1L, level1.uid, nation1.uid) + val tank2 = Tank(21L, "Т-34-85", 960000, PrepopulateStore.getProductMiniature(context, 2L), 2L, level6.uid, nation1.uid) + val tank10 = Tank(22L, "Pershing", 1260000, PrepopulateStore.getProductMiniature(context, 9L), 9L, level8.uid, nation3.uid) + val tank6 = Tank(23L, "Ferdinand", 2500000, PrepopulateStore.getProductMiniature(context, 8L), 8L, level8.uid, nation2.uid) + val tank3 = Tank(24L, "ИС-2", 1230000, PrepopulateStore.getProductMiniature(context, 3L), 3L, level7.uid, nation1.uid) + val tank4 = Tank(25L, "ИСУ-152", 2350000, PrepopulateStore.getProductMiniature(context, 4L), 4L, level8.uid, nation1.uid) + val tank5 = Tank(26L, "Tiger 1", 1430000,PrepopulateStore.getProductMiniature(context, 5L), 5L, level7.uid, nation2.uid) + val tank7 = Tank(27L, "Tiger 2", 2500000, PrepopulateStore.getProductMiniature(context, 6L), 6L, level8.uid, nation2.uid) + val tank8 = Tank(28L, "Panther", 1350000, PrepopulateStore.getProductMiniature(context, 7L), 7L, level7.uid, nation2.uid) + val tank9 = Tank(29L, "M4A2E3", 990000, PrepopulateStore.getProductMiniature(context, 10L), 10L, level6.uid, nation3.uid) + val tank11 = Tank(30L, "Hellcat", 940000, PrepopulateStore.getProductMiniature(context, 11L), 11L, level7.uid, nation3.uid) tankDao.insert(tank1) tankDao.insert(tank2) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/PrepopulateStore.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/PrepopulateStore.kt index df98e57..d564032 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/PrepopulateStore.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/database/PrepopulateStore.kt @@ -14,18 +14,26 @@ class PrepopulateStore { return listOf( TankImage(id = 1, data = getProductImage(context, 1)), TankImage(id = 2, data = getProductImage(context, 2)), - TankImage(id = 3, data = getProductImage(context, 3)) + TankImage(id = 3, data = getProductImage(context, 3)), + TankImage(id = 4, data = getProductImage(context, 4)), + TankImage(id = 5, data = getProductImage(context, 5)), + TankImage(id = 6, data = getProductImage(context, 6)), + TankImage(id = 7, data = getProductImage(context, 7)), + TankImage(id = 8, data = getProductImage(context, 8)), + TankImage(id = 9, data = getProductImage(context, 9)), + TankImage(id = 10, data = getProductImage(context, 10)), + TankImage(id = 11, data = getProductImage(context, 11)) ) } - private fun getProductMiniature(context: Context, imageId: Int): Bitmap { + fun getProductMiniature(context: Context, imageId: Long): Bitmap { val inputStream = context.assets.open("${imageId}.jpg") val bitmap = BitmapFactory.decodeStream(inputStream) return bitmap.resize(miniatureBound) } - private fun getProductImage(context: Context, imageId: Int): Bitmap { - val inputStream = context.assets.open("${imageId}.jpg") + private fun getProductImage(context: Context, imageName: Int): Bitmap { + val inputStream = context.assets.open("${imageName}.jpg") val bitmap = BitmapFactory.decodeStream(inputStream) return bitmap.resize(tankImageBound) } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Level.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Level.kt index 581bba9..8d61914 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Level.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Level.kt @@ -19,13 +19,7 @@ data class Level( level: Int ) : this(null, level) - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - other as Level - if (uid != other.uid) return false - return true - } + companion object { val DEMO_LEVEL = Level( @@ -34,23 +28,21 @@ data class Level( ) } + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Level + + if (uid != other.uid) return false + if (level != other.level) return false + + return true + } + override fun hashCode(): Int { - return (uid ?: -1) as Int + var result = uid?.hashCode() ?: 0 + result = 31 * result + level + return result } } - -fun getLevels(): List { - return listOf( - Level(1), - Level(2), - Level(3), - Level(4), - Level(5), - Level(6), - Level(7), - Level(8), - Level(9), - Level(10) - ) -} - diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Nation.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Nation.kt index 4b46b2b..d6c05b9 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Nation.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Nation.kt @@ -17,24 +17,30 @@ data class Nation( name: String ) : this(null, name) - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - other as Nation - if (uid != other.uid) return false - return true - } - - override fun hashCode(): Int { - return (uid ?: -1) as Int - } - companion object { val DEMO_NATION = Nation( 0, "СССР" ) } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Nation + + if (uid != other.uid) return false + if (nationName != other.nationName) return false + + return true + } + + override fun hashCode(): Int { + var result = uid?.hashCode() ?: 0 + result = 31 * result + nationName.hashCode() + return result + } } fun getNations(): List { diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Student.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Student.kt deleted file mode 100644 index 78bf7c2..0000000 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Student.kt +++ /dev/null @@ -1,19 +0,0 @@ -package ru.ulstu.`is`.pmu.tank.model - -import java.io.Serializable - -data class Student( - val firstName: String, - val lastName: String, - val group: String, - val phone: String, - val email: String -) : Serializable - -fun getStudents(): List { - return listOf( - Student("First1", "Last1", "Group1", "+79998887766", "email1@mail.ru"), - Student("First2", "Last2", "Group1", "+79995553322", "email2@mail.ru"), - Student("First3", "Last3", "Group2", "+79991114466", "email3@mail.ru") - ) -} diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Tank.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Tank.kt index 72d2ad9..d1351b5 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Tank.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/Tank.kt @@ -1,11 +1,15 @@ package ru.ulstu.`is`.pmu.tank.model +import android.graphics.Bitmap import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.Ignore import androidx.room.PrimaryKey +import androidx.room.TypeConverters +import com.application.ui.getEmptyBitmap import ru.ulstu.`is`.pmu.R +import ru.ulstu.`is`.pmu.tank.database.Converters @Entity( tableName = "tanks", @@ -26,6 +30,7 @@ data class Tank( val name: String, @ColumnInfo(name = "price") val price: Int, + val miniature: Bitmap, @ColumnInfo(name = "image_id", index = true) val imageId: Long, @ColumnInfo(name = "levelId", index = true) @@ -37,10 +42,11 @@ data class Tank( constructor( name: String, price: Int, + miniature: Bitmap, imageId: Long, level: Level, nation: Nation - ) : this(null, name, price, imageId, level.uid, nation.uid) + ) : this(null, name, price, miniature, imageId, level.uid, nation.uid) companion object { fun getTank(index: Long = 0): Tank { @@ -48,6 +54,7 @@ data class Tank( index, "Первый танк", 100000, + miniature = getEmptyBitmap(), 1L, 1, 1 @@ -58,13 +65,23 @@ data class Tank( override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false + other as Tank + if (tankId != other.tankId) return false + if (name != other.name) return false + if (price != other.price) return false + if (miniature != other.miniature) return false + if (imageId != other.imageId) return false + if (levelId != other.levelId) return false + if (nationId != other.nationId) return false + return true } override fun hashCode(): Int { return (tankId ?: -1) as Int } + } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankExtra.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankExtra.kt new file mode 100644 index 0000000..3fdcec5 --- /dev/null +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankExtra.kt @@ -0,0 +1,21 @@ +package ru.ulstu.`is`.pmu.tank.model + +import android.graphics.Bitmap +import androidx.room.ColumnInfo +import androidx.room.Embedded +import com.application.ui.getEmptyBitmap + +class TankExtra ( + @Embedded + val tank: Tank, + val image: Bitmap, +) { + companion object { + fun getEmpty(): TankExtra { + return TankExtra( + tank = Tank.getTank(), + image = getEmptyBitmap(), + ) + } + } +} \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankImage.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankImage.kt index ed3cd9b..f8cb2e8 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankImage.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankImage.kt @@ -4,6 +4,8 @@ import android.graphics.Bitmap import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import androidx.room.TypeConverters +import ru.ulstu.`is`.pmu.tank.database.Converters @Entity(tableName = "tank_images") data class TankImage( @@ -13,24 +15,20 @@ data class TankImage( val data: Bitmap ) { override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } - - if (javaClass != other?.javaClass) { - return false - } + if (this === other) return true + if (javaClass != other?.javaClass) return false other as TankImage - if (id != other.id) { - return false - } + if (id != other.id) return false + if (data != other.data) return false return true } override fun hashCode(): Int { - return (id ?: -1) as Int + var result = id?.hashCode() ?: 0 + result = 31 * result + data.hashCode() + return result } } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankWithNationAndLevel.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankWithNationAndLevel.kt index d67cf6e..47f9f02 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankWithNationAndLevel.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/TankWithNationAndLevel.kt @@ -5,6 +5,8 @@ import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey +import androidx.room.TypeConverters +import ru.ulstu.`is`.pmu.tank.database.Converters data class TankWithNationAndLevel ( @PrimaryKey(autoGenerate = true) diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt index 1fbf97c..67cdfef 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/model/User.kt @@ -43,12 +43,24 @@ data class User ( override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false + other as User + if (userId != other.userId) return false + if (nickname != other.nickname) return false + if (email != other.email) return false + if (password != other.password) return false + if (balance != other.balance) return false + return true } override fun hashCode(): Int { - return userId.toInt() + var result = userId.hashCode() + result = 31 * result + nickname.hashCode() + result = 31 * result + email.hashCode() + result = 31 * result + password.hashCode() + result = 31 * result + balance + return result } } \ No newline at end of file diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt index 474f7de..4ed9770 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/OfflineTankRepository.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.flow.Flow import ru.ulstu.`is`.pmu.tank.dao.TankDao import ru.ulstu.`is`.pmu.tank.dao.TankImageDao import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tank.model.TankExtra import ru.ulstu.`is`.pmu.tank.model.TankImage import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt index 6690a66..a47473e 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tank/repository/TankRepository.kt @@ -3,6 +3,7 @@ package ru.ulstu.`is`.pmu.tank.repository import android.graphics.Bitmap import kotlinx.coroutines.flow.Flow import ru.ulstu.`is`.pmu.tank.model.Tank +import ru.ulstu.`is`.pmu.tank.model.TankExtra import ru.ulstu.`is`.pmu.tank.model.TankWithNationAndLevel interface TankRepository { diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Constructor.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Constructor.kt index 3d794f3..ae593fc 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Constructor.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Constructor.kt @@ -20,6 +20,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.ExposedDropdownMenuDefaults.TrailingIcon +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextField @@ -267,6 +268,13 @@ private fun Constructor( modifier = Modifier .width(200.dp), ) + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + value = tankUiState.tankDetails.name, + onValueChange = { onUpdate(tankUiState.tankDetails.copy(name = it)) }, + label = { Text(text = "Название", color = CustomDark) }, + singleLine = true + ) Spacer(Modifier.height(10.dp)) CuteImageUploader( bitmap = tankUiState.tankDetails.image, @@ -316,7 +324,9 @@ private fun Constructor( containerColor = CustomOrange, contentColor = Color.Black ), - onClick = { onClick() }) { + enabled = tankUiState.isEntryValid, + onClick = onClick + ) { //"${student.firstName} ${student.lastName}" Text(text = stringResource(id = R.string.save_account_button), fontSize = 20.sp, fontWeight = FontWeight.Bold) } @@ -424,7 +434,8 @@ private fun Constructor( containerColor = CustomOrange, contentColor = Color.Black ), - onClick = { }) { + onClick = onClick + ) { //"${student.firstName} ${student.lastName}" Text(text = stringResource(id = R.string.create_account_button), fontSize = 20.sp, fontWeight = FontWeight.Bold) } diff --git a/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt b/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt index 987b43d..dc8d50d 100644 --- a/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt +++ b/compose/app/src/main/java/ru/ulstu/is/pmu/tanks/composeui/Hangar.kt @@ -29,6 +29,7 @@ import androidx.compose.runtime.remember 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.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -55,6 +56,7 @@ import ru.ulstu.`is`.pmu.tank.model.Nation 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.ui.AppViewModelProvider import ru.ulstu.`is`.pmu.ui.theme.CustomDark import ru.ulstu.`is`.pmu.ui.theme.CustomYellow @@ -127,13 +129,9 @@ private fun Hangar( .size(width = 170.dp, height = 250.dp) .padding(10.dp, 0.dp, 10.dp, 0.dp) ) { - Image( - painter = painterResource( - id = tankList[index].image - ), - contentDescription = stringResource(id = R.string.tanks_main_title), - modifier = Modifier - .height(130.dp) + CuteImage( + imageBitmap = tankList[index].image.asImageBitmap(), + modifier = Modifier.weight(0.5F) ) Text( text = tankList[index].name, diff --git a/compose/app/src/main/res/drawable/t_34_85.jpg b/compose/app/src/main/res/drawable/t_34_85.jpg new file mode 100644 index 0000000..c50d054 Binary files /dev/null and b/compose/app/src/main/res/drawable/t_34_85.jpg differ