1
1
package org.fossify.clock.adapters
2
2
3
+ import android.annotation.SuppressLint
3
4
import android.view.Menu
5
+ import android.view.MotionEvent
4
6
import android.view.View
5
7
import android.view.ViewGroup
8
+ import androidx.recyclerview.widget.ItemTouchHelper
9
+ import androidx.recyclerview.widget.RecyclerView
6
10
import org.fossify.clock.R
7
11
import org.fossify.clock.activities.SimpleActivity
8
12
import org.fossify.clock.databinding.ItemAlarmBinding
@@ -14,17 +18,32 @@ import org.fossify.clock.interfaces.ToggleAlarmInterface
14
18
import org.fossify.clock.models.Alarm
15
19
import org.fossify.commons.adapters.MyRecyclerViewAdapter
16
20
import org.fossify.commons.dialogs.ConfirmationDialog
21
+ import org.fossify.commons.extensions.applyColorFilter
17
22
import org.fossify.commons.extensions.beVisibleIf
18
23
import 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
19
28
import org.fossify.commons.views.MyRecyclerView
20
29
21
30
class AlarmsAdapter (
22
31
activity : SimpleActivity , var alarms : ArrayList <Alarm >, val toggleAlarmInterface : ToggleAlarmInterface ,
23
32
recyclerView : MyRecyclerView , itemClick : (Any ) -> Unit ,
24
- ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
33
+ ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract {
34
+
35
+ private var startReorderDragListener: StartReorderDragListener
25
36
26
37
init {
27
38
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
+ }
28
47
}
29
48
30
49
override fun getActionMenuId () = R .menu.cab_alarms
@@ -49,24 +68,35 @@ class AlarmsAdapter(
49
68
50
69
override fun getItemKeyPosition (key : Int ) = alarms.indexOfFirst { it.id == key }
51
70
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 ? ) {}
53
82
54
- override fun onActionModeDestroyed ( ) {}
83
+ override fun onRowSelected ( myViewHolder : ViewHolder ? ) {}
55
84
56
85
override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): ViewHolder {
57
86
return createViewHolder(ItemAlarmBinding .inflate(layoutInflater, parent, false ).root)
58
87
}
59
88
60
89
override fun onBindViewHolder (holder : ViewHolder , position : Int ) {
61
90
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 )
64
93
}
65
94
bindViewHolder(holder)
66
95
}
67
96
68
97
override fun getItemCount () = alarms.size
69
98
99
+ @SuppressLint(" NotifyDataSetChanged" )
70
100
fun updateItems (newItems : ArrayList <Alarm >) {
71
101
alarms = newItems
72
102
notifyDataSetChanged()
@@ -87,10 +117,19 @@ class AlarmsAdapter(
87
117
88
118
private fun getSelectedItems () = alarms.filter { selectedKeys.contains(it.id) } as ArrayList <Alarm >
89
119
90
- private fun setupView (view : View , alarm : Alarm ) {
120
+ @SuppressLint(" ClickableViewAccessibility" )
121
+ private fun setupView (view : View , alarm : Alarm , holder : ViewHolder ) {
91
122
val isSelected = selectedKeys.contains(alarm.id)
92
123
ItemAlarmBinding .bind(view).apply {
93
124
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
+ }
94
133
alarmTime.text = activity.getFormattedTime(alarm.timeInMinutes * 60 , false , true )
95
134
alarmTime.setTextColor(textColor)
96
135
@@ -137,4 +176,19 @@ class AlarmsAdapter(
137
176
}
138
177
}
139
178
}
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
+ }
140
194
}
0 commit comments