Skip to content

Commit 915f47d

Browse files
committed
Added swipe to delete alarm item
1 parent 5f55360 commit 915f47d

12 files changed

Lines changed: 56 additions & 14 deletions

File tree

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ dependencies {
8585
implementation(libs.androidx.activity)
8686
implementation(libs.androidx.constraintlayout)
8787
testImplementation(libs.junit)
88+
implementation(libs.androidx.recyclerview)
8889
androidTestImplementation(libs.androidx.junit)
8990
androidTestImplementation(libs.androidx.espresso.core)
9091
}

app/src/main/java/com/mbexample/alarmmanager/alarmmanager/AlarmScheduler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mbexample.alarmmanager.alarmmanager
1+
package com.mbexample.alarmmanager.alarm
22

33
import com.mbexample.alarmmanager.data.sources.local.Alarm
44

app/src/main/java/com/mbexample/alarmmanager/alarmmanager/AlarmSchedulerImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mbexample.alarmmanager.alarmmanager
1+
package com.mbexample.alarmmanager.alarm
22

33
import android.app.AlarmManager
44
import android.app.PendingIntent

app/src/main/java/com/mbexample/alarmmanager/data/repository/AlarmRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ interface AlarmRepository {
1515

1616
suspend fun deleteAlarm(alarm: Alarm)
1717

18-
suspend fun deleteAlarmById(alarmId: Int)
18+
suspend fun deleteAlarmById(alarmId: Long)
1919

2020
}

app/src/main/java/com/mbexample/alarmmanager/data/repository/AlarmRepositoryImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class AlarmRepositoryImpl @Inject constructor(
3131
alarmDatabase.getAlarmDao.deleteAlarm(alarm)
3232
}
3333

34-
override suspend fun deleteAlarmById(alarmId:Int) {
34+
override suspend fun deleteAlarmById(alarmId:Long) {
3535
alarmDatabase.getAlarmDao.deleteAlarmById(alarmId)
3636
}
3737

app/src/main/java/com/mbexample/alarmmanager/data/sources/local/AlarmDao.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ interface AlarmDao {
2727
fun getAllAlarms(): Flow<List<Alarm>>
2828

2929
@Query("DELETE FROM Alarm WHERE id = :alarmId")
30-
suspend fun deleteAlarmById(alarmId: Int)
30+
suspend fun deleteAlarmById(alarmId: Long)
3131

3232
}

app/src/main/java/com/mbexample/alarmmanager/ui/AlarmItemAdapter.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import android.view.LayoutInflater
44
import android.view.ViewGroup
55
import androidx.core.view.isVisible
66
import androidx.recyclerview.widget.DiffUtil
7+
import androidx.recyclerview.widget.ItemTouchHelper
78
import androidx.recyclerview.widget.ListAdapter
89
import androidx.recyclerview.widget.RecyclerView
910
import com.mbexample.alarmmanager.R
1011
import com.mbexample.alarmmanager.data.sources.local.Alarm
1112
import com.mbexample.alarmmanager.databinding.AlarmListItemBinding
13+
import com.mbexample.alarmmanager.ui.main.SwipeItemHelper
1214
import com.mbexample.alarmmanager.utils.Event
1315
import java.text.DateFormat
1416

@@ -57,9 +59,12 @@ class AlarmItemAdapter (
5759
holder.bind(currentItem)
5860
}
5961

62+
val touchHelper = ItemTouchHelper(SwipeItemHelper(this.alarmItemDismissClickListener, this))
63+
64+
6065
interface AlarmItemDismissClickListener {
6166
fun onAlarmItemDismissClick(alarm: Event<Unit>)
62-
67+
fun onAlarmItemSwipe(alarm: Alarm)
6368
}
6469

6570
}

app/src/main/java/com/mbexample/alarmmanager/ui/main/AlarmActivity.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import android.os.Build
77
import android.os.Bundle
88
import android.provider.Settings
99
import android.text.format.DateFormat
10-
import android.util.Log
1110
import android.widget.EditText
1211
import android.widget.Toast
1312
import androidx.activity.enableEdgeToEdge
@@ -25,7 +24,7 @@ import com.google.android.material.timepicker.MaterialTimePicker
2524
import com.google.android.material.timepicker.MaterialTimePicker.INPUT_MODE_CLOCK
2625
import com.google.android.material.timepicker.TimeFormat
2726
import com.mbexample.alarmmanager.R
28-
import com.mbexample.alarmmanager.alarmmanager.AlarmSchedulerImpl
27+
import com.mbexample.alarmmanager.alarm.AlarmSchedulerImpl
2928
import com.mbexample.alarmmanager.data.sources.local.Alarm
3029
import com.mbexample.alarmmanager.databinding.ActivityAlarmBinding
3130
import com.mbexample.alarmmanager.ui.AlarmItemAdapter
@@ -50,6 +49,7 @@ class AlarmActivity : AppCompatActivity() {
5049
setContentView(binding.root)
5150

5251
adapter = AlarmItemAdapter(viewModel)
52+
adapter.touchHelper.attachToRecyclerView(binding.alarmList)
5353
alarmSchedulerImpl = AlarmSchedulerImpl(this)
5454

5555
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
@@ -64,6 +64,13 @@ class AlarmActivity : AppCompatActivity() {
6464
adapter.submitList(it)
6565
}
6666

67+
viewModel.onAlarmItemSwipe.observe(this){
68+
it.getContentIfNotHandled()?.let {alarmItem ->
69+
alarm?.let(alarmSchedulerImpl::cancel)
70+
viewModel.deleteAlarmItemById(alarmItem.id)
71+
}
72+
}
73+
6774
viewModel.onAlarmDismissItemClick.observe(this) { onDismissClick ->
6875
onDismissClick.getContentIfNotHandled()?.let {
6976
alarm?.let(alarmSchedulerImpl::cancel)

app/src/main/java/com/mbexample/alarmmanager/ui/main/AlarmActivityViewModel.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,27 @@ class AlarmActivityViewModel @Inject constructor(
1818
private val alarmRepository: AlarmRepository
1919
):ViewModel(),AlarmItemAdapter.AlarmItemDismissClickListener {
2020

21+
private val _onAlarmItemSwipe = MutableLiveData<Event<Alarm>>()
22+
val onAlarmItemSwipe: LiveData<Event<Alarm>> = _onAlarmItemSwipe
23+
2124
private val _onAlarmDismissItemClick = MutableLiveData<Event<Unit>>()
2225
val onAlarmDismissItemClick: LiveData<Event<Unit>> = _onAlarmDismissItemClick
2326

2427
fun insertAlarm(alarm: Alarm)= viewModelScope.launch{
2528
alarmRepository.insertAlarm(alarm)
2629
}
2730

31+
fun deleteAlarmItemById(alarmId: Long)= viewModelScope.launch{
32+
alarmRepository.deleteAlarmById(alarmId)
33+
}
34+
2835
val getAllAlarm = alarmRepository.getAllAlarm().asLiveData()
2936

3037
override fun onAlarmItemDismissClick(alarm: Event<Unit>) {
3138
_onAlarmDismissItemClick.value = Event(Unit)
3239
}
40+
41+
override fun onAlarmItemSwipe(alarm: Alarm) {
42+
_onAlarmItemSwipe.value = Event(alarm)
43+
}
3344
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.mbexample.alarmmanager.ui.main
2+
3+
import androidx.recyclerview.widget.ItemTouchHelper
4+
import androidx.recyclerview.widget.RecyclerView
5+
import com.mbexample.alarmmanager.ui.AlarmItemAdapter
6+
7+
class SwipeItemHelper(
8+
private val listener: AlarmItemAdapter.AlarmItemDismissClickListener? = null,
9+
private val adapter: AlarmItemAdapter
10+
) : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
11+
override fun onMove(
12+
recyclerView: RecyclerView,
13+
viewHolder: RecyclerView.ViewHolder,
14+
target: RecyclerView.ViewHolder
15+
) = false
16+
17+
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
18+
listener?.onAlarmItemSwipe(adapter.currentList[viewHolder.bindingAdapterPosition])
19+
}
20+
}

0 commit comments

Comments
 (0)