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"