Skip to content

Commit 5f55360

Browse files
committed
Implemented dismiss functionality to cancel the scheduled alarm
1 parent 38352a8 commit 5f55360

17 files changed

Lines changed: 120 additions & 51 deletions

File tree

.idea/deploymentTargetDropDown.xml

Lines changed: 1 addition & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.app.Application
44
import android.app.NotificationChannel
55
import android.app.NotificationManager
66
import android.os.Build
7+
import com.mbexample.alarmmanager.utils.Constants.ALARM_CHANNEL_NAME
78
import dagger.hilt.android.HiltAndroidApp
89

910
@HiltAndroidApp
@@ -16,7 +17,7 @@ class AlarmApp: Application(){
1617
val name = getString(R.string.reminder)
1718
val channelDescription = getString(R.string.reminder_channel_desc)
1819
val importance = NotificationManager.IMPORTANCE_HIGH
19-
val mChannel = NotificationChannel("AlarmChannel", name, importance)
20+
val mChannel = NotificationChannel(ALARM_CHANNEL_NAME, name, importance)
2021
mChannel.description = channelDescription
2122
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
2223
notificationManager.createNotificationChannel(mChannel)

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import android.content.Intent
77
import android.os.Build
88
import com.mbexample.alarmmanager.data.sources.local.Alarm
99
import com.mbexample.alarmmanager.receiver.AlarmReceiver
10+
import com.mbexample.alarmmanager.utils.Constants.MESSAGE
11+
import com.mbexample.alarmmanager.utils.Constants.TITLE
1012

1113
class AlarmSchedulerImpl(private val context: Context) : AlarmScheduler {
1214

@@ -16,10 +18,10 @@ class AlarmSchedulerImpl(private val context: Context) : AlarmScheduler {
1618

1719
val pendingIntent = PendingIntent.getBroadcast(
1820
context,
19-
alarm.id,
21+
alarm.hashCode(),
2022
Intent(context, AlarmReceiver::class.java).apply {
21-
putExtra("TITLE", alarm.title)
22-
putExtra("MESSAGE", alarm.message)
23+
putExtra(TITLE, alarm.title)
24+
putExtra(MESSAGE, alarm.message)
2325
},
2426
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
2527
)
@@ -42,7 +44,7 @@ class AlarmSchedulerImpl(private val context: Context) : AlarmScheduler {
4244
alarmManager.cancel(
4345
PendingIntent.getBroadcast(
4446
context,
45-
alarm.id,
47+
alarm.hashCode(),
4648
Intent(context, AlarmReceiver::class.java),
4749
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
4850
)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ interface AlarmRepository {
99

1010
suspend fun upsertAlarm(alarm: Alarm)
1111

12+
fun getAlarmById(alarmId: Long): Alarm
13+
1214
fun getAllAlarm(): Flow<List<Alarm>>
1315

1416
suspend fun deleteAlarm(alarm: Alarm)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ class AlarmRepositoryImpl @Inject constructor(
1919
alarmDatabase.getAlarmDao.upsertAlarm(alarm)
2020
}
2121

22+
override fun getAlarmById(alarmId: Long): Alarm {
23+
return alarmDatabase.getAlarmDao.getAlarmById(alarmId)
24+
}
25+
2226
override fun getAllAlarm(): Flow<List<Alarm>> {
2327
return alarmDatabase.getAlarmDao.getAllAlarms()
2428
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import androidx.room.PrimaryKey
77
data class Alarm(
88

99
@PrimaryKey(true)
10-
val id:Int,
10+
var id:Long,
1111
val title: String,
1212
val message: String,
1313
val scheduleAt:Long

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ interface AlarmDao {
2020
@Delete
2121
suspend fun deleteAlarm(alarm: Alarm)
2222

23+
@Query("SELECT * FROM Alarm WHERE id = :alarmId ")
24+
fun getAlarmById(alarmId: Long): Alarm
25+
2326
@Query("SELECT * FROM Alarm ORDER BY id DESC")
2427
fun getAllAlarms(): Flow<List<Alarm>>
2528

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import androidx.room.RoomDatabase
55

66
@Database(
77
entities = [Alarm::class],
8-
version = 1,
9-
exportSchema = false
8+
version = 1
109
)
1110
abstract class AlarmDatabase: RoomDatabase() {
1211
abstract val getAlarmDao: AlarmDao

app/src/main/java/com/mbexample/alarmmanager/receiver/AlarmReceiver.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,31 @@ import android.content.BroadcastReceiver
55
import android.content.Context
66
import android.content.Intent
77
import android.content.pm.PackageManager
8+
import android.icu.text.CaseMap.Title
89
import android.widget.Toast
910
import androidx.core.app.ActivityCompat
1011
import androidx.core.app.NotificationCompat
1112
import androidx.core.app.NotificationManagerCompat
1213
import com.mbexample.alarmmanager.R
1314
import com.mbexample.alarmmanager.ui.main.AlarmActivity
15+
import com.mbexample.alarmmanager.utils.Constants.ALARM_CHANNEL_NAME
16+
import com.mbexample.alarmmanager.utils.Constants.MESSAGE
17+
import com.mbexample.alarmmanager.utils.Constants.TITLE
1418

1519
class AlarmReceiver : BroadcastReceiver() {
1620

1721
override fun onReceive(context: Context?, intent: Intent?) {
1822

19-
val title = intent?.getStringExtra("TITLE") ?: return
20-
val message = intent.getStringExtra("MESSAGE")
23+
val title = intent?.getStringExtra(TITLE) ?: return
24+
val message = intent.getStringExtra(MESSAGE)
2125

2226
val goIntent = Intent(context, AlarmActivity::class.java).apply {
2327
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
2428
}
2529
val pendingIntent: PendingIntent =
2630
PendingIntent.getActivity(context, 0, goIntent, PendingIntent.FLAG_IMMUTABLE)
2731

28-
val builder = NotificationCompat.Builder(context!!, "AlarmChannel")
32+
val builder = NotificationCompat.Builder(context!!, ALARM_CHANNEL_NAME)
2933
.setSmallIcon(R.drawable.ic_launcher_foreground)
3034
.setContentTitle(title)
3135
.setContentText(message)
@@ -40,7 +44,5 @@ class AlarmReceiver : BroadcastReceiver() {
4044
) {
4145
NotificationManagerCompat.from(context).notify(1, builder.build())
4246
}
43-
44-
Toast.makeText(context, "Alarm Triggered: $title\n$message", Toast.LENGTH_LONG).show()
4547
}
4648
}

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ import androidx.core.view.isVisible
66
import androidx.recyclerview.widget.DiffUtil
77
import androidx.recyclerview.widget.ListAdapter
88
import androidx.recyclerview.widget.RecyclerView
9+
import com.mbexample.alarmmanager.R
910
import com.mbexample.alarmmanager.data.sources.local.Alarm
1011
import com.mbexample.alarmmanager.databinding.AlarmListItemBinding
12+
import com.mbexample.alarmmanager.utils.Event
1113
import java.text.DateFormat
1214

13-
class AlarmItemAdapter: ListAdapter<Alarm, AlarmItemAdapter.HomeViewHolder>(diffCallBack) {
15+
class AlarmItemAdapter (
16+
private val alarmItemDismissClickListener: AlarmItemDismissClickListener
17+
): ListAdapter<Alarm, AlarmItemAdapter.HomeViewHolder>(diffCallBack) {
1418

1519
inner class HomeViewHolder(private val binding: AlarmListItemBinding) :
1620
RecyclerView.ViewHolder(binding.root) {
@@ -21,8 +25,11 @@ class AlarmItemAdapter: ListAdapter<Alarm, AlarmItemAdapter.HomeViewHolder>(diff
2125
tvTitle.text = alarm.title
2226
tvDesc.text = alarm.message
2327
val df: DateFormat = DateFormat.getTimeInstance()
24-
val formattedDate = df.format(alarm.scheduleAt)
25-
tvAlarmTime.text = formattedDate
28+
tvAlarmTime.text = df.format(alarm.scheduleAt)
29+
btnDismiss.setOnClickListener {
30+
alarmItemDismissClickListener.onAlarmItemDismissClick(Event(Unit))
31+
tvAlarmTime.isEnabled = false
32+
}
2633
}
2734
}
2835
}
@@ -50,6 +57,11 @@ class AlarmItemAdapter: ListAdapter<Alarm, AlarmItemAdapter.HomeViewHolder>(diff
5057
holder.bind(currentItem)
5158
}
5259

60+
interface AlarmItemDismissClickListener {
61+
fun onAlarmItemDismissClick(alarm: Event<Unit>)
62+
63+
}
64+
5365
}
5466

5567

0 commit comments

Comments
 (0)