ability to add and link barcodeless products
This commit is contained in:
		@@ -44,6 +44,10 @@
 | 
			
		||||
                android:name=".activities.ExpiryCalendarGroupActivity"
 | 
			
		||||
                android:exported="false"
 | 
			
		||||
                android:theme="@style/Theme.BarcodeScannerForEmployees"/>
 | 
			
		||||
        <activity
 | 
			
		||||
                android:name=".activities.FindBarcodelessAbstractProduct"
 | 
			
		||||
                android:exported="false"
 | 
			
		||||
                android:theme="@style/Theme.BarcodeScannerForEmployees"/>
 | 
			
		||||
        <activity
 | 
			
		||||
                android:name=".activities.FullscreenActivity"
 | 
			
		||||
                android:configChanges="orientation|keyboardHidden|screenSize"
 | 
			
		||||
@@ -57,7 +61,7 @@
 | 
			
		||||
        
 | 
			
		||||
        <provider
 | 
			
		||||
                android:name="androidx.core.content.FileProvider"
 | 
			
		||||
                android:authorities="com.google.firebase.components.activities.MainActivity.provider;com.google.firebase.components.activities.FullscreenActivity.provider;com.google.firebase.components.activities.AddAbstractProductActivity.provider;com.google.firebase.components.activities.AddProductActivity.provider;com.google.firebase.components.activities.ExpiryCalendarActivity.provider;com.google.firebase.components.activities.ExpiryCalendarGroupActivity.provider"
 | 
			
		||||
                android:authorities="com.google.firebase.components.activities.MainActivity.provider;com.google.firebase.components.activities.FullscreenActivity.provider;com.google.firebase.components.activities.AddAbstractProductActivity.provider;com.google.firebase.components.activities.AddProductActivity.provider;com.google.firebase.components.activities.ExpiryCalendarActivity.provider;com.google.firebase.components.activities.FindBarcodelessAbstractProduct.provider;com.google.firebase.components.activities.ExpiryCalendarGroupActivity.provider"
 | 
			
		||||
                android:exported="false"
 | 
			
		||||
                android:grantUriPermissions="true">
 | 
			
		||||
            <meta-data
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
    private lateinit var scanButton: Button
 | 
			
		||||
 | 
			
		||||
    private lateinit var barcodeText: EditText
 | 
			
		||||
    private lateinit var noBarcodeCheckBox: CheckBox
 | 
			
		||||
    private lateinit var productNameText: TextView
 | 
			
		||||
    private lateinit var netWeightText: TextView
 | 
			
		||||
    private lateinit var unitTypeSpinner: Spinner
 | 
			
		||||
@@ -63,6 +64,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
        scanButton = findViewById(R.id.scan_button)
 | 
			
		||||
 | 
			
		||||
        barcodeText = findViewById(R.id.barcodeTextEdit)
 | 
			
		||||
        noBarcodeCheckBox = findViewById(R.id.noBarcodeCheckBox)
 | 
			
		||||
        productNameText = findViewById(R.id.productName)
 | 
			
		||||
        netWeightText = findViewById(R.id.netWeight)
 | 
			
		||||
        unitTypeSpinner = findViewById(R.id.unitTypeSpinner)
 | 
			
		||||
