a bit of remake, better UI and ability to update abstract products
This commit is contained in:
parent
a5a4c5db40
commit
332c7cd3fe
|
@ -1,11 +1,51 @@
|
||||||
package org.foxarmy.barcodescannerforemployees
|
package org.foxarmy.barcodescannerforemployees
|
||||||
|
|
||||||
class AbstractProduct(
|
import android.os.Parcel
|
||||||
public var id: Int,
|
import android.os.Parcelable
|
||||||
public var name: String,
|
|
||||||
public var netWeight: Double,
|
class AbstractProduct() : Parcelable {
|
||||||
public var imageHash: String,
|
var id: Int = 0
|
||||||
public var categoryName: String
|
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)
|
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> {
|
fun getAllAbstractProductInCategory(db: SQLiteDatabase, id: Int) : List<AbstractProduct> {
|
||||||
|
|
||||||
var result = mutableListOf<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 abstractProductNetWeight = getDouble(getColumnIndexOrThrow(ProductContract.ProductEntry.PRODUCT_NET_WEIGHT))
|
||||||
val abstractProductImageHash = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.IMAGE_FILENAME))
|
val abstractProductImageHash = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.IMAGE_FILENAME))
|
||||||
|
|
||||||
val abstractProduct = AbstractProduct(
|
val abstractProduct = AbstractProduct(abstractProductId, abstractProductName, abstractProductNetWeight, abstractProductImageHash, category = id)
|
||||||
abstractProductId, abstractProductName, abstractProductNetWeight, abstractProductImageHash,
|
|
||||||
categoryName = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
result.add(abstractProduct)
|
result.add(abstractProduct)
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ class AddProductActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var categorySpinner: Spinner
|
private lateinit var categorySpinner: Spinner
|
||||||
|
|
||||||
|
private var product: AbstractProduct? = null
|
||||||
private lateinit var pictureFile: File
|
private lateinit var pictureFile: File
|
||||||
private lateinit var picturesPath: File
|
private lateinit var picturesPath: File
|
||||||
private lateinit var binding: ActivityAddProductBinding
|
private lateinit var binding: ActivityAddProductBinding
|
||||||
|
@ -40,8 +41,12 @@ class AddProductActivity : AppCompatActivity() {
|
||||||
|
|
||||||
setContentView(R.layout.fragment_add_product)
|
setContentView(R.layout.fragment_add_product)
|
||||||
|
|
||||||
|
val extras = intent.extras
|
||||||
|
product = extras!!.get("updatingObject") as AbstractProduct?
|
||||||
|
|
||||||
picturesPath = File(filesDir, "pictures")
|
picturesPath = File(filesDir, "pictures")
|
||||||
|
val thumbnailsDir = File(cacheDir, "thumbnails")
|
||||||
|
thumbnailsDir.mkdirs()
|
||||||
picturesPath.mkdirs()
|
picturesPath.mkdirs()
|
||||||
imageView = findViewById(R.id.imageView)
|
imageView = findViewById(R.id.imageView)
|
||||||
|
|
||||||
|
@ -56,10 +61,21 @@ class AddProductActivity : AppCompatActivity() {
|
||||||
|
|
||||||
fillupCategorySpinner()
|
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 {
|
saveButton.setOnClickListener {
|
||||||
val productName = productNameText.text.toString()
|
val productName = productNameText.text.toString()
|
||||||
val netWeight = netWeightText.text
|
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()
|
Toast.makeText(this, "Please, make a picture of a product!", Toast.LENGTH_SHORT).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
@ -80,7 +96,11 @@ class AddProductActivity : AppCompatActivity() {
|
||||||
put(ProductContract.ProductEntry.CATEGORY, categorySpinner.selectedItemPosition)
|
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()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,10 @@ class MainActivity : AppCompatActivity() {
|
||||||
"StorageFragment" -> {
|
"StorageFragment" -> {
|
||||||
val addProductIntent = Intent(this, AddProductActivity::class.java)
|
val addProductIntent = Intent(this, AddProductActivity::class.java)
|
||||||
val extras = Bundle()
|
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)
|
ContextCompat.startActivity(this, addProductIntent, extras)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +94,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
"CategoriesFragment" -> {
|
"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?")
|
.setMessage("Deleting a category will also delete ALL the products, that belong to that category. Do you want to proceed?")
|
||||||
.setPositiveButton("Yes") { _: DialogInterface, _: Int ->
|
.setPositiveButton("Yes") { _: DialogInterface, _: Int ->
|
||||||
val categoriesFragment = fragment as CategoriesFragment
|
val categoriesFragment = fragment as CategoriesFragment
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.foxarmy.barcodescannerforemployees.fragments
|
package org.foxarmy.barcodescannerforemployees.fragments
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.BaseColumns
|
import android.provider.BaseColumns
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
@ -7,10 +8,12 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.view.children
|
import androidx.core.view.children
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.gridlayout.widget.GridLayout
|
import androidx.gridlayout.widget.GridLayout
|
||||||
import org.foxarmy.barcodescannerforemployees.*
|
import org.foxarmy.barcodescannerforemployees.*
|
||||||
|
import org.foxarmy.barcodescannerforemployees.activities.AddProductActivity
|
||||||
import org.foxarmy.barcodescannerforemployees.views.AbstractProductView
|
import org.foxarmy.barcodescannerforemployees.views.AbstractProductView
|
||||||
|
|
||||||
class StorageFragment : Fragment() {
|
class StorageFragment : Fragment() {
|
||||||
|
@ -48,6 +51,17 @@ class StorageFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateSelected() {
|
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 netWeight = getDouble(getColumnIndexOrThrow(ProductContract.ProductEntry.PRODUCT_NET_WEIGHT))
|
||||||
val productImageHash = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.IMAGE_FILENAME))
|
val productImageHash = getString(getColumnIndexOrThrow(ProductContract.ProductEntry.IMAGE_FILENAME))
|
||||||
val category = getInt(getColumnIndexOrThrow(ProductContract.ProductEntry.CATEGORY))
|
val category = getInt(getColumnIndexOrThrow(ProductContract.ProductEntry.CATEGORY))
|
||||||
var categoryName = ""
|
|
||||||
|
|
||||||
val projection2 = arrayOf(CategoriesContract.CategoryEntry.CATEGORY_NAME)
|
val product = AbstractProduct(productId, productName, netWeight, productImageHash, category)
|
||||||
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)
|
|
||||||
|
|
||||||
generateThumbnailForImage(context!!, productImageHash)
|
generateThumbnailForImage(context!!, productImageHash)
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.content.ContextCompat.startActivity
|
import androidx.core.content.ContextCompat.startActivity
|
||||||
import org.foxarmy.barcodescannerforemployees.AbstractProduct
|
import org.foxarmy.barcodescannerforemployees.AbstractProduct
|
||||||
|
import org.foxarmy.barcodescannerforemployees.DBStorageController
|
||||||
import org.foxarmy.barcodescannerforemployees.R
|
import org.foxarmy.barcodescannerforemployees.R
|
||||||
import org.foxarmy.barcodescannerforemployees.activities.FullscreenActivity
|
import org.foxarmy.barcodescannerforemployees.activities.FullscreenActivity
|
||||||
import org.foxarmy.barcodescannerforemployees.getImageUri
|
import org.foxarmy.barcodescannerforemployees.getImageUri
|
||||||
|
@ -58,9 +59,11 @@ class AbstractProductView: LinearLayout {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
productNameField.text = product.name
|
productNameField.text = product.name
|
||||||
netWeightField.text = product.netWeight.toString()
|
netWeightField.text = product.netWeight.toString()
|
||||||
categoryField.text = product.categoryName
|
categoryField.text = DBStorageController(context).getCategoryNameById(DBStorageController(context).readableDatabase, product.category)
|
||||||
|
|
||||||
//TODO: units
|
//TODO: units
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue