darker outline of a productView, fixed duplications of abstract ones

This commit is contained in:
leca 2024-10-16 01:26:52 +03:00
parent b1030ac8c1
commit 224887422c
6 changed files with 78 additions and 28 deletions

View File

@ -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

View File

@ -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)

View File

@ -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?) {

View File

@ -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())
}
}

View File

@ -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"

View File

@ -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>