some ui improvements
This commit is contained in:
		@@ -3,6 +3,7 @@ package org.foxarmy.barcodescannerforemployees
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.content.ContextWrapper
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.graphics.Bitmap
 | 
			
		||||
import android.graphics.BitmapFactory
 | 
			
		||||
import android.graphics.Matrix
 | 
			
		||||
@@ -197,13 +198,7 @@ fun noInternetConnectionAvailableNotification(context: Context) {
 | 
			
		||||
                exitProcess(0)
 | 
			
		||||
            }
 | 
			
		||||
            .setNeutralButton(R.string.logout) { _, _ ->
 | 
			
		||||
                val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
                    "sensitive",
 | 
			
		||||
                    MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
                    context,
 | 
			
		||||
                    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
                    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
                )
 | 
			
		||||
                val sharedPreferences = getPreferences(context)
 | 
			
		||||
 | 
			
		||||
                sharedPreferences.edit().putString("token", "").apply()
 | 
			
		||||
                sharedPreferences.edit().putString("server", "").apply()
 | 
			
		||||
@@ -212,4 +207,14 @@ fun noInternetConnectionAvailableNotification(context: Context) {
 | 
			
		||||
                exitProcess(0)
 | 
			
		||||
            }.show()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun getPreferences(context: Context): SharedPreferences {
 | 
			
		||||
    return EncryptedSharedPreferences.create(
 | 
			
		||||
        "sensitive",
 | 
			
		||||
        MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
        context,
 | 
			
		||||
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
@@ -4,8 +4,6 @@ import android.content.Intent
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityAccountSettingsBinding
 | 
			
		||||
@@ -21,15 +19,7 @@ class AccountSettingsActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        setContentView(binding.root)
 | 
			
		||||
 | 
			
		||||
        val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
 | 
			
		||||
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            masterKeyAlias,
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        val sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val net = Net()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,6 @@ import androidx.appcompat.app.AlertDialog
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.widget.addTextChangedListener
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import com.journeyapps.barcodescanner.ScanContract
 | 
			
		||||
import com.journeyapps.barcodescanner.ScanIntentResult
 | 
			
		||||
import com.journeyapps.barcodescanner.ScanOptions
 | 
			
		||||
@@ -33,7 +31,6 @@ import java.io.FileOutputStream
 | 
			
		||||
import java.nio.file.Files
 | 
			
		||||
import java.nio.file.StandardCopyOption
 | 
			
		||||
import kotlin.concurrent.thread
 | 
			
		||||
import kotlin.math.abs
 | 
			
		||||
 | 
			
		||||
class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
    private lateinit var imageView: ImageView
 | 
			
		||||
@@ -66,13 +63,7 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.fragment_add_abstract_product)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(this, sharedPreferences.getString("currentGroup", "offline")!!)
 | 
			
		||||
        DAO = AbstractProductDAO(dbHelper)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,6 @@ import android.os.Bundle
 | 
			
		||||
import android.widget.Button
 | 
			
		||||
import android.widget.EditText
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.CategoryDAO
 | 
			
		||||
@@ -24,13 +22,7 @@ class AddCategoryActivity : Activity() {
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.activity_add_category)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(this, sharedPreferences.getString("currentGroup", "offline")!!)
 | 
			
		||||
        DAO = CategoryDAO(dbHelper)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,6 @@ import androidx.appcompat.app.AlertDialog
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.widget.addTextChangedListener
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import com.journeyapps.barcodescanner.ScanContract
 | 
			
		||||
import com.journeyapps.barcodescanner.ScanIntentResult
 | 
			
		||||
import com.journeyapps.barcodescanner.ScanOptions
 | 
			
		||||
@@ -61,13 +59,7 @@ class AddProductActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.fragment_add_product)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(this, sharedPreferences.getString("currentGroup", "offline")!!)
 | 
			
		||||
        productDAO = ProductDAO(dbHelper)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,6 @@ import android.os.Bundle
 | 
			
		||||
import android.widget.LinearLayout
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.ProductDAO
 | 
			
		||||
@@ -26,13 +24,7 @@ class ExpiryCalendarActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.fragment_expiry_dates)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(this, sharedPreferences.getString("currentGroup", "database")!!)
 | 
			
		||||
        productDAO = ProductDAO(dbHelper)
 | 
			
		||||
 
 | 
			
		||||
@@ -15,10 +15,7 @@ import java.io.File
 | 
			
		||||
 | 
			
		||||
class FullscreenActivity : Activity() {
 | 
			
		||||
 | 
			
		||||
    private lateinit var binding: ActivityFullscreenBinding
 | 
			
		||||
    private lateinit var fullscreenImageView: ImageView
 | 
			
		||||
    private lateinit var fullscreenContentControls: LinearLayout
 | 
			
