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.app.Activity
import android.content.Context import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat 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.DBStorageController
import org.foxarmy.barcodescannerforemployees.R import org.foxarmy.barcodescannerforemployees.R
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct 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.getActivity
import org.foxarmy.barcodescannerforemployees.getImageUri import org.foxarmy.barcodescannerforemployees.getImageUri
import java.io.File import java.io.File
import java.time.LocalDate
import java.time.Period
import java.time.format.DateTimeFormatter
class ProductView: LinearLayout { class ProductView: LinearLayout {
var product: Product = Product() var product: Product = Product()
@ -35,6 +46,7 @@ class ProductView: LinearLayout {
inflater.inflate(R.layout.product_view, this) inflater.inflate(R.layout.product_view, this)
} }
@RequiresApi(Build.VERSION_CODES.O)
constructor(activity: Activity, context: Context, product: Product) : super(context) { constructor(activity: Activity, context: Context, product: Product) : super(context) {
this.product = product this.product = product
this.activity = activity this.activity = activity
@ -48,9 +60,15 @@ class ProductView: LinearLayout {
productCategoryView = findViewById(R.id.categoryView) productCategoryView = findViewById(R.id.categoryView)
productLifeSpan = findViewById(R.id.dateSpan) productLifeSpan = findViewById(R.id.dateSpan)
findViewById<ConstraintLayout>(R.id.productLayout).setOnLongClickListener {
updateStroke()
true
}
update() update()
} }
@RequiresApi(Build.VERSION_CODES.O)
fun update () { fun update () {
val linkedAbstractProduct: AbstractProduct = DBStorageController(activity).findAbstractProductById(DBStorageController(activity).readableDatabase, product.abstractProductId)!! 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) productCategoryView.text = DBStorageController(activity).getCategoryNameById(DBStorageController(activity).readableDatabase, linkedAbstractProduct.category)
productLifeSpan.text = "${product.dateOfProduction}-${product.dateOfExpiry}" 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"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/transparent" /> <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" /> <padding android:bottom="1dp" android:top="1dp" android:left="1dp" android:right="1dp" />
</shape> </shape>

View File

@ -10,4 +10,8 @@
<color name="light_blue_A200">#FF40C4FF</color> <color name="light_blue_A200">#FF40C4FF</color>
<color name="light_blue_A400">#FF00B0FF</color> <color name="light_blue_A400">#FF00B0FF</color>
<color name="black_overlay">#66000000</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> </resources>