From 66949f761a1416eccc474bbe4b0df74381aa4724 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Tue, 5 Sep 2023 00:23:40 +0100 Subject: [PATCH 1/6] - empty list implemented for recycler view --- app/build.gradle | 4 +- .../farmr/ui/robots/AddItemScreenRobot.kt | 1 - .../h_mal/farmr/base/BaseListAdapter.kt | 59 +++++++++++++++++++ .../h_mal/farmr/base/BaseRecyclerAdapter.kt | 8 +-- .../appttude/h_mal/farmr/ui/FragmentMain.kt | 15 ++--- .../h_mal/farmr/ui/ShiftListAdapter.kt | 18 ++---- .../appttude/h_mal/farmr/ui/SplashScreen.kt | 1 + .../appttude/h_mal/farmr/utils/Formatting.kt | 5 +- app/src/main/res/layout/fragment_main.xml | 7 ++- 9 files changed, 82 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/com/appttude/h_mal/farmr/base/BaseListAdapter.kt diff --git a/app/build.gradle b/app/build.gradle index cc2e633..3ba231c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.appttude.h_mal.farmr" minSdkVersion MIN_SDK_VERSION targetSdkVersion TARGET_SDK_VERSION - versionCode 2 - versionName "2.0" + versionCode 3 + versionName "2.1" testInstrumentationRunner 'com.appttude.h_mal.farmr.application.TestRunner' vectorDrawables.useSupportLibrary = true } diff --git a/app/src/androidTest/java/com/appttude/h_mal/farmr/ui/robots/AddItemScreenRobot.kt b/app/src/androidTest/java/com/appttude/h_mal/farmr/ui/robots/AddItemScreenRobot.kt index fd525a2..5c1081d 100644 --- a/app/src/androidTest/java/com/appttude/h_mal/farmr/ui/robots/AddItemScreenRobot.kt +++ b/app/src/androidTest/java/com/appttude/h_mal/farmr/ui/robots/AddItemScreenRobot.kt @@ -1,6 +1,5 @@ package com.appttude.h_mal.farmr.ui.robots -import androidx.test.espresso.Espresso import androidx.test.espresso.action.ViewActions.scrollTo import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.model.ShiftType diff --git a/app/src/main/java/com/appttude/h_mal/farmr/base/BaseListAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/base/BaseListAdapter.kt new file mode 100644 index 0000000..6dc275c --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/farmr/base/BaseListAdapter.kt @@ -0,0 +1,59 @@ +package com.appttude.h_mal.farmr.base + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.appttude.h_mal.farmr.utils.hide +import com.appttude.h_mal.farmr.utils.show + +abstract class BaseListAdapter( + diff: DiffUtil.ItemCallback, + private val layoutId: Int, + private val emptyView: View +) : ListAdapter(diff) { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): CurrentViewHolder { + val currentViewHolder = LayoutInflater + .from(parent.context) + .inflate(layoutId, parent, false) + return CurrentViewHolder(currentViewHolder) + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + checkEmpty() + } + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int) { + checkEmpty() + } + + override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { + checkEmpty() + } + + override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { + checkEmpty() + } + + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + checkEmpty() + } + + fun checkEmpty() { + if (itemCount == 0) emptyView.show() + else emptyView.hide() + } + }) + } + + class CurrentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) +} \ No newline at end of file diff --git a/app/src/main/java/com/appttude/h_mal/farmr/base/BaseRecyclerAdapter.kt b/app/src/main/java/com/appttude/h_mal/farmr/base/BaseRecyclerAdapter.kt index fd34388..fc11460 100644 --- a/app/src/main/java/com/appttude/h_mal/farmr/base/BaseRecyclerAdapter.kt +++ b/app/src/main/java/com/appttude/h_mal/farmr/base/BaseRecyclerAdapter.kt @@ -7,10 +7,10 @@ import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.appttude.h_mal.farmr.utils.generateView -open class BaseRecyclerAdapter( +open class BaseRecyclerAdapter( @LayoutRes private val emptyViewId: Int, @LayoutRes private val currentViewId: Int -): RecyclerView.Adapter() { +) : RecyclerView.Adapter() { var list: List? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -37,6 +37,6 @@ open class BaseRecyclerAdapter( open fun bindEmptyView(view: View) {} open fun bindCurrentView(view: View, position: Int, data: T) {} - class EmptyViewHolder(itemView: View): ViewHolder(itemView) - class CurrentViewHolder(itemView: View): ViewHolder(itemView) + class EmptyViewHolder(itemView: View) : ViewHolder(itemView) + class CurrentViewHolder(itemView: View) : ViewHolder(itemView) } \ 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..a8a7487 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 @@ -41,20 +41,13 @@ class FragmentMain : BaseFragment(R.layout.fragment_main), BackPr override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mAdapter = ShiftListAdapter(this) { + emptyView = view.findViewById(R.id.empty_view) + productListView = view.findViewById(R.id.list_item_view) + + mAdapter = ShiftListAdapter(this, emptyView) { viewModel.deleteShift(it) } - productListView = view.findViewById(R.id.list_item_view) productListView.adapter = mAdapter - emptyView = view.findViewById(R.id.empty_view) - - mAdapter.registerAdapterDataObserver(object : AdapterDataObserver() { - override fun onChanged() { - super.onChanged() - if (mAdapter.itemCount == 0) emptyView.show() - else emptyView.hide() - } - }) view.findViewById(R.id.fab1).setOnClickListener { navigateToFragment(FragmentAddItem(), name = "additem") 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..17562d2 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 @@ -3,34 +3,26 @@ package com.appttude.h_mal.farmr.ui import android.annotation.SuppressLint import android.app.AlertDialog import android.os.Bundle -import android.view.ViewGroup +import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.fragment.app.Fragment import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter import com.appttude.h_mal.farmr.R -import com.appttude.h_mal.farmr.base.BaseRecyclerAdapter +import com.appttude.h_mal.farmr.base.BaseListAdapter 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.navigateToFragment class ShiftListAdapter( private val fragment: Fragment, + emptyView: View, private val longPressCallback: (Long) -> Unit -) : ListAdapter(diffCallBack) { - override fun onCreateViewHolder( - parent: ViewGroup, - viewType: Int - ): BaseRecyclerAdapter.CurrentViewHolder { - val currentViewHolder = parent.generateView(R.layout.list_item_1) - return BaseRecyclerAdapter.CurrentViewHolder(currentViewHolder) - } +) : BaseListAdapter(diffCallBack, R.layout.list_item_1, emptyView) { @SuppressLint("SetTextI18n") - override fun onBindViewHolder(holder: BaseRecyclerAdapter.CurrentViewHolder, position: Int) { + override fun onBindViewHolder(holder: CurrentViewHolder, position: Int) { val view = holder.itemView val data = getItem(position) 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/Formatting.kt b/app/src/main/java/com/appttude/h_mal/farmr/utils/Formatting.kt index 5b007e1..311057e 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 { diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index e9fd9c1..ea05026 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -24,8 +24,11 @@ app:backgroundTint="@color/colorPrimary" /> + android:id="@+id/empty_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> From 34764266db863791064677f44c63c28fd394d0e2 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Tue, 5 Sep 2023 00:38:26 +0100 Subject: [PATCH 2/6] - 2 dp formatting changed --- .../main/java/com/appttude/h_mal/farmr/ui/ShiftListAdapter.kt | 3 ++- app/src/main/java/com/appttude/h_mal/farmr/utils/Formatting.kt | 2 +- 2 files changed, 3 insertions(+), 2 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 17562d2..82d8d52 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 @@ -13,6 +13,7 @@ import com.appttude.h_mal.farmr.base.BaseListAdapter 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.formatToTwoDpString import com.appttude.h_mal.farmr.utils.navigateToFragment class ShiftListAdapter( @@ -39,7 +40,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.formatToTwoDpString() 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 311057e..e0f3582 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 @@ -26,7 +26,7 @@ fun Float.formatAsCurrencyString(): String? { } fun Float.formatToTwoDpString(): String { - return formatToTwoDp().toString() + return toBigDecimal().setScale(2).toString() } fun String.dateStringIsValid(): Boolean { From f01def1b6933c07ec740864cd8b6b970a128c3f3 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Fri, 8 Sep 2023 15:05:15 +0100 Subject: [PATCH 3/6] - android version updated to 33 --- app/build.gradle | 4 ++-- gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3ba231c..9d9440c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.appttude.h_mal.farmr" minSdkVersion MIN_SDK_VERSION targetSdkVersion TARGET_SDK_VERSION - versionCode 3 - versionName "2.1" + versionCode 4 + versionName "2.2" testInstrumentationRunner 'com.appttude.h_mal.farmr.application.TestRunner' vectorDrawables.useSupportLibrary = true } diff --git a/gradle.properties b/gradle.properties index ae744b0..e3acd5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,8 +26,8 @@ KOTLIN_VERSION = 1.7.10 GRADLE_ANALYZE_VERSION = 1.20.0 # Android configuration -COMPILE_SDK_VERSION = android-31 -TARGET_SDK_VERSION = 31 +COMPILE_SDK_VERSION = android-33 +TARGET_SDK_VERSION = 33 MIN_SDK_VERSION = 21 # Gradle parameters From 306dfa30c8cdff872743bda93789f5f923633b1f Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Fri, 8 Sep 2023 15:35:02 +0100 Subject: [PATCH 4/6] - migrate from apk to bundle --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 5d272f7..dc10e67 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -23,7 +23,7 @@ platform :android do desc "Deploy a new version to the Google Play" lane :deploy do - gradle(task: "clean assembleRelease") + gradle(task: "clean bundle", build_type: "Release") upload_to_play_store end end From 104c75765a52558052c5eaba25241309705afe08 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Fri, 8 Sep 2023 15:40:55 +0100 Subject: [PATCH 5/6] - ci update for release - bump version code --- .circleci/config.yml | 2 +- app/build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 342196f..6088a36 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -127,4 +127,4 @@ workflows: only: - release requires: - - build-and-test \ No newline at end of file + - run_instrumentation_test \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 9d9440c..abe1b81 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.appttude.h_mal.farmr" minSdkVersion MIN_SDK_VERSION targetSdkVersion TARGET_SDK_VERSION - versionCode 4 - versionName "2.2" + versionCode 5 + versionName "2.3" testInstrumentationRunner 'com.appttude.h_mal.farmr.application.TestRunner' vectorDrawables.useSupportLibrary = true } From 688cea6a295d9eb62cba51e6352d00966b66b94a Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Fri, 8 Sep 2023 21:05:19 +0100 Subject: [PATCH 6/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, ) }