		||||
    private val hideHandler = Handler(Looper.myLooper()!!)
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ import android.content.Intent
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityGroupBinding
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.noInternetConnectionAvailableNotification
 | 
			
		||||
@@ -20,13 +18,7 @@ class GroupActivity : AppCompatActivity() {
 | 
			
		||||
        binding = ActivityGroupBinding.inflate(layoutInflater)
 | 
			
		||||
        setContentView(binding.root)
 | 
			
		||||
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        val sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        binding.createGroupButton.setOnClickListener {
 | 
			
		||||
            val groupName = binding.groupNameTextEdit.text.toString()
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,6 @@ import android.os.Bundle
 | 
			
		||||
import android.widget.ArrayAdapter
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityLoginBinding
 | 
			
		||||
@@ -26,13 +24,7 @@ class LoginActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        fillUpLanguagesSpinner()
 | 
			
		||||
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        val sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        binding.loginButton.setOnClickListener {
 | 
			
		||||
            val server = binding.serverTextEdit.text.toString()
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,6 @@ import androidx.appcompat.app.AlertDialog
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import androidx.viewpager.widget.ViewPager
 | 
			
		||||
import com.google.android.material.navigation.NavigationView
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.*
 | 
			
		||||
@@ -44,6 +42,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
 | 
			
		||||
    private var actionBarDrawerToggle: ActionBarDrawerToggle? = null
 | 
			
		||||
    private lateinit var ws: WebSocketClient
 | 
			
		||||
 | 
			
		||||
    var selectionMode = false
 | 
			
		||||
    private var selectedAmount = 0
 | 
			
		||||
 | 
			
		||||
    private lateinit var sharedPreferences: SharedPreferences
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
@@ -52,18 +53,18 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
 | 
			
		||||
        binding = ActivityMainBinding.inflate(layoutInflater)
 | 
			
		||||
        setContentView(binding.root)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(binding.toolbar)
 | 
			
		||||
        setupViewPager(binding.tabViewpager)
 | 
			
		||||
        binding.tabTablayout.setupWithViewPager(binding.tabViewpager)
 | 
			
		||||
 | 
			
		||||
        binding.tabTablayout.setOnDragListener { _, _ ->
 | 
			
		||||
            selectionMode = false
 | 
			
		||||
            selectedAmount = 0
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        drawerLayout = binding.drawerLayout
 | 
			
		||||
        actionBarDrawerToggle = ActionBarDrawerToggle(this, drawerLayout, R.string.nav_open, R.string.nav_close)
 | 
			
		||||
 | 
			
		||||
@@ -73,14 +74,6 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
 | 
			
		||||
 | 
			
		||||
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)
 | 
			
		||||
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        binding.expiryCalendarFab.setOnClickListener { _ ->
 | 
			
		||||
            val expiryCalendarIntent = Intent(this, ExpiryCalendarActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
@@ -88,7 +81,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
 | 
			
		||||
            ContextCompat.startActivity(this, expiryCalendarIntent, extras)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding.newElementFab.setOnClickListener { view ->
 | 
			
		||||
        binding.newElementFab.setOnClickListener { _ ->
 | 
			
		||||
            val currentPosition = binding.tabTablayout.selectedTabPosition
 | 
			
		||||
            val fragment = adapter.getItem(currentPosition)
 | 
			
		||||
 | 
			
		||||
@@ -499,4 +492,17 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
 | 
			
		||||
        val storageFragment = fragment as StorageFragment
 | 
			
		||||
        storageFragment.filterByCategory(id)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun addSelection() {
 | 
			
		||||
        selectionMode = true
 | 
			
		||||
        selectedAmount ++
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun removeSelection() {
 | 
			
		||||
        selectedAmount --
 | 
			
		||||
        if (selectedAmount <= 0) {
 | 
			
		||||
            selectedAmount = 0
 | 
			
		||||
            selectionMode = false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +1,10 @@
 | 
			
		||||
package org.foxarmy.barcodescannerforemployees.activities
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityManageGroupBinding
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.parseArray
 | 
			
		||||
@@ -14,6 +13,7 @@ import org.foxarmy.barcodescannerforemployees.views.GroupMemberView
 | 
			
		||||
class ManageGroupActivity : AppCompatActivity(){
 | 
			
		||||
    private lateinit var binding: ActivityManageGroupBinding
 | 
			
		||||
    private var isAdmin: Boolean = true
 | 
			
		||||
    private lateinit var sharedPreferences: SharedPreferences
 | 
			
		||||
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
@@ -23,15 +23,7 @@ class ManageGroupActivity : AppCompatActivity(){
 | 
			
		||||
 | 
			
		||||
        val groupId = intent.extras!!.getInt("groupId")
 | 
			
		||||
 | 
			
		||||
        val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
 | 
			
		||||
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            masterKeyAlias,
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val net = Net()
 | 
			
		||||
 | 
			
		||||
@@ -56,14 +48,6 @@ class ManageGroupActivity : AppCompatActivity(){
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun amIAnAdminIn(groupId: Int): Boolean {
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        val net = Net()
 | 
			
		||||
 | 
			
		||||
        net.token = sharedPreferences.getString("token", "")!!
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,6 @@ import android.content.Intent
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.widget.LinearLayout
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityMyGroupsBinding
 | 
			
		||||
@@ -22,13 +20,7 @@ class MyGroupsActivity : AppCompatActivity(){
 | 
			
		||||
        binding = ActivityMyGroupsBinding.inflate(layoutInflater)
 | 
			
		||||
        setContentView(binding.root)
 | 
			
		||||
 | 
			
		||||
        val sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        val sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        val net = Net()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ import android.app.Activity
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
 | 
			
		||||
class NavigatorActivity : Activity() {
 | 
			
		||||
 | 
			
		||||
@@ -14,13 +12,7 @@ class NavigatorActivity : Activity() {
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        var intent = Intent(this, MainActivity::class.java)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,6 @@ import android.os.Bundle
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.ArrayAdapter
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivitySettingsBinding
 | 
			
		||||
 | 
			
		||||
@@ -21,13 +19,7 @@ class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            applicationContext,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = org.foxarmy.barcodescannerforemployees.getPreferences(this)
 | 
			
		||||
 | 
			
		||||
        myGroups = sharedPreferences.getStringSet("groups", emptySet())!!.toList()
 | 
			
		||||
        currentGroup = sharedPreferences.getString("currentGroup", "offline")!!
 | 
			
		||||
 
 | 
			
		||||
@@ -11,13 +11,12 @@ import android.widget.Toast
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.view.children
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.AddCategoryActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.CategoryDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getPreferences
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.views.CategoryView
 | 
			
		||||
 | 
			
		||||
class CategoriesFragment : Fragment() {
 | 
			
		||||
@@ -28,13 +27,7 @@ class CategoriesFragment : Fragment() {
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            requireContext(),
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(requireContext())
 | 
			
		||||
 | 
			
		||||
        prepareDatabaseConnection()
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,13 @@ import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.view.children
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.gridlayout.widget.GridLayout
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.AddProductActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.ProductDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.FragmentShelfBinding
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getPreferences
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.views.ProductView
 | 
			
		||||
import kotlin.concurrent.thread
 | 
			
		||||
 | 
			
		||||
@@ -38,16 +37,9 @@ class ShelfFragment : Fragment() {
 | 
			
		||||
    override fun onCreate(savedInstanceState: Bundle?) {
 | 
			
		||||
        super.onCreate(savedInstanceState)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            requireContext(),
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(requireContext())
 | 
			
		||||
 | 
			
		||||
        prepareDatabaseConnection()
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreateView(
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,6 @@ import android.widget.*
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.view.children
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.Net
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.AddAbstractProductActivity
 | 
			
		||||
@@ -20,6 +18,7 @@ import org.foxarmy.barcodescannerforemployees.database.AbstractProductDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.databinding.FragmentStorageBinding
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.generateThumbnailForImage
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getPreferences
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.views.AbstractProductView
 | 
			
		||||
import kotlin.concurrent.thread
 | 
			
		||||
 | 
			
		||||
@@ -39,13 +38,7 @@ class StorageFragment : Fragment() {
 | 
			
		||||
    ): View {
 | 
			
		||||
        binding = FragmentStorageBinding.inflate(inflater)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            requireContext(),
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(requireContext())
 | 
			
		||||
 | 
			
		||||
        prepareDatabaseConnection()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,17 +16,15 @@ import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.content.ContextCompat.startActivity
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.*
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.FullscreenActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.MainActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.CategoryDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getImageUri
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getUnitNameById
 | 
			
		||||
import java.io.File
 | 
			
		||||
 | 
			
		||||
class AbstractProductView: LinearLayout {
 | 
			
		||||
class AbstractProductView : LinearLayout {
 | 
			
		||||
    private var productLayout: ConstraintLayout? = null
 | 
			
		||||
    private var productPicture: ImageView? = null
 | 
			
		||||
    private var productNameField: TextView? = null
 | 
			
		||||
@@ -42,16 +40,10 @@ class AbstractProductView: LinearLayout {
 | 
			
		||||
 | 
			
		||||
    constructor(context: Context, a: AttributeSet) : super(context, a) {
 | 
			
		||||
        activity = getActivity(context)!!
 | 
			
		||||
        val inflater:LayoutInflater = activity.layoutInflater
 | 
			
		||||
        val inflater: LayoutInflater = activity.layoutInflater
 | 
			
		||||
        inflater.inflate(R.layout.abstract_product_view, this)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            context,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(context)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(context, sharedPreferences.getString("currentGroup", "database")!!)
 | 
			
		||||
        categoryDAO = CategoryDAO(dbHelper)
 | 
			
		||||
@@ -60,7 +52,7 @@ class AbstractProductView: LinearLayout {
 | 
			
		||||
    constructor(activity: Activity, context: Context, abstractProduct: AbstractProduct) : super(context) {
 | 
			
		||||
        this.abstractProduct = abstractProduct
 | 
			
		||||
        this.activity = activity
 | 
			
		||||
        val inflater:LayoutInflater = activity.layoutInflater
 | 
			
		||||
        val inflater: LayoutInflater = activity.layoutInflater
 | 
			
		||||
        inflater.inflate(R.layout.abstract_product_view, this)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
@@ -76,7 +68,7 @@ class AbstractProductView: LinearLayout {
 | 
			
		||||
        update()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun init () {
 | 
			
		||||
    private fun init() {
 | 
			
		||||
        productLayout = findViewById(R.id.productLayout)
 | 
			
		||||
        productPicture = findViewById(R.id.productPicture)
 | 
			
		||||
        productNameField = findViewById(R.id.productNameView)
 | 
			
		||||
@@ -84,30 +76,8 @@ class AbstractProductView: LinearLayout {
 | 
			
		||||
        categoryField = findViewById(R.id.categoryView)
 | 
			
		||||
        unitField = findViewById(R.id.unitView)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        productPicture!!.setOnClickListener {
 | 
			
		||||
            val fullscreenIntent = Intent(activity, FullscreenActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
            extras.putString("imagehash", abstractProduct.imageHash)
 | 
			
		||||
            fullscreenIntent.putExtras(extras)
 | 
			
		||||
            startActivity(context, fullscreenIntent, extras)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        productLayout!!.setOnClickListener {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        setUpClicks()
 | 
			
		||||
        unitField?.text = getUnitNameById(context, abstractProduct.unit)
 | 
			
		||||
 | 
			
		||||
        productLayout!!.setOnLongClickListener {
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
            this.background = ContextCompat.getDrawable(context, if (isProductSelected) R.drawable.outline_selected else R.drawable.outline)
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        productNameField!!.setOnClickListener {
 | 
			
		||||
            Toast.makeText(activity, productNameField!!.text, Toast.LENGTH_SHORT).show()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun update() {
 | 
			
		||||
@@ -117,10 +87,120 @@ class AbstractProductView: LinearLayout {
 | 
			
		||||
        thumbnailsDir.mkdirs()
 | 
			
		||||
        val imageUri = getImageUri(activity, File(thumbnailsDir, "${abstractProduct.imageHash}.webp"))
 | 
			
		||||
        productPicture!!.setImageURI(imageUri)
 | 
			
		||||
//        productPicture!!.rotation = 90f
 | 
			
		||||
 | 
			
		||||
        productNameField!!.text = abstractProduct.name
 | 
			
		||||
        netWeightField!!.text = abstractProduct.netWeight.toString()
 | 
			
		||||
        categoryField!!.text = categoryDAO.getCategoryNameById(abstractProduct.category)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private fun setUpClicks() {
 | 
			
		||||
        productLayout!!.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        productNameField!!.setOnLongClickListener { onNameLongClick() }
 | 
			
		||||
        productPicture!!.setOnLongClickListener { onImageLongClick() }
 | 
			
		||||
        netWeightField!!.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        categoryField!!.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        unitField!!.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
 | 
			
		||||
        productLayout!!.setOnClickListener { onAnyClick() }
 | 
			
		||||
        netWeightField!!.setOnClickListener { onAnyClick() }
 | 
			
		||||
        categoryField!!.setOnClickListener { onAnyClick() }
 | 
			
		||||
        unitField!!.setOnClickListener { onAnyClick() }
 | 
			
		||||
        productPicture!!.setOnClickListener { onImageLongClick() }
 | 
			
		||||
        productNameField!!.setOnClickListener { onNameLongClick() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onAnyClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) return false
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
 | 
			
		||||
            if (isProductSelected) {
 | 
			
		||||
                mainActivity.addSelection()
 | 
			
		||||
            } else {
 | 
			
		||||
                mainActivity.removeSelection()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.background = ContextCompat.getDrawable(
 | 
			
		||||
                context,
 | 
			
		||||
                if (isProductSelected) R.drawable.outline_selected else R.drawable.outline
 | 
			
		||||
            )
 | 
			
		||||
            return true
 | 
			
		||||
        } else {
 | 
			
		||||
            return false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onAnyLongClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) return false
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
 | 
			
		||||
            if (isProductSelected) {
 | 
			
		||||
                mainActivity.addSelection()
 | 
			
		||||
            } else {
 | 
			
		||||
                mainActivity.removeSelection()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.background = ContextCompat.getDrawable(
 | 
			
		||||
                context,
 | 
			
		||||
                if (isProductSelected) R.drawable.outline_selected else R.drawable.outline
 | 
			
		||||
            )
 | 
			
		||||
            return true
 | 
			
		||||
        } else {
 | 
			
		||||
            mainActivity.addSelection()
 | 
			
		||||
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
 | 
			
		||||
            this.background = ContextCompat.getDrawable(
 | 
			
		||||
                context,
 | 
			
		||||
                if (isProductSelected) R.drawable.outline_selected else R.drawable.outline
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onImageLongClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) {
 | 
			
		||||
            val fullscreenIntent = Intent(activity, FullscreenActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
            extras.putString("imagehash", abstractProduct.imageHash)
 | 
			
		||||
            fullscreenIntent.putExtras(extras)
 | 
			
		||||
            startActivity(context, fullscreenIntent, extras)
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            return onAnyLongClick()
 | 
			
		||||
        } else {
 | 
			
		||||
            val fullscreenIntent = Intent(activity, FullscreenActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
            extras.putString("imagehash", abstractProduct.imageHash)
 | 
			
		||||
            fullscreenIntent.putExtras(extras)
 | 
			
		||||
            startActivity(context, fullscreenIntent, extras)
 | 
			
		||||
        }
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onNameLongClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) {
 | 
			
		||||
            Toast.makeText(activity, productNameField!!.text, Toast.LENGTH_SHORT).show()
 | 
			
		||||
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            return onAnyLongClick()
 | 
			
		||||
        } else {
 | 
			
		||||
            Toast.makeText(activity, productNameField!!.text, Toast.LENGTH_SHORT).show()
 | 
			
		||||
        }
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,16 +7,16 @@ import android.view.LayoutInflater
 | 
			
		||||
import android.widget.LinearLayout
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.MainActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.AbstractProductDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.dataclasses.Category
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getPreferences
 | 
			
		||||
 | 
			
		||||
class CategoryView : LinearLayout {
 | 
			
		||||
    var category: Category
 | 
			
		||||
 | 
			
		||||
    val categoryName: TextView
 | 
			
		||||
    val amountOfProducts: TextView
 | 
			
		||||
    var isCategorySelected = false
 | 
			
		||||
@@ -27,13 +27,7 @@ class CategoryView : LinearLayout {
 | 
			
		||||
    constructor(activity: Activity, context: Context, category: Category) : super(context) {
 | 
			
		||||
        this.category = category
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            context,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(context)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(context, sharedPreferences.getString("currentGroup", "database")!!)
 | 
			
		||||
        abstractProductDAO = AbstractProductDAO(dbHelper)
 | 
			
		||||
@@ -41,7 +35,7 @@ class CategoryView : LinearLayout {
 | 
			
		||||
        val inflater: LayoutInflater = activity.layoutInflater
 | 
			
		||||
        inflater.inflate(R.layout.category_view, this)
 | 
			
		||||
 | 
			
		||||
        this.background = ContextCompat.getDrawable(context, if (isCategorySelected) R.drawable.outline_selected else R.drawable.outline)
 | 
			
		||||
        updateStroke()
 | 
			
		||||
 | 
			
		||||
        categoryName = findViewById(R.id.categoryNameTextView)
 | 
			
		||||
        amountOfProducts = findViewById(R.id.amountOfProducts)
 | 
			
		||||
@@ -49,13 +43,45 @@ class CategoryView : LinearLayout {
 | 
			
		||||
        categoryName.text = category.name
 | 
			
		||||
        amountOfProducts.text = abstractProductDAO.getAmountOfAbstractProductsInCategory(category.id).toString()
 | 
			
		||||
 | 
			
		||||
        setOnLongClickListener {
 | 
			
		||||
            isCategorySelected = !isCategorySelected
 | 
			
		||||
            this.background = ContextCompat.getDrawable(context, if (isCategorySelected) R.drawable.outline_selected else R.drawable.outline)
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
        setOnClickListener {
 | 
			
		||||
            (activity as MainActivity).filterAbstractProductsByCategory(category.id)
 | 
			
		||||
        setUpClicks()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setUpClicks() {
 | 
			
		||||
        categoryName.setOnClickListener { onCategoryClick() }
 | 
			
		||||
        amountOfProducts.setOnClickListener { onCategoryClick() }
 | 
			
		||||
 | 
			
		||||
        categoryName.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        amountOfProducts.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onCategoryClick(): Boolean {
 | 
			
		||||
        if (context !is MainActivity) return false
 | 
			
		||||
        val mainActivity = context as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) return onAnyLongClick()
 | 
			
		||||
        else (context as MainActivity).filterAbstractProductsByCategory(category.id)
 | 
			
		||||
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onAnyLongClick(): Boolean {
 | 
			
		||||
        if (context !is MainActivity) return false
 | 
			
		||||
        val mainActivity = context as MainActivity
 | 
			
		||||
 | 
			
		||||
        isCategorySelected = !isCategorySelected
 | 
			
		||||
        updateStroke()
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            if (isCategorySelected) mainActivity.addSelection()
 | 
			
		||||
            else mainActivity.removeSelection()
 | 
			
		||||
        } else {
 | 
			
		||||
            mainActivity.addSelection()
 | 
			
		||||
        }
 | 
			
		||||
        return true
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun updateStroke() {
 | 
			
		||||
        this.background = ContextCompat.getDrawable(context, if (isCategorySelected) R.drawable.outline_selected else R.drawable.outline)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,12 +7,11 @@ import android.view.LayoutInflater
 | 
			
		||||
import android.widget.LinearLayout
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.ExpiryCalendarActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.ProductDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.getPreferences
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
 | 
			
		||||
class ExpiryGroupView : LinearLayout {
 | 
			
		||||
@@ -24,13 +23,7 @@ class ExpiryGroupView : LinearLayout {
 | 
			
		||||
 | 
			
		||||
    constructor(activity: Activity, context: Context, representingDate: Long) : super(context) {
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            context,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(context)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(context, sharedPreferences.getString("currentGroup", "database")!!)
 | 
			
		||||
        productDAO = ProductDAO(dbHelper)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import android.view.LayoutInflater
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
import android.widget.LinearLayout
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.annotation.RequiresApi
 | 
			
		||||
import androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
@@ -21,29 +22,26 @@ import androidx.core.graphics.blue
 | 
			
		||||
import androidx.core.graphics.green
 | 
			
		||||
import androidx.core.graphics.red
 | 
			
		||||
import androidx.core.math.MathUtils.clamp
 | 
			
		||||
import androidx.security.crypto.EncryptedSharedPreferences
 | 
			
		||||
import androidx.security.crypto.MasterKeys
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.R
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.*
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.FullscreenActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.calculateProductFreshness
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.activities.MainActivity
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.AbstractProductDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.CategoryDAO
 | 
			
		||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
			
		||||
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
 | 
			
		||||
import java.text.DecimalFormat
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
import java.util.*
 | 
			
		||||
import kotlin.concurrent.thread
 | 
			
		||||
 | 
			
		||||
class ProductView: LinearLayout {
 | 
			
		||||
class ProductView : LinearLayout {
 | 
			
		||||
    var product: Product = Product()
 | 
			
		||||
    var isProductSelected = false
 | 
			
		||||
    private var activity: Activity
 | 
			
		||||
 | 
			
		||||
    private lateinit var productLayout: ConstraintLayout
 | 
			
		||||
    private lateinit var productImageView: ImageView
 | 
			
		||||
    private lateinit var productNameTextView: TextView
 | 
			
		||||
    private lateinit var productNetWeightTextView: TextView
 | 
			
		||||
@@ -63,13 +61,7 @@ class ProductView: LinearLayout {
 | 
			
		||||
    constructor(context: Context, a: AttributeSet) : super(context, a) {
 | 
			
		||||
        activity = getActivity(context)!!
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            context,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(context)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(context, sharedPreferences.getString("currentGroup", "offline")!!)
 | 
			
		||||
        abstractProductDAO = AbstractProductDAO(dbHelper)
 | 
			
		||||
@@ -86,18 +78,13 @@ class ProductView: LinearLayout {
 | 
			
		||||
        val inflater: LayoutInflater = activity.layoutInflater
 | 
			
		||||
        inflater.inflate(R.layout.product_view, this)
 | 
			
		||||
 | 
			
		||||
        sharedPreferences = EncryptedSharedPreferences.create(
 | 
			
		||||
            "sensitive",
 | 
			
		||||
            MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
 | 
			
		||||
            context,
 | 
			
		||||
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
 | 
			
		||||
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 | 
			
		||||
        )
 | 
			
		||||
        sharedPreferences = getPreferences(context)
 | 
			
		||||
 | 
			
		||||
        val dbHelper = DBStorageController(context, sharedPreferences.getString("currentGroup", "offline")!!)
 | 
			
		||||
        abstractProductDAO = AbstractProductDAO(dbHelper)
 | 
			
		||||
        categoryDAO = CategoryDAO(dbHelper)
 | 
			
		||||
 | 
			
		||||
        productLayout = findViewById(R.id.productLayout)
 | 
			
		||||
        productImageView = findViewById(R.id.productPicture)
 | 
			
		||||
        productNameTextView = findViewById(R.id.productNameView)
 | 
			
		||||
        productNetWeightTextView = findViewById(R.id.productNetWeightView)
 | 
			
		||||
@@ -106,68 +93,152 @@ class ProductView: LinearLayout {
 | 
			
		||||
        productLifeSpan = findViewById(R.id.dateSpan)
 | 
			
		||||
        productFreshnessTextView = findViewById(R.id.freshnessPercentTextView)
 | 
			
		||||
 | 
			
		||||
        findViewById<ConstraintLayout>(R.id.productLayout).setOnLongClickListener {
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
            updateStroke()
 | 
			
		||||
            true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        productImageView.setOnClickListener {
 | 
			
		||||
            val fullscreenIntent = Intent(activity, FullscreenActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
            val abstractProduct = abstractProductDAO.findAbstractProductById(product.abstractProductId)
 | 
			
		||||
            extras.putString("imagehash", abstractProduct!!.imageHash)
 | 
			
		||||
            fullscreenIntent.putExtras(extras)
 | 
			
		||||
            startActivity(context, fullscreenIntent, extras)
 | 
			
		||||
        }
 | 
			
		||||
        setUpClicks()
 | 
			
		||||
 | 
			
		||||
        update()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    fun update () {
 | 
			
		||||
        val linkedAbstractProduct: AbstractProduct = abstractProductDAO.findAbstractProductById(product.abstractProductId) ?: return
 | 
			
		||||
    private fun setUpClicks() {
 | 
			
		||||
        productLayout.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        productImageView.setOnLongClickListener { onImageLongClick() }
 | 
			
		||||
        productNameTextView.setOnLongClickListener { onNameLongClick() }
 | 
			
		||||
        productNetWeightTextView.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        productAmountTextView.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        productCategoryView.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        productLifeSpan.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
        productFreshnessTextView.setOnLongClickListener { onAnyLongClick() }
 | 
			
		||||
 | 
			
		||||
        productLayout.setOnClickListener { onAnyClick() }
 | 
			
		||||
        productImageView.setOnClickListener { onImageLongClick() }
 | 
			
		||||
        productNameTextView.setOnClickListener { onNameLongClick() }
 | 
			
		||||
        productNetWeightTextView.setOnClickListener { onAnyClick() }
 | 
			
		||||
        productAmountTextView.setOnClickListener { onAnyClick() }
 | 
			
		||||
        productCategoryView.setOnClickListener { onAnyClick() }
 | 
			
		||||
        productLifeSpan.setOnClickListener { onAnyClick() }
 | 
			
		||||
        productFreshnessTextView.setOnClickListener { onAnyClick() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    private fun onAnyClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) return false
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            isProductSelected = !isProductSelected
 | 
			
		||||
 | 
			
		||||
            if (isProductSelected) mainActivity.addSelection()
 | 
			
		||||
            else mainActivity.removeSelection()
 | 
			
		||||
 | 
			
		||||
            updateStroke()
 | 
			
		||||
 | 
			
		||||
            return true
 | 
			
		||||
        } else {
 | 
			
		||||
            return false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    private fun onAnyLongClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) return false
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        isProductSelected = !isProductSelected
 | 
			
		||||
        updateStroke()
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            if (isProductSelected) mainActivity.addSelection()
 | 
			
		||||
            else mainActivity.removeSelection()
 | 
			
		||||
        } else {
 | 
			
		||||
            mainActivity.addSelection()
 | 
			
		||||
        }
 | 
			
		||||
        return true
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onNameLongClick(): Boolean {
 | 
			
		||||
        if (activity !is MainActivity) {
 | 
			
		||||
            Toast.makeText(activity, productNameTextView.text, Toast.LENGTH_SHORT).show()
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) return onAnyLongClick()
 | 
			
		||||
        else Toast.makeText(activity, productNameTextView.text, Toast.LENGTH_SHORT).show()
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onImageLongClick(): Boolean {
 | 
			
		||||
        val abstractProduct = abstractProductDAO.findAbstractProductById(product.abstractProductId)
 | 
			
		||||
 | 
			
		||||
        if (activity !is MainActivity) {
 | 
			
		||||
            val fullscreenIntent = Intent(activity, FullscreenActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
            extras.putString("imagehash", abstractProduct!!.imageHash)
 | 
			
		||||
            fullscreenIntent.putExtras(extras)
 | 
			
		||||
            startActivity(context, fullscreenIntent, extras)
 | 
			
		||||
            return true
 | 
			
		||||
        }
 | 
			
		||||
        val mainActivity = activity as MainActivity
 | 
			
		||||
 | 
			
		||||
        if (mainActivity.selectionMode) {
 | 
			
		||||
            return onAnyLongClick()
 | 
			
		||||
        } else {
 | 
			
		||||
            val fullscreenIntent = Intent(activity, FullscreenActivity::class.java)
 | 
			
		||||
            val extras = Bundle()
 | 
			
		||||
            extras.putString("imagehash", abstractProduct!!.imageHash)
 | 
			
		||||
            fullscreenIntent.putExtras(extras)
 | 
			
		||||
            startActivity(context, fullscreenIntent, extras)
 | 
			
		||||
        }
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    fun update() {
 | 
			
		||||
        val linkedAbstractProduct: AbstractProduct =
 | 
			
		||||
            abstractProductDAO.findAbstractProductById(product.abstractProductId) ?: return
 | 
			
		||||
 | 
			
		||||
        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()
 | 
			
		||||
        productAmountTextView.text = product.amount.toString()
 | 
			
		||||
        productCategoryView.text = categoryDAO.getCategoryNameById(linkedAbstractProduct.category)
 | 
			
		||||
        productLifeSpan.text = "${SimpleDateFormat("dd.MM.yyyy").format(Date(product.dateOfProduction*1000))}-${SimpleDateFormat("dd.MM.yyyy").format(Date(product.dateOfExpiry*1000))}"
 | 
			
		||||
        productLifeSpan.text = "${SimpleDateFormat("dd.MM.yyyy").format(Date(product.dateOfProduction * 1000))}-${
 | 
			
		||||
            SimpleDateFormat("dd.MM.yyyy").format(Date(product.dateOfExpiry * 1000))
 | 
			
		||||
        }"
 | 
			
		||||
        productFreshnessTextView.text =
 | 
			
		||||
        if (product.freshness == Double.NEGATIVE_INFINITY || product.freshness == Double.POSITIVE_INFINITY || product.freshness < 0) {
 | 
			
		||||
            context.getString(R.string.expired)
 | 
			
		||||
        } else {
 | 
			
		||||
            "${DecimalFormat("#.#").format(product.freshness*100)}%"
 | 
			
		||||
        }
 | 
			
		||||
            if (product.freshness == Double.NEGATIVE_INFINITY || product.freshness == Double.POSITIVE_INFINITY || product.freshness < 0) {
 | 
			
		||||
                context.getString(R.string.expired)
 | 
			
		||||
            } else {
 | 
			
		||||
                "${DecimalFormat("#.#").format(product.freshness * 100)}%"
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        updateStroke()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    fun updateStroke() {
 | 
			
		||||
         if (isProductSelected) {
 | 
			
		||||
             this.background = ContextCompat.getDrawable(context, R.drawable.outline_selected)
 | 
			
		||||
        if (isProductSelected) {
 | 
			
		||||
            this.background = ContextCompat.getDrawable(context, R.drawable.outline_selected)
 | 
			
		||||
        } else {
 | 
			
		||||
             if (product.id != 0) {
 | 
			
		||||
                 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)
 | 
			
		||||
             }
 | 
			
		||||
            if (product.id != 0) {
 | 
			
		||||
                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)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -178,13 +249,15 @@ class ProductView: LinearLayout {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun calculateFreshnessGradient(percentage: Double): Int {
 | 
			
		||||
        val startColor = ContextCompat.getColor(context, if (percentage > 0.5) R.color.full_freshness else R.color.half_freshness)
 | 
			
		||||
        val endColor = ContextCompat.getColor(context, if (percentage > 0.5) R.color.half_freshness else R.color.expired_freshness)
 | 
			
		||||
        val startColor =
 | 
			
		||||
            ContextCompat.getColor(context, if (percentage > 0.5) R.color.full_freshness else R.color.half_freshness)
 | 
			
		||||
        val endColor =
 | 
			
		||||
            ContextCompat.getColor(context, if (percentage > 0.5) R.color.half_freshness else R.color.expired_freshness)
 | 
			
		||||
 | 
			
		||||
        val gradientPosition = 1 - if (percentage > 0.5) (percentage - 0.5) * 2 else percentage * 2
 | 
			
		||||
 | 
			
		||||
        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 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 = Integer.toHexString(red)
 | 
			
		||||
@@ -194,7 +267,7 @@ class ProductView: LinearLayout {
 | 
			
		||||
        if (greenHex.length == 1) greenHex = "0$greenHex"
 | 
			
		||||
 | 
			
		||||
        var blueHex = Integer.toHexString(blue)
 | 
			
		||||
        if (blueHex.length == 1 ) blueHex = "0$blueHex"
 | 
			
		||||
        if (blueHex.length == 1) blueHex = "0$blueHex"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        val colorString = "#$redHex$greenHex$blueHex"
 | 
			
		||||
@@ -202,7 +275,7 @@ class ProductView: LinearLayout {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @RequiresApi(Build.VERSION_CODES.O)
 | 
			
		||||
    fun darkenColor(color: Int, darkPercent: Double) : Int {
 | 
			
		||||
    fun darkenColor(color: Int, darkPercent: Double): Int {
 | 
			
		||||
        val c = Color.valueOf(color)
 | 
			
		||||
 | 
			
		||||
        val red = c.red() * (1 - darkPercent)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent" android:id="@+id/productLayout" android:outlineProvider="bounds"
 | 
			
		||||
            android:background="#00FFFEFE" android:clickable="true">
 | 
			
		||||
            android:background="#00FFFEFE" android:clickable="true" android:translationZ="0sp">
 | 
			
		||||
        <ImageView
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="200dp" app:srcCompat="@android:drawable/ic_menu_gallery"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user