Updated AGP to 8.0

The itemlist amount updating works

Started work on the item edit.
This commit is contained in:
KaasKop-
2023-04-21 15:54:48 +02:00
parent 28f5c22bf2
commit 159d96f7f3
14 changed files with 171 additions and 52 deletions

2
.idea/compiler.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
<bytecodeTargetLevel target="17" />
</component>
</project>

6
.idea/kotlinc.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.8.10" />
</component>
</project>

2
.idea/misc.xml generated
View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@@ -65,10 +65,12 @@ dependencies {
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1"
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.1")
implementation("androidx.compose.runtime:runtime-livedata:1.4.2")
implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.0'
implementation 'androidx.activity:activity-compose:1.7.1'
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.compose.material3:material3:1.0.1'

View File

@@ -17,6 +17,7 @@ import com.mitchelbv.thuis_c.ui.theme.ThuisTheme
import com.mitchelbv.thuis_c.views.feyenoord.MatchesScreen
import com.mitchelbv.thuis_c.views.freezer.FreezerScreen
import com.mitchelbv.thuis_c.views.freezer.item_list.FreezerItemListScreen
import com.mitchelbv.thuis_c.views.freezer.item_list.edit_item.FreezerItemEditScreen
import com.mitchelbv.thuis_c.views.home.HomeScreen
import com.mitchelbv.thuis_c.views.recipe.RecipeScreen
@@ -88,6 +89,7 @@ class MainActivity : ComponentActivity() {
)
}
// Items list
composable(route = "${FreezerItemListDestination.route}/{freezer_id}", arguments = listOf(
navArgument("freezer_id") {
this.type = NavType.IntType
@@ -95,10 +97,21 @@ class MainActivity : ComponentActivity() {
})
) {
FreezerItemListScreen(
onEditItem = {
onEditItem = {freezerItem ->
// I want onEditItem to open a modal dialog, so not sure if this is needed here...
navController.navigate("${FreezerItemDetail.route}/${freezerItem}")
})
}
// Edit items
composable(route = "${FreezerItemDetail.route}/{freezer_id}", arguments = listOf(
navArgument("freezer_id") {
this.type = NavType.IntType
this.nullable = false
}
)) {
FreezerItemEditScreen()
}
}
}
}

View File

