Added stroke that depends on product freshness

This commit is contained in:
leca 2024-10-15 13:13:40 +03:00
parent 8ef72db4e4
commit 6c4f11bcb0
3 changed files with 82 additions and 6 deletions

View File

@ -2,13 +2,21 @@ package org.foxarmy.barcodescannerforemployees.views
import android.app.Activity
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.core.graphics.blue
import androidx.core.graphics.green
import androidx.core.graphics.red
import org.foxarmy.barcodescannerforemployees.DBStorageController
import org.foxarmy.barcodescannerforemployees.R
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
@ -16,6 +24,9 @@ import org.foxarmy.barcodescannerforemployees.dataclasses.Product
import org.foxarmy.barcodescannerforemployees.getActivity
import org.foxarmy.barcodescannerforemployees.getImageUri
import java.io.File
import java.time.LocalDate
import java.time.Period
import java.time.format.DateTimeFormatter
class ProductView: LinearLayout {
var product: Product = Product()
@ -35,6 +46,7 @@ class ProductView: LinearLayout {
inflater.inflate(R.layout.product_view, this)
}
@RequiresApi(Build.VERSION_CODES.O)
constructor(activity: Activity, context: Context, product: Product) : super(context) {
this.product = product
this.activity = activity
@ -48,9 +60,15 @@ class ProductView: LinearLayout {
productCategoryView = findViewById(R.id.categoryView)
productLifeSpan = findViewById(R.id.dateSpan)
findViewById<ConstraintLayout>(R.id.productLayout).setOnLongClickListener {
updateStroke()
true
}
update()
}
@RequiresApi(Build.VERSION_CODES.O)
fun update () {
val linkedAbstractProduct: AbstractProduct = DBStorageController(activity).findAbstractProductById(DBStorageController(activity).readableDatabase, product.abstractProductId)!!
@ -66,12 +84,66 @@ class ProductView: LinearLayout {
productCategoryView.text = DBStorageController(activity).getCategoryNameById(DBStorageController(activity).readableDatabase, linkedAbstractProduct.category)
productLifeSpan.text = "${product.dateOfProduction}-${product.dateOfExpiry}"
this.background = ContextCompat.getDrawable(context, if (isProductSelected) R.drawable.outline_selected else R.drawable.outline)
updateStroke()
}
findViewById<ConstraintLayout>(R.id.productLayout).setOnLongClickListener {
isProductSelected = !isProductSelected
this.background = ContextCompat.getDrawable(context, if (isProductSelected) R.drawable.outline_selected else R.drawable.outline)
true
@RequiresApi(Build.VERSION_CODES.O)
fun updateStroke() {
if (isProductSelected) {
this.background = ContextCompat.getDrawable(context, R.drawable.outline_selected)
} else {
this.background = ContextCompat.getDrawable(context, R.drawable.outline)
val color = evaluateColor()
(this.background.current as GradientDrawable).setStroke(3, color)
}
}
@RequiresApi(Build.VERSION_CODES.O)
fun evaluateColor(): Int {
val dateFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("d.M.yyyy")
val fresh = LocalDate.parse(product.dateOfProduction, dateFormatter)
val expired = LocalDate.parse(product.dateOfExpiry, dateFormatter)
val shelfLife = Period.between(fresh, expired).days
val today = LocalDate.parse(LocalDate.now().format(dateFormatter), dateFormatter)
Log.d("QWERTYUIOP", today.toString())
val daysBeforeExpiry = Period.between(today, expired).days
val freshnessPercentage: Double = daysBeforeExpiry / shelfLife.toDouble()
Log.d("QWERTYUIOP", "$daysBeforeExpiry, $shelfLife, $freshnessPercentage")
return calculateFreshnessGradient(freshnessPercentage)
}
fun calculateFreshnessGradient(percentage: Double): Int {
val startColor = ContextCompat.getColor(context, if (percentage > 0.5) R.color.full_freshness else R.color.half_freshness)
val endColor = ContextCompat.getColor(context, if (percentage > 0.5) R.color.half_freshness else R.color.expired_freshness)
val gradientPosition = 1 - if (percentage > 0.5) (percentage - 0.5) * 2 else percentage * 2
Log.d("QWERTYUIOP", "GP: $gradientPosition")
val red = (startColor.red + gradientPosition * (endColor.red - startColor.red )).toInt()
val green = (startColor.green + gradientPosition * (endColor.green - startColor.green)).toInt()
val blue = (startColor.blue + gradientPosition * (endColor.blue - startColor.blue)).toInt()
var redHex = java.lang.Integer.toHexString(red)
if (redHex.length == 1) redHex = "0$redHex"
var greenHex = java.lang.Integer.toHexString(green)
if (greenHex.length == 1) greenHex = "0$greenHex"
var blueHex = java.lang.Integer.toHexString(blue)
if (blueHex.length == 1 ) blueHex = "0$blueHex"
val colorString = "#$redHex$greenHex$blueHex"
Log.d("QWERTYUIOP", "Color: $colorString\nRGB:$red:$green:$blue")
return Color.parseColor(colorString)
}
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
<stroke android:width="1dip" android:color="#28283f"/>
<stroke android:width="1dip" android:color="#28283f" android:id="@+id/test"/>
<padding android:bottom="1dp" android:top="1dp" android:left="1dp" android:right="1dp" />
</shape>

View File

@ -10,4 +10,8 @@
<color name="light_blue_A200">#FF40C4FF</color>
<color name="light_blue_A400">#FF00B0FF</color>
<color name="black_overlay">#66000000</color>
<color name="full_freshness">#5AFF30</color>
<color name="half_freshness">#FFF200</color>
<color name="expired_freshness">#ff0000</color>
</resources>