darker outline of a productView, fixed duplications of abstract ones
This commit is contained in:
		@@ -27,6 +27,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
    private lateinit var takePictureButton: Button
 | 
			
		||||
    private lateinit var scanButton: Button
 | 
			
		||||
 | 
			
		||||
    private lateinit var barcodeText: EditText
 | 
			
		||||
    private lateinit var productNameText: TextView
 | 
			
		||||
    private lateinit var netWeightText: TextView
 | 
			
		||||
 | 
			
		||||
@@ -35,7 +36,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
    private var abstractProduct: AbstractProduct? = null
 | 
			
		||||
    private lateinit var pictureFile: File
 | 
			
		||||
    private lateinit var picturesPath: File
 | 
			
		||||
    private lateinit var barcode: String
 | 
			
		||||
    private var barcode: String = ""
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
@@ -58,6 +59,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
        takePictureButton = findViewById(R.id.takePictureButton)
 | 
			
		||||
        scanButton = findViewById(R.id.scan_button)
 | 
			
		||||
 | 
			
		||||
        barcodeText = findViewById(R.id.barcodeTextEdit)
 | 
			
		||||
        productNameText = findViewById(R.id.productName)
 | 
			
		||||
        netWeightText = findViewById(R.id.netWeight)
 | 
			
		||||
 | 
			
		||||