@@ -44,7 +44,7 @@ interface ThuisService {
suspend fun getFreezerItems(): FreezerItems
@GET("api/FreezerItem/{id}")
suspend fun getFreezerItem(id: Int): FreezerItem
suspend fun getFreezerItem(@Path("id") id: Int): FreezerItem
@GET("api/FreezerItem/InFreezer/{id}")
suspend fun getFreezerItemsInFreezer(@Path("id") id: Int): List<FreezerItem>

View File

@@ -5,6 +5,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -20,7 +21,9 @@ fun FreezerItemListScreen(
onEditItem: (Int) -> Unit
) {
val freezerItemListUiState by freezerItemListViewModel.uiState.collectAsStateWithLifecycle()
freezerItemListUiState.items.forEach { freezerItem ->
val itemObserver = freezerItemListUiState.items.observeAsState()
itemObserver.value?.forEach { freezerItem ->
FreezerItemElement(freezerItem = freezerItem, arrowPressed = { item_id: Int, newAmount: Int ->
freezerItemListViewModel.UpdateItemAmount(
item_id,
@@ -28,26 +31,8 @@ fun FreezerItemListScreen(
)
}, onEditItem = onEditItem)
}
// FreezerItemList(
// freezerItemListUiState.items,
// arrowPressed = { kaas: Int, baas: Int ->
// freezerItemListViewModel.UpdateItemAmount(
// kaas,
// baas
// )
// },
// onEditItem = onEditItem
// )
}
FloatingActionButton(onClick = { /*TODO*/ }) {
@Composable
fun FreezerItemList(
freezerItems: List<FreezerItem>,
arrowPressed: (Int, Int) -> Unit,
onEditItem: (Int) -> Unit
) {
freezerItems.forEach { freezerItem ->
FreezerItemElement(freezerItem, arrowPressed = arrowPressed, onEditItem = onEditItem)
}
}
@@ -90,19 +75,3 @@ fun FreezerItemElement(
}
)
}
//@Preview
//@Composable
//fun FreezerItemElementPreview() {
// val freezerItem = FreezerItem(
// freezerItemId = 1,
// item = "Kip",
// amount = 5,
// drawer = 1,
// dateTimeAdded = "now",
// freezerId = 1
// )
// FreezerItemElement(freezerItem = freezerItem)
// FreezerItemElement(freezerItem = freezerItem)
// FreezerItemElement(freezerItem = freezerItem)
//}

View File

@@ -15,8 +15,7 @@ import java.net.ConnectException
import java.net.SocketTimeoutException
data class FreezerItemListUiState(
var items: List<FreezerItem> = listOf(),
// val items: MutableLiveData<List<FreezerItem>> = MutableLiveData<List<FreezerItem>>(),
val items: MutableLiveData<List<FreezerItem>> = MutableLiveData<List<FreezerItem>>(),
var error: String = ""
)
@@ -33,7 +32,7 @@ class FreezerItemListViewModel(savedStateHandle: SavedStateHandle) : ViewModel()
try {
val apiResponse =
ThuisRetrofitHelper.thuis.getFreezerItemsInFreezer(id = freezer_id)
_uiState.value = FreezerItemListUiState(apiResponse)
_uiState.value = FreezerItemListUiState(MutableLiveData(apiResponse))
} catch (e: ConnectException) {
// _uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = )))
@@ -46,16 +45,16 @@ class FreezerItemListViewModel(savedStateHandle: SavedStateHandle) : ViewModel()
fun UpdateItemAmount(item_id: Int, newAmount: Int) {
viewModelScope.launch(Dispatchers.IO) {
try {
val itemList = _uiState.value.items.toMutableList()
val itemList = _uiState.value.items.value!!.toMutableList()
val indexFreezerItem =
itemList.indexOf(uiState.value.items.find { a -> a.freezerItemId == item_id })
itemList.indexOf(uiState.value.items.value!!.find { a -> a.freezerItemId == item_id })
val freezerItemToUpdate = itemList[indexFreezerItem]
freezerItemToUpdate.amount = newAmount
// itemList[indexFreezerItem] = freezerItemToUpdate
val apiResponse =
ThuisRetrofitHelper.thuis.putFreezerItem(item_id, freezerItemToUpdate)
_uiState.update { currentState ->
currentState.copy(items = apiResponse)
currentState.copy(items = MutableLiveData(apiResponse))
}
} catch (e: HttpException) {
// TODO Display a snackbar...

View File

@@ -0,0 +1,77 @@
package com.mitchelbv.thuis_c.views.freezer.item_list.edit_item
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton
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.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.text.isDigitsOnly
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import com.mitchelbv.thuis_c.R
import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem
import com.mitchelbv.thuis_c.views.freezer.item_list.FreezerItemElement
import com.mitchelbv.thuis_c.views.freezer.item_list.FreezerItemListViewModel
@Composable
fun FreezerItemEditScreen(
freezerItemEditViewModel: FreezerItemEditViewModel = viewModel()
) {
val freezerItemUiState by freezerItemEditViewModel.uiState.collectAsStateWithLifecycle()
freezerItemUiState.item?.let { BuildEditView(freezerItem = it) }
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BuildEditView(freezerItem: FreezerItem) {
var itemText by rememberSaveable() {
mutableStateOf(freezerItem.item)
}
Column(verticalArrangement = Arrangement.SpaceBetween) {
TextField(
label = { Text(stringResource(id = R.string.freezer_item_edit_description)) },
// value = "${freezerItem.item}",
value = "${itemText}",
onValueChange = {
freezerItem.item = it
itemText = it
})
TextField(
label = { Text(stringResource(id = R.string.freezer_item_edit_amount)) },
value = "${freezerItem.amount}",
onValueChange = { value ->
if (value.isDigitsOnly()) {
freezerItem.amount = value.toInt()
}
},
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
TextField(
label = { Text(stringResource(id = R.string.freezer_item_edit_drawer)) },
value = "${freezerItem.drawer}",
onValueChange = {})
}
}
@Preview
@Composable
fun EditViewPreview() {
val test = FreezerItem(freezerItemId = 1, item = "Kip", 5, 5, "12-01-01", 1)
BuildEditView(freezerItem = test)
}

View File

@@ -0,0 +1,44 @@
package com.mitchelbv.thuis_c.views.freezer.item_list.edit_item
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.mitchelbv.thuis_c.network.thuis.ThuisRetrofitHelper
import com.mitchelbv.thuis_c.network.thuis.responses.FreezerItem
import com.mitchelbv.thuis_c.views.freezer.item_list.FreezerItemListUiState
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import java.net.ConnectException
data class FreezerItemEditUiState(
val item: FreezerItem? = null,
var error: String = ""
)
class FreezerItemEditViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
private val _uiState = MutableStateFlow(FreezerItemEditUiState())
val uiState: StateFlow<FreezerItemEditUiState> = _uiState.asStateFlow()
init {
savedStateHandle.get<Int>("freezer_id")?.let { fillEditBoxes(it) }
}
fun fillEditBoxes(freezer_id: Int) {
viewModelScope.launch(Dispatchers.IO) {
try {
val apiResponse =
ThuisRetrofitHelper.thuis.getFreezerItem(id = freezer_id)
_uiState.value = FreezerItemEditUiState(item = apiResponse)
} catch (e: ConnectException) {
// _uiState.value = FreezerItemListUiState(listOf(FreezerItem(item = )))
_uiState.value = FreezerItemEditUiState(error = "Oeps")
}
}
}
}

View File

@@ -8,8 +8,14 @@
<string name="home_card_cards">Cards</string>
<string name="home_card_freezer">Freezers</string>
<!-- Freezer item list -->
<string name="freezer_list_empty">No freezer(s)</string>
<string name="edit_freezer">Edit freezer</string>
<string name="freezer_item_count_partial">items</string>
<string name="freezer_item_drawer_partial">Drawer</string>
<!-- Freezer item edit view -->
<string name="freezer_item_edit_description">Description</string>
<string name="freezer_item_edit_amount">Amount</string>
<string name="freezer_item_edit_drawer">Drawer</string>
</resources>

View File

@@ -1,10 +1,10 @@
buildscript {
ext {
compose_version = '1.4.1'
compose_version = '1.4.2'
}
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'com.android.application' version '8.0.0' apply false
id 'com.android.library' version '8.0.0' apply false
id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
}

View File

@@ -20,4 +20,7 @@ kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
android.nonTransitiveRClass=true
android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false
org.gradle.unsafe.configuration-cache=true

View File

@@ -1,6 +1,6 @@
#Mon Oct 31 14:59:45 CET 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME