- mid commit

This commit is contained in:
2023-08-31 19:57:37 +01:00
parent 7be038ef24
commit 1d0498fe47
9 changed files with 68 additions and 101 deletions

View File

@@ -1,5 +1,6 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'org.jetbrains.kotlin.android' apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'androidx.navigation.safeargs'
def relStorePassword = System.getenv("RELEASE_STORE_PASSWORD") def relStorePassword = System.getenv("RELEASE_STORE_PASSWORD")
def relKeyPassword = System.getenv("RELEASE_KEY_PASSWORD") def relKeyPassword = System.getenv("RELEASE_KEY_PASSWORD")

View File

@@ -119,61 +119,54 @@ class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_
} }
private fun setupViewAfterViewCreated() { 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() wholeView.hide()
val title = when (arguments?.containsKey(ID)) { val title = id?.let {
true -> { // Since we are editing a shift lets load the shift data into the views
// Since we are editing a shift lets load the shift data into the views viewModel.getCurrentShift(arguments!!.getLong(ID))?.run {
viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { mLocationEditText.setText(description)
mLocationEditText.setText(description) mDateEditText.setText(date)
mDateEditText.setText(date)
// Set types // Set types
mType = ShiftType.getEnumByType(type) mType = ShiftType.getEnumByType(type)
mDescription = description mDescription = description
mDate = date mDate = date
mPayRate = rateOfPay mPayRate = rateOfPay
when (ShiftType.getEnumByType(type)) { when (ShiftType.getEnumByType(type)) {
ShiftType.HOURLY -> { ShiftType.HOURLY -> {
mHourlyRadioButton.isChecked = true mHourlyRadioButton.isChecked = true
mPieceRadioButton.isChecked = false mPieceRadioButton.isChecked = false
mTimeInEditText.setText(timeIn) mTimeInEditText.setText(timeIn)
mTimeOutEditText.setText(timeOut) mTimeOutEditText.setText(timeOut)
mBreakEditText.setText(breakMins.toString()) mBreakEditText.setText(breakMins.toString())
val durationText = "${duration.formatToTwoDpString()} Hours" val durationText = "${duration.formatToTwoDpString()} Hours"
mDurationTextView.text = durationText mDurationTextView.text = durationText
// Set fields // Set fields
mTimeIn = timeIn mTimeIn = timeIn
mTimeOut = timeOut mTimeOut = timeOut
mBreaks = breakMins mBreaks = breakMins
}
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() 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 calculateTotalPay()
getString(R.string.edit_item_title)
} }
getString(R.string.edit_item_title)
else -> getString(R.string.add_item_title) } ?: getString(R.string.add_item_title)
}
setTitle(title) setTitle(title)
} }
@@ -267,6 +260,7 @@ class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_
StringBuilder().append(mDuration).append(" hours").toString() StringBuilder().append(mDuration).append(" hours").toString()
mDuration!! * mPayRate mDuration!! * mPayRate
} }
ShiftType.PIECE -> { ShiftType.PIECE -> {
(mUnits ?: 0f) * mPayRate (mUnits ?: 0f) * mPayRate
} }

View File

@@ -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.CURRENCY
import com.appttude.h_mal.farmr.utils.formatAsCurrencyString import com.appttude.h_mal.farmr.utils.formatAsCurrencyString
import com.appttude.h_mal.farmr.utils.hide 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.navigateToFragment
import com.appttude.h_mal.farmr.utils.show import com.appttude.h_mal.farmr.utils.show
import com.appttude.h_mal.farmr.viewmodel.InfoViewModel import com.appttude.h_mal.farmr.viewmodel.InfoViewModel
@@ -52,11 +53,14 @@ class FurtherInfoFragment : BaseFragment<InfoViewModel>(R.layout.fragment_futher
hourlyDetailHolder = view.findViewById(R.id.details_hourly_details) hourlyDetailHolder = view.findViewById(R.id.details_hourly_details)
unitsHolder = view.findViewById(R.id.details_units_holder) unitsHolder = view.findViewById(R.id.details_units_holder)
val id = FurtherInfoFragmentArgs.fromBundle(requireArguments()).shiftId
editButton.setOnClickListener { 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?) { override fun onSuccess(data: Any?) {

View File

@@ -7,13 +7,16 @@ import android.os.Bundle
import android.view.Menu import android.view.Menu
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.navigation.fragment.NavHostFragment
import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.R
import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BackPressedListener
import com.appttude.h_mal.farmr.base.BaseActivity import com.appttude.h_mal.farmr.base.BaseActivity
import com.appttude.h_mal.farmr.utils.goBack
import com.appttude.h_mal.farmr.utils.popBackStack import com.appttude.h_mal.farmr.utils.popBackStack
class MainActivity : BaseActivity() { class MainActivity : BaseActivity() {
private lateinit var toolbar: Toolbar private lateinit var toolbar: Toolbar
private lateinit var navHost: NavHostFragment
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -21,8 +24,10 @@ class MainActivity : BaseActivity() {
toolbar = findViewById(R.id.toolbar) toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
val fragmentTransaction = supportFragmentManager.beginTransaction() navHost = supportFragmentManager
fragmentTransaction.replace(R.id.container, FragmentMain()).addToBackStack("main").commit() .findFragmentById(R.id.container) as NavHostFragment
val navController = navHost.navController
navController.setGraph(R.navigation.shift_navigation)
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -37,8 +42,7 @@ class MainActivity : BaseActivity() {
currentFragment.onBackPressed() currentFragment.onBackPressed()
} else { } else {
if (supportFragmentManager.backStackEntryCount > 1) { if (supportFragmentManager.backStackEntryCount > 1) {
// Todo: go back navHost.goBack()
// goBack()
} else { } else {
super.onBackPressed() super.onBackPressed()
} }

View File

@@ -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.model.ShiftType
import com.appttude.h_mal.farmr.utils.ID import com.appttude.h_mal.farmr.utils.ID
import com.appttude.h_mal.farmr.utils.generateView import com.appttude.h_mal.farmr.utils.generateView
import com.appttude.h_mal.farmr.utils.navigateTo
import com.appttude.h_mal.farmr.utils.navigateToFragment import com.appttude.h_mal.farmr.utils.navigateToFragment
class ShiftListAdapter( class ShiftListAdapter(
@@ -71,27 +72,16 @@ class ShiftListAdapter(
} }
} }
val b: Bundle = Bundle()
b.putLong(ID, data.id)
view.setOnClickListener { view.setOnClickListener {
// Navigate to further info // Navigate to further info
fragment.navigateToFragment( val nav = FurtherInfoFragmentDirections.mainToFurtherInfo(data.id)
FurtherInfoFragment(), fragment.navigateTo(nav)
bundle = b,
name = "furtherinfo"
)
// val nav = FragmentMainDirections.mainToFurtherInfo(data.id)
// fragment.navigateTo(nav)
} }
editView.setOnClickListener { editView.setOnClickListener {
// Navigate to edit // Navigate to edit
fragment.navigateToFragment( val nav = FragmentAddItemDirections.mainToAddItem(data.id)
FragmentAddItem(), fragment.navigateTo(nav)
bundle = b,
name = "additem"
)
// val nav = FragmentMainDirections.mainToAddItem(data.id)
// fragment.navigateTo(nav)
} }
view.setOnLongClickListener { view.setOnLongClickListener {
AlertDialog.Builder(it.context) AlertDialog.Builder(it.context)

View File

@@ -10,13 +10,7 @@ class InfoViewModel(
repository: Repository repository: Repository
) : ShiftViewModel(repository) { ) : ShiftViewModel(repository) {
fun retrieveData(bundle: Bundle?) { fun retrieveData(id: Long) {
val id = bundle?.getLong(ID)
if (id == null) {
onError("Failed to retrieve shift")
return
}
val shift = getCurrentShift(id) val shift = getCurrentShift(id)
if (shift == null) { if (shift == null) {
onError("Failed to retrieve shift") onError("Failed to retrieve shift")

View File

@@ -32,14 +32,16 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<FrameLayout <androidx.fragment.app.FragmentContainerView
android:layout_below="@id/appbar" android:layout_below="@id/appbar"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:name="androidx.navigation.fragment.NavHostFragment"
app:layout_constraintTop_toBottomOf="@id/appbar" app:layout_constraintTop_toBottomOf="@id/appbar"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/container"> android:id="@+id/container"
</FrameLayout> tools:layout="@layout/fragment_main">
</androidx.fragment.app.FragmentContainerView>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -17,12 +17,10 @@ class InfoViewModelTest : ShiftViewModelTest<InfoViewModel>() {
// Arrange // Arrange
val id = anyLong() val id = anyLong()
val shift = mockk<ShiftObject>() val shift = mockk<ShiftObject>()
val bundle = mockk<Bundle>()
// Act // Act
every { repository.readSingleShiftFromDatabase(id) }.returns(shift) every { repository.readSingleShiftFromDatabase(id) }.returns(shift)
every { bundle.getLong(ID) }.returns(id) viewModel.retrieveData(id)
viewModel.retrieveData(bundle)
// Assert // Assert
assertIs<ShiftObject>(retrieveCurrentData()) assertIs<ShiftObject>(retrieveCurrentData())
@@ -32,35 +30,14 @@ class InfoViewModelTest : ShiftViewModelTest<InfoViewModel>() {
) )
} }
@Test
fun retrieveData_noValidBundleAndId_unsuccessfulRetrieval() {
// Arrange
val id = anyLong()
val shift = mockk<ShiftObject>()
val bundle = mockk<Bundle>()
// Act
every { repository.readSingleShiftFromDatabase(id) }.returns(shift)
every { bundle.getLong(ID) }.returns(id)
viewModel.retrieveData(null)
// Assert
assertEquals(
retrieveCurrentError(),
"Failed to retrieve shift"
)
}
@Test @Test
fun retrieveData_validBundleNoShift_successfulRetrieval() { fun retrieveData_validBundleNoShift_successfulRetrieval() {
// Arrange // Arrange
val id = anyLong() val id = anyLong()
val bundle = mockk<Bundle>()
// Act // Act
every { repository.readSingleShiftFromDatabase(id) }.returns(null) every { repository.readSingleShiftFromDatabase(id) }.returns(null)
every { bundle.getLong(ID) }.returns(id) viewModel.retrieveData(id)
viewModel.retrieveData(bundle)
// Assert // Assert
assertEquals( assertEquals(

View File

@@ -13,6 +13,7 @@ buildscript {
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
} }
dependencies { dependencies {
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$NAVIGATION_VERSION"
classpath "com.android.tools.build:gradle:$GRADLE_PLUGIN_VERSION" classpath "com.android.tools.build:gradle:$GRADLE_PLUGIN_VERSION"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION"
classpath "com.autonomousapps:dependency-analysis-gradle-plugin:$GRADLE_ANALYZE_VERSION" classpath "com.autonomousapps:dependency-analysis-gradle-plugin:$GRADLE_ANALYZE_VERSION"