added productView and things around
This commit is contained in:
		@@ -1,11 +1,13 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees
 | 
			
		||||
 | 
			
		||||
import android.content.ContentValues
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.database.DatabaseUtils
 | 
			
		||||
import android.database.sqlite.SQLiteDatabase
 | 
			
		||||
import android.database.sqlite.SQLiteOpenHelper
 | 
			
		||||
import android.provider.BaseColumns
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.Product
 | 
			
		||||
import java.io.File
 | 
			
		||||
 | 
			
		||||
object AbstractProductContract {
 | 
			
		||||
@@ -166,6 +168,17 @@ class DBStorageController(context: Context) : SQLiteOpenHelper(context, DATABASE
 | 
			
		||||
        db.delete(AbstractProductContract.AbstractProductEntry.TABLE_NAME, BaseColumns._ID + "=" + id, null)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun insertNewProduct(db: SQLiteDatabase, product: Product) {
 | 
			
		||||
        val values = ContentValues().apply {
 | 
			
		||||
            put(ProductContract.ProductEntry.ABSTRACT_PRODUCT_ID, product.abstractProductId)
 | 
			
		||||
            put(ProductContract.ProductEntry.AMOUNT, product.amount)
 | 
			
		||||
            put(ProductContract.ProductEntry.DATE_OF_PRODUCTION, product.dateOfProduction)
 | 
			
		||||
            put(ProductContract.ProductEntry.EXPIRY_DATE, product.dateOfExpiry)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        db.insert(ProductContract.ProductEntry.TABLE_NAME, null, values)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun findAbstractProductByBarcode (db: SQLiteDatabase, barcode: String) : AbstractProduct? {
 | 
			
		||||
        var abstractProduct: AbstractProduct? = null
 | 
			
		||||
        val projection = arrayOf(
 | 
			
		||||
@@ -196,6 +209,38 @@ class DBStorageController(context: Context) : SQLiteOpenHelper(context, DATABASE
 | 
			
		||||
        return abstractProduct
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun findAbstractProductById(db: SQLiteDatabase, id: Int): AbstractProduct? {
 | 
			
		||||
        var abstractProduct: AbstractProduct? = null
 | 
			
		||||
        val projection = arrayOf(
 | 
			
		||||
            BaseColumns._ID,
 | 
			
		||||
            AbstractProductContract.AbstractProductEntry.PRODUCT_NAME,
 | 
			
		||||
            AbstractProductContract.AbstractProductEntry.PRODUCT_NET_WEIGHT,
 | 
			
		||||
            AbstractProductContract.AbstractProductEntry.IMAGE_FILENAME,
 | 
			
		||||
            AbstractProductContract.AbstractProductEntry.CATEGORY,
 | 
			
		||||
            AbstractProductContract.AbstractProductEntry.BARCODE
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        val selection = "${BaseColumns._ID} = ?"
 | 
			
		||||
        val selectionArgs = arrayOf(id.toString())
 | 
			
		||||
 | 
			
		||||
        val cursor = db.query(AbstractProductContract.AbstractProductEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, null)
 | 
			
		||||
 | 
			
		||||
        with (cursor) {
 | 
			
		||||
            while (moveToNext()) {
 | 
			
		||||
                val productId = getInt(getColumnIndexOrThrow(BaseColumns._ID))
 | 
			
		||||
                val barcode = getString(getColumnIndexOrThrow(AbstractProductContract.AbstractProductEntry.BARCODE))
 | 
			
		||||
                val name = getString(getColumnIndexOrThrow(AbstractProductContract.AbstractProductEntry.PRODUCT_NAME))
 | 
			
		||||
                val netWeight = getDouble(getColumnIndexOrThrow(AbstractProductContract.AbstractProductEntry.PRODUCT_NET_WEIGHT))
 | 
			
		||||
                val imageHash = getString((getColumnIndexOrThrow(AbstractProductContract.AbstractProductEntry.IMAGE_FILENAME)))
 | 
			
		||||
                val category = getInt(getColumnIndexOrThrow(AbstractProductContract.AbstractProductEntry.CATEGORY))
 | 
			
		||||
 | 
			
		||||
                abstractProduct = AbstractProduct(productId, barcode, name, netWeight, imageHash, category)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return abstractProduct
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        const val DATABASE_VERSION = 1
 | 
			
		||||
        const val DATABASE_NAME = "database.db"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,40 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.activities
 | 
			
		||||
 | 
			
		||||
import android.app.DatePickerDialog
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.widget.Button
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.*
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import com.google.mlkit.vision.codescanner.GmsBarcodeScanning
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.Product
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.views.AbstractProductView
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var scanButton: Button
 | 
			
		||||
    private lateinit var abstractProductView: AbstractProductView
 | 
			
		||||
    private lateinit var expiryDateRadioButton: RadioButton
 | 
			
		||||
    private lateinit var shelfLifeRadioButton: RadioButton
 | 
			
		||||
 | 
			
		||||
    private lateinit var expiryDateTextView: TextView
 | 
			
		||||
    private lateinit var expiryDateSelectButton: Button
 | 
			
		||||
 | 
			
		||||
    private lateinit var shelfLifeTextView: TextView
 | 
			
		||||
    private lateinit var shelfLifeTextEdit: EditText
 | 
			
		||||
 | 
			
		||||
    private lateinit var amountTextEdit: EditText
 | 
			
		||||
 | 
			
		||||
    private lateinit var dateOfProductionSelectButton: Button
 | 
			
		||||
    private lateinit var saveProductButton: Button
 | 
			
		||||
 | 
			
		||||
    private var expiryDateOverShelfLife: Boolean? = null
 | 
			
		||||
    private var dateOfProduction: String = ""
 | 
			
		||||
    private var dateOfExpiry: String = ""
 | 
			
		||||
 | 
			
		||||
    private var barcode: String = ""
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
@@ -21,27 +42,139 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
        setContentView(R.layout.fragment_add_product)
 | 
			
		||||
 | 
			
		||||
        val extras = intent.extras
 | 
			
		||||
        val product = extras!!.get("product") as Product?
 | 
			
		||||
        var product = extras!!.get("product") as Product?
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        scanButton = findViewById(R.id.scanButton)
 | 
			
		||||
        abstractProductView = findViewById(R.id.abstractProductView)
 | 
			
		||||
        /*
 | 
			
		||||
        scanButton = findViewById(R.id.scanButton)
 | 
			
		||||
        abstractProductView = AbstractProductView(this, this, AbstractProduct())
 | 
			
		||||
        findViewById<ConstraintLayout>(R.id.addProductConstraintLayout).addView(abstractProductView)
 | 
			
		||||
         */
 | 
			
		||||
        expiryDateRadioButton = findViewById(R.id.expiryDateRadio)
 | 
			
		||||
        shelfLifeRadioButton = findViewById(R.id.shelfLifeRadio)
 | 
			
		||||
 | 
			
		||||
        expiryDateTextView = findViewById(R.id.expiryDateTextView)
 | 
			
		||||
        expiryDateSelectButton = findViewById(R.id.selectExpiryDateButton)
 | 
			
		||||
 | 
			
		||||
        shelfLifeTextView = findViewById(R.id.shelfLife)
 | 
			
		||||
        shelfLifeTextEdit = findViewById(R.id.shelfLifeTextEdit)
 | 
			
		||||
 | 
			
		||||
        amountTextEdit = findViewById(R.id.amountTextEdit)
 | 
			
		||||
 | 
			
		||||
        dateOfProductionSelectButton = findViewById(R.id.selectDateOfProductionButton)
 | 
			
		||||
        saveProductButton = findViewById(R.id.saveProductButton)
 | 
			
		||||
 | 
			
		||||
        scanButton.setOnClickListener {
 | 
			
		||||
            val scanner = GmsBarcodeScanning.getClient(this)
 | 
			
		||||
            scanner.startScan()
 | 
			
		||||
                .addOnSuccessListener { barcode ->
 | 
			
		||||
                    findAndDisplayAbstractProductByBarcode(barcode.rawValue.toString())
 | 
			
		||||
                .addOnSuccessListener { bc ->
 | 
			
		||||
                    barcode = bc.rawValue.toString()
 | 
			
		||||
                    findAndDisplayAbstractProductByBarcode(barcode)
 | 
			
		||||
                }
 | 
			
		||||
                .addOnFailureListener {
 | 
			
		||||
                    Toast.makeText(this, "Cannot scan barcode", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        expiryDateRadioButton.setOnClickListener {
 | 
			
		||||
            expiryDateTextView.visibility = View.VISIBLE
 | 
			
		||||
            expiryDateSelectButton.visibility = View.VISIBLE
 | 
			
		||||
 | 
			
		||||
            shelfLifeTextEdit.visibility = View.INVISIBLE
 | 
			
		||||
            shelfLifeTextView.visibility = View.INVISIBLE
 | 
			
		||||
 | 
			
		||||
            expiryDateOverShelfLife = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        shelfLifeRadioButton.setOnClickListener {
 | 
			
		||||
            expiryDateTextView.visibility = View.INVISIBLE
 | 
			
		||||
            expiryDateSelectButton.visibility = View.INVISIBLE
 | 
			
		||||
 | 
			
		||||
            shelfLifeTextEdit.visibility = View.VISIBLE
 | 
			
		||||
            shelfLifeTextView.visibility = View.VISIBLE
 | 
			
		||||
 | 
			
		||||
            expiryDateOverShelfLife = false
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//        shelfLifeTextEdit.addTextChangedListener {
 | 
			
		||||
//            if (shelfLifeTextEdit.text.toString() == "") {
 | 
			
		||||
//                return@addTextChangedListener
 | 
			
		||||
//            }
 | 
			
		||||
//
 | 
			
		||||
//            evaluateDateOfExpiry()
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
        dateOfProductionSelectButton.setOnClickListener {
 | 
			
		||||
            val c = Calendar.getInstance()
 | 
			
		||||
            val year = c.get(Calendar.YEAR)
 | 
			
		||||
            val month = c.get(Calendar.MONTH)
 | 
			
		||||
            val day = c.get(Calendar.DAY_OF_MONTH)
 | 
			
		||||
 | 
			
		||||
            val dpd = DatePickerDialog(this, { _, y, m, d ->
 | 
			
		||||
                dateOfProduction = "$d.${m+1}.$y"
 | 
			
		||||
                findViewById<TextView>(R.id.dateOfProductionTextView).text = "Date of production: $dateOfProduction"
 | 
			
		||||
            }, year, month, day)
 | 
			
		||||
 | 
			
		||||
            dpd.show()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        expiryDateSelectButton.setOnClickListener {
 | 
			
		||||
            val c = Calendar.getInstance()
 | 
			
		||||
            val year = c.get(Calendar.YEAR)
 | 
			
		||||
            val month = c.get(Calendar.MONTH)
 | 
			
		||||
            val day = c.get(Calendar.DAY_OF_MONTH)
 | 
			
		||||
 | 
			
		||||
            val dpd = DatePickerDialog(this, { view, y, m, d ->
 | 
			
		||||
                dateOfExpiry = "$d.${m+1}.$y"
 | 
			
		||||
                expiryDateTextView.text = "Expiry date: $dateOfExpiry"
 | 
			
		||||
            }, year, month, day)
 | 
			
		||||
 | 
			
		||||
            dpd.show()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        saveProductButton.setOnClickListener {
 | 
			
		||||
            if (expiryDateOverShelfLife == null) {
 | 
			
		||||
                Toast.makeText(this, "Please, choose and fill in shelf life or expiry date.", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
            if (dateOfProduction == "") {
 | 
			
		||||
                Toast.makeText(this, "Please, choose date of production.", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!expiryDateOverShelfLife!!) {
 | 
			
		||||
                if (shelfLifeTextEdit.text.toString() != "") {
 | 
			
		||||
                    evaluateDateOfExpiry(shelfLifeTextEdit.text.toString().toInt())
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                if (dateOfExpiry == "") {
 | 
			
		||||
                    Toast.makeText(this, "Please, choose date of expiry.", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                    return@setOnClickListener
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (amountTextEdit.text.toString() == "") {
 | 
			
		||||
                Toast.makeText(this, "Please, specify an amount of product.", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val abstractProduct = DBStorageController(this).findAbstractProductByBarcode(DBStorageController(this).readableDatabase, barcode)
 | 
			
		||||
            product = Product(0, abstractProduct!!.id, amountTextEdit.text.toString().toInt(), dateOfProduction, dateOfExpiry)
 | 
			
		||||
 | 
			
		||||
            DBStorageController(this).insertNewProduct(DBStorageController(this).writableDatabase, product!!)
 | 
			
		||||
            finish()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun evaluateDateOfExpiry(shelfLifeMonths: Int) {
 | 
			
		||||
        if (dateOfProduction == "" ) {
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        val c = Calendar.getInstance()
 | 
			
		||||
        val dateOfProductionSplit = dateOfProduction.split(".")
 | 
			
		||||
        c.set(Calendar.YEAR, dateOfProductionSplit[0].toInt())
 | 
			
		||||
        c.set(Calendar.MONTH, dateOfProductionSplit[1].toInt())
 | 
			
		||||
        c.set(Calendar.DAY_OF_MONTH, dateOfProductionSplit[2].toInt())
 | 
			
		||||
 | 
			
		||||
        c.add(Calendar.MONTH, shelfLifeMonths)
 | 
			
		||||
        dateOfExpiry = "${c.get(Calendar.YEAR)}.${c.get(Calendar.MONTH)}.${c.get(Calendar.DAY_OF_MONTH)}"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun findAndDisplayAbstractProductByBarcode(barcode: String) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,23 +4,34 @@ import android.os.Parcel
 | 
			
		||||
import android.os.Parcelable
 | 
			
		||||
 | 
			
		||||
class Product() : Parcelable {
 | 
			
		||||
    var id = 0
 | 
			
		||||
    var abstractProductId = 0
 | 
			
		||||
    var amount = 0
 | 
			
		||||
    var dateOfProduction = "01.01.1970"
 | 
			
		||||
    var dateOfExpiry = "01.01.1970"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    constructor(abstractProductId: Int, amount: Int) : this() {
 | 
			
		||||
    constructor(id: Int, abstractProductId: Int, amount: Int, dateOfProduction: String, dateOfExpiry: String) : this() {
 | 
			
		||||
        this.id = id
 | 
			
		||||
        this.abstractProductId = abstractProductId
 | 
			
		||||
        this.amount = amount
 | 
			
		||||
        this.dateOfProduction = dateOfProduction
 | 
			
		||||
        this.dateOfExpiry = dateOfExpiry
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constructor(parcel: Parcel) : this() {
 | 
			
		||||
        id = parcel.readInt()
 | 
			
		||||
        abstractProductId = parcel.readInt()
 | 
			
		||||
        amount = parcel.readInt()
 | 
			
		||||
        dateOfProduction = parcel.readString()!!
 | 
			
		||||
        dateOfExpiry = parcel.readString()!!
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun writeToParcel(parcel: Parcel, flags: Int) {
 | 
			
		||||
        parcel.writeInt(id)
 | 
			
		||||
        parcel.writeInt(abstractProductId)
 | 
			
		||||
        parcel.writeInt(amount)
 | 
			
		||||
        parcel.writeString(dateOfProduction)
 | 
			
		||||
        parcel.writeString(dateOfExpiry)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun describeContents(): Int {
 | 
			
		||||
@@ -36,5 +47,4 @@ class Product() : Parcelable {
 | 
			
		||||
            return arrayOfNulls(size)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,17 +1,71 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.fragments
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.provider.BaseColumns
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.gridlayout.widget.GridLayout
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.ProductContract
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.Product
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.views.ProductView
 | 
			
		||||
 | 
			
		||||
class ShelfFragment : Fragment() {
 | 
			
		||||
    override fun onCreateView(
 | 
			
		||||
        inflater: LayoutInflater, container: ViewGroup?,
 | 
			
		||||
        savedInstanceState: Bundle?
 | 
			
		||||
    ): View? {
 | 
			
		||||
 | 
			
		||||
        return inflater.inflate(R.layout.fragment_shelf, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 | 
			
		||||
        updateContent()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onResume() {
 | 
			
		||||
        super.onResume()
 | 
			
		||||
 | 
			
		||||
        updateContent()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun updateContent() {
 | 
			
		||||
        val grv = view?.findViewById<GridLayout>(R.id.contentGridLayout)
 | 
			
		||||
        grv?.removeAllViews()
 | 
			
		||||
 | 
			
		||||
        val db = DBStorageController(requireContext()).readableDatabase
 | 
			
		||||
        val projection = arrayOf(
 | 
			
		||||
            BaseColumns._ID,
 | 
			
		||||
            ProductContract.ProductEntry.ABSTRACT_PRODUCT_ID,
 | 
			
		||||
            ProductContract.ProductEntry.AMOUNT,
 | 
			
		||||
            ProductContract.ProductEntry.DATE_OF_PRODUCTION,
 | 
			
		||||
            ProductContract.ProductEntry.EXPIRY_DATE,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        val cursor = db.query(ProductContract.ProductEntry.TABLE_NAME, projection, null, null, null, null, null)
 | 
			
		||||
 | 
			
		||||
        with (cursor) {
 | 
			
		||||
            while(moveToNext()) {
 | 
			
		||||
                val productId = getInt(getColumnIndexOrThrow(BaseColumns._ID))
 | 
			
		||||
                val abstractProductId = getInt(getColumnIndexOrThrow(ProductContract.ProductEntry.ABSTRACT_PRODUCT_ID))
 | 
			
		||||
                val amount = getInt(getColumnIndexOrThrow(ProductContract.ProductEntry.AMOUNT))
 | 
			
		||||
                val dateOfProduction = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.DATE_OF_PRODUCTION))
 | 
			
		||||
                val dateOfExpiry = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.EXPIRY_DATE))
 | 
			
		||||
 | 
			
		||||
                val product = Product(productId, abstractProductId, amount, dateOfProduction, dateOfExpiry)
 | 
			
		||||
 | 
			
		||||
                val productView = ProductView(
 | 
			
		||||
                    requireActivity(),
 | 
			
		||||
                    requireContext(),
 | 
			
		||||
                    product
 | 
			
		||||
                )
 | 
			
		||||
                grv?.addView(productView)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,78 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.views
 | 
			
		||||
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.util.AttributeSet
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
import android.widget.LinearLayout
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.Product
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getImageUri
 | 
			
		||||
import java.io.File
 | 
			
		||||
 | 
			
		||||
class ProductView: LinearLayout {
 | 
			
		||||
    var product: Product = Product()
 | 
			
		||||
    var isProductSelected = false
 | 
			
		||||
    private lateinit var activity: Activity
 | 
			
		||||
 | 
			
		||||
    private lateinit var productImageView: ImageView
 | 
			
		||||
    private lateinit var productNameTextView: TextView
 | 
			
		||||
    private lateinit var productNetWeightTextView: TextView
 | 
			
		||||
    private lateinit var productAmountTextView: TextView
 | 
			
		||||
    private lateinit var productCategoryView: TextView
 | 
			
		||||
    private lateinit var productLifeSpan: TextView
 | 
			
		||||
 | 
			
		||||
    constructor(context: Context, a: AttributeSet) : super(context, a) {
 | 
			
		||||
        activity = getActivity(context)!!
 | 
			
		||||
        val inflater: LayoutInflater = activity.layoutInflater
 | 
			
		||||
        inflater.inflate(R.layout.product_view, this)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constructor(activity: Activity, context: Context, product: Product) : super(context) {
 | 
			
		||||
        this.product = product
 | 
			
		||||
        this.activity = activity
 | 
			
		||||
        val inflater: LayoutInflater = activity.layoutInflater
 | 
			
		||||
        inflater.inflate(R.layout.product_view, this)
 | 
			
		||||
 | 
			
		||||
        productImageView = findViewById(R.id.productPicture)
 | 
			
		||||
        productNameTextView = findViewById(R.id.productNameView)
 | 
			
		||||
        productNetWeightTextView = findViewById(R.id.productNetWeightView)
 | 
			
		||||
        productAmountTextView = findViewById(R.id.amountView)
 | 
			
		||||
        productCategoryView = findViewById(R.id.categoryView)
 | 
			
		||||
        productLifeSpan = findViewById(R.id.dateSpan)
 | 
			
		||||
 | 
			
		||||
        update()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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 imageUri = getImageUri(activity, pictureFile)
 | 
			
		||||
        productImageView.setImageURI(imageUri)
 | 
			
		||||
 | 
			
		||||
        productNameTextView.text = linkedAbstractProduct.name
 | 
			
		||||
        productNetWeightTextView.text = linkedAbstractProduct.netWeight.toString()
 | 
			
		||||
        productAmountTextView.text = product.amount.toString()
 | 
			
		||||
        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)
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        findViewById<ConstraintLayout>(R.id.productLayout).setOnLongClickListener {
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
            this.background = ContextCompat.getDrawable(context, if (isProductSelected) R.drawable.outline_selected else R.drawable.outline)
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -32,24 +32,72 @@
 | 
			
		||||
        <Button
 | 
			
		||||
                android:text="Select"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/button2"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/selectDateOfProductionButton"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/scanButton"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/dateOfProductionTextView"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"/>
 | 
			
		||||
        <RadioGroup
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/button2"
 | 
			
		||||
                android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/selectDateOfProductionButton"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp"
 | 
			
		||||
                android:orientation="horizontal">
 | 
			
		||||
                android:orientation="horizontal" android:id="@+id/radioGroup">
 | 
			
		||||
            <RadioButton
 | 
			
		||||
                    android:text="Expiry date"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content" android:id="@+id/ExpiryDateRadio"/>
 | 
			
		||||
                    android:layout_height="wrap_content" android:id="@+id/expiryDateRadio"/>
 | 
			
		||||
            <RadioButton
 | 
			
		||||
                    android:text="Shell life"
 | 
			
		||||
                    android:text="Shelf life"
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content" android:id="@+id/shellLifeRadio"/>
 | 
			
		||||
                    android:layout_height="wrap_content" android:id="@+id/shelfLifeRadio"/>
 | 
			
		||||
        </RadioGroup>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="Expiry date: "
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/expiryDateTextView"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/radioGroup" app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:visibility="invisible"/>
 | 
			
		||||
        <Button
 | 
			
		||||
                android:text="Select"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/selectExpiryDateButton"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/radioGroup"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/expiryDateTextView" android:layout_marginStart="16dp"
 | 
			
		||||
                android:visibility="invisible"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="Shelf life:"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/shelfLife"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/radioGroup"
 | 
			
		||||
                android:layout_marginTop="16dp" app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                android:layout_marginStart="16dp" android:visibility="invisible"/>
 | 
			
		||||
        <EditText
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:inputType="numberDecimal"
 | 
			
		||||
                android:ems="10"
 | 
			
		||||
                android:id="@+id/shelfLifeTextEdit" app:layout_constraintTop_toBottomOf="@+id/radioGroup"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/expiryDateTextView" android:layout_marginStart="16dp"
 | 
			
		||||
                android:visibility="invisible"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="Amount"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/amountText"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/shelfLifeTextEdit"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="16dp"/>
 | 
			
		||||
        <EditText
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:inputType="numberSigned"
 | 
			
		||||
                android:ems="10"
 | 
			
		||||
                android:id="@+id/amountTextEdit"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/selectExpiryDateButton"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/amountText"/>
 | 
			
		||||
        <Button
 | 
			
		||||
                android:text="@string/saveButton"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/saveProductButton"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/amountTextEdit" app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp"/>
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
</androidx.core.widget.NestedScrollView>
 | 
			
		||||
@@ -1,6 +1,16 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
             android:layout_width="match_parent"
 | 
			
		||||
             xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
 | 
			
		||||
             android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent">
 | 
			
		||||
        <androidx.gridlayout.widget.GridLayout
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/contentGridLayout" app:columnCount="2"
 | 
			
		||||
                app:rowCount="100" android:nestedScrollingEnabled="true">
 | 
			
		||||
 | 
			
		||||
        </androidx.gridlayout.widget.GridLayout>
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
@@ -1,7 +1,62 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
              android:orientation="vertical"
 | 
			
		||||
              android:layout_width="match_parent"
 | 
			
		||||
              android:layout_height="match_parent">
 | 
			
		||||
              xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"
 | 
			
		||||
              android:layout_width="200dp"
 | 
			
		||||
              android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content" android:id="@+id/productLayout" android:outlineProvider="bounds"
 | 
			
		||||
            android:background="#00FFFEFE" android:clickable="true">
 | 
			
		||||
        <ImageView
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="200dp" app:srcCompat="@android:drawable/ic_menu_gallery"
 | 
			
		||||
                android:id="@+id/productPicture"
 | 
			
		||||
                app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/sample_product_name"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/productNameView"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/productPicture"
 | 
			
		||||
                android:layout_marginTop="15dp" app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                android:fontFamily="monospace" android:textSize="20sp"
 | 
			
		||||
                android:maxLines="2" android:layout_marginStart="10dp"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/sample_product_net_weight"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/productNetWeightView" android:layout_weight="1"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/productNameView"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="25dp"
 | 
			
		||||
                android:layout_marginTop="10dp" android:textSize="12sp" android:fontFamily="monospace"
 | 
			
		||||
                app:layout_constraintEnd_toStartOf="@+id/unitView" android:layout_marginEnd="2dp"
 | 
			
		||||
        />
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/sample_unit"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/unitView"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/productNetWeightView"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/productNameView" android:layout_marginTop="10dp"
 | 
			
		||||
                android:fontFamily="monospace" android:textSize="12sp" android:layout_marginStart="8dp"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="10"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/amountView"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/unitView"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/productNameView" android:layout_marginTop="10dp"
 | 
			
		||||
                android:layout_marginStart="16dp"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/sample_category"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/categoryView"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                android:layout_marginEnd="25dp" android:fontFamily="monospace" android:textSize="10sp"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/amountView" android:layout_marginTop="5dp"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="01.01.1970 - 01.01.1971"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/categoryView"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" android:id="@+id/dateSpan"/>
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
		Reference in New Issue
	
	Block a user