diff --git a/app/src/main/java/com/unibuy/v2/adapter/CartOperationAdapter.kt b/app/src/main/java/com/unibuy/v2/adapter/CartOperationAdapter.kt index 48fd9d1..da91d0e 100644 --- a/app/src/main/java/com/unibuy/v2/adapter/CartOperationAdapter.kt +++ b/app/src/main/java/com/unibuy/v2/adapter/CartOperationAdapter.kt @@ -1,6 +1,8 @@ package com.unibuy.v2.adapter +import android.graphics.PorterDuff import android.widget.ImageView +import androidx.core.content.ContextCompat import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.unibuy.smartdevice.R @@ -12,6 +14,11 @@ import com.unibuy.v2.UnibuyHelper /** * 購物車品項清單 Adapter(自 Luzui v2 移植)。 * 依賴 BaseRecyclerViewAdapterHelper 的 BaseQuickAdapter。 + * + * Disabled 按鈕規則: + * - buttonMinus:當 cartSelectedCount == 1 時 disabled(最低 1 件,不允許繼續減少) + * - buttonPlus :當 cartSelectedCount >= slot.count(庫存上限)或全車總件數 >= 8 時 disabled + * Disabled 外觀:背景換 bg_quantity_button_disabled、圖示染灰(#ADADAD)、clickable = false。 */ class CartOperationAdapter(layoutResId: Int, data: MutableList) : BaseQuickAdapter(layoutResId, data) { @@ -22,8 +29,9 @@ class CartOperationAdapter(layoutResId: Int, data: MutableList) : override fun convert(holder: BaseViewHolder, item: SlotStructure) { val result = UnibuyHelper.getCartViewModel().createResult(item) + val ctx = holder.itemView.context - // 多國語商品名稱 + // ── 多國語商品名稱 ────────────────────────────────────────────── val lang = java.util.Locale.getDefault().language // "zh" / "en" / "ja" val name = when { lang.equals("en", ignoreCase = true) -> @@ -43,13 +51,58 @@ class CartOperationAdapter(layoutResId: Int, data: MutableList) : holder.setText(R.id.textProductName, name) .setText(R.id.totalPriceTextView, "NT$ ${result.currentItemPrice}") + .setText(R.id.textStock, String.format("庫存%02d件", item.count)) .setText(R.id.textQuantity, "${result.currentItemCount}") .setText(R.id.textPrice, "NT$ ${item.product.realPrice}") + + // ── 商品圖片 ──────────────────────────────────────────────────── val imageProductPicture = holder.getView(R.id.image_product) try { ImageGlide(imageProductPicture.context).fileload(item.product.productImg, imageProductPicture) } catch (e: LogsEmptyException) { e.printStackTrace() } + + // ── 按鈕 Disabled 狀態判斷 ────────────────────────────────────── + val buttonMinus = holder.getView(R.id.buttonMinus) + val buttonPlus = holder.getView(R.id.buttonPlus) + + val isAtMinCount = item.cartSelectedCount <= 1 + val isAtStockLimit = item.cartSelectedCount >= item.count + val isCartFull = UnibuyHelper.getCartViewModel().hasMinimumCartItems() + val isPlusDisabled = isAtStockLimit || isCartFull + + // ── 減少按鈕 ──────────────────────────────────────────────────── + applyButtonState(buttonMinus, disabled = isAtMinCount, ctx) + + // ── 增加按鈕 ──────────────────────────────────────────────────── + applyButtonState(buttonPlus, disabled = isPlusDisabled, ctx) + } + + /** + * 套用啟用 / 停用外觀到 ImageView 按鈕。 + * + * @param button 目標按鈕 + * @param disabled true = 停用(light_gray 背景 + 灰色圖示 + 不可點擊) + * @param ctx Context(取色用) + */ + private fun applyButtonState(button: ImageView, disabled: Boolean, ctx: android.content.Context) { + if (disabled) { + button.setBackgroundResource(R.drawable.bg_quantity_button_disabled) + // setBackgroundResource 會重置 stateListAnimator,需立刻清除以防止陰影跳動 + button.stateListAnimator = null + button.setColorFilter( + ContextCompat.getColor(ctx, R.color.gray), + PorterDuff.Mode.SRC_IN + ) + button.isClickable = false + } else { + button.setBackgroundResource(R.drawable.bg_quantity_outline_button) + // setBackgroundResource 會重置 stateListAnimator,需立刻清除以防止陰影跳動 + button.stateListAnimator = null + button.clearColorFilter() + button.isClickable = true + } } } + diff --git a/app/src/main/java/com/unibuy/v2/ui/ShoppingCartFragment.java b/app/src/main/java/com/unibuy/v2/ui/ShoppingCartFragment.java index a2731da..f0dae20 100644 --- a/app/src/main/java/com/unibuy/v2/ui/ShoppingCartFragment.java +++ b/app/src/main/java/com/unibuy/v2/ui/ShoppingCartFragment.java @@ -196,6 +196,12 @@ public class ShoppingCartFragment extends FragmentAbstract { allCartItems = UnibuyHelper.INSTANCE.getCartViewModel().getAllCartItems(); binding.totalItemsTextView.setText(getString(R.string.total_items_format, allCartItems.getTotalCount())); binding.totalAmountTextView.setText(getString(R.string.total_amount_format, allCartItems.getTotalPrice())); + + if (UnibuyHelper.INSTANCE.getCartViewModel().hasMinimumCartItems()) { + binding.maxItemsWarningTextView.setVisibility(View.VISIBLE); + } else { + binding.maxItemsWarningTextView.setVisibility(View.GONE); + } } /** 清空購物車並切回 VMC 商品列表。 */ diff --git a/app/src/main/res/drawable/bg_quantity_button_disabled.xml b/app/src/main/res/drawable/bg_quantity_button_disabled.xml new file mode 100644 index 0000000..a51aaee --- /dev/null +++ b/app/src/main/res/drawable/bg_quantity_button_disabled.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/app/src/main/res/drawable/bg_quantity_outline_button.xml b/app/src/main/res/drawable/bg_quantity_outline_button.xml index e6e9c1c..a805788 100644 --- a/app/src/main/res/drawable/bg_quantity_outline_button.xml +++ b/app/src/main/res/drawable/bg_quantity_outline_button.xml @@ -1,12 +1,16 @@ - - - - - - - - + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_waste_outline_button.xml b/app/src/main/res/drawable/bg_waste_outline_button.xml index 2de6c1b..45c5635 100644 --- a/app/src/main/res/drawable/bg_waste_outline_button.xml +++ b/app/src/main/res/drawable/bg_waste_outline_button.xml @@ -1,12 +1,16 @@ - - - - - - - - + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_shopping_cart.xml b/app/src/main/res/layout/fragment_shopping_cart.xml index ca0bf2b..2df4570 100644 --- a/app/src/main/res/layout/fragment_shopping_cart.xml +++ b/app/src/main/res/layout/fragment_shopping_cart.xml @@ -8,16 +8,35 @@ android:orientation="vertical"> - + android:gravity="center_vertical"> + + + + + + - - + + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + @@ -69,34 +87,50 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" - android:orientation="horizontal"> + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="vertical"> - - - + android:gravity="center_vertical" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="horizontal"> + + + + + + + - @@ -105,9 +139,13 @@ android:layout_width="44dp" android:layout_height="44dp" android:layout_marginStart="32dp" + android:layout_marginTop="6dp" + android:layout_marginBottom="6dp" + android:layout_marginEnd="6dp" android:padding="10dp" android:background="@drawable/bg_waste_outline_button" android:elevation="4dp" + android:stateListAnimator="@null" android:src="@drawable/close_warning_24" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b39ae17..cd8f04c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -336,6 +336,8 @@ 不能減少了 購物車最多可購買 8 件商品 已加入購物車 + 已達數量上限 + 數據異常 商品出貨成功 請至99號櫃門拿取您的商品