@@ -72,6 +74,12 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
        fillupCategorySpinner()
 | 
			
		||||
        fillupUnitsSpinner()
 | 
			
		||||
 | 
			
		||||
        noBarcodeCheckBox.setOnClickListener {
 | 
			
		||||
            if (noBarcodeCheckBox.isChecked) {
 | 
			
		||||
                barcodeText.setText("")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        barcodeText.addTextChangedListener {
 | 
			
		||||
            this.barcode = barcodeText.text.toString()
 | 
			
		||||
        }
 | 
			
		||||
@@ -108,7 +116,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (barcode == "") {
 | 
			
		||||
            if (barcode == "" && !noBarcodeCheckBox.isChecked) {
 | 
			
		||||
                Toast.makeText(this, getString(R.string.product_barcode_request), Toast.LENGTH_SHORT).show()
 | 
			
		||||
                return@setOnClickListener
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.activities
 | 
			
		||||
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
@@ -25,6 +26,7 @@ import java.util.*
 | 
			
		||||
class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var scanButton: Button
 | 
			
		||||
    private lateinit var noBarcodeButton: Button
 | 
			
		||||
    private lateinit var abstractProductView: AbstractProductView
 | 
			
		||||
    private lateinit var expiryDateRadioButton: RadioButton
 | 
			
		||||
    private lateinit var shelfLifeRadioButton: RadioButton
 | 
			
		||||
@@ -49,6 +51,7 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
        setContentView(R.layout.fragment_add_product)
 | 
			
		||||
 | 
			
		||||
        scanButton = findViewById(R.id.scanButton)
 | 
			
		||||
        noBarcodeButton = findViewById(R.id.noBarcodeButton)
 | 
			
		||||
        abstractProductView = findViewById(R.id.abstractProductView)
 | 
			
		||||
        expiryDateRadioButton = findViewById(R.id.expiryDateRadio)
 | 
			
		||||
        shelfLifeRadioButton = findViewById(R.id.shelfLifeRadio)
 | 
			
		||||
@@ -83,6 +86,10 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
            requestPermissionLauncher.launch(android.Manifest.permission.CAMERA)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        noBarcodeButton.setOnClickListener {
 | 
			
		||||
            intentLauncher.launch(Intent(this, FindBarcodelessAbstractProduct::class.java))
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        expiryDateRadioButton.setOnClickListener {
 | 
			
		||||
            expiryDateOverShelfLife = true
 | 
			
		||||
            update()
 | 
			
		||||
@@ -157,6 +164,16 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
        expiryDatePicker.updateDate(today[2].toInt(), today[1].toInt(), today[0].toInt())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private val intentLauncher =
 | 
			
		||||
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
 | 
			
		||||
            if (result.resultCode == Activity.RESULT_OK) {
 | 
			
		||||
                val selectedAbstractProduct = (result.data?.extras!!.getParcelable("abstractProduct") as AbstractProduct?)!!
 | 
			
		||||
                product!!.abstractProductId = selectedAbstractProduct.id
 | 
			
		||||
                abstractProduct = selectedAbstractProduct
 | 
			
		||||
                displayAbstractProduct(selectedAbstractProduct, "")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private fun update () {
 | 
			
		||||
        if (expiryDateOverShelfLife == true) {
 | 
			
		||||
            expiryDatePicker.visibility = View.VISIBLE
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,34 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.activities
 | 
			
		||||
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityFindBarcodelessAbstractProductBinding
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.fragments.StorageFragment
 | 
			
		||||
 | 
			
		||||
class FindBarcodelessAbstractProduct() : AppCompatActivity() {
 | 
			
		||||
    private lateinit var binding: ActivityFindBarcodelessAbstractProductBinding
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 | 
			
		||||
        binding = ActivityFindBarcodelessAbstractProductBinding.inflate(layoutInflater)
 | 
			
		||||
 | 
			
		||||
        val ft = supportFragmentManager.beginTransaction()
 | 
			
		||||
        val fragment = StorageFragment.newInstance("barcodeless", arrayOf(""))
 | 
			
		||||
        ft.replace(R.id.content, fragment)
 | 
			
		||||
        ft.commit()
 | 
			
		||||
 | 
			
		||||
        setContentView(binding.root)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun selected(abstractProduct: AbstractProduct) {
 | 
			
		||||
        val data = Intent()
 | 
			
		||||
        data.putExtra("abstractProduct", abstractProduct)
 | 
			
		||||
        setResult(Activity.RESULT_OK, data)
 | 
			
		||||
        finish()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -77,7 +77,7 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
    private fun setupViewPager(viewpager: ViewPager) {
 | 
			
		||||
        adapter = ViewPagerAdapter(supportFragmentManager)
 | 
			
		||||
 | 
			
		||||
        adapter.addFragment(StorageFragment(), getString(R.string.storage_title))
 | 
			
		||||
        adapter.addFragment(StorageFragment.newInstance("", arrayOf("")), getString(R.string.storage_title))
 | 
			
		||||
        adapter.addFragment(ShelfFragment(), getString(R.string.shelf_title))
 | 
			
		||||
        adapter.addFragment(CategoriesFragment(), getString(R.string.categories_title))
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,10 +6,7 @@ import android.provider.BaseColumns
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import android.widget.AdapterView
 | 
			
		||||
import android.widget.ArrayAdapter
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import android.widget.*
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.view.children
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
@@ -17,6 +14,7 @@ import org.foxarmy.barcodescannerforemployees.AbstractProductContract
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.AddAbstractProductActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.FindBarcodelessAbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.FragmentStorageBinding
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.generateThumbnailForImage
 | 
			
		||||
@@ -26,7 +24,8 @@ import kotlin.concurrent.thread
 | 
			
		||||
class StorageFragment : Fragment() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var binding: FragmentStorageBinding
 | 
			
		||||
    private var filterByCategory = ""
 | 
			
		||||
    private var filterBy = ""
 | 
			
		||||
    private lateinit var filter: Array<String>
 | 
			
		||||
    override fun onCreateView(
 | 
			
		||||
        inflater: LayoutInflater, container: ViewGroup?,
 | 
			
		||||
        savedInstanceState: Bundle?
 | 
			
		||||
@@ -46,10 +45,13 @@ class StorageFragment : Fragment() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.dropFiltersButton.setOnClickListener {
 | 
			
		||||
            filterByCategory = ""
 | 
			
		||||
            filterBy = ""
 | 
			
		||||
            updateContent()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        filterBy = arguments?.getString("filterBy")!!
 | 
			
		||||
        filter = arguments?.getStringArray("filter")!!
 | 
			
		||||
 | 
			
		||||
        return binding.root
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -137,11 +139,18 @@ class StorageFragment : Fragment() {
 | 
			
		||||
            var selection = ""
 | 
			
		||||
            var selectionArgs: Array<String>? = null
 | 
			
		||||
 | 
			
		||||
            if (filterByCategory != "") {
 | 
			
		||||
                selection = "${AbstractProductContract.AbstractProductEntry.CATEGORY} = ?"
 | 
			
		||||
                selectionArgs = arrayOf(filterByCategory)
 | 
			
		||||
            when (filterBy) {
 | 
			
		||||
                "category" -> {
 | 
			
		||||
                    selection = "${AbstractProductContract.AbstractProductEntry.CATEGORY} = ?"
 | 
			
		||||
                    selectionArgs = filter
 | 
			
		||||
                }
 | 
			
		||||
                "barcodeless" -> {
 | 
			
		||||
                    selection = "${AbstractProductContract.AbstractProductEntry.BARCODE} = '' "
 | 
			
		||||
                    selectionArgs = null
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            val cursor = db.query(AbstractProductContract.AbstractProductEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, orderBy)
 | 
			
		||||
 | 
			
		||||
            with (cursor) {
 | 
			
		||||
@@ -164,6 +173,16 @@ class StorageFragment : Fragment() {
 | 
			
		||||
                        product
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
                    if (filterBy == "barcodeless") {
 | 
			
		||||
                        abstractProduct.setOnClickListener {
 | 
			
		||||
                            (activity as FindBarcodelessAbstractProduct).selected(abstractProduct.abstractProduct)
 | 
			
		||||
                        }
 | 
			
		||||
                        abstractProduct.findViewById<TextView>(R.id.productNameView).setOnClickListener {
 | 
			
		||||
                            (activity as FindBarcodelessAbstractProduct).selected(abstractProduct.abstractProduct)
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    activity!!.runOnUiThread{
 | 
			
		||||
                        grv.addView(abstractProduct)
 | 
			
		||||
                    }
 | 
			
		||||
@@ -179,8 +198,20 @@ class StorageFragment : Fragment() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun filterByCategory(id: Int) {
 | 
			
		||||
//        filterByCategory = DBStorageController(context!!).getCategoryNameById(DBStorageController(context!!).readableDatabase, id)
 | 
			
		||||
        filterByCategory = "$id"
 | 
			
		||||
        filterBy = "category"
 | 
			
		||||
        filter = arrayOf("$id")
 | 
			
		||||
        updateContent()
 | 
			
		||||
    }
 | 
			
		||||
    companion object {
 | 
			
		||||
 | 
			
		||||
        fun newInstance(filterBy: String, filter: Array<String>):StorageFragment = StorageFragment().apply {
 | 
			
		||||
            val fragment = StorageFragment()
 | 
			
		||||
            val args = Bundle()
 | 
			
		||||
            args.putString("filterBy", filterBy)
 | 
			
		||||
            args.putStringArray("filter", filter)
 | 
			
		||||
            fragment.setArguments(args)
 | 
			
		||||
 | 
			
		||||
            return fragment
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.core.widget.NestedScrollView
 | 
			
		||||
        xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
        xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        tools:context=".fragments.ShelfFragment"
 | 
			
		||||
        android:id="@+id/content">
 | 
			
		||||
 | 
			
		||||
</androidx.core.widget.NestedScrollView>
 | 
			
		||||
@@ -61,9 +61,16 @@
 | 
			
		||||
                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"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                android:layout_marginTop="8dp" android:hint="Barcode" android:textColorHint="#737373"
 | 
			
		||||
                android:layout_marginStart="5dp" android:layout_marginEnd="5dp"/>
 | 
			
		||||
                android:layout_marginStart="5dp"/>
 | 
			
		||||
        <CheckBox
 | 
			
		||||
                android:text="@string/no_barcode"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/noBarcodeCheckBox"
 | 
			
		||||
                app:layout_constraintStart_toEndOf="@+id/barcodeTextEdit"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/imageView" android:layout_marginTop="8dp"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/category"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
 
 | 
			
		||||
@@ -21,8 +21,15 @@
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/scanButton" android:layout_weight="1"
 | 
			
		||||
                app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/abstractProductView" android:layout_marginTop="16dp"/>
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/abstractProductView" android:layout_marginTop="16dp"
 | 
			
		||||
                android:layout_marginStart="32dp"/>
 | 
			
		||||
        <Button
 | 
			
		||||
                android:text="@string/no_barcode_button"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content" android:id="@+id/noBarcodeButton"
 | 
			
		||||
                app:layout_constraintTop_toBottomOf="@+id/abstractProductView"
 | 
			
		||||
                app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp"
 | 
			
		||||
                android:layout_marginEnd="32dp"/>
 | 
			
		||||
        <TextView
 | 
			
		||||
                android:text="@string/date_of_production"
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
                                       android:layout_width="match_parent"
 | 
			
		||||
                                       android:layout_height="match_parent">
 | 
			
		||||
</androidx.core.widget.NestedScrollView>
 | 
			
		||||
@@ -87,4 +87,6 @@
 | 
			
		||||
        ошибка сканирования или введите данные вручную
 | 
			
		||||
    </string>
 | 
			
		||||
    <string name="abstract_product_request">Пожалуйста, отсканируйте штрихкод, чтобы добавить продукт</string>
 | 
			
		||||
    <string name="no_barcode">No barcode present</string>
 | 
			
		||||
    <string name="no_barcode_button">No barcode</string>
 | 
			
		||||
</resources>
 | 
			
		||||
@@ -85,4 +85,6 @@
 | 
			
		||||
        wrongly or type manually
 | 
			
		||||
    </string>
 | 
			
		||||
    <string name="abstract_product_request">Please, scan a barcode in order to add product</string>
 | 
			
		||||
    <string name="no_barcode">No barcode present</string>
 | 
			
		||||
    <string name="no_barcode_button">No barcode</string>
 | 
			
		||||
</resources>
 | 
			
		||||
		Reference in New Issue
	
	Block a user