@@ -79,11 +81,15 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
            val productName = productNameText.text.toString()
 | 
			
		||||
            val netWeight = netWeightText.text
 | 
			
		||||
            if (abstractProduct == null && (!this::pictureFile.isInitialized || !pictureFile.exists())) {
 | 
			
		||||
 | 
			
		||||
                Toast.makeText(this, "Please, make a picture of a product!", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (barcode == "") {
 | 
			
		||||
                Toast.makeText(this, "Please, scan barcode on a product", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (productName == "") {
 | 
			
		||||
                Toast.makeText(this, "Please, write a name of a product!", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
@@ -124,6 +130,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
            scanner.startScan()
 | 
			
		||||
                .addOnSuccessListener { barcode ->
 | 
			
		||||
                    this.barcode = barcode.rawValue.toString()
 | 
			
		||||
                    barcodeText.setText(this.barcode)
 | 
			
		||||
                    val requester = Requester("https://ean-online.ru", "match.php")
 | 
			
		||||
                    requester.request(this, barcode.rawValue!!.toString())
 | 
			
		||||
                    var abstractProduct: AbstractProduct
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ import org.foxarmy.barcodescannerforemployees.fragments.StorageFragment
 | 
			
		||||
class MainActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var binding: ActivityMainBinding
 | 
			
		||||
    public lateinit var adapter: ViewPagerAdapter
 | 
			
		||||
    lateinit var adapter: ViewPagerAdapter
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
@@ -50,9 +50,6 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                "CategoriesFragment" -> {
 | 
			
		||||
                    val addCategoryIntent = Intent(this, AddCategoryActivity::class.java)
 | 
			
		||||
                    val extras = Bundle()
 | 
			
		||||
                    //TODO: Implement parcellable for Category class to simplify this
 | 
			
		||||
//                    extras.putInt("categoryid", 0)
 | 
			
		||||
//                    extras.putString("categoryname", "New category")
 | 
			
		||||
                    extras.putParcelable("category", Category(0, "New category"))
 | 
			
		||||
                    addCategoryIntent.putExtras(extras)
 | 
			
		||||
                    ContextCompat.startActivity(this, addCategoryIntent, extras)
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,19 @@ class StorageFragment : Fragment() {
 | 
			
		||||
        return inflater.inflate(R.layout.fragment_storage, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onResume() {
 | 
			
		||||
        super.onResume()
 | 
			
		||||
 | 
			
		||||
        updateContent()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onStop() {
 | 
			
		||||
        super.onStop()
 | 
			
		||||
 | 
			
		||||
        val grv = view?.findViewById<GridLayout>(R.id.contentGridLayout)
 | 
			
		||||
        grv?.removeAllViews()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun removeSelected() {
 | 
			
		||||
        thread {
 | 
			
		||||
            val grv = view?.findViewById<GridLayout>(R.id.contentGridLayout)
 | 
			
		||||
@@ -71,7 +84,7 @@ class StorageFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
    fun updateContent() {
 | 
			
		||||
        thread {
 | 
			
		||||
            val grv = view?.findViewById<GridLayout>(R.id.contentGridLayout)
 | 
			
		||||
            val grv:GridLayout? = view?.findViewById(R.id.contentGridLayout)
 | 
			
		||||
            activity!!.runOnUiThread{
 | 
			
		||||
                grv?.removeAllViews()
 | 
			
		||||
            }
 | 
			
		||||
@@ -106,12 +119,13 @@ class StorageFragment : Fragment() {
 | 
			
		||||
                        requireContext(),
 | 
			
		||||
                        product
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
                    activity!!.runOnUiThread{
 | 
			
		||||
                        grv?.addView(abstractProduct)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        }.join()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ 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
 | 
			
		||||
@@ -16,6 +17,7 @@ import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.graphics.blue
 | 
			
		||||
import androidx.core.graphics.green
 | 
			
		||||
import androidx.core.graphics.red
 | 
			
		||||
import androidx.core.math.MathUtils.clamp
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
			
		||||
@@ -26,6 +28,7 @@ import java.io.File
 | 
			
		||||
import java.time.Duration
 | 
			
		||||
import java.time.LocalDate
 | 
			
		||||
import java.time.format.DateTimeFormatter
 | 
			
		||||
import kotlin.concurrent.thread
 | 
			
		||||
 | 
			
		||||
class ProductView: LinearLayout {
 | 
			
		||||
    var product: Product = Product()
 | 
			
		||||
@@ -38,6 +41,9 @@ class ProductView: LinearLayout {
 | 
			
		||||
    private lateinit var productAmountTextView: TextView
 | 
			
		||||
    private lateinit var productCategoryView: TextView
 | 
			
		||||
    private lateinit var productLifeSpan: TextView
 | 
			
		||||
    private var backgroundColor: Int = 0xffffff
 | 
			
		||||
    private var strokeColor: Int = 0x000000
 | 
			
		||||
    private lateinit var outline: GradientDrawable
 | 
			
		||||
 | 
			
		||||
    constructor(context: Context, a: AttributeSet) : super(context, a) {
 | 
			
		||||
        activity = getActivity(context)!!
 | 
			
		||||
@@ -72,11 +78,12 @@ class ProductView: LinearLayout {
 | 
			
		||||
    fun update () {
 | 
			
		||||
        val linkedAbstractProduct: AbstractProduct = DBStorageController(activity).findAbstractProductById(DBStorageController(activity).readableDatabase, product.abstractProductId)!!
 | 
			
		||||
 | 
			
		||||
        val picturesDir = File(activity.filesDir, "pictures")
 | 
			
		||||
        picturesDir.mkdirs()
 | 
			
		||||
        val pictureFile = File(picturesDir, "${linkedAbstractProduct.imageHash}.png")
 | 
			
		||||
        val thumbnailsDir = File(activity.cacheDir, "thumbnails")
 | 
			
		||||
        thumbnailsDir.mkdirs()
 | 
			
		||||
        val pictureFile = File(thumbnailsDir, "${linkedAbstractProduct.imageHash}.webp")
 | 
			
		||||
        val imageUri = getImageUri(activity, pictureFile)
 | 
			
		||||
        productImageView.setImageURI(imageUri)
 | 
			
		||||
        productImageView.rotation = 90f
 | 
			
		||||
 | 
			
		||||
        productNameTextView.text = linkedAbstractProduct.name
 | 
			
		||||
        productNetWeightTextView.text = linkedAbstractProduct.netWeight.toString()
 | 
			
		||||
@@ -84,6 +91,7 @@ class ProductView: LinearLayout {
 | 
			
		||||
        productCategoryView.text = DBStorageController(activity).getCategoryNameById(DBStorageController(activity).readableDatabase, linkedAbstractProduct.category)
 | 
			
		||||
        productLifeSpan.text = "${product.dateOfProduction}-${product.dateOfExpiry}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        updateStroke()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -93,10 +101,15 @@ class ProductView: LinearLayout {
 | 
			
		||||
             this.background = ContextCompat.getDrawable(context, R.drawable.outline_selected)
 | 
			
		||||
        } else {
 | 
			
		||||
             if (product.id != 0) {
 | 
			
		||||
                 val color = evaluateColor()
 | 
			
		||||
                 val outline = GradientDrawable()
 | 
			
		||||
                 this.background = outline
 | 
			
		||||
                 (this.background.current as GradientDrawable).setStroke(3, color)
 | 
			
		||||
                 thread {
 | 
			
		||||
                     this.outline = GradientDrawable()
 | 
			
		||||
                     backgroundColor = evaluateColor()
 | 
			
		||||
                     strokeColor = darkenColor(backgroundColor, 0.25) // (backgroundColor and 0xfefefe ) shr 1
 | 
			
		||||
                     this.outline.setColor(backgroundColor)
 | 
			
		||||
                     this.outline.setStroke(4, strokeColor)
 | 
			
		||||
                     this.outline.alpha = 84
 | 
			
		||||
                     this.background = outline
 | 
			
		||||
                 }
 | 
			
		||||
             } else {
 | 
			
		||||
                 this.background = ContextCompat.getDrawable(context, R.drawable.outline)
 | 
			
		||||
             }
 | 
			
		||||
@@ -125,21 +138,37 @@ class ProductView: LinearLayout {
 | 
			
		||||
 | 
			
		||||
        val gradientPosition = 1 - if (percentage > 0.5) (percentage - 0.5) * 2 else percentage * 2
 | 
			
		||||
 | 
			
		||||
        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()
 | 
			
		||||
        val red = clamp((startColor.red + gradientPosition * (endColor.red - startColor.red )).toInt(), 0, 255)
 | 
			
		||||
        val green = clamp((startColor.green  + gradientPosition * (endColor.green - startColor.green)).toInt(), 0, 255)
 | 
			
		||||
        val blue = clamp((startColor.blue + gradientPosition * (endColor.blue - startColor.blue)).toInt(), 0, 255)
 | 
			
		||||
 | 
			
		||||
        var redHex = java.lang.Integer.toHexString(red)
 | 
			
		||||
        var redHex = Integer.toHexString(red)
 | 
			
		||||
        if (redHex.length == 1) redHex = "0$redHex"
 | 
			
		||||
 | 
			
		||||
        var greenHex = java.lang.Integer.toHexString(green)
 | 
			
		||||
        var greenHex = Integer.toHexString(green)
 | 
			
		||||
        if (greenHex.length == 1) greenHex = "0$greenHex"
 | 
			
		||||
 | 
			
		||||
        var blueHex = java.lang.Integer.toHexString(blue)
 | 
			
		||||
        var blueHex = Integer.toHexString(blue)
 | 
			
		||||
        if (blueHex.length == 1 ) blueHex = "0$blueHex"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        val colorString = "#$redHex$greenHex$blueHex"
 | 
			
		||||
        Log.d("QWERTYUIOP", "$red:$green:$blue")
 | 
			
		||||
        Log.d("QWERTYUIOP", "$redHex-$greenHex-$blueHex")
 | 
			
		||||
        Log.d("QWERTYUIOP", colorString)
 | 
			
		||||
        return Color.parseColor(colorString)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    fun darkenColor(color: Int, darkPercent: Double) : Int {
 | 
			
		||||
        val c = Color.valueOf(color)
 | 
			
		||||
 | 
			
		||||
        val red = c.red() * (1 - darkPercent)
 | 
			
		||||
        val green = c.green() * (1 - darkPercent)
 | 
			
		||||
        val blue = c.blue() * (1 - darkPercent)
 | 
			
		||||
        Log.d("QWERTYUIOP", "....A:${c.red()}, ${c.green()}, ${c.blue()}")
 | 
			
		||||
        Log.d("QWERTYUIOP", "....B:${red.toFloat()}, ${green.toFloat()}, ${blue.toFloat()}")
 | 
			
		||||
 | 
			
		||||
        return Color.rgb(red.toFloat(), green.toFloat(), blue.toFloat())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -38,7 +38,7 @@
 | 
			
		||||
                app:layout_constraintBottom_toTopOf="@+id/netWeight"
 | 
			
		||||
                app:layout_constraintHorizontal_bias="0.5"
 | 
			
		||||
                android:visibility="visible" android:hint="@string/product_name_label" android:textColorHint="#737373"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/imageView"/>
 | 
			
		||||
                android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/barcodeTextEdit"/>
 | 
			
		||||
        <EditText
 | 
			
		||||
                android:layout_width="350dp"
 | 
			
		||||
                android:layout_height="50dp"
 | 
			
		||||
@@ -51,6 +51,14 @@
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                android:visibility="visible" android:hint="@string/netWeight" android:textColorHint="#737373"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/productName"/>
 | 
			
		||||
        <EditText
 | 
			
		||||
                android:layout_width="350dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:inputType="text"
 | 
			
		||||
                android:ems="10"
 | 
			
		||||
                android:id="@+id/barcodeTextEdit" app:layout_constraintTop_toBottomOf="@+id/imageView"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                android:layout_marginTop="8dp" android:hint="Barcode" android:textColorHint="#737373"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/category"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
@@ -63,7 +71,7 @@
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/categorySpinner"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/categoryTextView"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/netWeight" android:layout_marginStart="8dp"
 | 
			
		||||
                android:layout_marginTop="20dp"/>
 | 
			
		||||
                android:layout_marginTop="18dp"/>
 | 
			
		||||
        <Button
 | 
			
		||||
                android:text="@string/saveButton"
 | 
			
		||||
                android:layout_width="100dp"
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,4 @@
 | 
			
		||||
 | 
			
		||||
        </androidx.gridlayout.widget.GridLayout>
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent" android:id="@+id/storageLayout">
 | 
			
		||||
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
		Reference in New Issue
	
	Block a user