a bit of remake, better UI and ability to update abstract products
This commit is contained in:
		@@ -1,11 +1,51 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees
 | 
			
		||||
 | 
			
		||||
class AbstractProduct(
 | 
			
		||||
    public var id: Int,
 | 
			
		||||
    public var name: String,
 | 
			
		||||
    public var netWeight: Double,
 | 
			
		||||
    public var imageHash: String,
 | 
			
		||||
    public var categoryName: String
 | 
			
		||||
) {
 | 
			
		||||
import android.os.Parcel
 | 
			
		||||
import android.os.Parcelable
 | 
			
		||||
 | 
			
		||||
class AbstractProduct() : Parcelable {
 | 
			
		||||
    var id: Int = 0
 | 
			
		||||
    var name: String = ""
 | 
			
		||||
    var netWeight: Double = 0.0
 | 
			
		||||
    var imageHash: String = ""
 | 
			
		||||
    var category: Int = 0
 | 
			
		||||
 | 
			
		||||
    constructor(id: Int, name: String ,netWeight: Double, imageHash: String, category: Int) : this() {
 | 
			
		||||
        this.id = id
 | 
			
		||||
        this.name = name
 | 
			
		||||
        this.netWeight = netWeight
 | 
			
		||||
        this.imageHash = imageHash
 | 
			
		||||
        this.category= category
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constructor(parcel: Parcel) : this() {
 | 
			
		||||
        id = parcel.readInt()
 | 
			
		||||
        name = parcel.readString()!!
 | 
			
		||||
        netWeight = parcel.readDouble()
 | 
			
		||||
        imageHash = parcel.readString()!!
 | 
			
		||||
        category = parcel.readInt()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun writeToParcel(parcel: Parcel, flags: Int) {
 | 
			
		||||
        parcel.writeInt(id)
 | 
			
		||||
        parcel.writeString(name)
 | 
			
		||||
        parcel.writeDouble(netWeight)
 | 
			
		||||
        parcel.writeString(imageHash)
 | 
			
		||||
        parcel.writeInt(category)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun describeContents(): Int {
 | 
			
		||||
        return 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object CREATOR : Parcelable.Creator<AbstractProduct> {
 | 
			
		||||
        override fun createFromParcel(parcel: Parcel): AbstractProduct {
 | 
			
		||||
            return AbstractProduct(parcel)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        override fun newArray(size: Int): Array<AbstractProduct?> {
 | 
			
		||||
            return arrayOfNulls(size)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -72,6 +72,24 @@ class DBStorageController(context: Context) : SQLiteOpenHelper(context, DATABASE
 | 
			
		||||
        db.delete(CategoriesContract.CategoryEntry.TABLE_NAME, BaseColumns._ID + "=" + id, null)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getCategoryNameById(db: SQLiteDatabase, id: Int) : String {
 | 
			
		||||
        var result = ""
 | 
			
		||||
 | 
			
		||||
        val projection = arrayOf(CategoriesContract.CategoryEntry.CATEGORY_NAME)
 | 
			
		||||
        val selection = "${BaseColumns._ID} = ?"
 | 
			
		||||
        val selectionArgs = arrayOf(id.toString())
 | 
			
		||||
 | 
			
		||||
        val cursor = db.query(CategoriesContract.CategoryEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, null)
 | 
			
		||||
 | 
			
		||||
        with (cursor) {
 | 
			
		||||
            while (moveToNext()) {
 | 
			
		||||
                result = getString(getColumnIndexOrThrow(CategoriesContract.CategoryEntry.CATEGORY_NAME))
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getAllAbstractProductInCategory(db: SQLiteDatabase, id: Int) : List<AbstractProduct> {
 | 
			
		||||
 | 
			
		||||
        var result = mutableListOf<AbstractProduct>()
 | 
			
		||||
@@ -94,10 +112,7 @@ class DBStorageController(context: Context) : SQLiteOpenHelper(context, DATABASE
 | 
			
		||||
                val abstractProductNetWeight = getDouble(getColumnIndexOrThrow(ProductContract.ProductEntry.PRODUCT_NET_WEIGHT))
 | 
			
		||||
                val abstractProductImageHash = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.IMAGE_FILENAME))
 | 
			
		||||
 | 
			
		||||
                val abstractProduct = AbstractProduct(
 | 
			
		||||
                    abstractProductId, abstractProductName, abstractProductNetWeight, abstractProductImageHash,
 | 
			
		||||
                    categoryName = ""
 | 
			
		||||
                )
 | 
			
		||||
                val abstractProduct = AbstractProduct(abstractProductId, abstractProductName, abstractProductNetWeight, abstractProductImageHash, category = id)
 | 
			
		||||
 | 
			
		||||
                result.add(abstractProduct)
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var categorySpinner: Spinner
 | 
			
		||||
 | 
			
		||||
    private var product: AbstractProduct? = null
 | 
			
		||||
    private lateinit var pictureFile: File
 | 
			
		||||
    private lateinit var picturesPath: File
 | 
			
		||||
    private lateinit var binding: ActivityAddProductBinding
 | 
			
		||||
@@ -40,8 +41,12 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.fragment_add_product)
 | 
			
		||||
 | 
			
		||||
        val extras = intent.extras
 | 
			
		||||
        product = extras!!.get("updatingObject") as AbstractProduct?
 | 
			
		||||
 | 
			
		||||
        picturesPath = File(filesDir, "pictures")
 | 
			
		||||
        val thumbnailsDir = File(cacheDir, "thumbnails")
 | 
			
		||||
        thumbnailsDir.mkdirs()
 | 
			
		||||
        picturesPath.mkdirs()
 | 
			
		||||
        imageView = findViewById(R.id.imageView)
 | 
			
		||||
 | 
			
		||||
@@ -56,10 +61,21 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        fillupCategorySpinner()
 | 
			
		||||
 | 
			
		||||
        if (product != null) {
 | 
			
		||||
            val imageThumbnailUri = getImageUri(this, File(thumbnailsDir, "${product!!.imageHash}.webp"))
 | 
			
		||||
            pictureFile = File(picturesPath, "${product!!.imageHash}.png]")
 | 
			
		||||
            imageView.setImageURI(imageThumbnailUri)
 | 
			
		||||
            imageView.rotation = 90f
 | 
			
		||||
            productNameText.text = product!!.name
 | 
			
		||||
            netWeightText.text = product!!.netWeight.toString()
 | 
			
		||||
            categorySpinner.setSelection(product!!.category)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        saveButton.setOnClickListener {
 | 
			
		||||
            val productName = productNameText.text.toString()
 | 
			
		||||
            val netWeight = netWeightText.text
 | 
			
		||||
            if (!this::pictureFile.isInitialized || !pictureFile.exists()) {
 | 
			
		||||
            if (!this::pictureFile.isInitialized && !pictureFile.exists()) {
 | 
			
		||||
 | 
			
		||||
                Toast.makeText(this, "Please, make a picture of a product!", Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
@@ -80,7 +96,11 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
                put(ProductContract.ProductEntry.CATEGORY, categorySpinner.selectedItemPosition)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            db.insert(ProductContract.ProductEntry.TABLE_NAME, null, values)
 | 
			
		||||
            if (product == null) {
 | 
			
		||||
                db.insert(ProductContract.ProductEntry.TABLE_NAME, null, values)
 | 
			
		||||
            } else {
 | 
			
		||||
                db.update(ProductContract.ProductEntry.TABLE_NAME, values, "${BaseColumns._ID} = ?", arrayOf(product!!.id.toString()))
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            finish()
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -38,6 +38,10 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                "StorageFragment" -> {
 | 
			
		||||
                    val addProductIntent = Intent(this, AddProductActivity::class.java)
 | 
			
		||||
                    val extras = Bundle()
 | 
			
		||||
                    // I reuse the same stuff for editing and adding new product.
 | 
			
		||||
                    // if updatingObject == null, it means that we need to create new object
 | 
			
		||||
                    extras.putParcelable("updatingObject", null)
 | 
			
		||||
                    addProductIntent.putExtras(extras)
 | 
			
		||||
                    ContextCompat.startActivity(this, addProductIntent, extras)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@@ -90,7 +94,7 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    "CategoriesFragment" -> {
 | 
			
		||||
                        val builder = AlertDialog.Builder(this)
 | 
			
		||||
                        AlertDialog.Builder(this)
 | 
			
		||||
                            .setMessage("Deleting a category will also delete ALL the products, that belong to that category. Do you want to proceed?")
 | 
			
		||||
                            .setPositiveButton("Yes") { _: DialogInterface, _: Int ->
 | 
			
		||||
                                val categoriesFragment = fragment as CategoriesFragment
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.fragments
 | 
			
		||||
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.provider.BaseColumns
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
@@ -7,10 +8,12 @@ import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.view.children
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.gridlayout.widget.GridLayout
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.*
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.AddProductActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.views.AbstractProductView
 | 
			
		||||
 | 
			
		||||
class StorageFragment : Fragment() {
 | 
			
		||||
@@ -48,6 +51,17 @@ class StorageFragment : Fragment() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun updateSelected() {
 | 
			
		||||
        val grv = view?.findViewById<GridLayout>(R.id.contentGridLayout)
 | 
			
		||||
 | 
			
		||||
        for (view: AbstractProductView in grv?.children!!.iterator() as Iterator<AbstractProductView>) {
 | 
			
		||||
            if (view.isProductSelected) {
 | 
			
		||||
                val addProductIntent = Intent(requireContext(), AddProductActivity::class.java)
 | 
			
		||||
                val extras = Bundle()
 | 
			
		||||
                extras.putParcelable("updatingObject", view.product)
 | 
			
		||||
                addProductIntent.putExtras(extras)
 | 
			
		||||
                ContextCompat.startActivity(requireContext(), addProductIntent, extras)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -73,19 +87,8 @@ class StorageFragment : Fragment() {
 | 
			
		||||
                val netWeight = getDouble(getColumnIndexOrThrow(ProductContract.ProductEntry.PRODUCT_NET_WEIGHT))
 | 
			
		||||
                val productImageHash = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.IMAGE_FILENAME))
 | 
			
		||||
                val category = getInt(getColumnIndexOrThrow(ProductContract.ProductEntry.CATEGORY))
 | 
			
		||||
                var categoryName = ""
 | 
			
		||||
 | 
			
		||||
                val projection2 = arrayOf(CategoriesContract.CategoryEntry.CATEGORY_NAME)
 | 
			
		||||
                val cursor2 = db.query(CategoriesContract.CategoryEntry.TABLE_NAME, projection2, "${BaseColumns._ID} = ?",
 | 
			
		||||
                    arrayOf(category.toString()), null, null, BaseColumns._ID+" ASC")
 | 
			
		||||
 | 
			
		||||
                with (cursor2) {
 | 
			
		||||
                    while (moveToNext()) {
 | 
			
		||||
                        categoryName = getString(getColumnIndexOrThrow(CategoriesContract.CategoryEntry.CATEGORY_NAME))
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                val product = AbstractProduct(productId, productName, netWeight, productImageHash, categoryName)
 | 
			
		||||
                val product = AbstractProduct(productId, productName, netWeight, productImageHash, category)
 | 
			
		||||
 | 
			
		||||
                generateThumbnailForImage(context!!, productImageHash)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.content.ContextCompat.startActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.AbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.FullscreenActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getImageUri
 | 
			
		||||
@@ -58,9 +59,11 @@ class AbstractProductView: LinearLayout {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        productNameField.text = product.name
 | 
			
		||||
        netWeightField.text = product.netWeight.toString()
 | 
			
		||||
        categoryField.text = product.categoryName
 | 
			
		||||
        categoryField.text = DBStorageController(context).getCategoryNameById(DBStorageController(context).readableDatabase, product.category)
 | 
			
		||||
 | 
			
		||||
        //TODO: units
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user