mirror of
https://github.com/wulkanowy/wulkanowy.git
synced 2024-11-22 11:06:05 -06:00
Refactor notification destinations (#1709)
Co-authored-by: Rafał Borcz <RafalBO99@outlook.com>
This commit is contained in:
parent
de9fcb9af9
commit
daa7b54dab
2445
app/schemas/io.github.wulkanowy.data.db.AppDatabase/48.json
Normal file
2445
app/schemas/io.github.wulkanowy.data.db.AppDatabase/48.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,72 +1,10 @@
|
||||
package io.github.wulkanowy.data.db
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.AutoMigration
|
||||
import androidx.room.Database
|
||||
import androidx.room.Room
|
||||
import androidx.room.RoomDatabase
|
||||
import androidx.room.*
|
||||
import androidx.room.RoomDatabase.JournalMode.TRUNCATE
|
||||
import androidx.room.TypeConverters
|
||||
import io.github.wulkanowy.data.db.dao.AdminMessageDao
|
||||
import io.github.wulkanowy.data.db.dao.AttendanceDao
|
||||
import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao
|
||||
import io.github.wulkanowy.data.db.dao.CompletedLessonsDao
|
||||
import io.github.wulkanowy.data.db.dao.ConferenceDao
|
||||
import io.github.wulkanowy.data.db.dao.ExamDao
|
||||
import io.github.wulkanowy.data.db.dao.GradeDao
|
||||
import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao
|
||||
import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao
|
||||
import io.github.wulkanowy.data.db.dao.GradeSemesterStatisticsDao
|
||||
import io.github.wulkanowy.data.db.dao.GradeSummaryDao
|
||||
import io.github.wulkanowy.data.db.dao.HomeworkDao
|
||||
import io.github.wulkanowy.data.db.dao.LuckyNumberDao
|
||||
import io.github.wulkanowy.data.db.dao.MessageAttachmentDao
|
||||
import io.github.wulkanowy.data.db.dao.MessagesDao
|
||||
import io.github.wulkanowy.data.db.dao.MobileDeviceDao
|
||||
import io.github.wulkanowy.data.db.dao.NoteDao
|
||||
import io.github.wulkanowy.data.db.dao.NotificationDao
|
||||
import io.github.wulkanowy.data.db.dao.RecipientDao
|
||||
import io.github.wulkanowy.data.db.dao.ReportingUnitDao
|
||||
import io.github.wulkanowy.data.db.dao.SchoolAnnouncementDao
|
||||
import io.github.wulkanowy.data.db.dao.SchoolDao
|
||||
import io.github.wulkanowy.data.db.dao.SemesterDao
|
||||
import io.github.wulkanowy.data.db.dao.StudentDao
|
||||
import io.github.wulkanowy.data.db.dao.StudentInfoDao
|
||||
import io.github.wulkanowy.data.db.dao.SubjectDao
|
||||
import io.github.wulkanowy.data.db.dao.TeacherDao
|
||||
import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao
|
||||
import io.github.wulkanowy.data.db.dao.TimetableDao
|
||||
import io.github.wulkanowy.data.db.dao.TimetableHeaderDao
|
||||
import io.github.wulkanowy.data.db.entities.AdminMessage
|
||||
import io.github.wulkanowy.data.db.entities.Attendance
|
||||
import io.github.wulkanowy.data.db.entities.AttendanceSummary
|
||||
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
||||
import io.github.wulkanowy.data.db.entities.Conference
|
||||
import io.github.wulkanowy.data.db.entities.Exam
|
||||
import io.github.wulkanowy.data.db.entities.Grade
|
||||
import io.github.wulkanowy.data.db.entities.GradePartialStatistics
|
||||
import io.github.wulkanowy.data.db.entities.GradePointsStatistics
|
||||
import io.github.wulkanowy.data.db.entities.GradeSemesterStatistics
|
||||
import io.github.wulkanowy.data.db.entities.GradeSummary
|
||||
import io.github.wulkanowy.data.db.entities.Homework
|
||||
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||
import io.github.wulkanowy.data.db.entities.Message
|
||||
import io.github.wulkanowy.data.db.entities.MessageAttachment
|
||||
import io.github.wulkanowy.data.db.entities.MobileDevice
|
||||
import io.github.wulkanowy.data.db.entities.Note
|
||||
import io.github.wulkanowy.data.db.entities.Notification
|
||||
import io.github.wulkanowy.data.db.entities.Recipient
|
||||
import io.github.wulkanowy.data.db.entities.ReportingUnit
|
||||
import io.github.wulkanowy.data.db.entities.School
|
||||
import io.github.wulkanowy.data.db.entities.SchoolAnnouncement
|
||||
import io.github.wulkanowy.data.db.entities.Semester
|
||||
import io.github.wulkanowy.data.db.entities.Student
|
||||
import io.github.wulkanowy.data.db.entities.StudentInfo
|
||||
import io.github.wulkanowy.data.db.entities.Subject
|
||||
import io.github.wulkanowy.data.db.entities.Teacher
|
||||
import io.github.wulkanowy.data.db.entities.Timetable
|
||||
import io.github.wulkanowy.data.db.entities.TimetableAdditional
|
||||
import io.github.wulkanowy.data.db.entities.TimetableHeader
|
||||
import io.github.wulkanowy.data.db.dao.*
|
||||
import io.github.wulkanowy.data.db.entities.*
|
||||
import io.github.wulkanowy.data.db.migrations.*
|
||||
import io.github.wulkanowy.utils.AppInfo
|
||||
import javax.inject.Singleton
|
||||
@ -108,6 +46,7 @@ import javax.inject.Singleton
|
||||
autoMigrations = [
|
||||
AutoMigration(from = 44, to = 45),
|
||||
AutoMigration(from = 46, to = 47),
|
||||
AutoMigration(from = 47, to = 48),
|
||||
],
|
||||
version = AppDatabase.VERSION_SCHEMA,
|
||||
exportSchema = true
|
||||
@ -116,7 +55,7 @@ import javax.inject.Singleton
|
||||
abstract class AppDatabase : RoomDatabase() {
|
||||
|
||||
companion object {
|
||||
const val VERSION_SCHEMA = 47
|
||||
const val VERSION_SCHEMA = 48
|
||||
|
||||
fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf(
|
||||
Migration2(),
|
||||
|
@ -1,11 +1,14 @@
|
||||
package io.github.wulkanowy.data.db
|
||||
|
||||
import androidx.room.TypeConverter
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
import io.github.wulkanowy.utils.toTimestamp
|
||||
import kotlinx.serialization.SerializationException
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import java.time.*
|
||||
import java.util.*
|
||||
import java.time.Instant
|
||||
import java.time.LocalDate
|
||||
import java.time.Month
|
||||
@ -58,4 +61,11 @@ class Converters {
|
||||
emptyList() // handle errors from old gson Pair serialized data
|
||||
}
|
||||
}
|
||||
|
||||
@TypeConverter
|
||||
fun destinationToString(destination: Destination) = json.encodeToString(destination)
|
||||
|
||||
@TypeConverter
|
||||
fun stringToDestination(destination: String): Destination = json.decodeFromString(destination)
|
||||
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import androidx.room.ColumnInfo
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
import io.github.wulkanowy.services.sync.notifications.NotificationType
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
import java.time.Instant
|
||||
|
||||
@Entity(tableName = "Notifications")
|
||||
@ -18,6 +19,9 @@ data class Notification(
|
||||
|
||||
val type: NotificationType,
|
||||
|
||||
@ColumnInfo(defaultValue = "{\"type\":\"io.github.wulkanowy.ui.modules.Destination.Dashboard\"}")
|
||||
val destination: Destination,
|
||||
|
||||
val date: Instant,
|
||||
|
||||
val data: String? = null
|
||||
|
@ -1,10 +1,10 @@
|
||||
package io.github.wulkanowy.data.pojos
|
||||
|
||||
import android.content.Intent
|
||||
import io.github.wulkanowy.services.sync.notifications.NotificationType
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
|
||||
data class NotificationData(
|
||||
val intentToStart: Intent,
|
||||
val destination: Destination,
|
||||
val title: String,
|
||||
val content: String
|
||||
)
|
||||
@ -13,7 +13,7 @@ data class GroupNotificationData(
|
||||
val notificationDataList: List<NotificationData>,
|
||||
val title: String,
|
||||
val content: String,
|
||||
val intentToStart: Intent,
|
||||
val destination: Destination,
|
||||
val type: NotificationType
|
||||
)
|
||||
|
||||
|
@ -0,0 +1,32 @@
|
||||
package io.github.wulkanowy.data.serializers
|
||||
|
||||
import kotlinx.serialization.ExperimentalSerializationApi
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.descriptors.PrimitiveKind
|
||||
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
|
||||
import kotlinx.serialization.descriptors.nullable
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import java.time.LocalDate
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
object LocalDateSerializer : KSerializer<LocalDate?> {
|
||||
|
||||
override val descriptor = PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.LONG).nullable
|
||||
|
||||
override fun serialize(encoder: Encoder, value: LocalDate?) {
|
||||
if (value == null) {
|
||||
encoder.encodeNull()
|
||||
} else {
|
||||
encoder.encodeNotNullMark()
|
||||
encoder.encodeLong(value.toEpochDay())
|
||||
}
|
||||
}
|
||||
|
||||
override fun deserialize(decoder: Decoder): LocalDate? =
|
||||
if (decoder.decodeNotNullMark()) {
|
||||
LocalDate.ofEpochDay(decoder.decodeLong())
|
||||
} else {
|
||||
decoder.decodeNull()
|
||||
}
|
||||
}
|
@ -15,6 +15,9 @@ import javax.inject.Singleton
|
||||
@Singleton
|
||||
class ShortcutsHelper @Inject constructor(@ApplicationContext private val context: Context) {
|
||||
|
||||
// Destination cannot be used here as shortcuts
|
||||
// require their intents to only use primitive types (see PersistableBundle.isValidType).
|
||||
|
||||
private val destinations = mapOf(
|
||||
"grade" to Destination.Grade,
|
||||
"attendance" to Destination.Attendance,
|
||||
|
@ -14,6 +14,7 @@ import io.github.wulkanowy.data.pojos.GroupNotificationData
|
||||
import io.github.wulkanowy.data.pojos.NotificationData
|
||||
import io.github.wulkanowy.data.repositories.NotificationRepository
|
||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||
import io.github.wulkanowy.ui.modules.splash.SplashActivity
|
||||
import io.github.wulkanowy.utils.PendingIntentCompat
|
||||
import io.github.wulkanowy.utils.getCompatBitmap
|
||||
import io.github.wulkanowy.utils.getCompatColor
|
||||
@ -47,7 +48,7 @@ class AppNotificationManager @Inject constructor(
|
||||
PendingIntent.getActivity(
|
||||
context,
|
||||
Random.nextInt(),
|
||||
notificationData.intentToStart,
|
||||
SplashActivity.getStartIntent(context, notificationData.destination),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
|
||||
)
|
||||
)
|
||||
@ -92,7 +93,7 @@ class AppNotificationManager @Inject constructor(
|
||||
PendingIntent.getActivity(
|
||||
context,
|
||||
Random.nextInt(),
|
||||
notificationData.intentToStart,
|
||||
SplashActivity.getStartIntent(context, notificationData.destination),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
|
||||
)
|
||||
)
|
||||
@ -146,7 +147,7 @@ class AppNotificationManager @Inject constructor(
|
||||
PendingIntent.getActivity(
|
||||
context,
|
||||
Random.nextInt(),
|
||||
groupNotificationData.intentToStart,
|
||||
SplashActivity.getStartIntent(context, groupNotificationData.destination),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
|
||||
)
|
||||
)
|
||||
@ -168,6 +169,7 @@ class AppNotificationManager @Inject constructor(
|
||||
studentId = student.id,
|
||||
title = notificationData.title,
|
||||
content = notificationData.content,
|
||||
destination = notificationData.destination,
|
||||
type = notificationType,
|
||||
date = Instant.now(),
|
||||
)
|
||||
|
@ -8,7 +8,6 @@ import io.github.wulkanowy.data.db.entities.Timetable
|
||||
import io.github.wulkanowy.data.pojos.GroupNotificationData
|
||||
import io.github.wulkanowy.data.pojos.NotificationData
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
import io.github.wulkanowy.ui.modules.splash.SplashActivity
|
||||
import io.github.wulkanowy.utils.getPlural
|
||||
import io.github.wulkanowy.utils.toFormattedString
|
||||
import java.time.Instant
|
||||
@ -23,8 +22,9 @@ class ChangeTimetableNotification @Inject constructor(
|
||||
suspend fun notify(items: List<Timetable>, student: Student) {
|
||||
val currentTime = Instant.now()
|
||||
val changedLessons = items.filter { (it.canceled || it.changes) && it.start > currentTime }
|
||||
val notificationDataList = changedLessons.groupBy { it.date }
|
||||
.map { (date, lessons) ->
|
||||
val lessonsByDate = changedLessons.groupBy { it.date }
|
||||
val notificationDataList = lessonsByDate
|
||||
.flatMap { (date, lessons) ->
|
||||
getNotificationContents(date, lessons).map {
|
||||
NotificationData(
|
||||
title = context.getPlural(
|
||||
@ -32,14 +32,10 @@ class ChangeTimetableNotification @Inject constructor(
|
||||
1
|
||||
),
|
||||
content = it,
|
||||
intentToStart = SplashActivity.getStartIntent(
|
||||
context = context,
|
||||
destination = Destination.Timetable(date)
|
||||
)
|
||||
destination = Destination.Timetable(date)
|
||||
)
|
||||
}
|
||||
}
|
||||
.flatten()
|
||||
.ifEmpty { return }
|
||||
|
||||
val groupNotificationData = GroupNotificationData(
|
||||
@ -53,7 +49,7 @@ class ChangeTimetableNotification @Inject constructor(
|
||||
changedLessons.size,
|
||||
changedLessons.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Timetable()),
|
||||
destination = Destination.Timetable(lessonsByDate.toSortedMap().firstKey()),
|
||||
type = NotificationType.CHANGE_TIMETABLE
|
||||
)
|
||||
|
||||
|
@ -31,7 +31,7 @@ class NewAttendanceNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.attendance_notify_new_items_title, 1),
|
||||
content = it,
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance)
|
||||
destination = Destination.Attendance
|
||||
)
|
||||
}
|
||||
|
||||
@ -46,7 +46,7 @@ class NewAttendanceNotification @Inject constructor(
|
||||
notificationDataList.size,
|
||||
notificationDataList.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance),
|
||||
destination = Destination.Attendance,
|
||||
type = NotificationType.NEW_ATTENDANCE
|
||||
)
|
||||
|
||||
|
@ -31,7 +31,7 @@ class NewConferenceNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.conference_notify_new_item_title, 1),
|
||||
content = it,
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Conference)
|
||||
destination = Destination.Conference
|
||||
)
|
||||
}
|
||||
|
||||
@ -43,7 +43,7 @@ class NewConferenceNotification @Inject constructor(
|
||||
lines.size,
|
||||
lines.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Conference),
|
||||
destination = Destination.Conference,
|
||||
type = NotificationType.NEW_CONFERENCE
|
||||
)
|
||||
|
||||
|
@ -31,7 +31,7 @@ class NewExamNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.exam_notify_new_item_title, 1),
|
||||
content = it,
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Exam),
|
||||
destination = Destination.Exam,
|
||||
)
|
||||
}
|
||||
|
||||
@ -43,7 +43,7 @@ class NewExamNotification @Inject constructor(
|
||||
lines.size,
|
||||
lines.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Exam),
|
||||
destination = Destination.Exam,
|
||||
type = NotificationType.NEW_EXAM
|
||||
)
|
||||
|
||||
|
@ -26,7 +26,7 @@ class NewGradeNotification @Inject constructor(
|
||||
append("${it.subject}: ${it.entry}")
|
||||
if (it.comment.isNotBlank()) append(" (${it.comment})")
|
||||
},
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Grade),
|
||||
destination = Destination.Grade,
|
||||
)
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@ class NewGradeNotification @Inject constructor(
|
||||
notificationDataList = notificationDataList,
|
||||
title = context.getPlural(R.plurals.grade_new_items, items.size),
|
||||
content = context.getPlural(R.plurals.grade_notify_new_items, items.size, items.size),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Grade),
|
||||
destination = Destination.Grade,
|
||||
type = NotificationType.NEW_GRADE_DETAILS
|
||||
)
|
||||
|
||||
@ -46,7 +46,7 @@ class NewGradeNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.grade_new_items_predicted, 1),
|
||||
content = "${it.subject}: ${it.predictedGrade}",
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Grade),
|
||||
destination = Destination.Grade,
|
||||
)
|
||||
}
|
||||
|
||||
@ -58,7 +58,7 @@ class NewGradeNotification @Inject constructor(
|
||||
items.size,
|
||||
items.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Grade),
|
||||
destination = Destination.Grade,
|
||||
type = NotificationType.NEW_GRADE_PREDICTED
|
||||
)
|
||||
|
||||
@ -70,7 +70,7 @@ class NewGradeNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.grade_new_items_final, 1),
|
||||
content = "${it.subject}: ${it.finalGrade}",
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Grade),
|
||||
destination = Destination.Grade,
|
||||
)
|
||||
}
|
||||
|
||||
@ -82,7 +82,7 @@ class NewGradeNotification @Inject constructor(
|
||||
items.size,
|
||||
items.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Grade),
|
||||
destination = Destination.Grade,
|
||||
type = NotificationType.NEW_GRADE_FINAL
|
||||
)
|
||||
|
||||
|
@ -31,7 +31,7 @@ class NewHomeworkNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.homework_notify_new_item_title, 1),
|
||||
content = it,
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Homework),
|
||||
destination = Destination.Homework,
|
||||
)
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ class NewHomeworkNotification @Inject constructor(
|
||||
lines.size,
|
||||
lines.size
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Homework),
|
||||
destination = Destination.Homework,
|
||||
type = NotificationType.NEW_HOMEWORK,
|
||||
notificationDataList = notificationDataList
|
||||
)
|
||||
|
@ -22,7 +22,7 @@ class NewLuckyNumberNotification @Inject constructor(
|
||||
R.string.lucky_number_notify_new_item,
|
||||
item.luckyNumber.toString()
|
||||
),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.LuckyNumber)
|
||||
destination = Destination.LuckyNumber
|
||||
)
|
||||
|
||||
appNotificationManager.sendSingleNotification(
|
||||
|
@ -22,7 +22,7 @@ class NewMessageNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(R.plurals.message_new_items, 1),
|
||||
content = "${it.sender}: ${it.subject}",
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Message),
|
||||
destination = Destination.Message,
|
||||
)
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@ class NewMessageNotification @Inject constructor(
|
||||
notificationDataList = notificationDataList,
|
||||
title = context.getPlural(R.plurals.message_new_items, items.size),
|
||||
content = context.getPlural(R.plurals.message_notify_new_items, items.size, items.size),
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Message),
|
||||
destination = Destination.Message,
|
||||
type = NotificationType.NEW_MESSAGE
|
||||
)
|
||||
|
||||
|
@ -29,13 +29,13 @@ class NewNoteNotification @Inject constructor(
|
||||
NotificationData(
|
||||
title = context.getPlural(titleRes, 1),
|
||||
content = "${it.teacher}: ${it.category}",
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Note),
|
||||
destination = Destination.Note,
|
||||
)
|
||||
}
|
||||
|
||||
val groupNotificationData = GroupNotificationData(
|
||||
notificationDataList = notificationDataList,
|
||||
intentToStart = SplashActivity.getStartIntent(context, Destination.Note),
|
||||
destination = Destination.Note,
|
||||
title = context.getPlural(R.plurals.note_new_items, items.size),
|
||||
content = context.getPlural(R.plurals.note_notify_new_items, items.size, items.size),
|
||||
type = NotificationType.NEW_NOTE
|
||||
|
@ -21,10 +21,7 @@ class NewSchoolAnnouncementNotification @Inject constructor(
|
||||
suspend fun notify(items: List<SchoolAnnouncement>, student: Student) {
|
||||
val notificationDataList = items.map {
|
||||
NotificationData(
|
||||
intentToStart = SplashActivity.getStartIntent(
|
||||
context = context,
|
||||
destination = Destination.SchoolAnnouncement
|
||||
),
|
||||
destination = Destination.SchoolAnnouncement,
|
||||
title = context.getPlural(
|
||||
R.plurals.school_announcement_notify_new_item_title,
|
||||
1
|
||||
@ -34,10 +31,7 @@ class NewSchoolAnnouncementNotification @Inject constructor(
|
||||
}
|
||||
val groupNotificationData = GroupNotificationData(
|
||||
type = NotificationType.NEW_ANNOUNCEMENT,
|
||||
intentToStart = SplashActivity.getStartIntent(
|
||||
context = context,
|
||||
destination = Destination.SchoolAnnouncement
|
||||
),
|
||||
destination = Destination.SchoolAnnouncement,
|
||||
title = context.getPlural(
|
||||
R.plurals.school_announcement_notify_new_item_title,
|
||||
items.size
|
||||
|
@ -1,6 +1,7 @@
|
||||
package io.github.wulkanowy.ui.modules
|
||||
|
||||
import androidx.fragment.app.Fragment
|
||||
import io.github.wulkanowy.data.serializers.LocalDateSerializer
|
||||
import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment
|
||||
import io.github.wulkanowy.ui.modules.conference.ConferenceFragment
|
||||
import io.github.wulkanowy.ui.modules.dashboard.DashboardFragment
|
||||
@ -14,18 +15,19 @@ import io.github.wulkanowy.ui.modules.note.NoteFragment
|
||||
import io.github.wulkanowy.ui.modules.schoolandteachers.school.SchoolFragment
|
||||
import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment
|
||||
import io.github.wulkanowy.ui.modules.timetable.TimetableFragment
|
||||
import java.io.Serializable
|
||||
import kotlinx.serialization.Serializable
|
||||
import java.time.LocalDate
|
||||
|
||||
sealed interface Destination : Serializable {
|
||||
@Serializable
|
||||
sealed class Destination private constructor() : java.io.Serializable {
|
||||
|
||||
/*
|
||||
Type in children classes have to be as getter to avoid null in enums
|
||||
https://stackoverflow.com/questions/68866453/kotlin-enum-val-is-returning-null-despite-being-set-at-compile-time
|
||||
*/
|
||||
val type: Type
|
||||
abstract val type: Type
|
||||
|
||||
val fragment: Fragment
|
||||
abstract val fragment: Fragment
|
||||
|
||||
enum class Type(val defaultDestination: Destination) {
|
||||
DASHBOARD(Dashboard),
|
||||
@ -43,94 +45,84 @@ sealed interface Destination : Serializable {
|
||||
MESSAGE(Message);
|
||||
}
|
||||
|
||||
object Dashboard : Destination {
|
||||
|
||||
@Serializable
|
||||
object Dashboard : Destination() {
|
||||
override val type get() = Type.DASHBOARD
|
||||
|
||||
override val fragment get() = DashboardFragment.newInstance()
|
||||
}
|
||||
|
||||
object Grade : Destination {
|
||||
|
||||
@Serializable
|
||||
object Grade : Destination() {
|
||||
override val type get() = Type.GRADE
|
||||
|
||||
override val fragment get() = GradeFragment.newInstance()
|
||||
}
|
||||
|
||||
object Attendance : Destination {
|
||||
|
||||
@Serializable
|
||||
object Attendance : Destination() {
|
||||
override val type get() = Type.ATTENDANCE
|
||||
|
||||
override val fragment get() = AttendanceFragment.newInstance()
|
||||
}
|
||||
|
||||
object Exam : Destination {
|
||||
|
||||
@Serializable
|
||||
object Exam : Destination() {
|
||||
override val type get() = Type.EXAM
|
||||
|
||||
override val fragment get() = ExamFragment.newInstance()
|
||||
}
|
||||
|
||||
data class Timetable(val date: LocalDate? = null) : Destination {
|
||||
|
||||
@Serializable
|
||||
data class Timetable(
|
||||
@Serializable(with = LocalDateSerializer::class)
|
||||
private val date: LocalDate? = null
|
||||
) : Destination() {
|
||||
override val type get() = Type.TIMETABLE
|
||||
|
||||
override val fragment get() = TimetableFragment.newInstance(date)
|
||||
}
|
||||
|
||||
object Homework : Destination {
|
||||
|
||||
@Serializable
|
||||
object Homework : Destination() {
|
||||
override val type get() = Type.HOMEWORK
|
||||
|
||||
override val fragment get() = HomeworkFragment.newInstance()
|
||||
}
|
||||
|
||||
object Note : Destination {
|
||||
|
||||
@Serializable
|
||||
object Note : Destination() {
|
||||
override val type get() = Type.NOTE
|
||||
|
||||
override val fragment get() = NoteFragment.newInstance()
|
||||
}
|
||||
|
||||
object Conference : Destination {
|
||||
|
||||
@Serializable
|
||||
object Conference : Destination() {
|
||||
override val type get() = Type.CONFERENCE
|
||||
|
||||
override val fragment get() = ConferenceFragment.newInstance()
|
||||
}
|
||||
|
||||
object SchoolAnnouncement : Destination {
|
||||
|
||||
@Serializable
|
||||
object SchoolAnnouncement : Destination() {
|
||||
override val type get() = Type.SCHOOL_ANNOUNCEMENT
|
||||
|
||||
override val fragment get() = SchoolAnnouncementFragment.newInstance()
|
||||
}
|
||||
|
||||
object School : Destination {
|
||||
|
||||
@Serializable
|
||||
object School : Destination() {
|
||||
override val type get() = Type.SCHOOL
|
||||
|
||||
override val fragment get() = SchoolFragment.newInstance()
|
||||
}
|
||||
|
||||
object LuckyNumber : Destination {
|
||||
|
||||
@Serializable
|
||||
object LuckyNumber : Destination() {
|
||||
override val type get() = Type.LUCKY_NUMBER
|
||||
|
||||
override val fragment get() = LuckyNumberFragment.newInstance()
|
||||
}
|
||||
|
||||
object More : Destination {
|
||||
|
||||
@Serializable
|
||||
object More : Destination() {
|
||||
override val type get() = Type.MORE
|
||||
|
||||
override val fragment get() = MoreFragment.newInstance()
|
||||
}
|
||||
|
||||
object Message : Destination {
|
||||
|
||||
@Serializable
|
||||
object Message : Destination() {
|
||||
override val type get() = Type.MESSAGE
|
||||
|
||||
override val fragment get() = MessageFragment.newInstance()
|
||||
}
|
||||
}
|
||||
}
|
@ -25,8 +25,8 @@ private fun generateTimetable(subject: String, room: String, roomOld: String) =
|
||||
diaryId = 0,
|
||||
date = LocalDate.now().minusDays(Random.nextLong(0, 8)),
|
||||
number = 1,
|
||||
start = Instant.now(),
|
||||
end = Instant.now().plus(Duration.ofHours(1)),
|
||||
start = Instant.now().plus(Duration.ofHours(1)),
|
||||
end = Instant.now(),
|
||||
subjectOld = "",
|
||||
group = "",
|
||||
room = room,
|
||||
|
@ -7,14 +7,13 @@ import androidx.recyclerview.widget.ListAdapter
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import io.github.wulkanowy.data.db.entities.Notification
|
||||
import io.github.wulkanowy.databinding.ItemNotificationsCenterBinding
|
||||
import io.github.wulkanowy.services.sync.notifications.NotificationType
|
||||
import io.github.wulkanowy.utils.toFormattedString
|
||||
import javax.inject.Inject
|
||||
|
||||
class NotificationsCenterAdapter @Inject constructor() :
|
||||
ListAdapter<Notification, NotificationsCenterAdapter.ViewHolder>(DiffUtilCallback()) {
|
||||
|
||||
var onItemClickListener: (NotificationType) -> Unit = {}
|
||||
var onItemClickListener: (Notification) -> Unit = {}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
|
||||
ItemNotificationsCenterBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
@ -29,7 +28,7 @@ class NotificationsCenterAdapter @Inject constructor() :
|
||||
notificationsCenterItemDate.text = item.date.toFormattedString("HH:mm, d MMM")
|
||||
notificationsCenterItemIcon.setImageResource(item.type.icon)
|
||||
|
||||
root.setOnClickListener { onItemClickListener(item.type) }
|
||||
root.setOnClickListener { onItemClickListener(item) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,26 +3,14 @@ package io.github.wulkanowy.ui.modules.notificationscenter
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import io.github.wulkanowy.R
|
||||
import io.github.wulkanowy.data.db.entities.Notification
|
||||
import io.github.wulkanowy.databinding.FragmentNotificationsCenterBinding
|
||||
import io.github.wulkanowy.services.sync.notifications.NotificationType
|
||||
import io.github.wulkanowy.ui.base.BaseFragment
|
||||
import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment
|
||||
import io.github.wulkanowy.ui.modules.conference.ConferenceFragment
|
||||
import io.github.wulkanowy.ui.modules.exam.ExamFragment
|
||||
import io.github.wulkanowy.ui.modules.grade.GradeFragment
|
||||
import io.github.wulkanowy.ui.modules.homework.HomeworkFragment
|
||||
import io.github.wulkanowy.ui.modules.luckynumber.LuckyNumberFragment
|
||||
import io.github.wulkanowy.ui.modules.main.MainActivity
|
||||
import io.github.wulkanowy.ui.modules.main.MainView
|
||||
import io.github.wulkanowy.ui.modules.message.MessageFragment
|
||||
import io.github.wulkanowy.ui.modules.note.NoteFragment
|
||||
import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment
|
||||
import io.github.wulkanowy.ui.modules.timetable.TimetableFragment
|
||||
import javax.inject.Inject
|
||||
|
||||
@AndroidEntryPoint
|
||||
@ -54,9 +42,8 @@ class NotificationsCenterFragment :
|
||||
}
|
||||
|
||||
override fun initView() {
|
||||
notificationsCenterAdapter.onItemClickListener = { notificationType ->
|
||||
notificationType.toDestinationFragment()
|
||||
?.let { (requireActivity() as MainActivity).pushView(it) }
|
||||
notificationsCenterAdapter.onItemClickListener = { notification ->
|
||||
(requireActivity() as MainActivity).pushView(notification.destination.fragment)
|
||||
}
|
||||
|
||||
with(binding.notificationsCenterRecycler) {
|
||||
@ -93,20 +80,4 @@ class NotificationsCenterFragment :
|
||||
presenter.onDetachView()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
private fun NotificationType.toDestinationFragment(): Fragment? = when (this) {
|
||||
NotificationType.NEW_CONFERENCE -> ConferenceFragment.newInstance()
|
||||
NotificationType.NEW_EXAM -> ExamFragment.newInstance()
|
||||
NotificationType.NEW_GRADE_DETAILS -> GradeFragment.newInstance()
|
||||
NotificationType.NEW_GRADE_PREDICTED -> GradeFragment.newInstance()
|
||||
NotificationType.NEW_GRADE_FINAL -> GradeFragment.newInstance()
|
||||
NotificationType.NEW_HOMEWORK -> HomeworkFragment.newInstance()
|
||||
NotificationType.NEW_LUCKY_NUMBER -> LuckyNumberFragment.newInstance()
|
||||
NotificationType.NEW_MESSAGE -> MessageFragment.newInstance()
|
||||
NotificationType.NEW_NOTE -> NoteFragment.newInstance()
|
||||
NotificationType.NEW_ANNOUNCEMENT -> SchoolAnnouncementFragment.newInstance()
|
||||
NotificationType.PUSH -> null
|
||||
NotificationType.CHANGE_TIMETABLE -> TimetableFragment.newInstance()
|
||||
NotificationType.NEW_ATTENDANCE -> AttendanceFragment.newInstance()
|
||||
}
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ class NotificationsCenterPresenter @Inject constructor(
|
||||
emitAll(notificationRepository.getNotifications(studentId))
|
||||
}
|
||||
.map { notificationList -> notificationList.sortedByDescending { it.date } }
|
||||
.catch { Timber.i("Loading notifications result: An exception occurred") }
|
||||
.catch { Timber.i("Loading notifications result: An exception occurred: `$it`") }
|
||||
.onEach {
|
||||
Timber.i("Loading notifications result: Success")
|
||||
|
||||
|
@ -7,6 +7,7 @@ import dagger.hilt.android.AndroidEntryPoint
|
||||
import io.github.wulkanowy.data.db.entities.Notification
|
||||
import io.github.wulkanowy.data.repositories.NotificationRepository
|
||||
import io.github.wulkanowy.services.sync.notifications.NotificationType
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
@ -38,6 +39,7 @@ class AppMessagingService : FirebaseMessagingService() {
|
||||
data = customData,
|
||||
date = Instant.now(),
|
||||
type = NotificationType.PUSH,
|
||||
destination = Destination.Dashboard,
|
||||
studentId = -1
|
||||
)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user