From d34cbf6f551b25b4372c04b56bd2ae72ca43d1ef Mon Sep 17 00:00:00 2001 From: hmalik144 Date: Thu, 17 Aug 2023 14:36:20 +0100 Subject: [PATCH] - mid commit --- app/build.gradle | 4 + .../h_mal/appttude/com/driver/BaseUiTest.kt | 30 ----- .../appttude/com/driver/ui/HomeFragment.kt | 6 +- .../ui/driverprofile/DriverLicenseFragment.kt | 2 - .../ui/driverprofile/DriverProfileFragment.kt | 2 - .../PrivateHireLicenseFragment.kt | 2 - .../ui/vehicleprofile/InsuranceFragment.kt | 2 - .../ui/vehicleprofile/LogbookFragment.kt | 2 - .../driver/ui/vehicleprofile/MotFragment.kt | 2 - .../PrivateHireVehicleFragment.kt | 2 - .../vehicleprofile/VehicleProfileFragment.kt | 2 - app/src/main/AndroidManifest.xml | 4 +- .../appttude/com/driver/base/BaseActivity.kt | 3 +- .../com/driver/base/BaseFirebaseAdapter.kt | 1 + .../appttude/com/driver/base/BaseFragment.kt | 79 ------------- .../driver/base/DataSubmissionBaseFragment.kt | 32 ++---- .../com/driver/base/DrawerActivity.kt | 2 +- .../com/driver/base/ImageSelectorFragment.kt | 107 ++++++++++++++++++ .../driver/data/prefs/PreferencesProvider.kt | 3 +- .../com/driver/model/DriverProfile.kt | 2 +- .../com/driver/model/DriversLicense.kt | 2 +- .../appttude/com/driver/model/Insurance.kt | 2 +- .../appttude/com/driver/model/Logbook.kt | 2 +- .../h_mal/appttude/com/driver/model/Model.kt | 3 + .../h_mal/appttude/com/driver/model/Mot.kt | 2 +- .../com/driver/model/PrivateHireLicense.kt | 2 +- .../com/driver/model/PrivateHireVehicle.kt | 4 +- .../com/driver/model/VehicleProfile.kt | 2 +- .../appttude/com/driver/ui/.idea/.gitignore | 3 - .../appttude/com/driver/ui/.idea/dictionaries | 6 - .../appttude/com/driver/ui/.idea/kotlinc.xml | 6 - .../appttude/com/driver/ui/.idea/misc.xml | 11 -- .../appttude/com/driver/ui/.idea/modules.xml | 8 -- .../appttude/com/driver/ui/.idea/vcs.xml | 6 - .../ui/permission/DeclarationBuilder.kt | 18 +++ .../PermissionsDeclarationDialog.kt | 46 ++++++++ .../driver/ui/update/UpdateProfileFragment.kt | 23 +--- .../appttude/com/driver/utils/Extensions.kt | 4 +- .../com/driver/utils/FirebaseException.kt | 14 ++- .../com/driver/utils/FirebaseUtils.kt | 5 +- .../com/driver/utils/GenericsHelper.kt | 6 +- .../com/driver/utils/PermissionsUtils.kt | 7 -- .../main/res/drawable/baseline_check_24.xml | 13 ++- .../main/res/drawable/baseline_clear_24.xml | 13 ++- .../main/res/drawable/baseline_inbox_24.xml | 13 ++- .../drawable/ic_baseline_arrow_forward_24.xml | 10 +- .../ic_baseline_assignment_ind_24.xml | 10 +- .../drawable/ic_baseline_photo_library_24.xml | 10 +- app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/layout/app_bar_main.xml | 4 +- .../res/layout/fragment_delete_profile.xml | 8 +- .../res/layout/fragment_driver_license.xml | 38 +++---- .../res/layout/fragment_driver_profile.xml | 25 ++-- .../res/layout/fragment_forgot_password.xml | 4 +- .../main/res/layout/fragment_image_viewer.xml | 4 +- .../main/res/layout/fragment_insurance.xml | 14 +-- app/src/main/res/layout/fragment_logbook.xml | 36 +++--- app/src/main/res/layout/fragment_login.xml | 8 +- app/src/main/res/layout/fragment_mot.xml | 20 ++-- .../layout/fragment_private_hire_license.xml | 14 +-- .../layout/fragment_private_hire_vehicle.xml | 8 +- app/src/main/res/layout/fragment_register.xml | 29 ++--- .../main/res/layout/fragment_update_email.xml | 34 +++--- .../res/layout/fragment_update_password.xml | 28 ++--- .../res/layout/fragment_update_profile.xml | 12 +- .../res/layout/fragment_vehicle_setup.xml | 56 ++++----- .../res/layout/home_buttons_container.xml | 6 +- app/src/main/res/layout/nav_header_main.xml | 6 +- app/src/main/res/layout/splash_screen.xml | 6 +- app/src/main/res/layout/update_activity.xml | 2 +- .../res/layout/update_overview_fragment.xml | 16 +-- .../main/res/navigation/auth_navigation.xml | 2 +- 72 files changed, 464 insertions(+), 458 deletions(-) create mode 100644 app/src/main/java/h_mal/appttude/com/driver/base/ImageSelectorFragment.kt create mode 100644 app/src/main/java/h_mal/appttude/com/driver/model/Model.kt delete mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/.idea/.gitignore delete mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/.idea/dictionaries delete mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/.idea/kotlinc.xml delete mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/.idea/misc.xml delete mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/.idea/modules.xml delete mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/.idea/vcs.xml create mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/permission/DeclarationBuilder.kt create mode 100644 app/src/main/java/h_mal/appttude/com/driver/ui/permission/PermissionsDeclarationDialog.kt diff --git a/app/build.gradle b/app/build.gradle index 460167c..c2f24e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,4 +166,8 @@ dependencies { androidTestImplementation "com.squareup.retrofit2:converter-gson:$retrofit_version" / * screenshot library */ androidTestImplementation 'tools.fastlane:screengrab:2.1.1' + / * Permissions dispatcher * / + def dispatcher_ver = "4.9.2" + implementation "com.github.permissions-dispatcher:permissionsdispatcher:${dispatcher_ver}" + kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:${dispatcher_ver}" } diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/BaseUiTest.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/BaseUiTest.kt index 376fdf3..398869b 100644 --- a/app/src/androidTest/java/h_mal/appttude/com/driver/BaseUiTest.kt +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/BaseUiTest.kt @@ -25,7 +25,6 @@ import org.hamcrest.TypeSafeMatcher import org.hamcrest.core.AllOf import org.junit.After import org.junit.Before -import org.junit.ClassRule import org.junit.Rule import tools.fastlane.screengrab.Screengrab import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy @@ -89,35 +88,6 @@ open class BaseUiTest>( open fun beforeLaunch() {} open fun afterLaunch(context: Context) {} - - @Suppress("DEPRECATION") - fun checkToastMessage(message: String) { - onView(withText(message)).inRoot(object : TypeSafeMatcher() { - override fun describeTo(description: Description?) { - description?.appendText("is toast") - } - - override fun matchesSafely(root: Root): Boolean { - root.run { - if (windowLayoutParams.get().type == WindowManager.LayoutParams.TYPE_TOAST) { - decorView.run { - if (windowToken === applicationWindowToken) { - // windowToken == appToken means this window isn't contained by any other windows. - // if it was a window for an activity, it would have TYPE_BASE_APPLICATION. - return true - } - } - } - } - return false - } - } - ).check(matches(isDisplayed())) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { - waitFor(3500) - } - } - fun checkSnackBarDisplayedByMessage(message: String) { onView( CoreMatchers.allOf( diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/HomeFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/HomeFragment.kt index 2aadb99..cbccc2f 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/HomeFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/HomeFragment.kt @@ -3,7 +3,7 @@ package h_mal.appttude.com.driver.ui import android.os.Bundle import android.view.View import h_mal.appttude.com.driver.R -import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment +import h_mal.appttude.com.driver.base.BaseFragment import h_mal.appttude.com.driver.data.DRIVER import h_mal.appttude.com.driver.databinding.FragmentHomeDriverBinding import h_mal.appttude.com.driver.utils.hide @@ -13,9 +13,7 @@ import h_mal.appttude.com.driver.viewmodels.RoleViewModel class HomeFragment : - DataSubmissionBaseFragment() { - - override var model = String() + BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverLicenseFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverLicenseFragment.kt index ffddae4..daaeed2 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverLicenseFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverLicenseFragment.kt @@ -12,8 +12,6 @@ import h_mal.appttude.com.driver.viewmodels.DriverLicenseViewModel class DriverLicenseFragment : DataSubmissionBaseFragment() { - override var model = DriversLicense() - override fun setupView(binding: FragmentDriverLicenseBinding) { binding.apply { licExpiry.apply { diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverProfileFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverProfileFragment.kt index 9bf7614..c3c60d9 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverProfileFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/DriverProfileFragment.kt @@ -13,8 +13,6 @@ import h_mal.appttude.com.driver.viewmodels.DriverProfileViewModel class DriverProfileFragment : DataSubmissionBaseFragment() { - override var model = DriverProfile() - override fun setupView(binding: FragmentDriverProfileBinding) = binding.run { namesInput.setTextOnChange { model.forenames = it } addressInput.setTextOnChange { model.address = it } diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/PrivateHireLicenseFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/PrivateHireLicenseFragment.kt index 8c92dbd..a8ca6dc 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/PrivateHireLicenseFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/driverprofile/PrivateHireLicenseFragment.kt @@ -13,8 +13,6 @@ import h_mal.appttude.com.driver.viewmodels.PrivateHireLicenseViewModel class PrivateHireLicenseFragment : DataSubmissionBaseFragment () { - override var model = PrivateHireLicense() - override fun setupView(binding: FragmentPrivateHireLicenseBinding) = binding.run { phNo.setTextOnChange { model.phNumber = it } phExpiry.apply { diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/InsuranceFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/InsuranceFragment.kt index 535fd10..a1fe911 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/InsuranceFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/InsuranceFragment.kt @@ -18,8 +18,6 @@ class InsuranceFragment : private var selectedImages: List? = listOf() - override var model = Insurance() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setImageSelectionAsMultiple() diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/LogbookFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/LogbookFragment.kt index be5afe7..6970fc6 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/LogbookFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/LogbookFragment.kt @@ -12,8 +12,6 @@ import h_mal.appttude.com.driver.viewmodels.LogbookViewModel class LogbookFragment : DataSubmissionBaseFragment() { - override var model = Logbook() - override fun setupView(binding: FragmentLogbookBinding) = binding.run { v5cNo.setTextOnChange { model.v5cnumber = it } uploadLb.setOnClickListener { openGalleryWithPermissionRequest() } diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/MotFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/MotFragment.kt index f129729..10b5afa 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/MotFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/MotFragment.kt @@ -12,8 +12,6 @@ import h_mal.appttude.com.driver.viewmodels.MotViewModel class MotFragment : DataSubmissionBaseFragment() { - override var model = Mot() - override fun setupView(binding: FragmentMotBinding) = binding.run { motExpiry.apply { setOnClickListener { diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/PrivateHireVehicleFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/PrivateHireVehicleFragment.kt index aaa8ab8..1bcada4 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/PrivateHireVehicleFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/PrivateHireVehicleFragment.kt @@ -13,8 +13,6 @@ import h_mal.appttude.com.driver.viewmodels.PrivateHireVehicleViewModel class PrivateHireVehicleFragment : DataSubmissionBaseFragment() { - override var model = PrivateHireVehicle() - override fun setupView(binding: FragmentPrivateHireLicenseBinding) = binding.run { phNo.setTextOnChange { model.phCarNumber = it } phExpiry.apply { diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/VehicleProfileFragment.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/VehicleProfileFragment.kt index 650c70c..17c91c2 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/VehicleProfileFragment.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/vehicleprofile/VehicleProfileFragment.kt @@ -11,8 +11,6 @@ import h_mal.appttude.com.driver.viewmodels.VehicleProfileViewModel class VehicleProfileFragment : DataSubmissionBaseFragment () { - override var model = VehicleProfile() - override fun setupView(binding: FragmentVehicleSetupBinding) = binding.run { reg.setTextOnChange { model.reg = it } make.setTextOnChange { model.make = it } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9c321a0..6169748 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,8 +14,8 @@ android:theme="@style/AppTheme"> + android:exported="true" + android:theme="@style/AppTheme.NoActionBar.User"> diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt b/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt index c20577e..cc8d646 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.view.View -import android.view.View.OnAttachStateChangeListener import android.view.ViewGroup.LayoutParams import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.inflate @@ -156,6 +155,7 @@ abstract class BaseActivity : AppCompatActi super.onToastHidden() mIdlingResource?.setIdleState(true) } + override fun onToastShown() { super.onToastShown() mIdlingResource?.setIdleState(false) @@ -178,6 +178,7 @@ abstract class BaseActivity : AppCompatActi super.onShown(transientBottomBar) mIdlingResource?.setIdleState(false) } + override fun onDismissed(transientBottomBar: Snackbar?, event: Int) { super.onDismissed(transientBottomBar, event) mIdlingResource?.setIdleState(true) diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/BaseFirebaseAdapter.kt b/app/src/main/java/h_mal/appttude/com/driver/base/BaseFirebaseAdapter.kt index 62b13c5..d8863b8 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/BaseFirebaseAdapter.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/BaseFirebaseAdapter.kt @@ -59,6 +59,7 @@ open class BaseFirebaseAdapter( super.onDataChanged() if (itemCount == 0) emptyList() } + override fun onError(error: DatabaseError) { super.onError(error) when (error.code) { diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/BaseFragment.kt b/app/src/main/java/h_mal/appttude/com/driver/base/BaseFragment.kt index e80b26e..afb8fbe 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/BaseFragment.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/BaseFragment.kt @@ -1,14 +1,9 @@ package h_mal.appttude.com.driver.base -import android.content.ClipData -import android.content.Context -import android.content.Intent -import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.result.contract.ActivityResultContract import androidx.fragment.app.Fragment import androidx.fragment.app.createViewModelLazy import androidx.viewbinding.ViewBinding @@ -16,7 +11,6 @@ import h_mal.appttude.com.driver.application.ApplicationViewModelFactory import h_mal.appttude.com.driver.data.ViewState import h_mal.appttude.com.driver.utils.GenericsHelper.getGenericClassAt import h_mal.appttude.com.driver.utils.GenericsHelper.inflateBindingByType -import h_mal.appttude.com.driver.utils.PermissionsUtils import org.kodein.di.KodeinAware import org.kodein.di.android.x.kodein import org.kodein.di.generic.instance @@ -36,12 +30,6 @@ abstract class BaseFragment : Fragment(), K private fun getFragmentViewModel(): Lazy = createViewModelLazy(getGenericClassAt(0), { viewModelStore }, factoryProducer = { factory }) - private var multipleImage: Boolean = false - - fun setImageSelectionAsMultiple() { - multipleImage = true - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -101,73 +89,6 @@ abstract class BaseFragment : Fragment(), K } } - private fun ClipData.convertToList(): List = 0.rangeTo(itemCount).map { getItemAt(it).uri } - - /** - * Pair with {@link #Fragment.onRequestPermissionsResult} - * @param ourRequestCode - * @param requestCode - * checks that ourRequestCode was granted - * sends callback with - * @param permissionGranted - */ - fun onPermissionRequest( - requestCode: Int, ourRequestCode: Int, grantResults: IntArray, - permissionGranted: () -> Unit - ) { - when (requestCode) { - ourRequestCode -> { - if (PermissionsUtils.isGranted(grantResults)) { - permissionGranted.invoke() - } - return - } - } - } - - /** - * Called on the result of image selection - */ - open fun onImageGalleryResult(imageUri: Uri?) {} - - /** - * Called on the result of multiple image selection - */ - open fun onImageGalleryResult(imageUris: List?) {} - - fun openGalleryForImage() { - permissionRequest.launch(multipleImage) - } - - private val permissionRequest = registerForActivityResult(getResultsContract()) { result -> - @Suppress("UNCHECKED_CAST") - when (result) { - is Uri -> onImageGalleryResult(result) - is List<*> -> onImageGalleryResult(result as List) - } - } - - private fun getResultsContract(): ActivityResultContract { - return object : ActivityResultContract() { - override fun createIntent(context: Context, input: Boolean): Intent { - return Intent(Intent.ACTION_GET_CONTENT) - .addCategory(Intent.CATEGORY_OPENABLE) - .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, input) - .setType("image/*") - } - - override fun parseResult(resultCode: Int, intent: Intent?): Any? { - intent?.clipData?.takeIf { it.itemCount > 1 }?.convertToList()?.let { clip -> - val list = clip.takeIf { it.size > 10 }?.let { - clip.subList(0, 9) - } ?: clip - return list - } - return intent?.data - } - } - } - fun showToast(message: String) = (activity as BaseActivity<*, *>).showToast(message) fun showSnackBar(message: String) = (activity as BaseActivity<*, *>).showSnackBar(message) } \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/DataSubmissionBaseFragment.kt b/app/src/main/java/h_mal/appttude/com/driver/base/DataSubmissionBaseFragment.kt index 5f18b90..0823d55 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/DataSubmissionBaseFragment.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/DataSubmissionBaseFragment.kt @@ -1,26 +1,22 @@ package h_mal.appttude.com.driver.base -import android.Manifest import android.content.Intent -import android.net.Uri import android.os.Bundle import android.view.View import android.widget.EditText import androidx.core.widget.doAfterTextChanged import androidx.viewbinding.ViewBinding import h_mal.appttude.com.driver.data.UserAuthState +import h_mal.appttude.com.driver.model.Model import h_mal.appttude.com.driver.ui.user.LoginActivity -import h_mal.appttude.com.driver.utils.PermissionsUtils.askForPermissions +import h_mal.appttude.com.driver.utils.GenericsHelper.getGenericClassAt import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEditText +import kotlin.reflect.full.createInstance -private const val IMAGE_PERMISSION_RESULT = 402 +abstract class DataSubmissionBaseFragment, VB : ViewBinding, T : Model> : + ImageSelectorFragment() { -abstract class DataSubmissionBaseFragment, VB : ViewBinding, T : Any> : - BaseFragment() { - - var picUri: Uri? = null - - abstract var model: T + var model: T = getGenericClassAt(2).createInstance() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -52,17 +48,7 @@ abstract class DataSubmissionBaseFragment, VB open fun submit() {} fun openGalleryWithPermissionRequest() { - if (askForPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, IMAGE_PERMISSION_RESULT)) { - openGalleryForImage() - } - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) = onPermissionRequest(requestCode, IMAGE_PERMISSION_RESULT, grantResults) { - openGalleryForImage() + showStorageWithPermissionCheck() } fun validateEditTexts(vararg editTexts: EditText): Boolean { @@ -81,8 +67,4 @@ abstract class DataSubmissionBaseFragment, VB } } - override fun onImageGalleryResult(imageUri: Uri?) { - super.onImageGalleryResult(imageUri) - picUri = imageUri - } } \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt b/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt index 22194a2..563a64f 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt @@ -25,7 +25,7 @@ abstract class DrawerActivity : BaseActivit abstract val containerId: Int abstract val drawerLayoutId: Int abstract val toolbarId: Int - abstract val navViewId:Int + abstract val navViewId: Int lateinit var navController: NavController lateinit var appBarConfiguration: AppBarConfiguration diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/ImageSelectorFragment.kt b/app/src/main/java/h_mal/appttude/com/driver/base/ImageSelectorFragment.kt new file mode 100644 index 0000000..a5ee6b0 --- /dev/null +++ b/app/src/main/java/h_mal/appttude/com/driver/base/ImageSelectorFragment.kt @@ -0,0 +1,107 @@ +package h_mal.appttude.com.driver.base + +import android.Manifest +import android.content.ClipData +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.activity.result.contract.ActivityResultContract +import androidx.viewbinding.ViewBinding +import h_mal.appttude.com.driver.ui.permission.PermissionsDeclarationDialog +import permissions.dispatcher.NeedsPermission +import permissions.dispatcher.OnNeverAskAgain +import permissions.dispatcher.OnPermissionDenied +import permissions.dispatcher.OnShowRationale +import permissions.dispatcher.PermissionRequest +import permissions.dispatcher.RuntimePermissions + +@RuntimePermissions +open class ImageSelectorFragment : BaseFragment() { + private var multipleImage: Boolean = false + var picUri: Uri? = null + + fun setImageSelectionAsMultiple() { + multipleImage = true + } + + fun openGalleryForImage() { + permissionRequest.launch(multipleImage) + } + + private val permissionRequest = registerForActivityResult(getResultsContract()) { result -> + @Suppress("UNCHECKED_CAST") + when (result) { + is Uri -> onImageGalleryResult(result) + is List<*> -> onImageGalleryResult(result as List) + } + } + + private fun getResultsContract(): ActivityResultContract { + return object : ActivityResultContract() { + override fun createIntent(context: Context, input: Boolean): Intent { + return Intent(Intent.ACTION_GET_CONTENT) + .addCategory(Intent.CATEGORY_OPENABLE) + .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, input) + .setType("image/*") + } + + override fun parseResult(resultCode: Int, intent: Intent?): Any? { + intent?.clipData?.takeIf { it.itemCount > 1 }?.convertToList()?.let { clip -> + val list = clip.takeIf { it.size > 10 }?.let { + clip.subList(0, 9) + } ?: clip + return list + } + return intent?.data + } + } + } + + private fun ClipData.convertToList(): List = 0.rangeTo(itemCount).map { getItemAt(it).uri } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + // NOTE: delegate the permission handling to generated method + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.READ_EXTERNAL_STORAGE) + fun showStorage() { + openGalleryForImage() + } + + @OnShowRationale(Manifest.permission.READ_EXTERNAL_STORAGE) + fun showRationaleForStorage(request: PermissionRequest) { + PermissionsDeclarationDialog(requireContext()).showDialog({ + request.proceed() + }, { + request.cancel() + }) + } + + @OnPermissionDenied(Manifest.permission.READ_EXTERNAL_STORAGE) + fun onStorageDenied() { + showToast("Storage permissions have been denied") + } + + @OnNeverAskAgain(Manifest.permission.READ_EXTERNAL_STORAGE) + fun onStorageNeverAskAgain() { + showToast("Storage permissions have been to never ask again") + } + + /** + * Called on the result of image selection + */ + open fun onImageGalleryResult(imageUri: Uri?) { + picUri = imageUri + } + + /** + * Called on the result of multiple image selection + */ + open fun onImageGalleryResult(imageUris: List?) {} +} \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/data/prefs/PreferencesProvider.kt b/app/src/main/java/h_mal/appttude/com/driver/data/prefs/PreferencesProvider.kt index b017b28..7a990bd 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/data/prefs/PreferencesProvider.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/data/prefs/PreferencesProvider.kt @@ -10,7 +10,8 @@ import androidx.preference.PreferenceManager * */ const val SORT_OPTION = "SORT_OPTION" -class PreferenceProvider (context: Context) { + +class PreferenceProvider(context: Context) { private val appContext = context.applicationContext diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/DriverProfile.kt b/app/src/main/java/h_mal/appttude/com/driver/model/DriverProfile.kt index eceddf3..f6f9fc8 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/DriverProfile.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/DriverProfile.kt @@ -8,4 +8,4 @@ data class DriverProfile( var dob: String? = null, var ni: String? = null, var dateFirst: String? = null -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/DriversLicense.kt b/app/src/main/java/h_mal/appttude/com/driver/model/DriversLicense.kt index bbebc73..fd34f65 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/DriversLicense.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/DriversLicense.kt @@ -5,4 +5,4 @@ data class DriversLicense( var licenseImageString: String? = null, var licenseNumber: String? = null, var licenseExpiry: String? = null -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/Insurance.kt b/app/src/main/java/h_mal/appttude/com/driver/model/Insurance.kt index 117f69d..07461e4 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/Insurance.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/Insurance.kt @@ -4,4 +4,4 @@ data class Insurance( var photoStrings: MutableList? = null, var insurerName: String? = null, var expiryDate: String? = null -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/Logbook.kt b/app/src/main/java/h_mal/appttude/com/driver/model/Logbook.kt index 783404d..ea74f49 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/Logbook.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/Logbook.kt @@ -4,4 +4,4 @@ package h_mal.appttude.com.driver.model data class Logbook( var photoString: String? = null, var v5cnumber: String? = null -) +) : Model diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/Model.kt b/app/src/main/java/h_mal/appttude/com/driver/model/Model.kt new file mode 100644 index 0000000..004e1bc --- /dev/null +++ b/app/src/main/java/h_mal/appttude/com/driver/model/Model.kt @@ -0,0 +1,3 @@ +package h_mal.appttude.com.driver.model + +interface Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/Mot.kt b/app/src/main/java/h_mal/appttude/com/driver/model/Mot.kt index 4972e3c..10fa777 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/Mot.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/Mot.kt @@ -4,4 +4,4 @@ package h_mal.appttude.com.driver.model data class Mot( var motImageString: String? = null, var motExpiry: String? = null -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireLicense.kt b/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireLicense.kt index 9500840..9148c92 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireLicense.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireLicense.kt @@ -5,4 +5,4 @@ data class PrivateHireLicense( var phImageString: String? = null, var phNumber: String? = null, var phExpiry: String? = null -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireVehicle.kt b/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireVehicle.kt index 708087a..005a45a 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireVehicle.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/PrivateHireVehicle.kt @@ -1,8 +1,8 @@ package h_mal.appttude.com.driver.model -class PrivateHireVehicle( +data class PrivateHireVehicle( var phCarImageString: String? = null, var phCarNumber: String? = null, var phCarExpiry: String? = null -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/model/VehicleProfile.kt b/app/src/main/java/h_mal/appttude/com/driver/model/VehicleProfile.kt index 59ec3c0..106e68f 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/model/VehicleProfile.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/model/VehicleProfile.kt @@ -11,4 +11,4 @@ data class VehicleProfile( var keeperPostCode: String? = null, var startDate: String? = null, var isSeized: Boolean = false -) \ No newline at end of file +) : Model \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/.gitignore b/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/dictionaries b/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/dictionaries deleted file mode 100644 index ed3680a..0000000 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/dictionaries +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/kotlinc.xml b/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/kotlinc.xml deleted file mode 100644 index 8b7f4af..0000000 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/kotlinc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/misc.xml b/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/misc.xml deleted file mode 100644 index 51300e5..0000000 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/misc.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/modules.xml b/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/modules.xml deleted file mode 100644 index f16767d..0000000 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/vcs.xml b/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/vcs.xml deleted file mode 100644 index 07117e4..0000000 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/permission/DeclarationBuilder.kt b/app/src/main/java/h_mal/appttude/com/driver/ui/permission/DeclarationBuilder.kt new file mode 100644 index 0000000..feba9e5 --- /dev/null +++ b/app/src/main/java/h_mal/appttude/com/driver/ui/permission/DeclarationBuilder.kt @@ -0,0 +1,18 @@ +package h_mal.appttude.com.driver.ui.permission + +import android.content.Context +import android.text.Html +import androidx.annotation.StringRes + +interface DeclarationBuilder { + val link: String + val message: String + + fun Context.readFromResources(@StringRes id: Int) = resources.getString(id) + + fun buildMessage(): CharSequence? { + val link1 = "here" + val message = "$message See my privacy policy: $link1" + return Html.fromHtml(message, Html.FROM_HTML_MODE_LEGACY) + } +} \ No newline at end of file diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/permission/PermissionsDeclarationDialog.kt b/app/src/main/java/h_mal/appttude/com/driver/ui/permission/PermissionsDeclarationDialog.kt new file mode 100644 index 0000000..2c74d82 --- /dev/null +++ b/app/src/main/java/h_mal/appttude/com/driver/ui/permission/PermissionsDeclarationDialog.kt @@ -0,0 +1,46 @@ +package h_mal.appttude.com.driver.ui.permission + +import android.content.Context +import android.text.method.LinkMovementMethod +import android.view.View +import android.widget.TextView +import androidx.appcompat.app.AlertDialog + + +class PermissionsDeclarationDialog(context: Context) : BaseDeclarationDialog(context) { + + override val link: String = "https://sites.google.com/view/hmaldev/home/choice-cars" + override val message: String = + "Storage is required to access images on the devices" +} + +abstract class BaseDeclarationDialog(val context: Context) : DeclarationBuilder { + abstract override val link: String + abstract override val message: String + + lateinit var dialog: AlertDialog + + fun showDialog(agreeCallback: () -> Unit = { }, disagreeCallback: () -> Unit = { }) { + val myMessage = buildMessage() + + val builder = AlertDialog.Builder(context) + .setPositiveButton("agree") { _, _ -> + agreeCallback() + } + .setNegativeButton("disagree") { _, _ -> + disagreeCallback() + } + .setMessage(myMessage) + .setCancelable(false) + + dialog = builder.create() + dialog.show() + + // Make the textview clickable. Must be called after show() + val msgTxt = dialog.findViewById(android.R.id.message) as TextView? + msgTxt?.movementMethod = LinkMovementMethod.getInstance() + } + + fun dismiss() = dialog.dismiss() +} + diff --git a/app/src/main/java/h_mal/appttude/com/driver/ui/update/UpdateProfileFragment.kt b/app/src/main/java/h_mal/appttude/com/driver/ui/update/UpdateProfileFragment.kt index acd6984..1adbab3 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/ui/update/UpdateProfileFragment.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/ui/update/UpdateProfileFragment.kt @@ -1,20 +1,18 @@ package h_mal.appttude.com.driver.ui.update -import android.Manifest.permission.READ_EXTERNAL_STORAGE import android.net.Uri import androidx.core.widget.doAfterTextChanged import com.google.firebase.auth.FirebaseUser -import h_mal.appttude.com.driver.base.BaseFragment +import h_mal.appttude.com.driver.base.ImageSelectorFragment import h_mal.appttude.com.driver.databinding.FragmentUpdateProfileBinding -import h_mal.appttude.com.driver.utils.PermissionsUtils.askForPermissions import h_mal.appttude.com.driver.utils.setEnterPressedListener import h_mal.appttude.com.driver.utils.setGlideImage import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel const val TAG_CONST = "non-user" -private const val IMAGE_PERMISSION_RESULT = 402 -class UpdateProfileFragment : BaseFragment() { +class UpdateProfileFragment : + ImageSelectorFragment() { private var imageChangeListener: Boolean = false private var nameChangeListener: Boolean = false @@ -35,11 +33,7 @@ class UpdateProfileFragment : BaseFragment, - grantResults: IntArray - ) = onPermissionRequest(requestCode, IMAGE_PERMISSION_RESULT, grantResults) { - openGalleryForImage() - } - - override fun onSuccess(data: Any?) { super.onSuccess(data) if (data is FirebaseUser) setFields(data) diff --git a/app/src/main/java/h_mal/appttude/com/driver/utils/Extensions.kt b/app/src/main/java/h_mal/appttude/com/driver/utils/Extensions.kt index fbd64b5..215f8b6 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/utils/Extensions.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/utils/Extensions.kt @@ -5,7 +5,7 @@ package h_mal.appttude.com.driver.utils * * @sample #boolean.isTrue{ #Do something when its true } */ -inline fun Boolean.isTrue(block: () -> Unit){ +inline fun Boolean.isTrue(block: () -> Unit) { if (this) { block() } @@ -16,7 +16,7 @@ inline fun Boolean.isTrue(block: () -> Unit){ * * @sample #nullable.isNotNull{i -> i.doSomethingSinceItsNotNull() } */ -inline fun T?.isNotNull(block: (T) -> R): R?{ +inline fun T?.isNotNull(block: (T) -> R): R? { return if (this != null) { block(this) } else { diff --git a/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseException.kt b/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseException.kt index 5949f2a..43d85c4 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseException.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseException.kt @@ -15,31 +15,43 @@ class FirebaseException( enum class Status(private val code: Int) { DATA_STALE(-1), + /** The server indicated that this operation failed */ OPERATION_FAILED(-2), + /** This client does not have permission to perform this operation */ PERMISSION_DENIED(-3), + /** The operation had to be aborted due to a network disconnect */ DISCONNECTED(-4), + /** The supplied auth token has expired */ - EXPIRED_TOKEN (-6), + EXPIRED_TOKEN(-6), + /** * The specified authentication token is invalid. This can occur when the token is malformed, * expired, or the secret that was used to generate it has been revoked. */ INVALID_TOKEN(-7), + /** The transaction had too many retries */ MAX_RETRIES(-8), + /** The transaction was overridden by a subsequent set */ OVERRIDDEN_BY_SET(-9), + /** The service is unavailable */ UNAVAILABLE(-10), + /** An exception occurred in user code */ USER_CODE_EXCEPTION(-11), + /** The operation could not be performed due to a network error. */ NETWORK_ERROR(-24), + /** The write was canceled locally */ WRITE_CANCELED(-25), + /** * An unknown error occurred. Please refer to the error message and error details for more * information. diff --git a/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseUtils.kt b/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseUtils.kt index 00b35bf..3e5df12 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseUtils.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/utils/FirebaseUtils.kt @@ -37,6 +37,7 @@ suspend inline fun DatabaseReference.getDataFromDatabaseRef(): is EventResponse.Changed -> { response.snapshot.getValue(T::class.java) } + is EventResponse.Cancelled -> { throw FirebaseException(response.error) } @@ -53,17 +54,19 @@ suspend inline fun DatabaseReference.getListDataFromDatabaseRe is EventResponse.Changed -> { response.snapshot.children.map { it.getValue(T::class.java) } } + is EventResponse.Cancelled -> { throw FirebaseException(response.error) } } } -suspend fun DatabaseReference.getDataFromDatabaseRef(clazz : Class): T? { +suspend fun DatabaseReference.getDataFromDatabaseRef(clazz: Class): T? { return when (val response: EventResponse = singleValueEvent()) { is EventResponse.Changed -> { response.snapshot.getValue(clazz) } + is EventResponse.Cancelled -> { throw FirebaseException(response.error) } diff --git a/app/src/main/java/h_mal/appttude/com/driver/utils/GenericsHelper.kt b/app/src/main/java/h_mal/appttude/com/driver/utils/GenericsHelper.kt index 24238dd..421815d 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/utils/GenericsHelper.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/utils/GenericsHelper.kt @@ -19,7 +19,7 @@ object GenericsHelper { * * @sample inflateBindingByType(getGenericClassAt(0), layoutInflater) */ - fun inflateBindingByType( + fun inflateBindingByType( genericClassAt: KClass, layoutInflater: LayoutInflater ): VB = try { @@ -30,12 +30,12 @@ object GenericsHelper { && viewBinding.parameterTypes.getOrNull(0) == LayoutInflater::class.java }.invoke(null, layoutInflater) as VB } catch (exception: Exception) { - println ("generic class failed at = $genericClassAt") + println("generic class failed at = $genericClassAt") exception.printStackTrace() throw IllegalStateException("Can not inflate binding from generic") } - fun LayoutInflater.inflateBindingByType( + fun LayoutInflater.inflateBindingByType( container: ViewGroup?, genericClassAt: KClass ): VB = try { diff --git a/app/src/main/java/h_mal/appttude/com/driver/utils/PermissionsUtils.kt b/app/src/main/java/h_mal/appttude/com/driver/utils/PermissionsUtils.kt index 32ec414..5bc2fc9 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/utils/PermissionsUtils.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/utils/PermissionsUtils.kt @@ -9,7 +9,6 @@ import android.provider.Settings import androidx.appcompat.app.AlertDialog import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.fragment.app.Fragment object PermissionsUtils { @@ -39,12 +38,6 @@ object PermissionsUtils { return true } - fun Fragment.askForPermissions(permission: String, requestCode: Int): Boolean = - requireActivity().askForPermissions(permission, requestCode) - - fun isGranted(grantResults: IntArray): Boolean = - grantResults.getOrNull(0)?.equals(PERMISSION_GRANTED) ?: false - private fun Context.showPermissionDeniedDialog() { AlertDialog.Builder(this) .setTitle("Permission Denied") diff --git a/app/src/main/res/drawable/baseline_check_24.xml b/app/src/main/res/drawable/baseline_check_24.xml index 2501e9f..9e21ec4 100644 --- a/app/src/main/res/drawable/baseline_check_24.xml +++ b/app/src/main/res/drawable/baseline_check_24.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/baseline_clear_24.xml b/app/src/main/res/drawable/baseline_clear_24.xml index 70db409..49ac6f1 100644 --- a/app/src/main/res/drawable/baseline_clear_24.xml +++ b/app/src/main/res/drawable/baseline_clear_24.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/baseline_inbox_24.xml b/app/src/main/res/drawable/baseline_inbox_24.xml index 5857b5d..1dba458 100644 --- a/app/src/main/res/drawable/baseline_inbox_24.xml +++ b/app/src/main/res/drawable/baseline_inbox_24.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml index 02671e8..0035908 100644 --- a/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml +++ b/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24" + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_baseline_assignment_ind_24.xml b/app/src/main/res/drawable/ic_baseline_assignment_ind_24.xml index a0f1ea9..30504d3 100644 --- a/app/src/main/res/drawable/ic_baseline_assignment_ind_24.xml +++ b/app/src/main/res/drawable/ic_baseline_assignment_ind_24.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24" + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_baseline_photo_library_24.xml b/app/src/main/res/drawable/ic_baseline_photo_library_24.xml index 4f7eb78..d9e00e2 100644 --- a/app/src/main/res/drawable/ic_baseline_photo_library_24.xml +++ b/app/src/main/res/drawable/ic_baseline_photo_library_24.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24" + android:viewportHeight="24"> diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index ab15e00..7c39387 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,7 +1,7 @@ + android:theme="@style/AppTheme.AppBarOverlay" + app:elevation="0dp"> + android:inputType="textEmailAddress" /> + android:inputType="textPassword" /> + app:layout_constraintRight_toRightOf="parent"> + tools:src="@drawable/choice_img_round" /> + android:alpha="1" + android:elevation="1dp" + android:scaleType="centerInside" + android:src="@drawable/ic_baseline_photo_library_24" + app:civ_border_width="1dp" + app:civ_circle_color="@color/colour_one" + app:civ_shadow_radius="0.5dp" /> @@ -53,24 +53,24 @@ android:id="@+id/lic_no" style="@style/EditTextStyle.Date" android:hint="@string/drivers_license_no" + android:importantForAutofill="no" android:inputType="none" - android:maxLines="1" - android:importantForAutofill="no" /> + android:maxLines="1" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/til_lic_no"> + android:autofillHints="date" + android:hint="@string/license_expiry_date" /> @@ -78,10 +78,10 @@ android:id="@+id/submit" style="@style/TextButton.WithIcon" android:text="@string/submit" - app:layout_constraintTop_toBottomOf="@+id/til_submission" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/til_submission" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.8" /> diff --git a/app/src/main/res/layout/fragment_driver_profile.xml b/app/src/main/res/layout/fragment_driver_profile.xml index 0cdcd7d..dedd1e4 100644 --- a/app/src/main/res/layout/fragment_driver_profile.xml +++ b/app/src/main/res/layout/fragment_driver_profile.xml @@ -46,18 +46,17 @@ tools:src="@drawable/choice_img_round" /> - + + android:maxLines="1" /> @@ -67,6 +66,7 @@ android:id="@+id/address_input" style="@style/EditTextStyle" android:layout_marginBottom="12dp" + android:autofillHints="postalAddress" android:ems="10" android:gravity="top|start" android:hint="@string/address" @@ -75,8 +75,7 @@ android:maxLines="7" android:minLines="4" android:selectAllOnFocus="true" - android:singleLine="true" - android:autofillHints="postalAddress" /> + android:singleLine="true" /> @@ -86,12 +85,12 @@ android:id="@+id/postcode_input" style="@style/EditTextStyle" android:layout_marginBottom="12dp" + android:autofillHints="postalCode" android:hint="@string/postcode" android:inputType="none" android:maxLines="1" android:selectAllOnFocus="true" - android:singleLine="true" - android:autofillHints="postalCode" /> + android:singleLine="true" /> @@ -101,8 +100,8 @@ android:id="@+id/dob_input" style="@style/EditTextStyle.Date" android:layout_marginBottom="12dp" - android:hint="@string/date_of_birth" - android:autofillHints="date" /> + android:autofillHints="date" + android:hint="@string/date_of_birth" /> @@ -113,9 +112,9 @@ style="@style/EditTextStyle" android:layout_marginBottom="12dp" android:hint="@string/ni_number" - android:maxLines="1" android:importantForAutofill="no" android:inputType="none" + android:maxLines="1" tools:ignore="TextFields" /> @@ -126,8 +125,8 @@ android:id="@+id/date_first" style="@style/EditTextStyle.Date" android:layout_marginBottom="12dp" - android:hint="@string/date_first_available" - android:autofillHints="date" /> + android:autofillHints="date" + android:hint="@string/date_first_available" /> diff --git a/app/src/main/res/layout/fragment_forgot_password.xml b/app/src/main/res/layout/fragment_forgot_password.xml index de856a4..a74ae2d 100644 --- a/app/src/main/res/layout/fragment_forgot_password.xml +++ b/app/src/main/res/layout/fragment_forgot_password.xml @@ -37,9 +37,9 @@ + android:inputType="textEmailAddress" /> + android:contentDescription="@string/floating_action_button" + android:src="@drawable/ic_file_download_black_24dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_insurance.xml b/app/src/main/res/layout/fragment_insurance.xml index ffa2b0c..ea23678 100644 --- a/app/src/main/res/layout/fragment_insurance.xml +++ b/app/src/main/res/layout/fragment_insurance.xml @@ -10,12 +10,12 @@ android:id="@+id/carouselView" android:layout_width="match_parent" android:layout_height="200dp" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintBottom_toTopOf="@id/uploadInsurance" android:layout_marginBottom="12dp" app:autoPlay="false" app:fillColor="#FFFFFFFF" + app:layout_constraintBottom_toTopOf="@id/uploadInsurance" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" app:pageColor="#00000000" app:radius="6dp" app:strokeColor="#FF777777" @@ -41,11 +41,11 @@ android:id="@+id/insurer" style="@style/EditTextStyle" android:hint="@string/insurer" + android:importantForAutofill="no" android:inputType="none" android:maxLines="1" android:selectAllOnFocus="true" - android:singleLine="true" - android:importantForAutofill="no" /> + android:singleLine="true" /> @@ -61,9 +61,9 @@ style="@style/EditTextStyle.Date" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="date" android:hint="@string/insurance_expiry" - android:importantForAutofill="no" /> + android:importantForAutofill="no" + android:inputType="date" /> + android:layout_width="match_parent" + android:layout_height="match_parent"> + app:layout_constraintRight_toRightOf="parent"> + tools:src="@drawable/choice_img_round" /> + android:text="@string/upload_logbook" + app:layout_constraintBottom_toTopOf="@id/til_v5c" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintTop_toTopOf="parent"> + android:importantForAutofill="no" + android:inputType="none" /> + app:layout_constraintTop_toBottomOf="@+id/til_v5c" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.8"> diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index bbf0fb5..6441edc 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -45,9 +45,9 @@ style="@style/EditTextStyle" android:layout_width="match_parent" android:layout_height="match_parent" + android:autofillHints="emailAddress" android:hint="@string/prompt_email" - android:inputType="textEmailAddress" - android:autofillHints="emailAddress" /> + android:inputType="textEmailAddress" /> + android:inputType="textPassword" /> + app:layout_constraintRight_toRightOf="parent"> + tools:src="@drawable/choice_img_round" /> + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintTop_toTopOf="parent"> + android:autofillHints="" + android:hint="@string/mot_expiry_date" /> diff --git a/app/src/main/res/layout/fragment_private_hire_license.xml b/app/src/main/res/layout/fragment_private_hire_license.xml index ab5f92d..c27fdd2 100644 --- a/app/src/main/res/layout/fragment_private_hire_license.xml +++ b/app/src/main/res/layout/fragment_private_hire_license.xml @@ -9,8 +9,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:maxWidth="350dp" android:layout_marginBottom="12dp" + android:maxWidth="350dp" app:cardCornerRadius="28dp" app:cardElevation="0dp" app:layout_constraintBottom_toTopOf="@id/uploadphlic" @@ -22,9 +22,9 @@ android:layout_width="match_parent" android:layout_height="200dp" android:adjustViewBounds="true" + android:contentDescription="@string/image_description" android:scaleType="centerCrop" - tools:src="@drawable/choice_img" - android:contentDescription="@string/image_description" /> + tools:src="@drawable/choice_img" /> + tools:text="987651" /> @@ -64,9 +64,9 @@ + android:hint="@string/private_hire_license_expiry" + tools:text="30/12/2018" /> @@ -79,6 +79,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/til_submission" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.8"/> + app:layout_constraintVertical_bias="0.8" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_private_hire_vehicle.xml b/app/src/main/res/layout/fragment_private_hire_vehicle.xml index 921a962..db03ac3 100644 --- a/app/src/main/res/layout/fragment_private_hire_vehicle.xml +++ b/app/src/main/res/layout/fragment_private_hire_vehicle.xml @@ -20,9 +20,9 @@ android:layout_width="200dp" android:layout_height="200dp" android:adjustViewBounds="true" + android:contentDescription="@string/image_description" android:scaleType="centerCrop" - tools:src="@drawable/choice_img_round" - android:contentDescription="@string/image_description" /> + tools:src="@drawable/choice_img_round" /> + android:autofillHints="date" + android:hint="@string/private_hire_certificate_expiry" /> diff --git a/app/src/main/res/layout/fragment_register.xml b/app/src/main/res/layout/fragment_register.xml index 585d5f1..8e57d20 100644 --- a/app/src/main/res/layout/fragment_register.xml +++ b/app/src/main/res/layout/fragment_register.xml @@ -46,34 +46,35 @@ + app:layout_constraintStart_toStartOf="parent"> + android:inputType="textPersonName" /> + app:layout_constraintTop_toBottomOf="@+id/til_name" + app:layout_constraintTop_toTopOf="parent"> + + android:inputType="textEmailAddress" /> + + android:inputType="textPassword" /> + + android:inputType="textPassword" /> diff --git a/app/src/main/res/layout/fragment_update_email.xml b/app/src/main/res/layout/fragment_update_email.xml index 9c57b47..8fcb1e8 100644 --- a/app/src/main/res/layout/fragment_update_email.xml +++ b/app/src/main/res/layout/fragment_update_email.xml @@ -8,10 +8,10 @@ + app:layout_constraintStart_toStartOf="parent"> + android:autofillHints="emailAddress" + android:hint="@string/prompt_email" + android:inputType="textEmailAddress" /> + app:layout_constraintTop_toTopOf="parent"> + android:inputType="textPassword" /> + app:layout_constraintTop_toBottomOf="@+id/til_password_top" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.8" /> diff --git a/app/src/main/res/layout/fragment_update_password.xml b/app/src/main/res/layout/fragment_update_password.xml index 38aab78..55ba54a 100644 --- a/app/src/main/res/layout/fragment_update_password.xml +++ b/app/src/main/res/layout/fragment_update_password.xml @@ -31,33 +31,33 @@ + app:layout_constraintStart_toStartOf="parent"> + android:inputType="textEmailAddress" /> + app:layout_constraintTop_toBottomOf="@+id/til_name" + app:layout_constraintTop_toTopOf="parent"> + android:inputType="textPassword" /> + android:inputType="textPassword" /> + app:layout_constraintTop_toBottomOf="@+id/til_new_password" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.8"> diff --git a/app/src/main/res/layout/fragment_update_profile.xml b/app/src/main/res/layout/fragment_update_profile.xml index 5c8402d..e2d05c5 100644 --- a/app/src/main/res/layout/fragment_update_profile.xml +++ b/app/src/main/res/layout/fragment_update_profile.xml @@ -9,8 +9,8 @@ + app:layout_constraintTop_toTopOf="parent"> + android:inputType="textPersonName" /> + android:layout_marginBottom="12dp" + android:autofillHints="none" + android:hint="@string/car_reg" + android:inputType="textCapCharacters" /> @@ -26,12 +26,12 @@ + android:maxLines="1" /> @@ -39,12 +39,12 @@ + android:maxLines="1" /> @@ -52,12 +52,12 @@ + android:maxLines="1" /> @@ -65,15 +65,15 @@ + android:maxLines="1" /> @@ -81,7 +81,9 @@ + android:singleLine="true" /> @@ -100,16 +100,16 @@ + android:singleLine="true" /> @@ -117,10 +117,10 @@ + android:layout_marginBottom="12dp" + android:autofillHints="date" + android:hint="@string/car_start_date" /> @@ -129,17 +129,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="12dp" - android:hint="@string/vehicle_seized" android:buttonTint="@color/colour_eight" + android:hint="@string/vehicle_seized" android:padding="12dp" android:textSize="18sp" /> + android:text="@string/submit" /> \ No newline at end of file diff --git a/app/src/main/res/layout/home_buttons_container.xml b/app/src/main/res/layout/home_buttons_container.xml index 61fab04..b01206d 100644 --- a/app/src/main/res/layout/home_buttons_container.xml +++ b/app/src/main/res/layout/home_buttons_container.xml @@ -3,8 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:layout_marginBottom="64dp" + android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> @@ -12,8 +12,8 @@ + android:layout_marginBottom="12dp" + android:text="@string/driver_profile" /> + android:textAppearance="@style/TextAppearance.AppCompat.Body1" + android:textSize="18sp" /> + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/update_activity.xml b/app/src/main/res/layout/update_activity.xml index 451bc4f..cd9ce92 100644 --- a/app/src/main/res/layout/update_activity.xml +++ b/app/src/main/res/layout/update_activity.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/layout/update_overview_fragment.xml b/app/src/main/res/layout/update_overview_fragment.xml index 562503e..31015f5 100644 --- a/app/src/main/res/layout/update_overview_fragment.xml +++ b/app/src/main/res/layout/update_overview_fragment.xml @@ -26,22 +26,22 @@ app:layout_constraintTop_toBottomOf="@+id/login_title_tv" /> + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent" /> diff --git a/app/src/main/res/navigation/auth_navigation.xml b/app/src/main/res/navigation/auth_navigation.xml index a62d468..e487946 100644 --- a/app/src/main/res/navigation/auth_navigation.xml +++ b/app/src/main/res/navigation/auth_navigation.xml @@ -45,9 +45,9 @@ app:destination="@id/loginFragment" app:enterAnim="@anim/nav_default_pop_enter_anim" app:exitAnim="@anim/nav_default_pop_exit_anim" + app:launchSingleTop="true" app:popEnterAnim="@anim/nav_default_pop_enter_anim" app:popExitAnim="@anim/nav_default_pop_exit_anim" - app:launchSingleTop="true" app:popUpTo="@id/auth_navigation" app:popUpToInclusive="true" />