From 1d7050c6879d5762f1c02566635affbe308f02fe Mon Sep 17 00:00:00 2001 From: leca Date: Sun, 17 Nov 2024 17:56:30 +0300 Subject: [PATCH] some ui improvements --- .../barcodescannerforemployees/Utils.kt | 19 +- .../activities/AccountSettingsActivity.kt | 12 +- .../activities/AddAbstractProductActivity.kt | 11 +- .../activities/AddCategoryActivity.kt | 10 +- .../activities/AddProductActivity.kt | 10 +- .../activities/ExpiryCalendarActivity.kt | 10 +- .../activities/FullscreenActivity.kt | 3 - .../activities/GroupActivity.kt | 10 +- .../activities/LoginActivity.kt | 10 +- .../activities/MainActivity.kt | 42 ++-- .../activities/ManageGroupActivity.kt | 22 +- .../activities/MyGroupsActivity.kt | 10 +- .../activities/NavigatorActivity.kt | 10 +- .../activities/SettingsActivity.kt | 10 +- .../fragments/CategoriesFragment.kt | 11 +- .../fragments/ShelfFragment.kt | 12 +- .../fragments/StorageFragment.kt | 11 +- .../views/AbstractProductView.kt | 158 ++++++++++---- .../views/CategoryView.kt | 60 ++++-- .../views/ExpiryGroupView.kt | 11 +- .../views/ProductView.kt | 203 ++++++++++++------ .../main/res/layout/abstract_product_view.xml | 2 +- 22 files changed, 358 insertions(+), 299 deletions(-) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/Utils.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/Utils.kt index a2e6cce..83d07e8 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/Utils.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/Utils.kt @@ -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 + ) } \ No newline at end of file diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AccountSettingsActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AccountSettingsActivity.kt index d9447a0..18c0857 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AccountSettingsActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AccountSettingsActivity.kt @@ -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() diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddAbstractProductActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddAbstractProductActivity.kt index fd3ee93..4cd5b9a 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddAbstractProductActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddAbstractProductActivity.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddCategoryActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddCategoryActivity.kt index 9642a48..fa2677e 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddCategoryActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddCategoryActivity.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddProductActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddProductActivity.kt index 48ea623..a6d5ea9 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddProductActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/AddProductActivity.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ExpiryCalendarActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ExpiryCalendarActivity.kt index aaaba71..1c3c3b0 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ExpiryCalendarActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ExpiryCalendarActivity.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/FullscreenActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/FullscreenActivity.kt index 5ead467..b6fa359 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/FullscreenActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/FullscreenActivity.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/GroupActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/GroupActivity.kt index 2707136..017ff2e 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/GroupActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/GroupActivity.kt @@ -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() diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/LoginActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/LoginActivity.kt index c2395f6..1709e92 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/LoginActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/LoginActivity.kt @@ -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() diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MainActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MainActivity.kt index 8aa3b96..f315103 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MainActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MainActivity.kt @@ -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 + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ManageGroupActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ManageGroupActivity.kt index 8bb9f24..9090d1b 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ManageGroupActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/ManageGroupActivity.kt @@ -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", "")!! diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MyGroupsActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MyGroupsActivity.kt index 3c3fcb8..21449ac 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MyGroupsActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/MyGroupsActivity.kt @@ -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() diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/NavigatorActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/NavigatorActivity.kt index 01917de..cb1c3f4 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/NavigatorActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/NavigatorActivity.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/SettingsActivity.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/SettingsActivity.kt index 5195133..1012af7 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/SettingsActivity.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/activities/SettingsActivity.kt @@ -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")!! diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/CategoriesFragment.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/CategoriesFragment.kt index 6c75dc3..4128ca1 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/CategoriesFragment.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/CategoriesFragment.kt @@ -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() } diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/ShelfFragment.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/ShelfFragment.kt index b7328d9..24bc463 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/ShelfFragment.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/ShelfFragment.kt @@ -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( diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/StorageFragment.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/StorageFragment.kt index dacf52b..ca9908d 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/StorageFragment.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/fragments/StorageFragment.kt @@ -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() diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/AbstractProductView.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/AbstractProductView.kt index d6fe38c..55f632f 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/AbstractProductView.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/AbstractProductView.kt @@ -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 + } } \ No newline at end of file diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/CategoryView.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/CategoryView.kt index e9b5927..983b43b 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/CategoryView.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/CategoryView.kt @@ -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) } } \ No newline at end of file diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ExpiryGroupView.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ExpiryGroupView.kt index 7a68f37..37b9753 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ExpiryGroupView.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ExpiryGroupView.kt @@ -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) diff --git a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ProductView.kt b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ProductView.kt index 7d6d1d9..3af388a 100644 --- a/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ProductView.kt +++ b/app/src/main/java/org/foxarmy/barcodescannerforemployees/views/ProductView.kt @@ -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(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) diff --git a/app/src/main/res/layout/abstract_product_view.xml b/app/src/main/res/layout/abstract_product_view.xml index e21f764..cec7a83 100644 --- a/app/src/main/res/layout/abstract_product_view.xml +++ b/app/src/main/res/layout/abstract_product_view.xml @@ -8,7 +8,7 @@ + android:background="#00FFFEFE" android:clickable="true" android:translationZ="0sp">