From 7be038ef2496bb18be5a41519b03d61266891e42 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Thu, 31 Aug 2023 13:09:31 +0100 Subject: [PATCH 1/6] - mid commit --- app/build.gradle | 3 ++ .../h_mal/farmr/ui/FilterDataFragment.kt | 3 +- .../h_mal/farmr/ui/FragmentAddItem.kt | 7 ++- .../appttude/h_mal/farmr/ui/FragmentMain.kt | 5 +- .../appttude/h_mal/farmr/ui/MainActivity.kt | 3 +- .../h_mal/farmr/ui/ShiftListAdapter.kt | 4 ++ .../h_mal/farmr/utils/NavigationUtils.kt | 32 ++++++++++++ .../main/res/navigation/shift_navigation.xml | 50 +++++++++++++++++++ gradle.properties | 1 + 9 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/appttude/h_mal/farmr/utils/NavigationUtils.kt create mode 100644 app/src/main/res/navigation/shift_navigation.xml diff --git a/app/build.gradle b/app/build.gradle index 3ba231c..1dd9a04 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,6 +49,9 @@ dependencies { implementation "androidx.lifecycle:lifecycle-livedata-core:$LIFECYCLE_VERSION" implementation "androidx.lifecycle:lifecycle-viewmodel:$LIFECYCLE_VERSION" implementation 'androidx.recyclerview:recyclerview:1.0.0' + / * Fragment Navigation * / + implementation "androidx.navigation:navigation-fragment-ktx:$NAVIGATION_VERSION" + implementation "androidx.navigation:navigation-ui-ktx:$NAVIGATION_VERSION" / * Unit testing * / testImplementation "junit:junit:$JUNIT_VERSION" androidTestRuntimeOnly "org.jetbrains.kotlin:kotlin-test-junit:$KOTLIN_VERSION" diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt index 400c5a4..b26aa3b 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt @@ -13,6 +13,7 @@ import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.base.BaseFragment import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.model.Success +import com.appttude.h_mal.farmr.utils.goBack import com.appttude.h_mal.farmr.utils.setDatePicker import com.appttude.h_mal.farmr.viewmodel.FilterViewModel @@ -100,6 +101,6 @@ class FilterDataFragment : BaseFragment(R.layout.fragment_filte override fun onSuccess(data: Any?) { super.onSuccess(data) - if (data is Success) popBackStack() + if (data is Success) goBack() } } \ No newline at end of file diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt index 1b9caf5..f147859 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt @@ -20,6 +20,7 @@ import com.appttude.h_mal.farmr.utils.createDialog import com.appttude.h_mal.farmr.utils.displayToast import com.appttude.h_mal.farmr.utils.formatAsCurrencyString import com.appttude.h_mal.farmr.utils.formatToTwoDpString +import com.appttude.h_mal.farmr.utils.goBack import com.appttude.h_mal.farmr.utils.hide import com.appttude.h_mal.farmr.utils.popBackStack import com.appttude.h_mal.farmr.utils.setDatePicker @@ -118,6 +119,8 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ } private fun setupViewAfterViewCreated() { +// val id = arguments?.let { FragmentAddItemArgs.fromBundle(it).id) + id = arguments?.getLong(ID) wholeView.hide() @@ -274,7 +277,7 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ override fun onBackPressed(): Boolean { if (mRadioGroup.checkedRadioButtonId == -1) { - mActivity?.popBackStack() + goBack() } else { requireContext().createDialog( title = "Discard Changes?", @@ -292,7 +295,7 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ super.onSuccess(data) if (data is Success) { displayToast(data.successMessage) - popBackStack() + goBack() } } } \ No newline at end of file diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt index 6723171..00528da 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt @@ -18,6 +18,7 @@ import com.appttude.h_mal.farmr.model.Success import com.appttude.h_mal.farmr.utils.createDialog import com.appttude.h_mal.farmr.utils.displayToast import com.appttude.h_mal.farmr.utils.hide +import com.appttude.h_mal.farmr.utils.navigateTo import com.appttude.h_mal.farmr.utils.navigateToFragment import com.appttude.h_mal.farmr.utils.show import com.appttude.h_mal.farmr.viewmodel.MainViewModel @@ -57,7 +58,7 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr }) view.findViewById(R.id.fab1).setOnClickListener { - navigateToFragment(FragmentAddItem(), name = "additem") + navigateTo(R.id.main_to_addItem) } } @@ -94,7 +95,7 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr } R.id.filter_data -> { - navigateToFragment(FilterDataFragment(), name = "filterdata") + navigateTo(R.id.main_to_filterData) return true } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt index 0ae17b4..c1f68c4 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt @@ -37,7 +37,8 @@ class MainActivity : BaseActivity() { currentFragment.onBackPressed() } else { if (supportFragmentManager.backStackEntryCount > 1) { - popBackStack() + // Todo: go back +// goBack() } else { super.onBackPressed() } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt index 5151661..db7deeb 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt @@ -80,6 +80,8 @@ class ShiftListAdapter( bundle = b, name = "furtherinfo" ) +// val nav = FragmentMainDirections.mainToFurtherInfo(data.id) +// fragment.navigateTo(nav) } editView.setOnClickListener { // Navigate to edit @@ -88,6 +90,8 @@ class ShiftListAdapter( bundle = b, name = "additem" ) +// val nav = FragmentMainDirections.mainToAddItem(data.id) +// fragment.navigateTo(nav) } view.setOnLongClickListener { AlertDialog.Builder(it.context) diff --git a/app/src/main/java/com/appttude/h_mal/farmr/utils/NavigationUtils.kt b/app/src/main/java/com/appttude/h_mal/farmr/utils/NavigationUtils.kt new file mode 100644 index 0000000..7193e42 --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/farmr/utils/NavigationUtils.kt @@ -0,0 +1,32 @@ +package com.appttude.h_mal.farmr.utils + +import android.view.View +import androidx.fragment.app.Fragment +import androidx.navigation.NavDirections +import androidx.navigation.Navigation +import com.appttude.h_mal.farmr.R + +fun Fragment.navigateToFragment(newFragment: Fragment) { + childFragmentManager.beginTransaction() + .add(R.id.container, newFragment) + .commit() +} + + +fun View.navigateTo(navigationId: Int) { + Navigation.findNavController(this).navigate(navigationId) +} + +fun View.navigateTo(navDirections: NavDirections) { + Navigation.findNavController(this).navigate(navDirections) +} + +fun Fragment.navigateTo(navigationId: Int) { + Navigation.findNavController(requireView()).navigate(navigationId) +} + +fun Fragment.navigateTo(navDirections: NavDirections) { + Navigation.findNavController(requireView()).navigate(navDirections) +} + +fun Fragment.goBack() = Navigation.findNavController(requireView()).popBackStack() \ No newline at end of file diff --git a/app/src/main/res/navigation/shift_navigation.xml b/app/src/main/res/navigation/shift_navigation.xml new file mode 100644 index 0000000..df34235 --- /dev/null +++ b/app/src/main/res/navigation/shift_navigation.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ae744b0..a183b97 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,6 +8,7 @@ MATERIAL_VERSION = 1.0.0 CONSTR_LAYOUT_VERSION = 1.1.3 LIFECYCLE_VERSION = 2.5.1 VIEWMODEL_VERSION = 2.4.1 +NAVIGATION_VERSION = 2.3.2 PREFERENCES_VERSION = 1.2.1 MOKITO_INLINE_VERSION = 2.13.0 CORE_TEST_VERSION = 2.1.0 From 1d0498fe4773d01040eccc3ad493d7abe28668db Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Thu, 31 Aug 2023 19:57:37 +0100 Subject: [PATCH 2/6] - mid commit --- app/build.gradle | 1 + .../h_mal/farmr/ui/FragmentAddItem.kt | 82 +++++++++---------- .../h_mal/farmr/ui/FurtherInfoFragment.kt | 8 +- .../appttude/h_mal/farmr/ui/MainActivity.kt | 12 ++- .../h_mal/farmr/ui/ShiftListAdapter.kt | 22 ++--- .../h_mal/farmr/viewmodel/InfoViewModel.kt | 8 +- app/src/main/res/layout/main_view.xml | 8 +- .../farmr/viewmodel/InfoViewModelTest.kt | 27 +----- build.gradle | 1 + 9 files changed, 68 insertions(+), 101 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1dd9a04..c62d206 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'androidx.navigation.safeargs' def relStorePassword = System.getenv("RELEASE_STORE_PASSWORD") def relKeyPassword = System.getenv("RELEASE_KEY_PASSWORD") diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt index f147859..43ff1bb 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt @@ -119,61 +119,54 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ } private fun setupViewAfterViewCreated() { -// val id = arguments?.let { FragmentAddItemArgs.fromBundle(it).id) + val id = arguments?.let { FragmentAddItemArgs.fromBundle(it).shiftId } - id = arguments?.getLong(ID) wholeView.hide() - val title = when (arguments?.containsKey(ID)) { - true -> { - // Since we are editing a shift lets load the shift data into the views - viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { - mLocationEditText.setText(description) - mDateEditText.setText(date) + val title = id?.let { + // Since we are editing a shift lets load the shift data into the views + viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { + mLocationEditText.setText(description) + mDateEditText.setText(date) - // Set types - mType = ShiftType.getEnumByType(type) - mDescription = description - mDate = date - mPayRate = rateOfPay + // Set types + mType = ShiftType.getEnumByType(type) + mDescription = description + mDate = date + mPayRate = rateOfPay - when (ShiftType.getEnumByType(type)) { - ShiftType.HOURLY -> { - mHourlyRadioButton.isChecked = true - mPieceRadioButton.isChecked = false - mTimeInEditText.setText(timeIn) - mTimeOutEditText.setText(timeOut) - mBreakEditText.setText(breakMins.toString()) - val durationText = "${duration.formatToTwoDpString()} Hours" - mDurationTextView.text = durationText + when (ShiftType.getEnumByType(type)) { + ShiftType.HOURLY -> { + mHourlyRadioButton.isChecked = true + mPieceRadioButton.isChecked = false + mTimeInEditText.setText(timeIn) + mTimeOutEditText.setText(timeOut) + mBreakEditText.setText(breakMins.toString()) + val durationText = "${duration.formatToTwoDpString()} Hours" + mDurationTextView.text = durationText - // Set fields - mTimeIn = timeIn - mTimeOut = timeOut - mBreaks = breakMins - } - - ShiftType.PIECE -> { - mHourlyRadioButton.isChecked = false - mPieceRadioButton.isChecked = true - mUnitEditText.setText(units.formatToTwoDpString()) - - // Set piece rate units - mUnits = units - } + // Set fields + mTimeIn = timeIn + mTimeOut = timeOut + mBreaks = breakMins } - mPayRateEditText.setText(rateOfPay.formatAsCurrencyString()) - mTotalPayTextView.text = totalPay.formatAsCurrencyString() - calculateTotalPay() + ShiftType.PIECE -> { + mHourlyRadioButton.isChecked = false + mPieceRadioButton.isChecked = true + mUnitEditText.setText(units.formatToTwoDpString()) + + // Set piece rate units + mUnits = units + } } + mPayRateEditText.setText(rateOfPay.formatAsCurrencyString()) + mTotalPayTextView.text = totalPay.formatAsCurrencyString() - // Return title - getString(R.string.edit_item_title) + calculateTotalPay() } - - else -> getString(R.string.add_item_title) - } + getString(R.string.edit_item_title) + } ?: getString(R.string.add_item_title) setTitle(title) } @@ -267,6 +260,7 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ StringBuilder().append(mDuration).append(" hours").toString() mDuration!! * mPayRate } + ShiftType.PIECE -> { (mUnits ?: 0f) * mPayRate } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt index be79fa7..a2b92a3 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt @@ -13,6 +13,7 @@ import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.utils.CURRENCY import com.appttude.h_mal.farmr.utils.formatAsCurrencyString import com.appttude.h_mal.farmr.utils.hide +import com.appttude.h_mal.farmr.utils.navigateTo import com.appttude.h_mal.farmr.utils.navigateToFragment import com.appttude.h_mal.farmr.utils.show import com.appttude.h_mal.farmr.viewmodel.InfoViewModel @@ -52,11 +53,14 @@ class FurtherInfoFragment : BaseFragment(R.layout.fragment_futher hourlyDetailHolder = view.findViewById(R.id.details_hourly_details) unitsHolder = view.findViewById(R.id.details_units_holder) + val id = FurtherInfoFragmentArgs.fromBundle(requireArguments()).shiftId + editButton.setOnClickListener { - navigateToFragment(FragmentAddItem(), name = "additem", bundle = arguments!!) + val nav = FragmentAddItemDirections.furtherInfoToAddItem(id) + navigateTo(nav) } - viewModel.retrieveData(arguments) + viewModel.retrieveData(id) } override fun onSuccess(data: Any?) { diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt index c1f68c4..15196c1 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt @@ -7,13 +7,16 @@ import android.os.Bundle import android.view.Menu import androidx.appcompat.widget.Toolbar import androidx.core.app.ActivityCompat +import androidx.navigation.fragment.NavHostFragment import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BaseActivity +import com.appttude.h_mal.farmr.utils.goBack import com.appttude.h_mal.farmr.utils.popBackStack class MainActivity : BaseActivity() { private lateinit var toolbar: Toolbar + private lateinit var navHost: NavHostFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -21,8 +24,10 @@ class MainActivity : BaseActivity() { toolbar = findViewById(R.id.toolbar) setSupportActionBar(toolbar) - val fragmentTransaction = supportFragmentManager.beginTransaction() - fragmentTransaction.replace(R.id.container, FragmentMain()).addToBackStack("main").commit() + navHost = supportFragmentManager + .findFragmentById(R.id.container) as NavHostFragment + val navController = navHost.navController + navController.setGraph(R.navigation.shift_navigation) } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -37,8 +42,7 @@ class MainActivity : BaseActivity() { currentFragment.onBackPressed() } else { if (supportFragmentManager.backStackEntryCount > 1) { - // Todo: go back -// goBack() + navHost.goBack() } else { super.onBackPressed() } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt index db7deeb..e7dbeed 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt @@ -15,6 +15,7 @@ import com.appttude.h_mal.farmr.data.legacydb.ShiftObject import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.utils.ID import com.appttude.h_mal.farmr.utils.generateView +import com.appttude.h_mal.farmr.utils.navigateTo import com.appttude.h_mal.farmr.utils.navigateToFragment class ShiftListAdapter( @@ -71,27 +72,16 @@ class ShiftListAdapter( } } - val b: Bundle = Bundle() - b.putLong(ID, data.id) + view.setOnClickListener { // Navigate to further info - fragment.navigateToFragment( - FurtherInfoFragment(), - bundle = b, - name = "furtherinfo" - ) -// val nav = FragmentMainDirections.mainToFurtherInfo(data.id) -// fragment.navigateTo(nav) + val nav = FurtherInfoFragmentDirections.mainToFurtherInfo(data.id) + fragment.navigateTo(nav) } editView.setOnClickListener { // Navigate to edit - fragment.navigateToFragment( - FragmentAddItem(), - bundle = b, - name = "additem" - ) -// val nav = FragmentMainDirections.mainToAddItem(data.id) -// fragment.navigateTo(nav) + val nav = FragmentAddItemDirections.mainToAddItem(data.id) + fragment.navigateTo(nav) } view.setOnLongClickListener { AlertDialog.Builder(it.context) diff --git a/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModel.kt b/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModel.kt index 025829e..8692912 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModel.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModel.kt @@ -10,13 +10,7 @@ class InfoViewModel( repository: Repository ) : ShiftViewModel(repository) { - fun retrieveData(bundle: Bundle?) { - val id = bundle?.getLong(ID) - if (id == null) { - onError("Failed to retrieve shift") - return - } - + fun retrieveData(id: Long) { val shift = getCurrentShift(id) if (shift == null) { onError("Failed to retrieve shift") diff --git a/app/src/main/res/layout/main_view.xml b/app/src/main/res/layout/main_view.xml index 5dcff32..a665835 100644 --- a/app/src/main/res/layout/main_view.xml +++ b/app/src/main/res/layout/main_view.xml @@ -32,14 +32,16 @@ - - + android:id="@+id/container" + tools:layout="@layout/fragment_main"> + \ No newline at end of file diff --git a/app/src/test/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModelTest.kt b/app/src/test/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModelTest.kt index 3fb73c0..443d363 100644 --- a/app/src/test/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModelTest.kt +++ b/app/src/test/java/com/appttude/h_mal/farmr/viewmodel/InfoViewModelTest.kt @@ -17,12 +17,10 @@ class InfoViewModelTest : ShiftViewModelTest() { // Arrange val id = anyLong() val shift = mockk() - val bundle = mockk() // Act every { repository.readSingleShiftFromDatabase(id) }.returns(shift) - every { bundle.getLong(ID) }.returns(id) - viewModel.retrieveData(bundle) + viewModel.retrieveData(id) // Assert assertIs(retrieveCurrentData()) @@ -32,35 +30,14 @@ class InfoViewModelTest : ShiftViewModelTest() { ) } - @Test - fun retrieveData_noValidBundleAndId_unsuccessfulRetrieval() { - // Arrange - val id = anyLong() - val shift = mockk() - val bundle = mockk() - - // Act - every { repository.readSingleShiftFromDatabase(id) }.returns(shift) - every { bundle.getLong(ID) }.returns(id) - viewModel.retrieveData(null) - - // Assert - assertEquals( - retrieveCurrentError(), - "Failed to retrieve shift" - ) - } - @Test fun retrieveData_validBundleNoShift_successfulRetrieval() { // Arrange val id = anyLong() - val bundle = mockk() // Act every { repository.readSingleShiftFromDatabase(id) }.returns(null) - every { bundle.getLong(ID) }.returns(id) - viewModel.retrieveData(bundle) + viewModel.retrieveData(id) // Assert assertEquals( diff --git a/build.gradle b/build.gradle index 4faecfe..12d88d4 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ buildscript { maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$NAVIGATION_VERSION" classpath "com.android.tools.build:gradle:$GRADLE_PLUGIN_VERSION" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION" classpath "com.autonomousapps:dependency-analysis-gradle-plugin:$GRADLE_ANALYZE_VERSION" From 21816430f5a2ccba039eef14fa36b167ed10fb82 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Thu, 31 Aug 2023 20:03:39 +0100 Subject: [PATCH 3/6] - mid commit --- .../java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt | 3 ++- .../main/java/com/appttude/h_mal/farmr/utils/Formatting.kt | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt index e7dbeed..588dac0 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt @@ -14,6 +14,7 @@ import com.appttude.h_mal.farmr.base.BaseRecyclerAdapter import com.appttude.h_mal.farmr.data.legacydb.ShiftObject import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.utils.ID +import com.appttude.h_mal.farmr.utils.formatToTwoDp import com.appttude.h_mal.farmr.utils.generateView import com.appttude.h_mal.farmr.utils.navigateTo import com.appttude.h_mal.farmr.utils.navigateToFragment @@ -48,7 +49,7 @@ class ShiftListAdapter( val typeText: String = data.type val descriptionText: String = data.description val dateText: String = data.date - val totalPayText: String = data.totalPay.toString() + val totalPayText: String = data.totalPay.formatToTwoDp().toString() descriptionTextView.text = descriptionText dateTextView.text = dateText diff --git a/app/src/main/java/com/appttude/h_mal/farmr/utils/Formatting.kt b/app/src/main/java/com/appttude/h_mal/farmr/utils/Formatting.kt index 5b007e1..3e77c47 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/utils/Formatting.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/utils/Formatting.kt @@ -8,9 +8,8 @@ import java.util.Currency import java.util.Date import java.util.Locale -fun String.formatToTwoDp(): Float { - val formattedString = String.format("%.2f", this) - return formattedString.toFloat() +fun String.formatToTwoDp(): String { + return String.format("%.2f", this) } fun Float.formatToTwoDp(): Float { @@ -27,7 +26,7 @@ fun Float.formatAsCurrencyString(): String? { } fun Float.formatToTwoDpString(): String { - return formatToTwoDp().toString() + return String.format("%.2f", this) } fun String.dateStringIsValid(): Boolean { From 85e0edb1e828932c1306377d46c9209467c37178 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Mon, 4 Sep 2023 23:05:05 +0100 Subject: [PATCH 4/6] - Show dialog on back press broken --- .../h_mal/farmr/ui/FragmentAddItem.kt | 6 +++-- .../h_mal/farmr/ui/FurtherInfoFragment.kt | 2 +- .../appttude/h_mal/farmr/ui/MainActivity.kt | 24 +++++++++++++++++++ .../h_mal/farmr/ui/ShiftListAdapter.kt | 4 ++-- .../appttude/h_mal/farmr/ui/SplashScreen.kt | 1 + .../appttude/h_mal/farmr/utils/Constants.kt | 1 + app/src/main/res/layout/main_view.xml | 1 + .../main/res/navigation/shift_navigation.xml | 1 - 8 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt index 43ff1bb..fc60a62 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt @@ -16,6 +16,7 @@ import com.appttude.h_mal.farmr.base.BaseFragment import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.model.Success import com.appttude.h_mal.farmr.utils.ID +import com.appttude.h_mal.farmr.utils.SHIFT_ID import com.appttude.h_mal.farmr.utils.createDialog import com.appttude.h_mal.farmr.utils.displayToast import com.appttude.h_mal.farmr.utils.formatAsCurrencyString @@ -119,13 +120,14 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ } private fun setupViewAfterViewCreated() { - val id = arguments?.let { FragmentAddItemArgs.fromBundle(it).shiftId } + val id = arguments?.takeIf { it.containsKey(SHIFT_ID) } + ?.let { FragmentAddItemArgs.fromBundle(it).shiftId } wholeView.hide() val title = id?.let { // Since we are editing a shift lets load the shift data into the views - viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { + viewModel.getCurrentShift(id)?.run { mLocationEditText.setText(description) mDateEditText.setText(date) diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt index a2b92a3..31813a1 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt @@ -56,7 +56,7 @@ class FurtherInfoFragment : BaseFragment(R.layout.fragment_futher val id = FurtherInfoFragmentArgs.fromBundle(requireArguments()).shiftId editButton.setOnClickListener { - val nav = FragmentAddItemDirections.furtherInfoToAddItem(id) + val nav = FurtherInfoFragmentDirections.furtherInfoToAddItem(id) navigateTo(nav) } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt index 15196c1..9cf7cf4 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.content.pm.PackageManager import android.os.Bundle import android.view.Menu +import android.view.MenuItem import androidx.appcompat.widget.Toolbar import androidx.core.app.ActivityCompat import androidx.navigation.fragment.NavHostFragment @@ -36,6 +37,19 @@ class MainActivity : BaseActivity() { return true } + override fun onSupportNavigateUp(): Boolean { + val currentFragment = navHost.parentFragment + return if (currentFragment is BackPressedListener) { + currentFragment.onBackPressed() + } else { + if (supportFragmentManager.backStackEntryCount > 1) { + navHost.goBack() + } else { + super.onSupportNavigateUp() + } + } + } + override fun onBackPressed() { val currentFragment = supportFragmentManager.findFragmentById(R.id.container) if (currentFragment is BackPressedListener) { @@ -48,4 +62,14 @@ class MainActivity : BaseActivity() { } } } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + when (item.itemId) { + android.R.id.home -> onBackPressed() + } + return super.onOptionsItemSelected(item) + } } \ No newline at end of file diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt index 588dac0..1fea169 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt @@ -76,12 +76,12 @@ class ShiftListAdapter( view.setOnClickListener { // Navigate to further info - val nav = FurtherInfoFragmentDirections.mainToFurtherInfo(data.id) + val nav = FragmentMainDirections.mainToFurtherInfo(data.id) fragment.navigateTo(nav) } editView.setOnClickListener { // Navigate to edit - val nav = FragmentAddItemDirections.mainToAddItem(data.id) + val nav = FragmentMainDirections.mainToAddItem(data.id) fragment.navigateTo(nav) } view.setOnLongClickListener { diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/SplashScreen.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/SplashScreen.kt index 5f8cfd8..34a7896 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/SplashScreen.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/SplashScreen.kt @@ -22,6 +22,7 @@ class SplashScreen : Activity() { Handler(Looper.getMainLooper()).postDelayed({ startActivity(i) overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) + this.finish() }, SPLASH_TIME_OUT) } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/utils/Constants.kt b/app/src/main/java/com/appttude/h_mal/farmr/utils/Constants.kt index 59f48f8..fc14614 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/utils/Constants.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/utils/Constants.kt @@ -4,4 +4,5 @@ const val LEGACY = "LEGACY_" const val DATE_FORMAT = "yyyy-MM-dd" const val TIME_FORMAT = "hh:mm" const val ID = "ID" +const val SHIFT_ID = "shiftId" const val CURRENCY = "£" \ No newline at end of file diff --git a/app/src/main/res/layout/main_view.xml b/app/src/main/res/layout/main_view.xml index a665835..aef69db 100644 --- a/app/src/main/res/layout/main_view.xml +++ b/app/src/main/res/layout/main_view.xml @@ -41,6 +41,7 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" + app:defaultNavHost="true" android:id="@+id/container" tools:layout="@layout/fragment_main"> diff --git a/app/src/main/res/navigation/shift_navigation.xml b/app/src/main/res/navigation/shift_navigation.xml index df34235..9a6584d 100644 --- a/app/src/main/res/navigation/shift_navigation.xml +++ b/app/src/main/res/navigation/shift_navigation.xml @@ -27,7 +27,6 @@ tools:layout="@layout/fragment_add_item" > Date: Fri, 8 Sep 2023 21:05:19 +0100 Subject: [PATCH 5/6] - Dialog on exit when add/edit shift - menu buttons only on main fragment - title of fragment correct --- .../appttude/h_mal/farmr/base/FormFragment.kt | 46 ++++++++ .../h_mal/farmr/ui/FilterDataFragment.kt | 11 +- .../h_mal/farmr/ui/FragmentAddItem.kt | 104 ++++++++++-------- .../appttude/h_mal/farmr/ui/FragmentMain.kt | 13 ++- .../h_mal/farmr/ui/FurtherInfoFragment.kt | 11 +- .../appttude/h_mal/farmr/ui/MainActivity.kt | 11 -- .../farmr/viewmodel/SubmissionViewModel.kt | 1 + 7 files changed, 136 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/com/appttude/h_mal/farmr/base/FormFragment.kt diff --git a/app/src/main/java/com/appttude/h_mal/farmr/base/FormFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/base/FormFragment.kt new file mode 100644 index 0000000..253ceb5 --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/farmr/base/FormFragment.kt @@ -0,0 +1,46 @@ +package com.appttude.h_mal.farmr.base + +import android.text.Editable +import android.text.TextWatcher +import android.view.ViewGroup +import android.widget.EditText +import androidx.annotation.LayoutRes +import androidx.core.view.children + + +open class FormFragment(@LayoutRes contentLayoutId: Int) : BaseFragment(contentLayoutId) { + private val initialFormData = mutableMapOf() + private val formData = mutableMapOf() + + fun applyFormListener(view: ViewGroup) { + view.children.forEach { + if (it is EditText) { + initialFormData[it.id] = it.text.trim().toString() + setDataInMap(it.id, it.text.trim().toString()) + it.addCustomTextWatch() + } else if (it is ViewGroup) { + applyFormListener(it) + } + } + } + + fun didFormChange(): Boolean { + return !(initialFormData.all { (k, v) -> + formData[k] == v + }) + } + + private fun EditText.addCustomTextWatch() { + addTextChangedListener(object : TextWatcher{ + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { } + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + setDataInMap(id, p0.toString()) + } + override fun afterTextChanged(p0: Editable?) { } + }) + } + + private fun setDataInMap(id: Int, text: String) { + formData[id] = text + } +} \ No newline at end of file diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt index 400c5a4..785ca82 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FilterDataFragment.kt @@ -33,7 +33,6 @@ class FilterDataFragment : BaseFragment(R.layout.fragment_filte override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setTitle(getString(R.string.title_activity_filter_data)) LocationET = view.findViewById(R.id.filterLocationEditText) dateFromET = view.findViewById(R.id.fromdateInEditText) @@ -75,6 +74,16 @@ class FilterDataFragment : BaseFragment(R.layout.fragment_filte submit.setOnClickListener(this) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(false) + } + + override fun onResume() { + super.onResume() + setTitle(getString(R.string.title_activity_filter_data)) + } + override fun onItemSelected( parentView: AdapterView<*>?, selectedItemView: View?, diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt index 1b9caf5..2ab0a89 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt @@ -2,6 +2,7 @@ package com.appttude.h_mal.farmr.ui import android.os.Bundle import android.view.View +import android.view.ViewGroup import android.widget.Button import android.widget.EditText import android.widget.LinearLayout @@ -12,7 +13,7 @@ import android.widget.TextView import androidx.core.widget.doAfterTextChanged import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.base.BackPressedListener -import com.appttude.h_mal.farmr.base.BaseFragment +import com.appttude.h_mal.farmr.base.FormFragment import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.model.Success import com.appttude.h_mal.farmr.utils.ID @@ -28,7 +29,7 @@ import com.appttude.h_mal.farmr.utils.show import com.appttude.h_mal.farmr.utils.validateField import com.appttude.h_mal.farmr.viewmodel.SubmissionViewModel -class FragmentAddItem : BaseFragment(R.layout.fragment_add_item), +class FragmentAddItem : FormFragment(R.layout.fragment_add_item), RadioGroup.OnCheckedChangeListener, BackPressedListener { private lateinit var mHourlyRadioButton: RadioButton @@ -117,61 +118,69 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ setupViewAfterViewCreated() } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(false) + } + + override fun onResume() { + super.onResume() + val title = when (arguments?.containsKey(ID)) { + true -> getString(R.string.edit_item_title) + else -> getString(R.string.add_item_title) + } + setTitle(title) + } + private fun setupViewAfterViewCreated() { id = arguments?.getLong(ID) wholeView.hide() - val title = when (arguments?.containsKey(ID)) { - true -> { - // Since we are editing a shift lets load the shift data into the views - viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { - mLocationEditText.setText(description) - mDateEditText.setText(date) + if (arguments?.containsKey(ID) == true) { + // Since we are editing a shift lets load the shift data into the views + viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { + mLocationEditText.setText(description) + mDateEditText.setText(date) - // Set types - mType = ShiftType.getEnumByType(type) - mDescription = description - mDate = date - mPayRate = rateOfPay + // Set types + mType = ShiftType.getEnumByType(type) + mDescription = description + mDate = date + mPayRate = rateOfPay - when (ShiftType.getEnumByType(type)) { - ShiftType.HOURLY -> { - mHourlyRadioButton.isChecked = true - mPieceRadioButton.isChecked = false - mTimeInEditText.setText(timeIn) - mTimeOutEditText.setText(timeOut) - mBreakEditText.setText(breakMins.toString()) - val durationText = "${duration.formatToTwoDpString()} Hours" - mDurationTextView.text = durationText + when (ShiftType.getEnumByType(type)) { + ShiftType.HOURLY -> { + mHourlyRadioButton.isChecked = true + mPieceRadioButton.isChecked = false + mTimeInEditText.setText(timeIn) + mTimeOutEditText.setText(timeOut) + mBreakEditText.setText(breakMins.toString()) + val durationText = "${duration.formatToTwoDpString()} Hours" + mDurationTextView.text = durationText - // Set fields - mTimeIn = timeIn - mTimeOut = timeOut - mBreaks = breakMins - } - - ShiftType.PIECE -> { - mHourlyRadioButton.isChecked = false - mPieceRadioButton.isChecked = true - mUnitEditText.setText(units.formatToTwoDpString()) - - // Set piece rate units - mUnits = units - } + // Set fields + mTimeIn = timeIn + mTimeOut = timeOut + mBreaks = breakMins } - mPayRateEditText.setText(rateOfPay.formatAsCurrencyString()) - mTotalPayTextView.text = totalPay.formatAsCurrencyString() - calculateTotalPay() + ShiftType.PIECE -> { + mHourlyRadioButton.isChecked = false + mPieceRadioButton.isChecked = true + mUnitEditText.setText(units.formatToTwoDpString()) + + // Set piece rate units + mUnits = units + } } + mPayRateEditText.setText(rateOfPay.formatAsCurrencyString()) + mTotalPayTextView.text = totalPay.formatAsCurrencyString() - // Return title - getString(R.string.edit_item_title) + calculateTotalPay() } - - else -> getString(R.string.add_item_title) } - setTitle(title) + + applyFormListener(view = view as ViewGroup) } override fun onCheckedChanged(radioGroup: RadioGroup, id: Int) { @@ -264,6 +273,7 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ StringBuilder().append(mDuration).append(" hours").toString() mDuration!! * mPayRate } + ShiftType.PIECE -> { (mUnits ?: 0f) * mPayRate } @@ -273,9 +283,7 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ } override fun onBackPressed(): Boolean { - if (mRadioGroup.checkedRadioButtonId == -1) { - mActivity?.popBackStack() - } else { + if (didFormChange()) { requireContext().createDialog( title = "Discard Changes?", message = "Are you sure you want to discard changes?", @@ -284,6 +292,8 @@ class FragmentAddItem : BaseFragment(R.layout.fragment_add_ mActivity?.popBackStack() } ) + } else { + mActivity?.popBackStack() } return true } diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt index a8a7487..4cc3d54 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt @@ -3,6 +3,8 @@ package com.appttude.h_mal.farmr.ui import android.app.AlertDialog import android.content.Intent import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import androidx.core.content.FileProvider @@ -33,11 +35,15 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setTitle("Shift List") // Inflate the layout for this fragment setHasOptionsMenu(true) } + override fun onResume() { + super.onResume() + setTitle("Shift List") + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -59,6 +65,11 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr viewModel.refreshLiveData() } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + // Inflate the menu; this adds items to the action bar if it is present. + inflater.inflate(R.menu.menu_main, menu) + } + override fun onSuccess(data: Any?) { super.onSuccess(data) if (data is List<*>) { diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt index be79fa7..4c498d7 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FurtherInfoFragment.kt @@ -35,7 +35,6 @@ class FurtherInfoFragment : BaseFragment(R.layout.fragment_futher override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setTitle(getString(R.string.further_info_title)) progressBarFI = view.findViewById(R.id.progressBar_info) wholeView = view.findViewById(R.id.further_info_view) @@ -59,6 +58,16 @@ class FurtherInfoFragment : BaseFragment(R.layout.fragment_futher viewModel.retrieveData(arguments) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(false) + } + + override fun onResume() { + super.onResume() + setTitle(getString(R.string.further_info_title)) + } + override fun onSuccess(data: Any?) { super.onSuccess(data) if (data is ShiftObject) data.setupView() diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt index 0ae17b4..bd3e86a 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt @@ -1,12 +1,7 @@ package com.appttude.h_mal.farmr.ui -import android.Manifest -import android.app.Activity -import android.content.pm.PackageManager import android.os.Bundle -import android.view.Menu import androidx.appcompat.widget.Toolbar -import androidx.core.app.ActivityCompat import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BaseActivity @@ -25,12 +20,6 @@ class MainActivity : BaseActivity() { fragmentTransaction.replace(R.id.container, FragmentMain()).addToBackStack("main").commit() } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. - menuInflater.inflate(R.menu.menu_main, menu) - return true - } - override fun onBackPressed() { val currentFragment = supportFragmentManager.findFragmentById(R.id.container) if (currentFragment is BackPressedListener) { diff --git a/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/SubmissionViewModel.kt b/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/SubmissionViewModel.kt index 322ca40..181f305 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/SubmissionViewModel.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/viewmodel/SubmissionViewModel.kt @@ -284,6 +284,7 @@ class SubmissionViewModel( description = description, date = date, units = units!!, + rateOfPay = rateOfPay, ) } From 3a3a14e95f6a71bbc131f0909ac95b53a7f35a15 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Sun, 10 Sep 2023 18:19:26 +0100 Subject: [PATCH 6/6] - Fragment navigation library added - on back pressed fixed --- .gitignore | 1 + .../h_mal/farmr/ui/FragmentAddItem.kt | 104 ++++++++++-------- .../appttude/h_mal/farmr/ui/FragmentMain.kt | 37 ++++--- .../appttude/h_mal/farmr/ui/MainActivity.kt | 32 ------ .../main/res/navigation/shift_navigation.xml | 2 +- 5 files changed, 82 insertions(+), 94 deletions(-) diff --git a/.gitignore b/.gitignore index ae7f176..be47ae6 100644 --- a/.gitignore +++ b/.gitignore @@ -89,6 +89,7 @@ gen-external-apklibs .idea/assetWizardSettings.xml .idea/gradle.xml .idea/jarRepositories.xml +.idea/navEditor.xml # Gem/fastlane Gemfile.lock diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt index d78f045..a3ed587 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentAddItem.kt @@ -1,6 +1,7 @@ package com.appttude.h_mal.farmr.ui import android.os.Bundle +import android.util.Log import android.view.View import android.view.ViewGroup import android.widget.Button @@ -10,21 +11,19 @@ import android.widget.RadioButton import android.widget.RadioGroup import android.widget.ScrollView import android.widget.TextView +import androidx.activity.OnBackPressedCallback import androidx.core.widget.doAfterTextChanged import com.appttude.h_mal.farmr.R -import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.FormFragment import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.model.Success import com.appttude.h_mal.farmr.utils.ID -import com.appttude.h_mal.farmr.utils.SHIFT_ID import com.appttude.h_mal.farmr.utils.createDialog import com.appttude.h_mal.farmr.utils.displayToast import com.appttude.h_mal.farmr.utils.formatAsCurrencyString import com.appttude.h_mal.farmr.utils.formatToTwoDpString import com.appttude.h_mal.farmr.utils.goBack import com.appttude.h_mal.farmr.utils.hide -import com.appttude.h_mal.farmr.utils.popBackStack import com.appttude.h_mal.farmr.utils.setDatePicker import com.appttude.h_mal.farmr.utils.setTimePicker import com.appttude.h_mal.farmr.utils.show @@ -32,7 +31,9 @@ import com.appttude.h_mal.farmr.utils.validateField import com.appttude.h_mal.farmr.viewmodel.SubmissionViewModel class FragmentAddItem : FormFragment(R.layout.fragment_add_item), - RadioGroup.OnCheckedChangeListener, BackPressedListener { + RadioGroup.OnCheckedChangeListener { + + private lateinit var onBackPressed: OnBackPressedCallback private lateinit var mHourlyRadioButton: RadioButton private lateinit var mPieceRadioButton: RadioButton @@ -123,6 +124,13 @@ class FragmentAddItem : FormFragment(R.layout.fragment_add_ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(false) + // This callback is only called when MyFragment is at least started + onBackPressed = object : OnBackPressedCallback(false) { + override fun handleOnBackPressed() { + onBackPressed() + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressed) } override fun onResume() { @@ -132,56 +140,65 @@ class FragmentAddItem : FormFragment(R.layout.fragment_add_ else -> getString(R.string.add_item_title) } setTitle(title) + + onBackPressed.isEnabled = true + } + + override fun onPause() { + super.onPause() + onBackPressed.isEnabled = false } private fun setupViewAfterViewCreated() { - val id = arguments?.takeIf { it.containsKey(SHIFT_ID) } - ?.let { FragmentAddItemArgs.fromBundle(it).shiftId } + val id = try { + FragmentAddItemArgs.fromBundle(requireArguments()).shiftId + } catch (e: Exception) { + Log.i("Nav Args", "Failed to retrieve args from navigation") + null + } wholeView.hide() - if (id != null) { - // Since we are editing a shift lets load the shift data into the views - viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { - mLocationEditText.setText(description) - mDateEditText.setText(date) + // Since we are editing a shift lets load the shift data into the views + id?.let { viewModel.getCurrentShift(id) }?.run { + mLocationEditText.setText(description) + mDateEditText.setText(date) - // Set types - mType = ShiftType.getEnumByType(type) - mDescription = description - mDate = date - mPayRate = rateOfPay + // Set types + mType = ShiftType.getEnumByType(type) + mDescription = description + mDate = date + mPayRate = rateOfPay - when (ShiftType.getEnumByType(type)) { - ShiftType.HOURLY -> { - mHourlyRadioButton.isChecked = true - mPieceRadioButton.isChecked = false - mTimeInEditText.setText(timeIn) - mTimeOutEditText.setText(timeOut) - mBreakEditText.setText(breakMins.toString()) - val durationText = "${duration.formatToTwoDpString()} Hours" - mDurationTextView.text = durationText + when (ShiftType.getEnumByType(type)) { + ShiftType.HOURLY -> { + mHourlyRadioButton.isChecked = true + mPieceRadioButton.isChecked = false + mTimeInEditText.setText(timeIn) + mTimeOutEditText.setText(timeOut) + mBreakEditText.setText(breakMins.toString()) + val durationText = "${duration.formatToTwoDpString()} Hours" + mDurationTextView.text = durationText - // Set fields - mTimeIn = timeIn - mTimeOut = timeOut - mBreaks = breakMins - } - - ShiftType.PIECE -> { - mHourlyRadioButton.isChecked = false - mPieceRadioButton.isChecked = true - mUnitEditText.setText(units.formatToTwoDpString()) - - // Set piece rate units - mUnits = units - } + // Set fields + mTimeIn = timeIn + mTimeOut = timeOut + mBreaks = breakMins } - mPayRateEditText.setText(rateOfPay.formatAsCurrencyString()) - mTotalPayTextView.text = totalPay.formatAsCurrencyString() - calculateTotalPay() + ShiftType.PIECE -> { + mHourlyRadioButton.isChecked = false + mPieceRadioButton.isChecked = true + mUnitEditText.setText(units.formatToTwoDpString()) + + // Set piece rate units + mUnits = units + } } + mPayRateEditText.setText(rateOfPay.formatAsCurrencyString()) + mTotalPayTextView.text = totalPay.formatAsCurrencyString() + + calculateTotalPay() } applyFormListener(view = view as ViewGroup) @@ -286,7 +303,7 @@ class FragmentAddItem : FormFragment(R.layout.fragment_add_ } } - override fun onBackPressed(): Boolean { + fun onBackPressed() { if (didFormChange()) { requireContext().createDialog( title = "Discard Changes?", @@ -299,7 +316,6 @@ class FragmentAddItem : FormFragment(R.layout.fragment_add_ } else { goBack() } - return true } override fun onSuccess(data: Any?) { diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt index 698ebb7..1fbe573 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/FragmentMain.kt @@ -7,11 +7,10 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.activity.OnBackPressedCallback import androidx.core.content.FileProvider import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver import com.appttude.h_mal.farmr.R -import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BaseFragment import com.appttude.h_mal.farmr.data.legacydb.ShiftObject import com.appttude.h_mal.farmr.model.Order @@ -19,30 +18,43 @@ import com.appttude.h_mal.farmr.model.Sortable import com.appttude.h_mal.farmr.model.Success import com.appttude.h_mal.farmr.utils.createDialog import com.appttude.h_mal.farmr.utils.displayToast -import com.appttude.h_mal.farmr.utils.hide import com.appttude.h_mal.farmr.utils.navigateTo -import com.appttude.h_mal.farmr.utils.navigateToFragment -import com.appttude.h_mal.farmr.utils.show import com.appttude.h_mal.farmr.viewmodel.MainViewModel import com.google.android.material.floatingactionbutton.FloatingActionButton import java.io.File import kotlin.system.exitProcess -class FragmentMain : BaseFragment(R.layout.fragment_main), BackPressedListener { +class FragmentMain : BaseFragment(R.layout.fragment_main) { private lateinit var productListView: RecyclerView private lateinit var emptyView: View private lateinit var mAdapter: ShiftListAdapter + private lateinit var onBackPressed: OnBackPressedCallback + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Inflate the layout for this fragment setHasOptionsMenu(true) + // This callback is only called when MyFragment is at least started + onBackPressed = object : OnBackPressedCallback(false) { + override fun handleOnBackPressed() { + onBackPressed() + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressed) } override fun onResume() { super.onResume() setTitle("Shift List") + + onBackPressed.isEnabled = true + } + + override fun onPause() { + super.onPause() + onBackPressed.isEnabled = false } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -182,21 +194,13 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr file ) intent.setDataAndType(excelUri, "application/vnd.ms-excel") - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) startActivity(intent) } } - private fun exportDialog() { - AlertDialog.Builder(context) - .setTitle("Export?") - .setMessage("Exporting current filtered data. Continue?") - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok) { _, _ -> exportData() }.create().show() - } - - override fun onBackPressed(): Boolean { + fun onBackPressed() { requireContext().createDialog( title = "Leave?", message = "Are you sure you want to exit Farmr?", @@ -210,6 +214,5 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr exitProcess(0) } ) - return true } } \ No newline at end of file diff --git a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt index f23e578..9f0357b 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/ui/MainActivity.kt @@ -1,16 +1,11 @@ package com.appttude.h_mal.farmr.ui import android.os.Bundle -import android.view.Menu import android.view.MenuItem import androidx.appcompat.widget.Toolbar -import androidx.core.app.ActivityCompat import androidx.navigation.fragment.NavHostFragment import com.appttude.h_mal.farmr.R -import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BaseActivity -import com.appttude.h_mal.farmr.utils.goBack -import com.appttude.h_mal.farmr.utils.popBackStack class MainActivity : BaseActivity() { private lateinit var toolbar: Toolbar @@ -28,33 +23,6 @@ class MainActivity : BaseActivity() { navController.setGraph(R.navigation.shift_navigation) } - override fun onSupportNavigateUp(): Boolean { - val currentFragment = navHost.parentFragment - return if (currentFragment is BackPressedListener) { - currentFragment.onBackPressed() - } else { - if (supportFragmentManager.backStackEntryCount > 1) { - navHost.goBack() - } else { - super.onSupportNavigateUp() - } - } - } - - - override fun onBackPressed() { - val currentFragment = supportFragmentManager.findFragmentById(R.id.container) - if (currentFragment is BackPressedListener) { - currentFragment.onBackPressed() - } else { - if (supportFragmentManager.backStackEntryCount > 1) { - navHost.goBack() - } else { - super.onBackPressed() - } - } - } - override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long diff --git a/app/src/main/res/navigation/shift_navigation.xml b/app/src/main/res/navigation/shift_navigation.xml index 9a6584d..7289dd2 100644 --- a/app/src/main/res/navigation/shift_navigation.xml +++ b/app/src/main/res/navigation/shift_navigation.xml @@ -24,7 +24,7 @@ android:id="@+id/fragmentAddItem" android:name="com.appttude.h_mal.farmr.ui.FragmentAddItem" android:label="fragment_add_item" - tools:layout="@layout/fragment_add_item" > + tools:layout="@layout/fragment_add_item">