From c9b4190a93640c5dd6c1bccebceee739cbe552a1 Mon Sep 17 00:00:00 2001 From: "h.malik144@gmail.com" Date: Wed, 13 Sep 2023 15:45:58 +0100 Subject: [PATCH] - change list item view - added pop menu to list item - fixed update/add shift bug --- .../h_mal/farmr/ui/FragmentAddItem.kt | 16 +-- .../appttude/h_mal/farmr/ui/FragmentMain.kt | 4 +- .../h_mal/farmr/ui/ShiftListAdapter.kt | 113 +++++++++------ .../res/drawable/baseline_more_vert_24.xml | 5 + .../main/res/layout-v26/list_cell_hourly.xml | 135 ++++++++++++++++++ .../main/res/layout-v26/list_cell_piece.xml | 118 +++++++++++++++ app/src/main/res/layout/fragment_main.xml | 2 +- app/src/main/res/layout/list_cell_hourly.xml | 132 +++++++++++++++++ app/src/main/res/layout/list_cell_piece.xml | 117 +++++++++++++++ app/src/main/res/layout/list_item_1.xml | 24 ++-- app/src/main/res/menu/options_menu.xml | 14 ++ .../main/res/navigation/shift_navigation.xml | 24 +++- app/src/main/res/values/dimens.xml | 7 + app/src/main/res/values/strings.xml | 6 + 14 files changed, 649 insertions(+), 68 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_more_vert_24.xml create mode 100644 app/src/main/res/layout-v26/list_cell_hourly.xml create mode 100644 app/src/main/res/layout-v26/list_cell_piece.xml create mode 100644 app/src/main/res/layout/list_cell_hourly.xml create mode 100644 app/src/main/res/layout/list_cell_piece.xml create mode 100644 app/src/main/res/menu/options_menu.xml 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 a3ed587..ef191a5 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 @@ -131,6 +131,13 @@ class FragmentAddItem : FormFragment(R.layout.fragment_add_ } } requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressed) + + id = try { + FragmentAddItemArgs.fromBundle(requireArguments()).shiftId + } catch (e: Exception) { + Log.i("Nav Args", "Failed to retrieve args from navigation") + null + } } override fun onResume() { @@ -150,17 +157,10 @@ class FragmentAddItem : FormFragment(R.layout.fragment_add_ } private fun setupViewAfterViewCreated() { - val id = try { - FragmentAddItemArgs.fromBundle(requireArguments()).shiftId - } catch (e: Exception) { - Log.i("Nav Args", "Failed to retrieve args from navigation") - null - } - wholeView.hide() // Since we are editing a shift lets load the shift data into the views - id?.let { viewModel.getCurrentShift(id) }?.run { + id?.let { viewModel.getCurrentShift(it) }?.run { mLocationEditText.setText(description) mDateEditText.setText(date) 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 1fbe573..a827b98 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 @@ -63,9 +63,7 @@ class FragmentMain : BaseFragment(R.layout.fragment_main) { emptyView = view.findViewById(R.id.empty_view) productListView = view.findViewById(R.id.list_item_view) - mAdapter = ShiftListAdapter(this, emptyView) { - viewModel.deleteShift(it) - } + mAdapter = ShiftListAdapter(this, emptyView, viewModel) productListView.adapter = mAdapter view.findViewById(R.id.fab1).setOnClickListener { 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 dfe40ce..5853a68 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 @@ -2,27 +2,30 @@ package com.appttude.h_mal.farmr.ui import android.annotation.SuppressLint import android.app.AlertDialog -import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import androidx.fragment.app.Fragment import androidx.recyclerview.widget.DiffUtil import com.appttude.h_mal.farmr.R 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.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 +import com.appttude.h_mal.farmr.viewmodel.MainViewModel + + +const val PIECE_ITEM = 500 +const val HOURLY_ITEM = 501 class ShiftListAdapter( private val fragment: Fragment, emptyView: View, - private val longPressCallback: (Long) -> Unit + private val viewModel: MainViewModel ) : BaseListAdapter(diffCallBack, R.layout.list_item_1, emptyView) { @SuppressLint("SetTextI18n") @@ -33,40 +36,28 @@ class ShiftListAdapter( val descriptionTextView: TextView = view.findViewById(R.id.location) val dateTextView: TextView = view.findViewById(R.id.date) val totalPay: TextView = view.findViewById(R.id.total_pay) - val hoursView: TextView = view.findViewById(R.id.hours) - val h: TextView = view.findViewById(R.id.h) - val minutesView: TextView = view.findViewById(R.id.minutes) - val m: TextView = view.findViewById(R.id.m) val editView: ImageView = view.findViewById(R.id.imageView) - h.text = "h" - m.text = "m" - val typeText: String = data.type - val descriptionText: String = data.description - val dateText: String = data.date - val totalPayText: String = data.totalPay.formatToTwoDpString() - descriptionTextView.text = descriptionText - dateTextView.text = dateText - totalPay.text = totalPayText + when (getItemViewType(position)) { + HOURLY_ITEM -> { + val hoursView: TextView = view.findViewById(R.id.hours) + val minutesView: TextView = view.findViewById(R.id.minutes) - when (ShiftType.getEnumByType(typeText)) { - ShiftType.HOURLY -> { val time = data.getHoursMinutesPairFromDuration() - hoursView.text = time.first - minutesView.text = time.second + minutesView.text = if (time.second.length == 1) "0${time.second}" else time.second } - ShiftType.PIECE -> { + PIECE_ITEM -> { + val unitsView: TextView = view.findViewById(R.id.pieces) val unitsText: String = data.units.toString() - hoursView.text = unitsText - h.text = "" - minutesView.text = "" - m.text = "pcs" + unitsView.text = unitsText } } - + descriptionTextView.text = data.description + dateTextView.text = data.date + totalPay.text = data.totalPay.formatToTwoDpString() view.setOnClickListener { // Navigate to further info @@ -74,22 +65,62 @@ class ShiftListAdapter( fragment.navigateTo(nav) } editView.setOnClickListener { - // Navigate to edit - val nav = FragmentMainDirections.mainToAddItem(data.id) - fragment.navigateTo(nav) - } - view.setOnLongClickListener { - AlertDialog.Builder(it.context) - .setMessage("Are you sure you want to delete") - .setPositiveButton("delete") { _, _ -> longPressCallback.invoke(data.id) } - .setNegativeButton("cancel") { dialog, _ -> - dialog?.dismiss() + //creating a popup menu + val popup = PopupMenu(it.context, it) + //inflating menu from xml resource + popup.inflate(R.menu.options_menu) + + //adding click listener + popup.setOnMenuItemClickListener { menu -> + when (menu.itemId) { + R.id.update -> { + // Navigate to edit + val nav = FragmentMainDirections.mainToAddItem(data.id) + fragment.navigateTo(nav) + return@setOnMenuItemClickListener true + } + + R.id.delete -> { + AlertDialog.Builder(it.context) + .setMessage("Are you sure you want to delete") + .setPositiveButton("delete") { _, _ -> viewModel.deleteShift(data.id) } + .setNegativeButton("cancel") { dialog, _ -> + dialog?.dismiss() + } + .create().show() + return@setOnMenuItemClickListener true + } + + else -> return@setOnMenuItemClickListener false } - .create().show() - true + } + //displaying the popup + popup.show() } } + override fun getItemViewType(position: Int): Int { + val typeString = getItem(position).type + return when (ShiftType.getEnumByType(typeString)) { + ShiftType.HOURLY -> HOURLY_ITEM + ShiftType.PIECE -> PIECE_ITEM + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CurrentViewHolder { + val layoutId = when (viewType) { + HOURLY_ITEM -> R.layout.list_cell_hourly + PIECE_ITEM -> R.layout.list_cell_piece + else -> { + return super.onCreateViewHolder(parent, viewType) + } + } + val currentView = LayoutInflater + .from(parent.context) + .inflate(layoutId, parent, false) + return CurrentViewHolder(currentView) + } + companion object { val diffCallBack = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: ShiftObject, newItem: ShiftObject): Boolean { diff --git a/app/src/main/res/drawable/baseline_more_vert_24.xml b/app/src/main/res/drawable/baseline_more_vert_24.xml new file mode 100644 index 0000000..39fbab5 --- /dev/null +++ b/app/src/main/res/drawable/baseline_more_vert_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout-v26/list_cell_hourly.xml b/app/src/main/res/layout-v26/list_cell_hourly.xml new file mode 100644 index 0000000..ef855a8 --- /dev/null +++ b/app/src/main/res/layout-v26/list_cell_hourly.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-v26/list_cell_piece.xml b/app/src/main/res/layout-v26/list_cell_piece.xml new file mode 100644 index 0000000..89d5ebd --- /dev/null +++ b/app/src/main/res/layout-v26/list_cell_piece.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index ea05026..8bf6a22 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - tools:listitem="@layout/list_item_1"> + tools:listitem="@layout/list_cell_hourly"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_cell_piece.xml b/app/src/main/res/layout/list_cell_piece.xml new file mode 100644 index 0000000..1e7c87c --- /dev/null +++ b/app/src/main/res/layout/list_cell_piece.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_item_1.xml b/app/src/main/res/layout/list_item_1.xml index bdec9ea..672d4e9 100644 --- a/app/src/main/res/layout/list_item_1.xml +++ b/app/src/main/res/layout/list_item_1.xml @@ -1,6 +1,7 @@ + android:showDividers="end" + tools:ignore="HardcodedText"> + android:textSize="@dimen/unit_text_size" /> + android:textSize="@dimen/units_symbol_size" /> + android:textSize="@dimen/unit_text_size"/> + android:textSize="@dimen/units_symbol_size" /> + android:textSize="@dimen/units_symbol_size" /> + android:textSize="@dimen/total_pay_size" /> @@ -106,7 +108,7 @@ android:layout_below="@+id/date" android:maxLines="3" android:text="Location Name" - android:textSize="20sp" /> + android:textSize="@dimen/location_size" /> + android:textSize="@dimen/date_size" /> + + + + \ 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 index 7289dd2..2ceec49 100644 --- a/app/src/main/res/navigation/shift_navigation.xml +++ b/app/src/main/res/navigation/shift_navigation.xml @@ -12,13 +12,25 @@ tools:layout="@layout/fragment_main" > + app:destination="@id/fragmentAddItem" + app:enterAnim="@anim/nav_default_enter_anim" + app:exitAnim="@anim/nav_default_exit_anim" + app:popEnterAnim="@anim/nav_default_pop_enter_anim" + app:popExitAnim="@anim/nav_default_pop_exit_anim" /> + app:destination="@id/filterDataFragment" + app:enterAnim="@anim/nav_default_enter_anim" + app:exitAnim="@anim/nav_default_exit_anim" + app:popEnterAnim="@anim/nav_default_pop_enter_anim" + app:popExitAnim="@anim/nav_default_pop_exit_anim"/> + app:destination="@id/furtherInfoFragment" + app:enterAnim="@anim/nav_default_enter_anim" + app:exitAnim="@anim/nav_default_exit_anim" + app:popEnterAnim="@anim/nav_default_pop_enter_anim" + app:popExitAnim="@anim/nav_default_pop_exit_anim"/> + app:destination="@id/fragmentAddItem" + app:enterAnim="@anim/nav_default_enter_anim" + app:exitAnim="@anim/nav_default_exit_anim" + app:popEnterAnim="@anim/nav_default_pop_enter_anim" + app:popExitAnim="@anim/nav_default_pop_exit_anim"/> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 74f8724..53a1571 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,6 +4,13 @@ 16dp 16dp 8dp + 20sp + 12sp + 16sp + 16sp + 14sp + 75dp + 12sp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7120641..d406702 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,4 +97,10 @@ Shift Details insert break in minutes Break + h + m + pcs + £ + Delete shift + Update Shift