Skip to content

Commit 04248b9

Browse files
committed
add sticky to sticky notifications
1 parent 1a585c9 commit 04248b9

4 files changed

Lines changed: 87 additions & 10 deletions

File tree

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/activitySwitch/manager/NotificationActivitySwitchManager.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.core.app.NotificationManagerCompat
1717
import com.example.util.simpletimetracker.core.extension.allowVmViolations
1818
import com.example.util.simpletimetracker.core.utils.PendingIntents
1919
import com.example.util.simpletimetracker.feature_notification.R
20+
import com.example.util.simpletimetracker.feature_notification.recevier.NotificationReceiver
2021
import com.example.util.simpletimetracker.feature_notification.recordType.customView.NotificationIconView
2122
import com.example.util.simpletimetracker.feature_views.extension.getBitmapFromView
2223
import com.example.util.simpletimetracker.feature_views.extension.measureExactly
@@ -63,6 +64,9 @@ class NotificationActivitySwitchManager @Inject constructor(
6364
startIntent,
6465
PendingIntents.getFlags(),
6566
)
67+
val cancelIntent = getCancelIntent(
68+
context = context,
69+
)
6670

6771
// TODO fix default duration type click when show tags is enabled,
6872
// no animation / indication.
@@ -72,6 +76,8 @@ class NotificationActivitySwitchManager @Inject constructor(
7276
.setContentIntent(contentIntent)
7377
.setOngoing(true)
7478
.setAutoCancel(false)
79+
// setOngoing(true) doesn't work on api 34, reshow notification on cancel.
80+
.setDeleteIntent(cancelIntent) //
7581
.setCustomContentView(prepareView(params, isBig = false))
7682
.setCustomBigContentView(prepareView(params, isBig = true))
7783
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
@@ -149,7 +155,23 @@ class NotificationActivitySwitchManager @Inject constructor(
149155
}.getBitmapFromView()
150156
}
151157

