diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt
index f0f1c32dd..a08045f85 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt
@@ -107,6 +107,14 @@ class PreferencesRepository @Inject constructor(
R.bool.pref_default_notification_upcoming_lessons_enable
)
+ val isUpcomingLessonsNotificationsPersistentKey =
+ context.getString(R.string.pref_key_notifications_upcoming_lessons_persistent)
+ val isUpcomingLessonsNotificationsPersistent: Boolean
+ get() = getBoolean(
+ isUpcomingLessonsNotificationsPersistentKey,
+ R.bool.pref_default_notification_upcoming_lessons_persistent
+ )
+
val isNotificationPiggybackEnabledKey =
context.getString(R.string.pref_key_notifications_piggyback)
val isNotificationPiggybackEnabled: Boolean
diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt
index 406d91f5f..5e4bad8cf 100644
--- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt
+++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt
@@ -11,6 +11,7 @@ import androidx.core.app.NotificationManagerCompat
import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.R
import io.github.wulkanowy.data.Status
+import io.github.wulkanowy.data.repositories.PreferencesRepository
import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.services.HiltBroadcastReceiver
import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID
@@ -32,6 +33,9 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() {
@Inject
lateinit var studentRepository: StudentRepository
+ @Inject
+ lateinit var preferencesRepository: PreferencesRepository
+
companion object {
const val NOTIFICATION_TYPE_CURRENT = 1
const val NOTIFICATION_TYPE_UPCOMING = 2
@@ -68,6 +72,7 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() {
private fun prepareNotification(context: Context, intent: Intent) {
val type = intent.getIntExtra(LESSON_TYPE, 0)
val notificationId = intent.getIntExtra(NOTIFICATION_ID, MainView.Section.TIMETABLE.id)
+ val isPersistent = preferencesRepository.isUpcomingLessonsNotificationsPersistent
if (type == NOTIFICATION_TYPE_LAST_LESSON_CANCELLATION) {
return NotificationManagerCompat.from(context).cancel(notificationId)
@@ -87,33 +92,57 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() {
Timber.d("TimetableNotification receive: type: $type, subject: $subject, start: ${start.toLocalDateTime()}, student: $studentId")
- showNotification(context, notificationId, studentName,
+ showNotification(context, notificationId, isPersistent, studentName,
if (type == NOTIFICATION_TYPE_CURRENT) end else start, end - start,
- context.getString(if (type == NOTIFICATION_TYPE_CURRENT) R.string.timetable_now else R.string.timetable_next, "($room) $subject".removePrefix("()")),
- nextSubject?.let { context.getString(R.string.timetable_later, "($nextRoom) $nextSubject".removePrefix("()")) }
+ context.getString(
+ if (type == NOTIFICATION_TYPE_CURRENT) R.string.timetable_now else R.string.timetable_next,
+ "($room) $subject".removePrefix("()")
+ ),
+ nextSubject?.let {
+ context.getString(
+ R.string.timetable_later,
+ "($nextRoom) $nextSubject".removePrefix("()")
+ )
+ }
)
}
- private fun showNotification(context: Context, notificationId: Int, studentName: String?, countDown: Long, timeout: Long, title: String, next: String?) {
- NotificationManagerCompat.from(context).notify(notificationId, NotificationCompat.Builder(context, CHANNEL_ID)
- .setContentTitle(title)
- .setContentText(next)
- .setAutoCancel(false)
- .setOngoing(true)
- .setWhen(countDown)
- .apply {
- if (Build.VERSION.SDK_INT >= N) setUsesChronometer(true)
- }
- .setTimeoutAfter(timeout)
- .setSmallIcon(R.drawable.ic_stat_timetable)
- .setColor(context.getCompatColor(R.color.colorPrimary))
- .setStyle(NotificationCompat.InboxStyle().also {
- it.setSummaryText(studentName)
- it.addLine(next)
- })
- .setContentIntent(PendingIntent.getActivity(context, MainView.Section.TIMETABLE.id,
- MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), FLAG_UPDATE_CURRENT))
- .build()
- )
+ private fun showNotification(
+ context: Context,
+ notificationId: Int,
+ isPersistent: Boolean,
+ studentName: String?,
+ countDown: Long,
+ timeout: Long,
+ title: String,
+ next: String?
+ ) {
+ NotificationManagerCompat.from(context)
+ .notify(notificationId, NotificationCompat.Builder(context, CHANNEL_ID)
+ .setContentTitle(title)
+ .setContentText(next)
+ .setAutoCancel(false)
+ .setWhen(countDown)
+ .setOngoing(isPersistent)
+ .apply {
+ if (Build.VERSION.SDK_INT >= N) setUsesChronometer(true)
+ }
+ .setTimeoutAfter(timeout)
+ .setSmallIcon(R.drawable.ic_stat_timetable)
+ .setColor(context.getCompatColor(R.color.colorPrimary))
+ .setStyle(NotificationCompat.InboxStyle().also {
+ it.setSummaryText(studentName)
+ it.addLine(next)
+ })
+ .setContentIntent(
+ PendingIntent.getActivity(
+ context,
+ MainView.Section.TIMETABLE.id,
+ MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true),
+ FLAG_UPDATE_CURRENT
+ )
+ )
+ .build()
+ )
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt
index 19d2f5591..722ee96d1 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsPresenter.kt
@@ -42,7 +42,7 @@ class NotificationsPresenter @Inject constructor(
preferencesRepository.apply {
when (key) {
- isUpcomingLessonsNotificationsEnableKey -> {
+ isUpcomingLessonsNotificationsEnableKey, isUpcomingLessonsNotificationsPersistentKey -> {
if (!isUpcomingLessonsNotificationsEnable) {
timetableNotificationHelper.cancelNotification()
}
diff --git a/app/src/main/res/values/preferences_defaults.xml b/app/src/main/res/values/preferences_defaults.xml
index 9286052d8..df84d37d6 100644
--- a/app/src/main/res/values/preferences_defaults.xml
+++ b/app/src/main/res/values/preferences_defaults.xml
@@ -14,6 +14,7 @@
false
true
false
+ true
false
0.33
0.33
diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml
index bae6a617b..c512a5f21 100644
--- a/app/src/main/res/values/preferences_keys.xml
+++ b/app/src/main/res/values/preferences_keys.xml
@@ -18,6 +18,7 @@
notifications_system_settings
notifications_enable
notifications_upcoming_lessons_enable
+ notifications_upcoming_lessons_persistent
notification_debug
grade_modifier_plus
grade_modifier_minus
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ae11d493e..63d4fc423 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -621,6 +621,8 @@
Notifications
Show notifications
Show upcoming lesson notifications
+ Make upcoming lesson notification persistent
+ Turn off when notification is not showing in your watch/band
Open system notification settings
Fix synchronization & notifications issues
Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings.
diff --git a/app/src/main/res/xml/scheme_preferences_notifications.xml b/app/src/main/res/xml/scheme_preferences_notifications.xml
index 24b83169b..78e91cf06 100644
--- a/app/src/main/res/xml/scheme_preferences_notifications.xml
+++ b/app/src/main/res/xml/scheme_preferences_notifications.xml
@@ -14,6 +14,14 @@
app:key="@string/pref_key_notifications_upcoming_lessons_enable"
app:singleLineTitle="false"
app:title="@string/pref_notify_upcoming_lessons_switch" />
+