1+ package com.example.notimanager.domain.service
2+
3+ import android.Manifest
4+ import android.app.NotificationChannel
5+ import android.app.NotificationManager
6+ import android.app.PendingIntent
7+ import android.app.Service
8+ import android.content.Intent
9+ import android.content.pm.PackageManager
10+ import android.os.IBinder
11+ import androidx.core.app.ActivityCompat
12+ import androidx.core.app.NotificationCompat
13+ import androidx.core.app.NotificationManagerCompat
14+ import com.example.notimanager.R
15+ import com.example.notimanager.presentation.ui.activity.MainActivity
16+
17+ class ForegroundNotiService : Service () {
18+ private val channelId = " NotiManagerChannel"
19+ private val groupId = " NotiManagerGroup"
20+
21+ override fun onCreate () {
22+ super .onCreate()
23+ createNotificationChannel()
24+ }
25+
26+ override fun onStartCommand (intent : Intent ? , flags : Int , startId : Int ): Int {
27+ val clearGroup = intent?.extras?.getBoolean(" clearGroup" ) ? : false
28+ if (clearGroup) clearGroupNotifications()
29+
30+ val appName = intent?.extras?.getString(" appName" ) ? : " "
31+ val content = intent?.extras?.getString(" content" ) ? : " "
32+ val isGroupSummary = intent?.extras?.getBoolean(" isGroupSummary" ) ? : false
33+ putNotification(appName, content, isGroupSummary)
34+
35+ return START_STICKY
36+ }
37+
38+ override fun onBind (intent : Intent ? ): IBinder ? {
39+ return null
40+ }
41+
42+ override fun onDestroy () {
43+ super .onDestroy()
44+ stopForeground(STOP_FOREGROUND_REMOVE )
45+ }
46+
47+ private fun putNotification (
48+ appName : String ,
49+ content : String ,
50+ isGroupSummary : Boolean ) {
51+ val notificationIntent = Intent (this , MainActivity ::class .java).apply {
52+ putExtra(" appName" , appName)
53+ }
54+ val pendingIntent = PendingIntent
55+ .getActivity(this ,
56+ 0 ,
57+ notificationIntent,
58+ PendingIntent .FLAG_IMMUTABLE or PendingIntent .FLAG_UPDATE_CURRENT )
59+
60+ val notification = NotificationCompat .Builder (this , channelId)
61+ .setSmallIcon(R .mipmap.ic_launcher)
62+ .setContentTitle(appName)
63+ .setContentText(content)
64+ .setContentIntent(pendingIntent)
65+ .setPriority(NotificationCompat .PRIORITY_HIGH )
66+ .setGroup(groupId)
67+ .setAutoCancel(true )
68+ .setOngoing(true )
69+ .setGroupSummary(isGroupSummary)
70+ .build()
71+
72+ if (ActivityCompat .checkSelfPermission(
73+ this ,
74+ Manifest .permission.POST_NOTIFICATIONS
75+ ) != PackageManager .PERMISSION_GRANTED
76+ ) {
77+ return
78+ }
79+
80+ NotificationManagerCompat .from(this ).notify(appName.hashCode(), notification)
81+ }
82+
83+ private fun createNotificationChannel () {
84+ val channel = NotificationChannel (
85+ channelId,
86+ " NotiManager Channel" ,
87+ NotificationManager .IMPORTANCE_DEFAULT
88+ )
89+ val manager = getSystemService(NotificationManager ::class .java)
90+ manager.createNotificationChannel(channel)
91+ }
92+
93+ private fun clearGroupNotifications () {
94+ NotificationManagerCompat .from(this ).cancelAll()
95+ }
96+ }
0 commit comments