diff --git a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt index e75968f806a649d082f25083b2df061d72b2db53..2e0ef1127a59c145ed703fa0360ad8f42eb9a946 100644 --- a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt +++ b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt @@ -91,19 +91,32 @@ class MainActivity : AppCompatActivity(), ParentActivityService { headerText.text = text } - override fun showDialog(view: View) { + override fun showDialog( + view: View, + rootView: ViewGroup, + elevation: Float, + ) { + configureDialogBehavior(rootView) + dialogParent.removeAllViews() dialogParent.isClickable = true dialogParent.addView(view) dialogParent.setBlurEnabled(true) + + dialogParent.elevation = elevation } override fun showDialog( view: View, elevation: Float, ) { - showDialog(view) - dialogParent.elevation = elevation + val decorView = window.decorView as ViewGroup + showDialog(view, decorView, elevation) + } + + override fun showDialog(view: View) { + val decorView = window.decorView as ViewGroup + showDialog(view, decorView, 0f) } override fun hideDialog() { @@ -123,11 +136,10 @@ class MainActivity : AppCompatActivity(), ParentActivityService { dialogParent = binding.dialogParent } - private fun configureDialogBehavior() { - val decorView = window.decorView as ViewGroup + private fun configureDialogBehavior(rootView: ViewGroup) { dialogParent - .setupWith(decorView) - .setFrameClearDrawable(decorView.background) + .setupWith(rootView) + .setFrameClearDrawable(rootView.background) .setBlurRadius(DIALOG_BLUR_RADIUS) dialogParent.setBlurEnabled(false) } @@ -187,7 +199,6 @@ class MainActivity : AppCompatActivity(), ParentActivityService { currentFragmentId = null initializeComponents() - configureDialogBehavior() configureNavigation() } } diff --git a/app/src/main/java/com/example/bondoman/views/components/TextInputComponent.kt b/app/src/main/java/com/example/bondoman/views/components/TextInputComponent.kt index f5262780de4b67a9d56c36aa23101b145c255cc9..e87a97906dbc6cf6699955ed72d251813a580102 100644 --- a/app/src/main/java/com/example/bondoman/views/components/TextInputComponent.kt +++ b/app/src/main/java/com/example/bondoman/views/components/TextInputComponent.kt @@ -101,11 +101,13 @@ class TextInputComponent } fun disable() { - inputEditText.isEnabled = false + inputEditText.isCursorVisible = false + inputEditText.isFocusableInTouchMode = false } fun enable() { - inputEditText.isEnabled = true + inputEditText.isCursorVisible = true + inputEditText.isFocusableInTouchMode = true } // Setter methods for text change listeners diff --git a/app/src/main/java/com/example/bondoman/views/fragments/TransactionAddFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/TransactionAddFragment.kt index d3fd8be1f5ca1c6252a427d03014a335a4f316f0..1f6bf49a092d96f45c04e0fe7ed61cab7c11bd63 100644 --- a/app/src/main/java/com/example/bondoman/views/fragments/TransactionAddFragment.kt +++ b/app/src/main/java/com/example/bondoman/views/fragments/TransactionAddFragment.kt @@ -43,4 +43,13 @@ class TransactionAddFragment : TransactionFormFragment() { return view } + + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { + super.onViewCreated(view, savedInstanceState) + + changeLocation() + } } diff --git a/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt index 441612e4f911608abc503509da0dc1980f7c1694..22362c02cde5a97cdbbd031d3b8c2905ffaf6fe9 100644 --- a/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt +++ b/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt @@ -2,6 +2,7 @@ package com.example.bondoman.views.fragments import android.content.Context import android.content.pm.PackageManager +import android.location.Geocoder import android.location.Location import android.location.LocationListener import android.location.LocationManager @@ -15,6 +16,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.example.bondoman.R @@ -25,6 +27,7 @@ import com.example.bondoman.databinding.FragmentTransactionFormBinding import com.example.bondoman.views.utils.interfaces.ParentActivityService import com.example.bondoman.views.utils.interfaces.SecondaryFragment import java.util.Date +import java.util.Locale import java.util.function.Consumer abstract class TransactionFormFragment : Fragment(), SecondaryFragment { @@ -55,12 +58,18 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { ActivityResultContracts.RequestMultiplePermissions(), ) { permissions -> when { - permissions.getOrDefault(android.Manifest.permission.ACCESS_FINE_LOCATION, false) -> { + permissions.getOrDefault( + android.Manifest.permission.ACCESS_FINE_LOCATION, + false, + ) -> { // Precise location access granted. requestLocation() } - permissions.getOrDefault(android.Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { + permissions.getOrDefault( + android.Manifest.permission.ACCESS_COARSE_LOCATION, + false, + ) -> { // Only approximate location access granted. requestLocation() } @@ -85,7 +94,8 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { provider: String, status: Int, extras: Bundle, - ) {} + ) { + } override fun onProviderEnabled(provider: String) {} @@ -102,7 +112,8 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { provider: String, status: Int, extras: Bundle, - ) {} + ) { + } override fun onProviderEnabled(provider: String) {} @@ -143,7 +154,7 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { protected fun setLocation(location: String?) { this.location = location - binding.transactionFormLocationField.setText(location ?: "-") + binding.transactionFormLocationField.setText(location) } override fun onCreate(savedInstanceState: Bundle?) { @@ -195,6 +206,44 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { } } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun getLocationString( + location: Location, + callback: (String?) -> Unit, + ) { + val geocoder = Geocoder(requireContext(), Locale.getDefault()) + geocoder.getFromLocation( + location.latitude, + location.longitude, + 1, + ) { addresses -> + if (addresses.isNotEmpty()) { + val address = addresses[0] + val locationString = address.getAddressLine(0) + callback(locationString) + } else { + callback(null) + } + } + } + + private fun getLocationString(location: Location): String? { + val geocoder = Geocoder(requireContext(), Locale.getDefault()) + val addresses = + geocoder.getFromLocation( + location.latitude, + location.longitude, + 1, + ) + + return if (!addresses.isNullOrEmpty()) { + val address = addresses[0] + address.getAddressLine(0) + } else { + null + } + } + private fun changeLocationData() { assert(currentGpsLocation != null || currentNetworkLocation != null) @@ -213,8 +262,16 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { currentLocation = currentNetworkLocation } - location = currentLocation.toString() - binding.transactionFormLocationField.setText(currentLocation.toString()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getLocationString(currentLocation!!) { + location = it + binding.transactionFormLocationField.setText(it) + } + } else { + val locationString = getLocationString(currentLocation!!) + location = locationString + binding.transactionFormLocationField.setText(locationString) + } } private fun requestLocation() { @@ -229,19 +286,19 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { ) == PackageManager.PERMISSION_GRANTED, ) + binding.transactionFormLocationField.text = null + binding.transactionFormLocationField.setHint("Getting location ...") currentGpsLocation = null currentNetworkLocation = null val hasGps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) val hasNetwork = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) - val currentApiVersion = Build.VERSION.SDK_INT - Log.d("HAS GPS", hasGps.toString()) Log.d("HAS NETWORK", hasNetwork.toString()) if (hasGps) { - if (currentApiVersion >= Build.VERSION_CODES.R) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { locationManager.getCurrentLocation( LocationManager.GPS_PROVIDER, null, @@ -258,7 +315,7 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { } if (hasNetwork) { - if (currentApiVersion >= Build.VERSION_CODES.R) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { locationManager.getCurrentLocation( LocationManager.NETWORK_PROVIDER, null, @@ -283,7 +340,7 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment { } } - private fun changeLocation() { + protected fun changeLocation() { if ( ContextCompat.checkSelfPermission( requireContext(), diff --git a/app/src/main/java/com/example/bondoman/views/fragments/TransactionListFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/TransactionListFragment.kt index 773ed23df5b5c296b15ceccab1580a37c6399ddc..15b31fc6bcde8de39fca1bcf551a5c9c2b4b64c4 100644 --- a/app/src/main/java/com/example/bondoman/views/fragments/TransactionListFragment.kt +++ b/app/src/main/java/com/example/bondoman/views/fragments/TransactionListFragment.kt @@ -32,8 +32,6 @@ class TransactionListFragment : Fragment(), TransactionClickListener { private lateinit var viewBinding: FragmentTransactionListBinding private lateinit var currentTransactionObserver: (Transaction?) -> Unit - private val blurRadius: Float = 1f - private fun configureRecyclerView() { val transactions: List<Transaction> = listOf( @@ -113,7 +111,7 @@ class TransactionListFragment : Fragment(), TransactionClickListener { } detailLayout.setDeleteListener { - parentActivityService.showDialog(dialog) + parentActivityService.showDialog(dialog, detailLayout, DIALOG_ELEVATION) } } @@ -152,12 +150,12 @@ class TransactionListFragment : Fragment(), TransactionClickListener { ): View { viewBinding = FragmentTransactionListBinding.inflate(inflater, container, false) - addDialogComponent(inflater, container) - configureRecyclerView() configureDetailView() + addDialogComponent(inflater, container) + configureAddButton() return viewBinding.root @@ -173,6 +171,8 @@ class TransactionListFragment : Fragment(), TransactionClickListener { } companion object { + const val DIALOG_ELEVATION = 10f + @JvmStatic fun newInstance() = TransactionListFragment().apply { diff --git a/app/src/main/java/com/example/bondoman/views/fragments/TransactionUpdateFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/TransactionUpdateFragment.kt index 0a4136bda88f2f85e39b408ab1a8bba4c965eed2..a33e258c2cb827f03b5f0b72ad186c6db6f524f1 100644 --- a/app/src/main/java/com/example/bondoman/views/fragments/TransactionUpdateFragment.kt +++ b/app/src/main/java/com/example/bondoman/views/fragments/TransactionUpdateFragment.kt @@ -60,6 +60,9 @@ class TransactionUpdateFragment : TransactionFormFragment() { val autoCompleteTextView = getBinding().transactionFormAutoComplete autoCompleteTextView.dropDownHeight = 0 + // change location hint + getBinding().transactionFormLocationField.hint = "Change location" + // fill input fields val currentTransaction = args.CurrentTransaction setCategory(currentTransaction.category) diff --git a/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt b/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt index a83e1741a1f520a3b885a77a60f173769fb9a907..024726a4dfa03d8319395c1dc700e88fed9c4335 100644 --- a/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt +++ b/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt @@ -1,6 +1,7 @@ package com.example.bondoman.views.utils.interfaces import android.view.View +import android.view.ViewGroup import android.view.ViewGroup.LayoutParams interface ParentActivityService { @@ -30,6 +31,12 @@ interface ParentActivityService { elevation: Float, ) + fun showDialog( + view: View, + rootView: ViewGroup, + elevation: Float, + ) + fun hideDialog() fun dialogParentId(): Int diff --git a/app/src/main/res/layout/component_text_input.xml b/app/src/main/res/layout/component_text_input.xml index 55a625114813de201eacf72ca750024011900d18..76a089a87d7e7542f16ae73783f2a650870eab9d 100644 --- a/app/src/main/res/layout/component_text_input.xml +++ b/app/src/main/res/layout/component_text_input.xml @@ -16,7 +16,7 @@ <com.google.android.material.textfield.TextInputEditText android:id="@+id/text_input_component_field" android:layout_width="match_parent" - android:layout_height="39dp" + android:layout_height="wrap_content" android:background="@drawable/bg_full_border" android:hint="@string/dummy_input_text_hint" android:inputType="text" diff --git a/app/src/main/res/layout/fragment_transaction_form.xml b/app/src/main/res/layout/fragment_transaction_form.xml index b640e3a9b85e7cbfb2efa4ce5de92ea66c1f44b3..aa7c1f5ca1e857516463dee896a0cc294b275a87 100644 --- a/app/src/main/res/layout/fragment_transaction_form.xml +++ b/app/src/main/res/layout/fragment_transaction_form.xml @@ -69,11 +69,13 @@ <com.google.android.material.textfield.TextInputEditText android:id="@+id/transaction_form_location_field" android:layout_width="match_parent" - android:layout_height="39dp" + android:layout_height="wrap_content" android:background="@drawable/bg_full_border" - android:enabled="false" + android:cursorVisible="false" + android:focusableInTouchMode="false" android:hint="@string/hint_transaction_form_location" android:imeOptions="actionDone" + android:inputType="text" android:padding="10dp" android:textAppearance="@style/TextAppearance.TransactionForm.Input" android:textColor="@color/zinc_300" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e301f3438c68021bb42f0de0be37fe0928e8ae78..1153e44bbe0472a184941437dd08ae6da8c63291 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,7 +25,7 @@ <string name="dummy_text_input_label">Label</string> <string name="dummy_input_text_hint">Hint</string> <string name="label_transaction_form_location">Location</string> - <string name="hint_transaction_form_location">Allow to access location</string> + <string name="hint_transaction_form_location">Allow location access</string> <string name="text_change_location">Change location</string> <string name="text_save_button">Save</string> <string name="dummy_dropdown_item">Item</string>