Added stroke that depends on product freshness
This commit is contained in:
		@@ -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)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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>
 | 
			
		||||
@@ -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>
 | 
			
		||||
		Reference in New Issue
	
	Block a user