Updated AGP to 8.0
The itemlist amount updating works Started work on the item edit.
This commit is contained in:
2
.idea/compiler.xml
generated
2
.idea/compiler.xml
generated
@@ -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
6
.idea/kotlinc.xml
generated
Normal 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
2
.idea/misc.xml
generated
@@ -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">
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
//}
|
||||
@@ -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...
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user