158+
private fun getCancelIntent(
159+
context: Context,
160+
): PendingIntent {
161+
val intent = Intent(context, NotificationReceiver::class.java)
162+
intent.action = ACTION_NOTIFICATION_SWITCH_CANCEL
163+
return PendingIntent.getBroadcast(
164+
context,
165+
0,
166+
intent,
167+
PendingIntents.getFlags(),
168+
)
169+
}
170+
152171
companion object {
172+
const val ACTION_NOTIFICATION_SWITCH_CANCEL =
173+
"com.example.util.simpletimetracker.feature_notification.switch.onCancel"
174+
153175
private const val NOTIFICATIONS_CHANNEL_ID = "ACTIVITY_SWITCH"
154176
private const val NOTIFICATIONS_CHANNEL_NAME = "Activity Switch"
155177

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recevier/NotificationReceiver.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_TIME_STARTED
2525
import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_TYPE_ICON
2626
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
2727
import com.example.util.simpletimetracker.feature_notification.activity.controller.NotificationActivityBroadcastController
28+
import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationActivitySwitchManager.Companion.ACTION_NOTIFICATION_SWITCH_CANCEL
2829
import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.ACTION_NOTIFICATION_CONTROLS_STOP
2930
import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.ACTION_NOTIFICATION_CONTROLS_TAGS_NEXT
3031
import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.ACTION_NOTIFICATION_CONTROLS_TAGS_PREV
@@ -50,6 +51,7 @@ import com.example.util.simpletimetracker.feature_notification.activitySwitch.ma
5051
import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.ARGS_TYPES_SHIFT
5152
import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.ARGS_TYPE_ID
5253
import com.example.util.simpletimetracker.feature_notification.external.NotificationExternalBroadcastController
54+
import com.example.util.simpletimetracker.feature_notification.recordType.manager.NotificationTypeManager.Companion.ACTION_NOTIFICATION_TYPE_CANCEL
5355
import com.example.util.simpletimetracker.feature_notification.recordType.manager.NotificationTypeManager.Companion.ACTION_NOTIFICATION_TYPE_STOP
5456
import dagger.hilt.android.AndroidEntryPoint
5557
import javax.inject.Inject
@@ -292,6 +294,13 @@ class NotificationReceiver : BroadcastReceiver() {
292294
typesShift = typesShift,
293295
)
294296
}
297+
ACTION_NOTIFICATION_TYPE_CANCEL -> {
298+
val typeId = intent.getLongExtra(ARGS_TYPE_ID, 0)
299+
typeController.onTypeCancel(typeId)
300+
}
301+
ACTION_NOTIFICATION_SWITCH_CANCEL -> {
302+
typeController.onActivitySwitchCancel()
303+
}
295304
Intent.ACTION_BOOT_COMPLETED -> {
296305
onBootCompleted()
297306
}

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/controller/NotificationTypeBroadcastController.kt

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.example.util.simpletimetracker.domain.notifications.interactor.Notifi
55
import com.example.util.simpletimetracker.domain.notifications.interactor.NotificationTypeInteractor
66
import com.example.util.simpletimetracker.feature_notification.activitySwitch.mapper.NotificationControlsMapper
77
import com.example.util.simpletimetracker.feature_notification.recordType.interactor.ActivityStartStopFromBroadcastInteractor
8+
import kotlinx.coroutines.CoroutineScope
89
import kotlinx.coroutines.MainScope
910
import kotlinx.coroutines.launch
1011
import javax.inject.Inject
@@ -22,7 +23,7 @@ class NotificationTypeBroadcastController @Inject constructor(
2223
typeId: Long,
2324
) {
2425
if (typeId == 0L) return
25-
allowDiskRead { MainScope() }.launch {
26+
safeLaunch {
2627
activityStartStopFromBroadcastInteractor.onActionActivityStop(
2728
typeId = typeId,
2829
)
@@ -35,12 +36,12 @@ class NotificationTypeBroadcastController @Inject constructor(
3536
selectedTypeId: Long,
3637
typesShift: Int,
3738
) {
38-
allowDiskRead { MainScope() }.launch {
39+
safeLaunch {
3940
activityStartStopFromBroadcastInteractor.onActionTypeClick(
4041
from = notificationControlsMapper.mapExtraToFrom(
4142
extra = from,
4243
recordTypeId = typeId,
43-
) ?: return@launch,
44+
) ?: return@safeLaunch,
4445
selectedTypeId = selectedTypeId,
4546
typesShift = typesShift,
4647
)
@@ -54,12 +55,12 @@ class NotificationTypeBroadcastController @Inject constructor(
5455
tagId: Long,
5556
typesShift: Int,
5657
) {
57-
allowDiskRead { MainScope() }.launch {
58+
safeLaunch {
5859
activityStartStopFromBroadcastInteractor.onActionTagClick(
5960
from = notificationControlsMapper.mapExtraToFrom(
6061
extra = from,
6162
recordTypeId = typeId,
62-
) ?: return@launch,
63+
) ?: return@safeLaunch,
6364
selectedTypeId = selectedTypeId,
6465
tagId = tagId,
6566
typesShift = typesShift,
@@ -75,12 +76,12 @@ class NotificationTypeBroadcastController @Inject constructor(
7576
tagValue: String?,
7677
typesShift: Int,
7778
) {
78-
allowDiskRead { MainScope() }.launch {
79+
safeLaunch {
7980
activityStartStopFromBroadcastInteractor.onActionTagValueSave(
8081
from = notificationControlsMapper.mapExtraToFrom(
8182
extra = from,
8283
recordTypeId = typeId,
83-
) ?: return@launch,
84+
) ?: return@safeLaunch,
8485
selectedTypeId = selectedTypeId,
8586
tagId = tagId,
8687
tagValue = tagValue,
@@ -98,12 +99,12 @@ class NotificationTypeBroadcastController @Inject constructor(
9899
typesShift: Int,
99100
tagsShift: Int,
100101
) {
101-
allowDiskRead { MainScope() }.launch {
102+
safeLaunch {
102103
activityStartStopFromBroadcastInteractor.onRequestUpdate(
103104
from = notificationControlsMapper.mapExtraToFrom(
104105
extra = from,
105106
typeId,
106-
) ?: return@launch,
107+
) ?: return@safeLaunch,
107108
selectedTypeId = selectedTypeId,
108109
selectedTagId = selectedTagId,
109110
selectedTagValue = selectedTagValue,
@@ -113,10 +114,30 @@ class NotificationTypeBroadcastController @Inject constructor(
113114
}
114115
}
115116

117+
fun onTypeCancel(
118+
typeId: Long,
119+
) {
120+
safeLaunch {
121+
notificationTypeInteractor.checkAndShow(typeId)
122+
}
123+
}
124+
125+
fun onActivitySwitchCancel() {
126+
safeLaunch {
127+
notificationActivitySwitchInteractor.updateNotification()
128+
}
129+
}
130+
116131
fun onBootCompleted() {
117-
allowDiskRead { MainScope() }.launch {
132+
safeLaunch {
118133
notificationTypeInteractor.updateNotifications()
119134
notificationActivitySwitchInteractor.updateNotification()
120135
}
121136
}
137+
138+
private fun safeLaunch(
139+
block: suspend CoroutineScope.() -> Unit
140+
) {
141+
allowDiskRead { MainScope() }.launch(block = block)
142+
}
122143
}

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/manager/NotificationTypeManager.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ class NotificationTypeManager @Inject constructor(
7272
requestCode = params.id.toInt(),
7373
recordTypeId = params.id,
7474
)
75+
val cancelIntent = getCancelIntent(
76+
context = context,
77+
requestCode = params.id.toInt(),
78+
recordTypeId = params.id,
79+
)
7580

7681
// TODO add manual notification grouping by adding setGroup() to all,
7782
// and showing separate notification with setGroupSummary(),
@@ -83,6 +88,8 @@ class NotificationTypeManager @Inject constructor(
8388
.setContentIntent(contentIntent)
8489
.setOngoing(true)
8590
.setAutoCancel(false)
91+
// setOngoing(true) doesn't work on api 34, reshow notification on cancel.
92+
.setDeleteIntent(cancelIntent)
8693
.setCustomContentView(prepareView(params, isBig = false))
8794
.setCustomBigContentView(prepareView(params, isBig = true))
8895
.addAction(0, params.stopButton, stopIntent)
@@ -158,6 +165,22 @@ class NotificationTypeManager @Inject constructor(
158165
)
159166
}
160167

168+
private fun getCancelIntent(
169+
context: Context,
170+
requestCode: Int,
171+
recordTypeId: Long,
172+
): PendingIntent {
173+
val intent = Intent(context, NotificationReceiver::class.java)
174+
intent.action = ACTION_NOTIFICATION_TYPE_CANCEL
175+
intent.putExtra(ARGS_TYPE_ID, recordTypeId)
176+
return PendingIntent.getBroadcast(
177+
context,
178+
requestCode,
179+
intent,
180+
PendingIntents.getFlags(),
181+
)
182+
}
183+
161184
private fun getIconBitmap(
162185
icon: RecordTypeIcon,
163186
color: Int,
@@ -176,6 +199,8 @@ class NotificationTypeManager @Inject constructor(
176199
companion object {
177200
const val ACTION_NOTIFICATION_TYPE_STOP =
178201
"com.example.util.simpletimetracker.feature_notification.recordType.onStop"
202+
const val ACTION_NOTIFICATION_TYPE_CANCEL =
203+
"com.example.util.simpletimetracker.feature_notification.recordType.onCancel"
179204

180205
private const val NOTIFICATIONS_CHANNEL_ID = "NOTIFICATIONS"
181206
private const val NOTIFICATIONS_CHANNEL_NAME = "Notifications"

0 commit comments

Comments
 (0)