From cba668f28a8a2a98e8a7a8dd25066dc13e1a4e57 Mon Sep 17 00:00:00 2001 From: Brook Mezgebu Date: Sat, 27 Feb 2021 18:40:25 +0300 Subject: [PATCH 1/8] feat: hide / show the fab when the user scrolls the transaction list + NestedScrollView is better to handle Recycler views inside scrolling view-group + Hide the Fab when the user scrolls down so that the last item can be seen completely. --- .../view/dashboard/DashboardFragment.kt | 11 +++++++++++ app/src/main/res/layout/fragment_dashboard.xml | 5 +++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt b/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt index a2b43b8..04c5caa 100644 --- a/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt +++ b/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt @@ -7,6 +7,7 @@ import android.widget.ArrayAdapter import android.widget.Spinner import android.widget.TextView import androidx.appcompat.app.AppCompatDelegate +import androidx.core.widget.NestedScrollView import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -27,6 +28,7 @@ import indianRupee import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.first import show +import kotlin.math.abs @AndroidEntryPoint class DashboardFragment : @@ -183,6 +185,15 @@ class DashboardFragment : findNavController().navigate(R.id.action_dashboardFragment_to_addTransactionFragment) } + mainDashboardScrollView.setOnScrollChangeListener( + NestedScrollView.OnScrollChangeListener { _, sX, sY, oX, oY -> + if (abs(sY - oY) > 10) { + when { + sY > oY -> btnAddTransaction.hide() + oY > sY -> btnAddTransaction.show() + } + } + }) transactionAdapter.setOnItemClickListener { val bundle = Bundle().apply { putSerializable("transaction", it) diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index a557a2a..9339d4e 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -8,7 +8,8 @@ tools:context=".view.dashboard.DashboardFragment"> - - + Date: Sat, 27 Feb 2021 18:41:44 +0300 Subject: [PATCH 2/8] feat: show the app's icon and name when transaction is shared + show the app's icon and name at the bottom of the image when a given transaction is shared ( as an image ). --- .../details/TransactionDetailsFragment.kt | 33 ++++++++++++------- .../layout/content_transaction_details.xml | 24 ++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt b/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt index 52fba83..2f6fd7e 100644 --- a/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt +++ b/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt @@ -10,6 +10,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ShareCompat import androidx.core.content.ContextCompat import androidx.core.view.drawToBitmap +import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -23,8 +24,10 @@ import dev.spikeysanju.expensetracker.utils.saveBitmap import dev.spikeysanju.expensetracker.utils.viewState.DetailState import dev.spikeysanju.expensetracker.view.base.BaseFragment import dev.spikeysanju.expensetracker.view.main.viewmodel.TransactionViewModel +import hide import indianRupee import kotlinx.coroutines.flow.collect +import show @AndroidEntryPoint class TransactionDetailsFragment : BaseFragment() { @@ -126,19 +129,27 @@ class TransactionDetailsFragment : BaseFragment - saveBitmap(requireActivity(), bitmap) - } ?: run { - toast("Error occurred!") - return - } + // unHide the app logo and name + binding.transactionDetails.appIconForShare.show().let { + binding.transactionDetails.appNameForShare.show().let { + val imageURI = binding.transactionDetails.detailView.drawToBitmap().let { bitmap -> + binding.transactionDetails.appIconForShare.hide() + binding.transactionDetails.appNameForShare.hide() + saveBitmap(requireActivity(), bitmap) + } ?: run { + toast("Error occurred!") + return + } - val intent = ShareCompat.IntentBuilder(requireActivity()) - .setType("image/jpeg") - .setStream(imageURI) - .intent + val intent = ShareCompat.IntentBuilder(requireActivity()) + .setType("image/jpeg") + .setStream(imageURI) + .intent + + startActivity(Intent.createChooser(intent, null)) + } + } - startActivity(Intent.createChooser(intent, null)) } private fun isStoragePermissionGranted(): Boolean = ContextCompat.checkSelfPermission( diff --git a/app/src/main/res/layout/content_transaction_details.xml b/app/src/main/res/layout/content_transaction_details.xml index a364d67..c84d623 100644 --- a/app/src/main/res/layout/content_transaction_details.xml +++ b/app/src/main/res/layout/content_transaction_details.xml @@ -193,6 +193,30 @@ app:layout_constraintTop_toBottomOf="@id/caption_createdAt" tools:text="Sunday, 18 Dec 2021" /> + + + + From 81b70b5b663b5ad2c96d182066662137196d13d1 Mon Sep 17 00:00:00 2001 From: Brook Mezgebu Date: Sat, 27 Feb 2021 18:48:06 +0300 Subject: [PATCH 3/8] lint: fix lint errors --- .../expensetracker/view/dashboard/DashboardFragment.kt | 4 +++- .../expensetracker/view/details/TransactionDetailsFragment.kt | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt b/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt index 04c5caa..bd91702 100644 --- a/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt +++ b/app/src/main/java/dev/spikeysanju/expensetracker/view/dashboard/DashboardFragment.kt @@ -193,7 +193,9 @@ class DashboardFragment : oY > sY -> btnAddTransaction.show() } } - }) + } + ) + transactionAdapter.setOnItemClickListener { val bundle = Bundle().apply { putSerializable("transaction", it) diff --git a/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt b/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt index 2f6fd7e..aed66d8 100644 --- a/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt +++ b/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt @@ -10,7 +10,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ShareCompat import androidx.core.content.ContextCompat import androidx.core.view.drawToBitmap -import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -149,7 +148,6 @@ class TransactionDetailsFragment : BaseFragment Date: Sun, 28 Feb 2021 22:25:54 +0300 Subject: [PATCH 4/8] fix: corrections from code-review + using reference for dimension values + readability fixes on chained view operation. seems like it works fine without nesting the operations. --- .../details/TransactionDetailsFragment.kt | 40 +++++++++++-------- .../layout/content_transaction_details.xml | 6 +-- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt b/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt index aed66d8..c7b5b48 100644 --- a/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt +++ b/app/src/main/java/dev/spikeysanju/expensetracker/view/details/TransactionDetailsFragment.kt @@ -129,25 +129,31 @@ class TransactionDetailsFragment : BaseFragment - binding.transactionDetails.appIconForShare.hide() - binding.transactionDetails.appNameForShare.hide() - saveBitmap(requireActivity(), bitmap) - } ?: run { - toast("Error occurred!") - return - } + showAppNameAndLogo() + val imageURI = binding.transactionDetails.detailView.drawToBitmap().let { bitmap -> + hideAppNameAndLogo() + saveBitmap(requireActivity(), bitmap) + } ?: run { + toast("Error occurred!") + return + } - val intent = ShareCompat.IntentBuilder(requireActivity()) - .setType("image/jpeg") - .setStream(imageURI) - .intent + val intent = ShareCompat.IntentBuilder(requireActivity()) + .setType("image/jpeg") + .setStream(imageURI) + .intent - startActivity(Intent.createChooser(intent, null)) - } - } + startActivity(Intent.createChooser(intent, null)) + } + + private fun showAppNameAndLogo() = with(binding.transactionDetails) { + appIconForShare.show() + appNameForShare.show() + } + + private fun hideAppNameAndLogo() = with(binding.transactionDetails) { + appIconForShare.hide() + appNameForShare.hide() } private fun isStoragePermissionGranted(): Boolean = ContextCompat.checkSelfPermission( diff --git a/app/src/main/res/layout/content_transaction_details.xml b/app/src/main/res/layout/content_transaction_details.xml index c84d623..ac1b5c5 100644 --- a/app/src/main/res/layout/content_transaction_details.xml +++ b/app/src/main/res/layout/content_transaction_details.xml @@ -199,12 +199,12 @@ android:visibility="invisible" app:layout_constraintEnd_toStartOf="@+id/app_name_for_share" app:layout_constraintBottom_toBottomOf="parent" - android:layout_width="50dp" - android:layout_height="50dp" /> + android:layout_width="@dimen/dimen_64" + android:layout_height="@dimen/dimen_64" /> Date: Thu, 18 Mar 2021 15:23:25 +0600 Subject: [PATCH 5/8] implemented basic bio-metric --- app/build.gradle | 3 ++ app/src/main/AndroidManifest.xml | 3 +- .../expensetracker/view/main/MainActivity.kt | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ce37383..ae00e97 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,4 +96,7 @@ dependencies { //implementation "com.google.dagger:hilt-android-testing:$hilt_ver" implementation "androidx.hilt:hilt-common:1.0.0-alpha03" implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03" + + //Bio-metric + implementation 'androidx.biometric:biometric:1.2.0-alpha03' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 637e37e..d7ce326 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,8 @@ package="dev.spikeysanju.expensetracker"> - + Date: Fri, 19 Mar 2021 13:09:26 +0600 Subject: [PATCH 6/8] added settings in menu + settings fragment + biometric preference saved --- .idea/codeStyles/Project.xml | 15 +- .../data/local/datastore/SettingsDataStore.kt | 42 ++++ .../view/dashboard/DashboardFragment.kt | 4 + .../view/settings/SettingsFragment.kt | 39 ++++ .../view/settings/SettingsViewModel.kt | 31 +++ app/src/main/res/layout/fragment_settings.xml | 59 ++++++ app/src/main/res/menu/menu_ui.xml | 5 + app/src/main/res/navigation/nav_graph.xml | 200 ++++++++++-------- app/src/main/res/values/strings.xml | 2 + 9 files changed, 291 insertions(+), 106 deletions(-) create mode 100644 app/src/main/java/dev/spikeysanju/expensetracker/data/local/datastore/SettingsDataStore.kt create mode 100644 app/src/main/java/dev/spikeysanju/expensetracker/view/settings/SettingsFragment.kt create mode 100644 app/src/main/java/dev/spikeysanju/expensetracker/view/settings/SettingsViewModel.kt create mode 100644 app/src/main/res/layout/fragment_settings.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 3c7772a..208123b 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -3,18 +3,9 @@ -