11package org.fossify.clock.adapters
22
3+ import android.annotation.SuppressLint
34import android.view.Menu
5+ import android.view.MotionEvent
46import android.view.View
57import android.view.ViewGroup
8+ import androidx.recyclerview.widget.ItemTouchHelper
9+ import androidx.recyclerview.widget.RecyclerView
610import org.fossify.clock.R
711import org.fossify.clock.activities.SimpleActivity
812import org.fossify.clock.databinding.ItemAlarmBinding
@@ -14,17 +18,32 @@ import org.fossify.clock.interfaces.ToggleAlarmInterface
1418import org.fossify.clock.models.Alarm
1519import org.fossify.commons.adapters.MyRecyclerViewAdapter
1620import org.fossify.commons.dialogs.ConfirmationDialog
21+ import org.fossify.commons.extensions.applyColorFilter
1722import org.fossify.commons.extensions.beVisibleIf
1823import org.fossify.commons.extensions.toast
24+ import org.fossify.commons.helpers.SORT_BY_CUSTOM
25+ import org.fossify.commons.interfaces.ItemMoveCallback
26+ import org.fossify.commons.interfaces.ItemTouchHelperContract
27+ import org.fossify.commons.interfaces.StartReorderDragListener
1928import org.fossify.commons.views.MyRecyclerView
2029
2130class AlarmsAdapter (
2231 activity : SimpleActivity , var alarms : ArrayList <Alarm >, val toggleAlarmInterface : ToggleAlarmInterface ,
2332 recyclerView : MyRecyclerView , itemClick : (Any ) -> Unit ,
24- ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
33+ ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract {
34+
35+ private var startReorderDragListener: StartReorderDragListener
2536
2637 init {
2738 setupDragListener(true )
39+ val touchHelper = ItemTouchHelper (ItemMoveCallback (this ))
40+ touchHelper.attachToRecyclerView(recyclerView)
41+
42+ startReorderDragListener = object : StartReorderDragListener {
43+ override fun requestDrag (viewHolder : RecyclerView .ViewHolder ) {
44+ touchHelper.startDrag(viewHolder)
45+ }
46+ }
2847 }
2948
3049 override fun getActionMenuId () = R .menu.cab_alarms
@@ -49,24 +68,35 @@ class AlarmsAdapter(
4968
5069 override fun getItemKeyPosition (key : Int ) = alarms.indexOfFirst { it.id == key }
5170
52- override fun onActionModeCreated () {}
71+ @SuppressLint(" NotifyDataSetChanged" )
72+ override fun onActionModeCreated () {
73+ notifyDataSetChanged()
74+ }
75+
76+ @SuppressLint(" NotifyDataSetChanged" )
77+ override fun onActionModeDestroyed () {
78+ notifyDataSetChanged()
79+ }
80+
81+ override fun onRowClear (myViewHolder : ViewHolder ? ) {}
5382
54- override fun onActionModeDestroyed ( ) {}
83+ override fun onRowSelected ( myViewHolder : ViewHolder ? ) {}
5584
5685 override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): ViewHolder {
5786 return createViewHolder(ItemAlarmBinding .inflate(layoutInflater, parent, false ).root)
5887 }
5988
6089 override fun onBindViewHolder (holder : ViewHolder , position : Int ) {
6190 val alarm = alarms[position]
62- holder.bindView(alarm, true , true ) { itemView, layoutPosition ->
63- setupView(itemView, alarm)
91+ holder.bindView(alarm, true , true ) { itemView, _ ->
92+ setupView(itemView, alarm, holder )
6493 }
6594 bindViewHolder(holder)
6695 }
6796
6897 override fun getItemCount () = alarms.size
6998
99+ @SuppressLint(" NotifyDataSetChanged" )
70100 fun updateItems (newItems : ArrayList <Alarm >) {
71101 alarms = newItems
72102 notifyDataSetChanged()
@@ -87,10 +117,19 @@ class AlarmsAdapter(
87117
88118 private fun getSelectedItems () = alarms.filter { selectedKeys.contains(it.id) } as ArrayList <Alarm >
89119
90- private fun setupView (view : View , alarm : Alarm ) {
120+ @SuppressLint(" ClickableViewAccessibility" )
121+ private fun setupView (view : View , alarm : Alarm , holder : ViewHolder ) {
91122 val isSelected = selectedKeys.contains(alarm.id)
92123 ItemAlarmBinding .bind(view).apply {
93124 alarmHolder.isSelected = isSelected
125+ alarmDragHandle.beVisibleIf(selectedKeys.isNotEmpty())
126+ alarmDragHandle.applyColorFilter(textColor)
127+ alarmDragHandle.setOnTouchListener { _, event ->
128+ if (event.action == MotionEvent .ACTION_DOWN ) {
129+ startReorderDragListener.requestDrag(holder)
130+ }
131+ false
132+ }
94133 alarmTime.text = activity.getFormattedTime(alarm.timeInMinutes * 60 , false , true )
95134 alarmTime.setTextColor(textColor)
96135
@@ -137,4 +176,19 @@ class AlarmsAdapter(
137176 }
138177 }
139178 }
179+
180+ override fun onRowMoved (fromPosition : Int , toPosition : Int ) {
181+ alarms.swap(fromPosition, toPosition)
182+ notifyItemMoved(fromPosition, toPosition)
183+ saveAlarmsCustomOrder(alarms)
184+ if (activity.config.alarmSort != SORT_BY_CUSTOM ) {
185+ activity.config.alarmSort = SORT_BY_CUSTOM
186+ }
187+ }
188+
189+ private fun saveAlarmsCustomOrder (alarms : ArrayList <Alarm >) {
190+ val alarmsCustomSortingIds = alarms.map { it.id }
191+
192+ activity.config.alarmsCustomSorting = alarmsCustomSortingIds.joinToString { it.toString() }
193+ }
140194}
0 commit comments