From b3b4562f21fbf6ca497f027661bfe4c511ec904a Mon Sep 17 00:00:00 2001 From: Reimar Date: Thu, 8 May 2025 10:04:29 +0200 Subject: [PATCH] Allow checking/unchecking shopping items --- .../easyeat/helpers/shopping_list.kt | 4 ++ .../easyeat/models/ShoppingListItem.kt | 2 +- .../ui/shopping_list/ShoppingItemAdapter.kt | 40 +++++++++++++++++-- .../ui/shopping_list/ShoppingListFragment.kt | 23 ++++++++++- .../src/main/res/drawable/ic_check_24px.xml | 10 +++++ .../main/res/layout/shopping_list_item.xml | 10 +++++ app/app/src/main/res/values-night/themes.xml | 1 + app/app/src/main/res/values/attrs.xml | 6 +++ app/app/src/main/res/values/colors.xml | 1 + app/app/src/main/res/values/strings.xml | 1 + app/app/src/main/res/values/themes.xml | 1 + 11 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 app/app/src/main/res/drawable/ic_check_24px.xml create mode 100644 app/app/src/main/res/values/attrs.xml diff --git a/app/app/src/main/java/tech/mercantec/easyeat/helpers/shopping_list.kt b/app/app/src/main/java/tech/mercantec/easyeat/helpers/shopping_list.kt index 1d5684b..aa42d3e 100644 --- a/app/app/src/main/java/tech/mercantec/easyeat/helpers/shopping_list.kt +++ b/app/app/src/main/java/tech/mercantec/easyeat/helpers/shopping_list.kt @@ -16,3 +16,7 @@ fun addShoppingItem(ctx: Context, name: String, amount: Double?, unit: String?) requestJson(ctx, "POST", "/api/ShoppingList/add", request) } + +fun toggleShoppingItemChecked(ctx: Context, item: ShoppingListItem) { + requestJson(ctx, "PUT", "/api/ShoppingList/check?itemId=${item.id}", null) +} diff --git a/app/app/src/main/java/tech/mercantec/easyeat/models/ShoppingListItem.kt b/app/app/src/main/java/tech/mercantec/easyeat/models/ShoppingListItem.kt index 1710ca0..a97a6a7 100644 --- a/app/app/src/main/java/tech/mercantec/easyeat/models/ShoppingListItem.kt +++ b/app/app/src/main/java/tech/mercantec/easyeat/models/ShoppingListItem.kt @@ -3,4 +3,4 @@ package tech.mercantec.easyeat.models import kotlinx.serialization.Serializable @Serializable -data class ShoppingListItem(val id: Int, val name: String, val amount: Double?, val unit: String?, val checked: Boolean) +data class ShoppingListItem(val id: Int, var name: String, var amount: Double?, var unit: String?, var checked: Boolean) diff --git a/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingItemAdapter.kt b/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingItemAdapter.kt index 7458594..be952f2 100644 --- a/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingItemAdapter.kt +++ b/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingItemAdapter.kt @@ -1,16 +1,20 @@ package tech.mercantec.easyeat.ui.shopping_list import android.content.Context +import android.graphics.Paint import android.icu.text.DecimalFormat +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import android.widget.ImageView import android.widget.TextView +import androidx.core.content.ContextCompat import tech.mercantec.easyeat.R import tech.mercantec.easyeat.models.ShoppingListItem -class ShoppingItemAdapter(context: Context, items: Array) +class ShoppingItemAdapter(context: Context, items: ArrayList) : ArrayAdapter(context, R.layout.shopping_list_item, items) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { @@ -18,9 +22,37 @@ class ShoppingItemAdapter(context: Context, items: Array) val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.shopping_list_item, parent, false) item?.let { item -> - view.findViewById(R.id.amount).text = DecimalFormat("#.##").format(item.amount) - view.findViewById(R.id.unit).text = item.unit - view.findViewById(R.id.name).text = item.name + val checkmarkView = view.findViewById(R.id.checkmark) + val amountView = view.findViewById(R.id.amount) + val unitView = view.findViewById(R.id.unit) + val nameView = view.findViewById(R.id.name) + val textViews = listOf(amountView, unitView, nameView) + + amountView.text = DecimalFormat("#.##").format(item.amount) + unitView.text = item.unit + nameView.text = item.name + + if (item.checked) { + textViews.forEach { + it.paintFlags = it.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + + val color = TypedValue() + context.theme.resolveAttribute(R.attr.colorDisabled, color, true) + it.setTextColor(ContextCompat.getColor(context, color.resourceId)) + + checkmarkView.visibility = View.VISIBLE + } + } else { + textViews.forEach { + it.paintFlags = it.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + + val color = TypedValue() + context.theme.resolveAttribute(android.R.attr.textColorSecondary, color, true) + it.setTextColor(ContextCompat.getColor(context, color.resourceId)) + + checkmarkView.visibility = View.INVISIBLE + } + } } return view diff --git a/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingListFragment.kt b/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingListFragment.kt index fc074be..b1e9dc3 100644 --- a/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingListFragment.kt +++ b/app/app/src/main/java/tech/mercantec/easyeat/ui/shopping_list/ShoppingListFragment.kt @@ -16,7 +16,10 @@ import tech.mercantec.easyeat.databinding.FragmentShoppingListBinding import tech.mercantec.easyeat.helpers.ApiRequestException import tech.mercantec.easyeat.helpers.addShoppingItem import tech.mercantec.easyeat.helpers.getShoppingList +import tech.mercantec.easyeat.helpers.toggleShoppingItemChecked +import tech.mercantec.easyeat.models.Dish import tech.mercantec.easyeat.models.ShoppingListItem +import java.util.ArrayList import kotlin.concurrent.thread class ShoppingListFragment : Fragment() { @@ -48,10 +51,28 @@ class ShoppingListFragment : Fragment() { } activity?.runOnUiThread { - binding.shoppingList.adapter = ShoppingItemAdapter(requireContext(), items) + binding.shoppingList.adapter = ShoppingItemAdapter(requireContext(), ArrayList(items.toMutableList())) } } + binding.shoppingList.setOnItemClickListener { parent, view, position, id -> + val item = parent.getItemAtPosition(position) as ShoppingListItem + item.checked = !item.checked + + thread { + try { + toggleShoppingItemChecked(requireContext(), item) + } catch (e: ApiRequestException) { + Toast.makeText(requireContext(), e.message, Toast.LENGTH_LONG).show() + } + } + + val adapter = parent.adapter as ShoppingItemAdapter + + adapter.remove(item) + adapter.insert(item, position) + } + binding.addToShoppingList.setOnClickListener { val view = requireActivity().layoutInflater.inflate(R.layout.dialog_add_to_shopping_list, null) diff --git a/app/app/src/main/res/drawable/ic_check_24px.xml b/app/app/src/main/res/drawable/ic_check_24px.xml new file mode 100644 index 0000000..280f0bd --- /dev/null +++ b/app/app/src/main/res/drawable/ic_check_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/app/src/main/res/layout/shopping_list_item.xml b/app/app/src/main/res/layout/shopping_list_item.xml index 69280e3..f71e2d3 100644 --- a/app/app/src/main/res/layout/shopping_list_item.xml +++ b/app/app/src/main/res/layout/shopping_list_item.xml @@ -1,11 +1,21 @@ + + @color/dark_cyan @color/white @color/dark_gray + @color/dark_gray @color/dark_cyan ?attr/colorPrimaryVariant @color/black diff --git a/app/app/src/main/res/values/attrs.xml b/app/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..d82cf71 --- /dev/null +++ b/app/app/src/main/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/app/src/main/res/values/colors.xml b/app/app/src/main/res/values/colors.xml index 9c94335..4af2f08 100644 --- a/app/app/src/main/res/values/colors.xml +++ b/app/app/src/main/res/values/colors.xml @@ -7,4 +7,5 @@ #FF242424 #FFF9F9F9 #D62D2D + #4CAF50 diff --git a/app/app/src/main/res/values/strings.xml b/app/app/src/main/res/values/strings.xml index 3c50a80..741c1d1 100644 --- a/app/app/src/main/res/values/strings.xml +++ b/app/app/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ Beef Change password Log out + Checked g diff --git a/app/app/src/main/res/values/themes.xml b/app/app/src/main/res/values/themes.xml index 30afe6a..eff4e5d 100644 --- a/app/app/src/main/res/values/themes.xml +++ b/app/app/src/main/res/values/themes.xml @@ -4,6 +4,7 @@ @color/dark_cyan @color/white @color/dark_gray + @color/gray ?attr/colorPrimaryVariant @color/white