Skip to content

Commit 7c0049b

Browse files
authored
Merge pull request #69 from ronniedroid/manual_sort
FEAT Added custom sorting to the alarms and timers sorting dialogs
2 parents 8a78172 + 99904a8 commit 7c0049b

17 files changed

+410
-100
lines changed

app/src/main/kotlin/org/fossify/clock/adapters/AlarmsAdapter.kt

+60-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package org.fossify.clock.adapters
22

3+
import android.annotation.SuppressLint
34
import android.view.Menu
5+
import android.view.MotionEvent
46
import android.view.View
57
import android.view.ViewGroup
8+
import androidx.recyclerview.widget.ItemTouchHelper
9+
import androidx.recyclerview.widget.RecyclerView
610
import org.fossify.clock.R
711
import org.fossify.clock.activities.SimpleActivity
812
import org.fossify.clock.databinding.ItemAlarmBinding
@@ -14,17 +18,32 @@ import org.fossify.clock.interfaces.ToggleAlarmInterface
1418
import org.fossify.clock.models.Alarm
1519
import org.fossify.commons.adapters.MyRecyclerViewAdapter
1620
import org.fossify.commons.dialogs.ConfirmationDialog
21+
import org.fossify.commons.extensions.applyColorFilter
1722
import org.fossify.commons.extensions.beVisibleIf
1823
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
1928
import org.fossify.commons.views.MyRecyclerView
2029

2130
class 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
}

app/src/main/kotlin/org/fossify/clock/adapters/StopwatchAdapter.kt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.fossify.clock.adapters
22

3+
import android.annotation.SuppressLint
34
import android.view.Menu
45
import android.view.View
56
import android.view.ViewGroup
@@ -52,6 +53,7 @@ class StopwatchAdapter(activity: SimpleActivity, var laps: ArrayList<Lap>, recyc
5253

5354
override fun getItemCount() = laps.size
5455

56+
@SuppressLint("NotifyDataSetChanged")
5557
fun updateItems(newItems: ArrayList<Lap>) {
5658
lastLapId = 0
5759
laps = newItems.clone() as ArrayList<Lap>

app/src/main/kotlin/org/fossify/clock/adapters/TimeZonesAdapter.kt

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.fossify.clock.adapters
22

3+
import android.annotation.SuppressLint
34
import android.view.Menu
45
import android.view.View
56
import android.view.ViewGroup
@@ -67,12 +68,14 @@ class TimeZonesAdapter(activity: SimpleActivity, var timeZones: ArrayList<MyTime
6768

6869
override fun getItemCount() = timeZones.size
6970

71+
@SuppressLint("NotifyDataSetChanged")
7072
fun updateItems(newItems: ArrayList<MyTimeZone>) {
7173
timeZones = newItems
7274
notifyDataSetChanged()
7375
finishActMode()
7476
}
7577

78+
@SuppressLint("NotifyDataSetChanged")
7679
fun updateTimes() {
7780
notifyDataSetChanged()
7881
}

0 commit comments

Comments
 (0)