diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 0c64df61..a8407c84 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -19,6 +19,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index f1345fb1..216b9ffc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -82,7 +82,12 @@ dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'com.takisoft.preferencex:preferencex:1.0.0'
- implementation "com.firebase:firebase-jobdispatcher:0.8.5"
+
+ implementation "android.arch.work:work-rxjava2:1.0.0"
+ implementation "android.arch.work:work-runtime:1.0.0"
+
+ implementation 'com.squareup.inject:assisted-inject-annotations-dagger2:0.3.2'
+ kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.3.2'
implementation "com.google.dagger:dagger-android-support:2.21"
kapt "com.google.dagger:dagger-compiler:2.21"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cb24e2aa..81e252cb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -42,13 +42,6 @@
android:label="@string/main_title"
android:theme="@style/WulkanowyTheme.NoActionBar" />
-
-
-
-
-
@@ -64,6 +57,12 @@
android:resource="@xml/provider_widget_timetable" />
+
+
diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt
index 59478a51..68fc7c64 100644
--- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt
+++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt
@@ -3,6 +3,8 @@ package io.github.wulkanowy
import android.content.Context
import androidx.appcompat.app.AppCompatDelegate
import androidx.multidex.MultiDex
+import androidx.work.Configuration
+import androidx.work.WorkManager
import com.crashlytics.android.Crashlytics
import com.crashlytics.android.core.CrashlyticsCore
import com.jakewharton.threetenabp.AndroidThreeTen
@@ -14,6 +16,7 @@ import io.fabric.sdk.android.Fabric
import io.github.wulkanowy.BuildConfig.DEBUG
import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
import io.github.wulkanowy.di.DaggerAppComponent
+import io.github.wulkanowy.services.sync.SyncWorkerFactory
import io.github.wulkanowy.utils.CrashlyticsTree
import io.github.wulkanowy.utils.DebugLogTree
import timber.log.Timber
@@ -24,6 +27,9 @@ class WulkanowyApp : DaggerApplication() {
@Inject
lateinit var prefRepository: PreferencesRepository
+ @Inject
+ lateinit var workerFactory: SyncWorkerFactory
+
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
MultiDex.install(this)
@@ -35,6 +41,7 @@ class WulkanowyApp : DaggerApplication() {
initializeFabric()
if (DEBUG) enableDebugLog()
AppCompatDelegate.setDefaultNightMode(prefRepository.currentTheme)
+ WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(workerFactory).build())
}
private fun enableDebugLog() {
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt
index 3f2e29b8..6816ceaa 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt
@@ -14,7 +14,7 @@ import javax.inject.Singleton
interface CompletedLessonsDao {
@Insert
- fun insertAll(exams: List): List
+ fun insertAll(exams: List)
@Delete
fun deleteAll(exams: List)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt
index 629f201d..0bd210b0 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt
@@ -16,9 +16,6 @@ interface GradeDao {
@Insert
fun insertAll(grades: List)
- @Update
- fun update(grade: Grade)
-
@Update
fun updateAll(grade: List)
@@ -28,6 +25,4 @@ interface GradeDao {
@Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId")
fun loadAll(semesterId: Int, studentId: Int): Maybe>
- @Query("SELECT * FROM Grades WHERE is_read = 0 AND semester_id = :semesterId AND student_id = :studentId")
- fun loadAllNew(semesterId: Int, studentId: Int): Maybe>
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt
index 05736e42..afd7905c 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt
@@ -24,6 +24,6 @@ interface LuckyNumberDao {
fun delete(luckyNumber: LuckyNumber)
@Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date")
- fun loadFromDate(studentId: Int, date: LocalDate): Maybe
+ fun load(studentId: Int, date: LocalDate): Maybe
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt
index 5018b690..11d456b9 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt
@@ -12,26 +12,20 @@ import io.reactivex.Maybe
interface MessagesDao {
@Insert
- fun insertAll(messages: List): List
+ fun insertAll(messages: List)
@Delete
fun deleteAll(messages: List)
- @Update
- fun update(message: Message)
-
@Update
fun updateAll(messages: List)
- @Query("SELECT * FROM Messages WHERE student_id = :studentId AND real_id = :id")
- fun loadOne(studentId: Int, id: Int): Maybe
-
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder ORDER BY date DESC")
- fun load(studentId: Int, folder: Int): Maybe>
+ fun loadAll(studentId: Int, folder: Int): Maybe>
+
+ @Query("SELECT * FROM Messages WHERE student_id = :studentId AND real_id = :id")
+ fun load(studentId: Int, id: Int): Maybe
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND removed = 1 ORDER BY date DESC")
fun loadDeleted(studentId: Int): Maybe>
-
- @Query("SELECT * FROM Messages WHERE unread = 1 AND student_id = :studentId")
- fun loadNewMessages(studentId: Int): Maybe>
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt
index 89443506..867e06a2 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt
@@ -16,9 +16,6 @@ interface NoteDao {
@Insert
fun insertAll(notes: List)
- @Update
- fun update(note: Note)
-
@Update
fun updateAll(notes: List)
@@ -28,6 +25,4 @@ interface NoteDao {
@Query("SELECT * FROM Notes WHERE student_id = :studentId")
fun loadAll(studentId: Int): Maybe>
- @Query("SELECT * FROM Notes WHERE is_read = 0 AND student_id = :studentId")
- fun loadNew(studentId: Int): Maybe>
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt
index b089c477..5f3a92ab 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt
@@ -25,7 +25,7 @@ data class Note(
var id: Long = 0
@ColumnInfo(name = "is_read")
- var isRead: Boolean = false
+ var isRead: Boolean = true
@ColumnInfo(name = "is_notified")
var isNotified: Boolean = true
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt
index 6d953bf5..0f587376 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt
@@ -11,11 +11,6 @@ import javax.inject.Singleton
@Singleton
class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDao) {
- fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
- return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate)
- .filter { !it.isEmpty() }
- }
-
fun saveAttendance(attendance: List) {
attendanceDb.insertAll(attendance)
}
@@ -23,4 +18,8 @@ class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDa
fun deleteAttendance(attendance: List) {
attendanceDb.deleteAll(attendance)
}
+
+ fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
+ return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt
index 60da5ef2..2e9a1006 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt
@@ -10,10 +10,6 @@ import javax.inject.Singleton
@Singleton
class AttendanceSummaryLocal @Inject constructor(private val attendanceDb: AttendanceSummaryDao) {
- fun getAttendanceSummary(semester: Semester, subjectId: Int): Maybe> {
- return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId).filter { !it.isEmpty() }
- }
-
fun saveAttendanceSummary(attendance: List) {
attendanceDb.insertAll(attendance)
}
@@ -21,4 +17,8 @@ class AttendanceSummaryLocal @Inject constructor(private val attendanceDb: Atten
fun deleteAttendanceSummary(attendance: List) {
attendanceDb.deleteAll(attendance)
}
+
+ fun getAttendanceSummary(semester: Semester, subjectId: Int): Maybe> {
+ return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt
index 04b6e4ed..90d39aab 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt
@@ -16,7 +16,7 @@ class AttendanceSummaryRepository @Inject constructor(
private val remote: AttendanceSummaryRemote
) {
- fun getAttendanceSummary(semester: Semester, subjectId: Int, forceRefresh: Boolean = false): Single>? {
+ fun getAttendanceSummary(semester: Semester, subjectId: Int, forceRefresh: Boolean = false): Single> {
return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh }
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt
index 8ebefb31..9b275908 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt
@@ -11,10 +11,6 @@ import javax.inject.Singleton
@Singleton
class CompletedLessonsLocal @Inject constructor(private val completedLessonsDb: CompletedLessonsDao) {
- fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): Maybe> {
- return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end).filter { !it.isEmpty() }
- }
-
fun saveCompletedLessons(completedLessons: List) {
completedLessonsDb.insertAll(completedLessons)
}
@@ -22,4 +18,8 @@ class CompletedLessonsLocal @Inject constructor(private val completedLessonsDb:
fun deleteCompleteLessons(completedLessons: List) {
completedLessonsDb.deleteAll(completedLessons)
}
+
+ fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): Maybe> {
+ return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt
index cdd583aa..4983a474 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt
@@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.grade
import io.github.wulkanowy.data.db.dao.GradeDao
import io.github.wulkanowy.data.db.entities.Grade
import io.github.wulkanowy.data.db.entities.Semester
-import io.reactivex.Completable
import io.reactivex.Maybe
import javax.inject.Inject
import javax.inject.Singleton
@@ -11,27 +10,19 @@ import javax.inject.Singleton
@Singleton
class GradeLocal @Inject constructor(private val gradeDb: GradeDao) {
- fun getGrades(semester: Semester): Maybe> {
- return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { !it.isEmpty() }
- }
-
- fun getNewGrades(semester: Semester): Maybe> {
- return gradeDb.loadAllNew(semester.semesterId, semester.studentId)
- }
-
fun saveGrades(grades: List) {
gradeDb.insertAll(grades)
}
- fun updateGrade(grade: Grade): Completable {
- return Completable.fromCallable { gradeDb.update(grade) }
- }
-
- fun updateGrades(grades: List): Completable {
- return Completable.fromCallable { gradeDb.updateAll(grades) }
- }
-
fun deleteGrades(grades: List) {
gradeDb.deleteAll(grades)
}
+
+ fun updateGrades(grades: List) {
+ gradeDb.updateAll(grades)
+ }
+
+ fun getGrades(semester: Semester): Maybe> {
+ return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt
index f304ecee..d268a46c 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt
@@ -31,24 +31,28 @@ class GradeRepository @Inject constructor(
local.deleteGrades(oldGrades - newGrades)
local.saveGrades((newGrades - oldGrades)
.onEach {
- if (it.date >= notifyBreakDate) {
- if (notify) it.isNotified = false
- it.isRead = false
+ if (it.date >= notifyBreakDate) it.apply {
+ isRead = false
+ if (notify) isNotified = false
}
})
}
}.flatMap { local.getGrades(semester).toSingle(emptyList()) })
}
- fun getNewGrades(semester: Semester): Single> {
- return local.getNewGrades(semester).toSingle(emptyList())
+ fun getUnreadGrades(semester: Semester): Single> {
+ return local.getGrades(semester).map { it.filter { grade -> !grade.isRead } }.toSingle(emptyList())
+ }
+
+ fun getNotNotifiedGrades(semester: Semester): Single> {
+ return local.getGrades(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList())
}
fun updateGrade(grade: Grade): Completable {
- return local.updateGrade(grade)
+ return Completable.fromCallable { local.updateGrades(listOf(grade)) }
}
fun updateGrades(grades: List): Completable {
- return local.updateGrades(grades)
+ return Completable.fromCallable { local.updateGrades(grades) }
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt
index 7ccf7154..e74641d3 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt
@@ -10,11 +10,6 @@ import javax.inject.Singleton
@Singleton
class GradeSummaryLocal @Inject constructor(private val gradeSummaryDb: GradeSummaryDao) {
- fun getGradesSummary(semester: Semester): Maybe> {
- return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId)
- .filter { !it.isEmpty() }
- }
-
fun saveGradesSummary(gradesSummary: List) {
gradeSummaryDb.insertAll(gradesSummary)
}
@@ -22,4 +17,8 @@ class GradeSummaryLocal @Inject constructor(private val gradeSummaryDb: GradeSum
fun deleteGradesSummary(gradesSummary: List) {
gradeSummaryDb.deleteAll(gradesSummary)
}
+
+ fun getGradesSummary(semester: Semester): Maybe> {
+ return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt
index 2508b18e..55e51fca 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt
@@ -11,10 +11,6 @@ import javax.inject.Singleton
@Singleton
class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) {
- fun getHomework(semester: Semester, date: LocalDate): Maybe> {
- return homeworkDb.loadAll(semester.semesterId, semester.studentId, date).filter { !it.isEmpty() }
- }
-
fun saveHomework(homework: List) {
homeworkDb.insertAll(homework)
}
@@ -22,4 +18,8 @@ class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) {
fun deleteHomework(homework: List) {
homeworkDb.deleteAll(homework)
}
+
+ fun getHomework(semester: Semester, date: LocalDate): Maybe> {
+ return homeworkDb.loadAll(semester.semesterId, semester.studentId, date).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt
index c645736e..115c8965 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt
@@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.luckynumber
import io.github.wulkanowy.data.db.dao.LuckyNumberDao
import io.github.wulkanowy.data.db.entities.LuckyNumber
import io.github.wulkanowy.data.db.entities.Semester
-import io.reactivex.Completable
import io.reactivex.Maybe
import org.threeten.bp.LocalDate
import javax.inject.Inject
@@ -12,19 +11,19 @@ import javax.inject.Singleton
@Singleton
class LuckyNumberLocal @Inject constructor(private val luckyNumberDb: LuckyNumberDao) {
- fun getLuckyNumber(semester: Semester, date: LocalDate): Maybe {
- return luckyNumberDb.loadFromDate(semester.studentId, date)
- }
-
fun saveLuckyNumber(luckyNumber: LuckyNumber) {
luckyNumberDb.insert(luckyNumber)
}
- fun updateLuckyNumber(luckyNumber: LuckyNumber): Completable {
- return Completable.fromCallable { luckyNumberDb.update(luckyNumber) }
+ fun updateLuckyNumber(luckyNumber: LuckyNumber) {
+ luckyNumberDb.update(luckyNumber)
}
fun deleteLuckyNumber(luckyNumber: LuckyNumber) {
luckyNumberDb.delete(luckyNumber)
}
+
+ fun getLuckyNumber(semester: Semester, date: LocalDate): Maybe {
+ return luckyNumberDb.load(semester.studentId, date)
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt
index 7b69a058..4036521f 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt
@@ -44,7 +44,11 @@ class LuckyNumberRepository @Inject constructor(
)
}
+ fun getNotNotifiedLuckyNumber(semester: Semester): Maybe {
+ return local.getLuckyNumber(semester, LocalDate.now()).filter { !it.isNotified }
+ }
+
fun updateLuckyNumber(luckyNumber: LuckyNumber): Completable {
- return local.updateLuckyNumber(luckyNumber)
+ return Completable.fromCallable { local.updateLuckyNumber(luckyNumber) }
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageFolder.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageFolder.kt
new file mode 100644
index 00000000..06f5a1e0
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageFolder.kt
@@ -0,0 +1,7 @@
+package io.github.wulkanowy.data.repositories.message
+
+enum class MessageFolder(val id: Int = 1) {
+ RECEIVED(1),
+ SENT(2),
+ TRASHED(3)
+}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt
index 7bac6615..e9ab7297 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt
@@ -3,6 +3,7 @@ package io.github.wulkanowy.data.repositories.message
import io.github.wulkanowy.data.db.dao.MessagesDao
import io.github.wulkanowy.data.db.entities.Message
import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED
import io.reactivex.Maybe
import javax.inject.Inject
import javax.inject.Singleton
@@ -10,34 +11,26 @@ import javax.inject.Singleton
@Singleton
class MessageLocal @Inject constructor(private val messagesDb: MessagesDao) {
- fun getMessage(studentId: Int, id: Int): Maybe {
- return messagesDb.loadOne(studentId, id)
- }
-
- fun getMessages(studentId: Int, folder: MessageRepository.MessageFolder): Maybe> {
- return when (folder) {
- MessageRepository.MessageFolder.TRASHED -> messagesDb.loadDeleted(studentId)
- else -> messagesDb.load(studentId, folder.id)
- }.filter { !it.isEmpty() }
- }
-
- fun getNewMessages(student: Student): Maybe> {
- return messagesDb.loadNewMessages(student.studentId)
- }
-
- fun saveMessages(messages: List): List {
- return messagesDb.insertAll(messages)
- }
-
- fun updateMessage(message: Message) {
- return messagesDb.update(message)
+ fun saveMessages(messages: List) {
+ messagesDb.insertAll(messages)
}
fun updateMessages(messages: List) {
- return messagesDb.updateAll(messages)
+ messagesDb.updateAll(messages)
}
fun deleteMessages(messages: List) {
messagesDb.deleteAll(messages)
}
+
+ fun getMessage(student: Student, id: Int): Maybe {
+ return messagesDb.load(student.studentId, id)
+ }
+
+ fun getMessages(student: Student, folder: MessageFolder): Maybe> {
+ return when (folder) {
+ TRASHED -> messagesDb.loadDeleted(student.studentId)
+ else -> messagesDb.loadAll(student.studentId, folder.id)
+ }.filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt
index 6d388471..f4ccde0d 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt
@@ -16,7 +16,7 @@ import io.github.wulkanowy.api.messages.Recipient as ApiRecipient
@Singleton
class MessageRemote @Inject constructor(private val api: Api) {
- fun getMessages(studentId: Int, folder: MessageRepository.MessageFolder): Single> {
+ fun getMessages(studentId: Int, folder: MessageFolder): Single> {
return api.getMessages(Folder.valueOf(folder.name)).map { messages ->
messages.map {
Message(
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt
index 2d78c4cb..9f9a7bdf 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt
@@ -7,6 +7,7 @@ import io.github.wulkanowy.data.ApiHelper
import io.github.wulkanowy.data.db.entities.Message
import io.github.wulkanowy.data.db.entities.Recipient
import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED
import io.reactivex.Completable
import io.reactivex.Single
import java.net.UnknownHostException
@@ -21,22 +22,16 @@ class MessageRepository @Inject constructor(
private val apiHelper: ApiHelper
) {
- enum class MessageFolder(val id: Int = 1) {
- RECEIVED(1),
- SENT(2),
- TRASHED(3)
- }
-
fun getMessages(student: Student, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
return Single.just(apiHelper.initApi(student))
.flatMap { _ ->
- local.getMessages(student.studentId, folder).filter { !forceRefresh }
+ local.getMessages(student, folder).filter { !forceRefresh }
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
if (it) remote.getMessages(student.studentId, folder)
else Single.error(UnknownHostException())
}.flatMap { new ->
- local.getMessages(student.studentId, folder).toSingle(emptyList())
+ local.getMessages(student, folder).toSingle(emptyList())
.doOnSuccess { old ->
local.deleteMessages(old - new)
local.saveMessages((new - old)
@@ -44,7 +39,7 @@ class MessageRepository @Inject constructor(
it.isNotified = !notify
})
}
- }.flatMap { local.getMessages(student.studentId, folder).toSingle(emptyList()) }
+ }.flatMap { local.getMessages(student, folder).toSingle(emptyList()) }
)
}
}
@@ -52,33 +47,35 @@ class MessageRepository @Inject constructor(
fun getMessage(student: Student, messageId: Int, markAsRead: Boolean = false): Single {
return Single.just(apiHelper.initApi(student))
.flatMap { _ ->
- local.getMessage(student.studentId, messageId)
+ local.getMessage(student, messageId)
.filter { !it.content.isNullOrEmpty() }
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
- if (it) local.getMessage(student.studentId, messageId).toSingle()
+ if (it) local.getMessage(student, messageId).toSingle()
else Single.error(UnknownHostException())
}
.flatMap { dbMessage ->
remote.getMessagesContent(dbMessage, markAsRead).doOnSuccess {
- local.updateMessage(dbMessage.copy(unread = false).apply {
+ local.updateMessages(listOf(dbMessage.copy(unread = false).apply {
id = dbMessage.id
content = it
- })
+ }))
}
}.flatMap {
- local.getMessage(student.studentId, messageId).toSingle()
+ local.getMessage(student, messageId).toSingle()
}
)
}
}
- fun getNewMessages(student: Student): Single> {
- return local.getNewMessages(student).toSingle(emptyList())
+ fun getNotNotifiedMessages(student: Student): Single> {
+ return local.getMessages(student, RECEIVED)
+ .map { it.filter { message -> !message.isNotified && message.unread } }
+ .toSingle(emptyList())
}
fun updateMessage(message: Message): Completable {
- return Completable.fromCallable { local.updateMessage(message) }
+ return Completable.fromCallable { local.updateMessages(listOf(message)) }
}
fun updateMessages(messages: List): Completable {
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt
index 3c849e2d..784e61f0 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt
@@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.note
import io.github.wulkanowy.data.db.dao.NoteDao
import io.github.wulkanowy.data.db.entities.Note
import io.github.wulkanowy.data.db.entities.Student
-import io.reactivex.Completable
import io.reactivex.Maybe
import javax.inject.Inject
import javax.inject.Singleton
@@ -11,27 +10,19 @@ import javax.inject.Singleton
@Singleton
class NoteLocal @Inject constructor(private val noteDb: NoteDao) {
- fun getNotes(student: Student): Maybe> {
- return noteDb.loadAll(student.studentId).filter { !it.isEmpty() }
- }
-
- fun getNewNotes(student: Student): Maybe> {
- return noteDb.loadNew(student.studentId)
- }
-
fun saveNotes(notes: List) {
noteDb.insertAll(notes)
}
- fun updateNote(note: Note): Completable {
- return Completable.fromCallable { noteDb.update(note) }
- }
-
- fun updateNotes(notes: List): Completable {
- return Completable.fromCallable { noteDb.updateAll(notes) }
+ fun updateNotes(notes: List) {
+ noteDb.updateAll(notes)
}
fun deleteNotes(notes: List) {
noteDb.deleteAll(notes)
}
+
+ fun getNotes(student: Student): Maybe> {
+ return noteDb.loadAll(student.studentId).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt
index 9d575693..d74bc7ea 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt
@@ -30,24 +30,24 @@ class NoteRepository @Inject constructor(
local.deleteNotes(old - new)
local.saveNotes((new - old)
.onEach {
- if (student.registrationDate <= it.date.atStartOfDay()) {
- if (notify) it.isNotified = false
- it.isRead = false
+ if (it.date >= student.registrationDate.toLocalDate()) it.apply {
+ isRead = false
+ if (notify) isNotified = false
}
})
}
}.flatMap { local.getNotes(student).toSingle(emptyList()) })
}
- fun getNewNotes(student: Student): Single> {
- return local.getNewNotes(student).toSingle(emptyList())
+ fun getNotNotifiedNotes(student: Student): Single> {
+ return local.getNotes(student).map { it.filter { note -> !note.isNotified } }.toSingle(emptyList())
}
fun updateNote(note: Note): Completable {
- return local.updateNote(note)
+ return Completable.fromCallable { local.updateNotes(listOf(note)) }
}
fun updateNotes(notes: List): Completable {
- return local.updateNotes(notes)
+ return Completable.fromCallable { local.updateNotes(notes) }
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt
index 5996d949..6f301664 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt
@@ -12,7 +12,7 @@ class PreferencesRepository @Inject constructor(
val context: Context
) {
val startMenuIndex: Int
- get() = sharedPref.getString(context.getString(R.string.pref_key_start_menu), "0")?.toInt() ?: 0
+ get() = sharedPref.getString(context.getString(R.string.pref_key_start_menu), "0")?.toIntOrNull() ?: 0
val isShowPresent: Boolean
get() = sharedPref.getBoolean(context.getString(R.string.pref_key_attendance_present), true)
@@ -22,25 +22,24 @@ class PreferencesRepository @Inject constructor(
val currentThemeKey: String = context.getString(R.string.pref_key_theme)
val currentTheme: Int
- get() = sharedPref.getString(currentThemeKey, "1")?.toInt() ?: 1
+ get() = sharedPref.getString(currentThemeKey, "1")?.toIntOrNull() ?: 1
val gradePlusModifier: Double
- get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_plus), "0.0")?.toDouble() ?: 0.0
+ get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_plus), "0.0")?.toDoubleOrNull() ?: 0.0
val gradeMinusModifier: Double
- get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_minus), "0.0")?.toDouble() ?: 0.0
+ get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_minus), "0.0")?.toDoubleOrNull() ?: 0.0
val gradeColorTheme: String
get() = sharedPref.getString(context.getString(R.string.pref_key_grade_color_scheme), "vulcan") ?: "vulcan"
-
- val serviceEnablesKey: String = context.getString(R.string.pref_key_services_enable)
+ val serviceEnableKey: String = context.getString(R.string.pref_key_services_enable)
val isServiceEnabled: Boolean
- get() = sharedPref.getBoolean(serviceEnablesKey, true)
+ get() = sharedPref.getBoolean(serviceEnableKey, true)
val servicesIntervalKey: String = context.getString(R.string.pref_key_services_interval)
- val servicesInterval: Int
- get() = sharedPref.getString(servicesIntervalKey, "60")?.toInt() ?: 60
+ val servicesInterval: Long
+ get() = sharedPref.getString(servicesIntervalKey, "60")?.toLongOrNull() ?: 60
val servicesOnlyWifiKey: String = context.getString(R.string.pref_key_services_wifi_only)
val isServicesOnlyWifi: Boolean
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt
index a090a55e..e074ce2a 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt
@@ -11,11 +11,6 @@ import javax.inject.Singleton
@Singleton
class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao) {
- fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
- return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate)
- .filter { !it.isEmpty() }
- }
-
fun saveTimetable(timetables: List) {
timetableDb.insertAll(timetables)
}
@@ -23,4 +18,8 @@ class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao)
fun deleteTimetable(timetables: List) {
timetableDb.deleteAll(timetables)
}
+
+ fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
+ return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate).filter { it.isNotEmpty() }
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt b/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt
index 21c193e5..9e8b24ab 100644
--- a/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt
+++ b/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt
@@ -5,6 +5,7 @@ import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
import io.github.wulkanowy.WulkanowyApp
import io.github.wulkanowy.data.RepositoryModule
+import io.github.wulkanowy.services.ServicesModule
import javax.inject.Singleton
@Singleton
@@ -12,6 +13,7 @@ import javax.inject.Singleton
AndroidSupportInjectionModule::class,
AppModule::class,
RepositoryModule::class,
+ ServicesModule::class,
BuilderModule::class])
interface AppComponent : AndroidInjector {
diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt
index 64ec1cbc..eb3b18f9 100644
--- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt
+++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt
@@ -2,8 +2,6 @@ package io.github.wulkanowy.di
import android.appwidget.AppWidgetManager
import android.content.Context
-import com.firebase.jobdispatcher.FirebaseJobDispatcher
-import com.firebase.jobdispatcher.GooglePlayDriver
import com.google.firebase.analytics.FirebaseAnalytics
import dagger.Module
import dagger.Provides
@@ -30,10 +28,6 @@ internal class AppModule {
@Provides
fun provideFlexibleAdapter() = FlexibleAdapter>(null, null, true)
- @Singleton
- @Provides
- fun provideJobDispatcher(context: Context) = FirebaseJobDispatcher(GooglePlayDriver(context))
-
@Singleton
@Provides
fun provideFirebaseAnalyticsHelper(context: Context) = FirebaseAnalyticsHelper(FirebaseAnalytics.getInstance(context))
diff --git a/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt b/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt
index 9f4ecb80..359ac45c 100644
--- a/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt
+++ b/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt
@@ -3,7 +3,6 @@ package io.github.wulkanowy.di
import dagger.Module
import dagger.android.ContributesAndroidInjector
import io.github.wulkanowy.di.scopes.PerActivity
-import io.github.wulkanowy.services.job.SyncWorker
import io.github.wulkanowy.services.widgets.TimetableWidgetService
import io.github.wulkanowy.ui.modules.login.LoginActivity
import io.github.wulkanowy.ui.modules.login.LoginModule
@@ -32,7 +31,4 @@ internal abstract class BuilderModule {
@ContributesAndroidInjector
abstract fun bindTimetableWidgetProvider(): TimetableWidgetProvider
-
- @ContributesAndroidInjector
- abstract fun bindSyncJob(): SyncWorker
}
diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt
new file mode 100644
index 00000000..70cbf84c
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt
@@ -0,0 +1,102 @@
+package io.github.wulkanowy.services
+
+import android.app.NotificationManager
+import android.content.Context
+import android.content.Context.NOTIFICATION_SERVICE
+import androidx.core.app.NotificationManagerCompat
+import androidx.work.WorkManager
+import com.squareup.inject.assisted.dagger2.AssistedModule
+import dagger.Binds
+import dagger.Module
+import dagger.Provides
+import dagger.multibindings.IntoSet
+import io.github.wulkanowy.services.sync.works.AttendanceSummaryWork
+import io.github.wulkanowy.services.sync.works.AttendanceWork
+import io.github.wulkanowy.services.sync.works.CompletedLessonWork
+import io.github.wulkanowy.services.sync.works.ExamWork
+import io.github.wulkanowy.services.sync.works.GradeStatisticsWork
+import io.github.wulkanowy.services.sync.works.GradeSummaryWork
+import io.github.wulkanowy.services.sync.works.GradeWork
+import io.github.wulkanowy.services.sync.works.HomeworkWork
+import io.github.wulkanowy.services.sync.works.LuckyNumberWork
+import io.github.wulkanowy.services.sync.works.MessageWork
+import io.github.wulkanowy.services.sync.works.NoteWork
+import io.github.wulkanowy.services.sync.works.RecipientWork
+import io.github.wulkanowy.services.sync.works.TimetableWork
+import io.github.wulkanowy.services.sync.works.Work
+import javax.inject.Singleton
+
+@AssistedModule
+@Module(includes = [AssistedInject_ServicesModule::class])
+abstract class ServicesModule {
+
+ @Module
+ companion object {
+
+ @JvmStatic
+ @Provides
+ fun provideWorkManager() = WorkManager.getInstance()
+
+ @JvmStatic
+ @Singleton
+ @Provides
+ fun provideNotificationManagerCompat(context: Context) = NotificationManagerCompat.from(context)
+
+ @JvmStatic
+ @Singleton
+ @Provides
+ fun provideNotificationManager(context: Context) = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+ }
+
+ @Binds
+ @IntoSet
+ abstract fun provideGradeWork(work: GradeWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideNoteWork(work: NoteWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideAttendanceWork(work: AttendanceWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideGradeSummaryWork(work: GradeSummaryWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideExamWork(work: ExamWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideAttendanceSummaryWork(work: AttendanceSummaryWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideTimetableWork(work: TimetableWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideLuckyNumberWork(work: LuckyNumberWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideCompletedLessonWork(work: CompletedLessonWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideHomeworkWork(work: HomeworkWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideMessageWork(work: MessageWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideRecipientWork(work: RecipientWork): Work
+
+ @Binds
+ @IntoSet
+ abstract fun provideGradeStatistics(work: GradeStatisticsWork): Work
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/job/ServiceHelper.kt b/app/src/main/java/io/github/wulkanowy/services/job/ServiceHelper.kt
deleted file mode 100644
index ecb177cc..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/job/ServiceHelper.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-package io.github.wulkanowy.services.job
-
-import com.firebase.jobdispatcher.Constraint.ON_ANY_NETWORK
-import com.firebase.jobdispatcher.Constraint.ON_UNMETERED_NETWORK
-import com.firebase.jobdispatcher.FirebaseJobDispatcher
-import com.firebase.jobdispatcher.Lifetime.FOREVER
-import com.firebase.jobdispatcher.RetryStrategy.DEFAULT_EXPONENTIAL
-import com.firebase.jobdispatcher.Trigger.executionWindow
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.utils.isHolidays
-import org.threeten.bp.LocalDate
-import timber.log.Timber
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class ServiceHelper @Inject constructor(
- private val prefRepository: PreferencesRepository,
- private val dispatcher: FirebaseJobDispatcher
-) {
-
- fun reloadFullSyncService() {
- startFullSyncService(true)
- }
-
- fun startFullSyncService(replaceCurrent: Boolean = false) {
- if (LocalDate.now().isHolidays || !prefRepository.isServiceEnabled) {
- Timber.d("Services disabled or it's holidays")
- return
- }
-
- dispatcher.mustSchedule(
- dispatcher.newJobBuilder()
- .setLifetime(FOREVER)
- .setRecurring(true)
- .setService(SyncWorker::class.java)
- .setTag(SyncWorker.WORK_TAG)
- .setTrigger(
- executionWindow(
- prefRepository.servicesInterval * 60,
- (prefRepository.servicesInterval + 10) * 60
- )
- )
- .setConstraints(if (prefRepository.isServicesOnlyWifi) ON_UNMETERED_NETWORK else ON_ANY_NETWORK)
- .setReplaceCurrent(replaceCurrent)
- .setRetryStrategy(DEFAULT_EXPONENTIAL)
- .build()
- )
-
- Timber.d("Services started")
- }
-
- fun stopFullSyncService() {
- dispatcher.cancel(SyncWorker.WORK_TAG)
- Timber.d("Services stopped")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/job/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/job/SyncWorker.kt
deleted file mode 100644
index 1d0d98b4..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/job/SyncWorker.kt
+++ /dev/null
@@ -1,214 +0,0 @@
-package io.github.wulkanowy.services.job
-
-import com.firebase.jobdispatcher.JobParameters
-import com.firebase.jobdispatcher.SimpleJobService
-import dagger.android.AndroidInjection
-import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository
-import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository
-import io.github.wulkanowy.data.repositories.exam.ExamRepository
-import io.github.wulkanowy.data.repositories.grade.GradeRepository
-import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository
-import io.github.wulkanowy.data.repositories.homework.HomeworkRepository
-import io.github.wulkanowy.data.repositories.luckynumber.LuckyNumberRepository
-import io.github.wulkanowy.data.repositories.message.MessageRepository
-import io.github.wulkanowy.data.repositories.message.MessageRepository.MessageFolder.RECEIVED
-import io.github.wulkanowy.data.repositories.note.NoteRepository
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.data.repositories.recipient.RecipientRepository
-import io.github.wulkanowy.data.repositories.reportingunit.ReportingUnitRepository
-import io.github.wulkanowy.data.repositories.semester.SemesterRepository
-import io.github.wulkanowy.data.repositories.student.StudentRepository
-import io.github.wulkanowy.data.repositories.timetable.TimetableRepository
-import io.github.wulkanowy.services.notification.GradeNotification
-import io.github.wulkanowy.services.notification.LuckyNumberNotification
-import io.github.wulkanowy.services.notification.MessageNotification
-import io.github.wulkanowy.services.notification.NoteNotification
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.isHolidays
-import io.github.wulkanowy.utils.monday
-import io.reactivex.Completable
-import io.reactivex.Maybe
-import io.reactivex.Single
-import io.reactivex.disposables.CompositeDisposable
-import org.threeten.bp.LocalDate
-import timber.log.Timber
-import javax.inject.Inject
-
-class SyncWorker : SimpleJobService() {
-
- @Inject
- lateinit var student: StudentRepository
-
- @Inject
- lateinit var semester: SemesterRepository
-
- @Inject
- lateinit var gradesDetails: GradeRepository
-
- @Inject
- lateinit var gradesSummary: GradeSummaryRepository
-
- @Inject
- lateinit var attendance: AttendanceRepository
-
- @Inject
- lateinit var exam: ExamRepository
-
- @Inject
- lateinit var timetable: TimetableRepository
-
- @Inject
- lateinit var message: MessageRepository
-
- @Inject
- lateinit var note: NoteRepository
-
- @Inject
- lateinit var homework: HomeworkRepository
-
- @Inject
- lateinit var luckyNumber: LuckyNumberRepository
-
- @Inject
- lateinit var completedLessons: CompletedLessonsRepository
-
- @Inject
- lateinit var reportingUnitRepository: ReportingUnitRepository
-
- @Inject
- lateinit var recipientRepository: RecipientRepository
-
- @Inject
- lateinit var prefRepository: PreferencesRepository
-
- private val disposable = CompositeDisposable()
-
- companion object {
- const val WORK_TAG = "FULL_SYNC"
- }
-
- override fun onCreate() {
- super.onCreate()
- AndroidInjection.inject(this)
- }
-
- override fun onRunJob(job: JobParameters?): Int {
- Timber.d("Synchronization started")
-
- val start = LocalDate.now().monday
- val end = LocalDate.now().friday
-
- if (start.isHolidays) return RESULT_FAIL_NORETRY
-
- var error: Throwable? = null
-
- val notify = prefRepository.isNotificationsEnable
-
- disposable.add(student.isStudentSaved()
- .flatMapMaybe { if (it) student.getCurrentStudent().toMaybe() else Maybe.empty() }
- .flatMap { semester.getCurrentSemester(it, true).map { semester -> semester to it }.toMaybe() }
- .flatMapCompletable { c ->
- Completable.merge(
- listOf(
- gradesDetails.getGrades(c.second, c.first, true, notify).ignoreElement(),
- gradesSummary.getGradesSummary(c.first, true).ignoreElement(),
- attendance.getAttendance(c.first, start, end, true).ignoreElement(),
- exam.getExams(c.first, start, end, true).ignoreElement(),
- timetable.getTimetable(c.first, start, end, true).ignoreElement(),
- message.getMessages(c.second, RECEIVED, true, notify).ignoreElement(),
- note.getNotes(c.second, c.first, true, notify).ignoreElement(),
- homework.getHomework(c.first, LocalDate.now(), true).ignoreElement(),
- homework.getHomework(c.first, LocalDate.now().plusDays(1), true).ignoreElement(),
- luckyNumber.getLuckyNumber(c.first, true, notify).ignoreElement(),
- completedLessons.getCompletedLessons(c.first, start, end, true).ignoreElement()
- ) + reportingUnitRepository.getReportingUnits(c.second, true)
- .flatMapPublisher { reportingUnits ->
- Single.merge(reportingUnits.map { recipientRepository.getRecipients(c.second, 2, it, true) })
- }.ignoreElements()
- )
- }
- .subscribe({}, { error = it }))
-
- return if (null === error) {
- if (notify) sendNotifications()
- Timber.d("Synchronization successful")
- RESULT_SUCCESS
- } else {
- Timber.e(error, "Synchronization failed")
- RESULT_FAIL_RETRY
- }
- }
-
- private fun sendNotifications() {
- sendGradeNotifications()
- sendMessageNotification()
- sendNoteNotification()
- sendLuckyNumberNotification()
- }
-
- private fun sendGradeNotifications() {
- disposable.add(student.getCurrentStudent()
- .flatMap { semester.getCurrentSemester(it) }
- .flatMap { gradesDetails.getNewGrades(it) }
- .map { it.filter { grade -> !grade.isNotified } }
- .doOnSuccess {
- if (it.isNotEmpty()) {
- Timber.d("Found ${it.size} unread grades")
- GradeNotification(applicationContext).sendNotification(it)
- }
- }
- .map { it.map { grade -> grade.apply { isNotified = true } } }
- .flatMapCompletable { gradesDetails.updateGrades(it) }
- .subscribe({}, { Timber.e(it, "Grade notifications sending failed") }))
- }
-
- private fun sendMessageNotification() {
- disposable.add(student.getCurrentStudent()
- .flatMap { message.getNewMessages(it) }
- .map { it.filter { message -> !message.isNotified } }
- .doOnSuccess {
- if (it.isNotEmpty()) {
- Timber.d("Found ${it.size} unread messages")
- MessageNotification(applicationContext).sendNotification(it)
- }
- }
- .map { it.map { message -> message.apply { isNotified = true } } }
- .flatMapCompletable { message.updateMessages(it) }
- .subscribe({}, { Timber.e(it, "Message notifications sending failed") })
- )
- }
-
- private fun sendNoteNotification() {
- disposable.add(student.getCurrentStudent()
- .flatMap { note.getNewNotes(it) }
- .map { it.filter { note -> !note.isNotified } }
- .doOnSuccess {
- if (it.isNotEmpty()) {
- Timber.d("Found ${it.size} unread notes")
- NoteNotification(applicationContext).sendNotification(it)
- }
- }
- .map { it.map { note -> note.apply { isNotified = true } } }
- .flatMapCompletable { note.updateNotes(it) }
- .subscribe({}, { Timber.e("Notifications sending failed") })
- )
- }
-
- private fun sendLuckyNumberNotification() {
- disposable.add(student.getCurrentStudent()
- .flatMap { semester.getCurrentSemester(it) }
- .flatMapMaybe { luckyNumber.getLuckyNumber(it) }
- .filter { !it.isNotified }
- .doOnSuccess {
- LuckyNumberNotification(applicationContext).sendNotification(it)
- }
- .map { it.apply { isNotified = true } }
- .flatMapCompletable { luckyNumber.updateLuckyNumber(it) }
- .subscribe({}, { Timber.e("Lucky number notification sending failed") }))
- }
-
- override fun onDestroy() {
- super.onDestroy()
- disposable.clear()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/BaseNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/BaseNotification.kt
deleted file mode 100644
index 945d0b15..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/notification/BaseNotification.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.github.wulkanowy.services.notification
-
-import android.app.Notification
-import android.app.NotificationManager
-import android.content.Context
-import android.content.Context.NOTIFICATION_SERVICE
-import android.os.Build.VERSION.SDK_INT
-import android.os.Build.VERSION_CODES.O
-import androidx.core.app.NotificationCompat
-import timber.log.Timber
-import kotlin.random.Random
-
-abstract class BaseNotification(protected val context: Context) {
-
- protected val notificationManager: NotificationManager by lazy {
- context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
- }
-
- fun notify(notification: Notification) {
- notificationManager.notify(Random.nextInt(1000), notification)
- }
-
- fun notificationBuilder(channelId: String): NotificationCompat.Builder {
- if (SDK_INT >= O) createChannel(channelId)
- return NotificationCompat.Builder(context, channelId)
- }
-
- fun cancelAll() {
- notificationManager.cancelAll()
- Timber.d("Notifications canceled")
- }
-
- abstract fun createChannel(channelId: String)
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/GradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/GradeNotification.kt
deleted file mode 100644
index df57ec28..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/notification/GradeNotification.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-package io.github.wulkanowy.services.notification
-
-import android.annotation.TargetApi
-import android.app.Notification.VISIBILITY_PUBLIC
-import android.app.NotificationChannel
-import android.app.NotificationManager.IMPORTANCE_HIGH
-import android.app.PendingIntent
-import android.app.PendingIntent.FLAG_UPDATE_CURRENT
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.content.ContextCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.Grade
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
-import timber.log.Timber
-
-class GradeNotification(context: Context) : BaseNotification(context) {
-
- private val channelId = "Grade_Notify"
-
- @TargetApi(26)
- override fun createChannel(channelId: String) {
- notificationManager.createNotificationChannel(NotificationChannel(
- channelId, context.getString(R.string.notify_grade_channel), IMPORTANCE_HIGH
- ).apply {
- enableLights(true)
- enableVibration(true)
- lockscreenVisibility = VISIBILITY_PUBLIC
- })
- }
-
- fun sendNotification(items: List) {
- notify(notificationBuilder(channelId)
- .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items, items.size, items.size))
- .setContentText(context.resources.getQuantityString(R.plurals.notify_grade_new_items, items.size, items.size))
- .setSmallIcon(R.drawable.ic_stat_notify_grade)
- .setAutoCancel(true)
- .setDefaults(NotificationCompat.DEFAULT_ALL)
- .setPriority(NotificationCompat.PRIORITY_HIGH)
- .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 0),
- FLAG_UPDATE_CURRENT
- )
- )
- .setStyle(NotificationCompat.InboxStyle().run {
- setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, items.size, items.size))
- items.forEach {
- addLine("${it.subject}: ${it.entry}")
- }
- this
- })
- .build()
- )
-
- Timber.d("Notification sent")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/LuckyNumberNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/LuckyNumberNotification.kt
deleted file mode 100644
index 9db159aa..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/notification/LuckyNumberNotification.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package io.github.wulkanowy.services.notification
-
-import android.annotation.TargetApi
-import android.app.Notification
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.app.PendingIntent
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.content.ContextCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.LuckyNumber
-import io.github.wulkanowy.ui.modules.main.MainActivity
-
-class LuckyNumberNotification(context: Context) : BaseNotification(context) {
-
- private val channelId = "Lucky_Number_Notify"
-
- @TargetApi(26)
- override fun createChannel(channelId: String) {
- notificationManager.createNotificationChannel(NotificationChannel(
- channelId, context.getString(R.string.notify_lucky_number_channel), NotificationManager.IMPORTANCE_HIGH
- ).apply {
- enableLights(true)
- enableVibration(true)
- lockscreenVisibility = Notification.VISIBILITY_PUBLIC
- })
- }
-
- fun sendNotification(luckyNumber: LuckyNumber) {
- notify(notificationBuilder(channelId)
- .setContentTitle(context.getString(R.string.notify_lucky_number_new_item_title))
- .setContentText(context.getString(R.string.notify_lucky_number_new_item, luckyNumber.luckyNumber))
- .setSmallIcon(R.drawable.ic_stat_notify_lucky_number)
- .setAutoCancel(true)
- .setDefaults(NotificationCompat.DEFAULT_ALL)
- .setPriority(NotificationCompat.PRIORITY_HIGH)
- .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(MainActivity.EXTRA_START_MENU_INDEX, 4),
- PendingIntent.FLAG_UPDATE_CURRENT
- )
- )
- .build()
- )
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/MessageNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/MessageNotification.kt
deleted file mode 100644
index 8733cada..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/notification/MessageNotification.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-package io.github.wulkanowy.services.notification
-
-import android.annotation.TargetApi
-import android.app.Notification
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.app.PendingIntent
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.content.ContextCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.Message
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import timber.log.Timber
-
-class MessageNotification(context: Context) : BaseNotification(context) {
-
- private val channelId = "Message_Notify"
-
- @TargetApi(26)
- override fun createChannel(channelId: String) {
- notificationManager.createNotificationChannel(NotificationChannel(
- channelId, context.getString(R.string.notify_message_channel), NotificationManager.IMPORTANCE_HIGH
- ).apply {
- enableLights(true)
- enableVibration(true)
- lockscreenVisibility = Notification.VISIBILITY_PUBLIC
- })
- }
-
- fun sendNotification(items: List) {
- notify(notificationBuilder(channelId)
- .setContentTitle(context.resources.getQuantityString(R.plurals.message_new_items, items.size, items.size))
- .setContentText(context.resources.getQuantityString(R.plurals.notify_message_new_items, items.size, items.size))
- .setSmallIcon(R.drawable.ic_stat_notify_message)
- .setAutoCancel(true)
- .setDefaults(NotificationCompat.DEFAULT_ALL)
- .setPriority(NotificationCompat.PRIORITY_HIGH)
- .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(MainActivity.EXTRA_START_MENU_INDEX, 4),
- PendingIntent.FLAG_UPDATE_CURRENT
- )
- )
- .setStyle(NotificationCompat.InboxStyle().run {
- setSummaryText(context.resources.getQuantityString(R.plurals.message_number_item, items.size, items.size))
- items.forEach {
- addLine("${it.sender}: ${it.subject}")
- }
- this
- })
- .build()
- )
-
- Timber.d("Notification sent")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/NoteNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/NoteNotification.kt
deleted file mode 100644
index 33c2fdc7..00000000
--- a/app/src/main/java/io/github/wulkanowy/services/notification/NoteNotification.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-package io.github.wulkanowy.services.notification
-
-import android.annotation.TargetApi
-import android.app.Notification
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.app.PendingIntent
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.content.ContextCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.Note
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import timber.log.Timber
-
-class NoteNotification(context: Context) : BaseNotification(context) {
-
- private val channelId = "Note_Notify"
-
- @TargetApi(26)
- override fun createChannel(channelId: String) {
- notificationManager.createNotificationChannel(NotificationChannel(
- channelId, context.getString(R.string.notify_note_channel), NotificationManager.IMPORTANCE_HIGH
- ).apply {
- enableLights(true)
- enableVibration(true)
- lockscreenVisibility = Notification.VISIBILITY_PUBLIC
- })
- }
-
- fun sendNotification(items: List) {
- notify(notificationBuilder(channelId)
- .setContentTitle(context.resources.getQuantityString(R.plurals.note_new_items, items.size, items.size))
- .setContentText(context.resources.getQuantityString(R.plurals.notify_note_new_items, items.size, items.size))
- .setSmallIcon(R.drawable.ic_stat_notify_note)
- .setAutoCancel(true)
- .setDefaults(NotificationCompat.DEFAULT_ALL)
- .setPriority(NotificationCompat.PRIORITY_HIGH)
- .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(MainActivity.EXTRA_START_MENU_INDEX, 4),
- PendingIntent.FLAG_UPDATE_CURRENT
- )
- )
- .setStyle(NotificationCompat.InboxStyle().run {
- setSummaryText(context.resources.getQuantityString(R.plurals.note_number_item, items.size, items.size))
- items.forEach {
- addLine("${it.teacher}: ${it.category}")
- }
- this
- })
- .build()
- )
-
- Timber.d("Notification sent")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt
new file mode 100644
index 00000000..9a730cab
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt
@@ -0,0 +1,50 @@
+package io.github.wulkanowy.services.sync
+
+import android.os.Build.VERSION.SDK_INT
+import android.os.Build.VERSION_CODES.O
+import androidx.work.BackoffPolicy.EXPONENTIAL
+import androidx.work.Constraints
+import androidx.work.ExistingPeriodicWorkPolicy.KEEP
+import androidx.work.ExistingPeriodicWorkPolicy.REPLACE
+import androidx.work.NetworkType.METERED
+import androidx.work.NetworkType.UNMETERED
+import androidx.work.PeriodicWorkRequest
+import androidx.work.WorkManager
+import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
+import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
+import io.github.wulkanowy.utils.isHolidays
+import org.threeten.bp.LocalDate.now
+import timber.log.Timber
+import java.util.concurrent.TimeUnit.MINUTES
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class SyncManager @Inject constructor(
+ private val workManager: WorkManager,
+ private val preferencesRepository: PreferencesRepository,
+ newEntriesChannel: NewEntriesChannel
+) {
+
+ init {
+ if (SDK_INT >= O) newEntriesChannel.create()
+ if (now().isHolidays) stopSyncWorker()
+ Timber.i("SyncManager was initialized")
+ }
+
+ fun startSyncWorker(restart: Boolean = false) {
+ if (preferencesRepository.isServiceEnabled && !now().isHolidays) {
+ workManager.enqueueUniquePeriodicWork(SyncWorker::class.java.simpleName, if (restart) REPLACE else KEEP,
+ PeriodicWorkRequest.Builder(SyncWorker::class.java, preferencesRepository.servicesInterval, MINUTES, 10, MINUTES)
+ .setBackoffCriteria(EXPONENTIAL, 30, MINUTES)
+ .setConstraints(Constraints.Builder()
+ .setRequiredNetworkType(if (preferencesRepository.isServicesOnlyWifi) METERED else UNMETERED)
+ .build())
+ .build())
+ }
+ }
+
+ fun stopSyncWorker() {
+ workManager.cancelUniqueWork(SyncWorker::class.java.simpleName)
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt
new file mode 100644
index 00000000..53460a0b
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt
@@ -0,0 +1,45 @@
+package io.github.wulkanowy.services.sync
+
+import android.content.Context
+import androidx.work.ListenableWorker
+import androidx.work.RxWorker
+import androidx.work.WorkerParameters
+import com.squareup.inject.assisted.Assisted
+import com.squareup.inject.assisted.AssistedInject
+import io.github.wulkanowy.data.repositories.semester.SemesterRepository
+import io.github.wulkanowy.data.repositories.student.StudentRepository
+import io.github.wulkanowy.services.sync.works.Work
+import io.reactivex.Completable
+import io.reactivex.Single
+import timber.log.Timber
+
+class SyncWorker @AssistedInject constructor(
+ @Assisted appContext: Context,
+ @Assisted workerParameters: WorkerParameters,
+ private val studentRepository: StudentRepository,
+ private val semesterRepository: SemesterRepository,
+ private val works: Set<@JvmSuppressWildcards Work>
+) : RxWorker(appContext, workerParameters) {
+
+ override fun createWork(): Single {
+ return studentRepository.getCurrentStudent()
+ .flatMapCompletable { student ->
+ semesterRepository.getCurrentSemester(student, true)
+ .flatMapCompletable { semester ->
+ Completable.mergeDelayError(works.map { it.create(student, semester) })
+ }
+ }
+ .toSingleDefault(Result.success())
+ .onErrorReturn {
+ Timber.e(it, "There was an error during synchronization")
+ Result.retry()
+ }
+ }
+
+ @AssistedInject.Factory
+ interface Factory {
+
+ fun create(appContext: Context, workerParameters: WorkerParameters): ListenableWorker
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt
new file mode 100644
index 00000000..aadfc27f
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt
@@ -0,0 +1,20 @@
+package io.github.wulkanowy.services.sync
+
+import android.content.Context
+import androidx.work.ListenableWorker
+import androidx.work.WorkerFactory
+import androidx.work.WorkerParameters
+import timber.log.Timber
+import javax.inject.Inject
+
+class SyncWorkerFactory @Inject constructor(private val syncWorkerFactory: SyncWorker.Factory) : WorkerFactory() {
+
+ override fun createWorker(appContext: Context, workerClassName: String, workerParameters: WorkerParameters): ListenableWorker? {
+ return if (workerClassName == SyncWorker::class.java.name) {
+ syncWorkerFactory.create(appContext, workerParameters)
+ } else {
+ Timber.e(IllegalArgumentException("Unknown worker class name: $workerClassName"))
+ null
+ }
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewEntriesChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewEntriesChannel.kt
new file mode 100644
index 00000000..8e24a2a6
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewEntriesChannel.kt
@@ -0,0 +1,30 @@
+package io.github.wulkanowy.services.sync.channels
+
+import android.annotation.TargetApi
+import android.app.Notification.VISIBILITY_PUBLIC
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.NotificationManager.IMPORTANCE_HIGH
+import android.content.Context
+import io.github.wulkanowy.R
+import javax.inject.Inject
+
+@TargetApi(26)
+class NewEntriesChannel @Inject constructor(
+ private val notificationManager: NotificationManager,
+ private val context: Context
+) {
+
+ companion object {
+ const val CHANNEL_ID = "new_entries_channel"
+ }
+
+ fun create() {
+ notificationManager.createNotificationChannel(
+ NotificationChannel(CHANNEL_ID, context.getString(R.string.channel_new_entries), IMPORTANCE_HIGH).apply {
+ enableLights(true)
+ enableVibration(true)
+ lockscreenVisibility = VISIBILITY_PUBLIC
+ })
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt
new file mode 100644
index 00000000..01978c5b
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt
@@ -0,0 +1,17 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository
+import io.reactivex.Completable
+import javax.inject.Inject
+
+class AttendanceSummaryWork @Inject constructor(
+ private val attendanceSummaryRepository: AttendanceSummaryRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return attendanceSummaryRepository.getAttendanceSummary(semester, -1, true).ignoreElement()
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt
new file mode 100644
index 00000000..e4b55b0e
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt
@@ -0,0 +1,18 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository
+import io.github.wulkanowy.utils.friday
+import io.github.wulkanowy.utils.monday
+import io.reactivex.Completable
+import org.threeten.bp.LocalDate.now
+import javax.inject.Inject
+
+class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return attendanceRepository.getAttendance(semester, now().monday, now().friday, true)
+ .ignoreElement()
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt
new file mode 100644
index 00000000..29642ad6
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt
@@ -0,0 +1,21 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository
+import io.github.wulkanowy.utils.friday
+import io.github.wulkanowy.utils.monday
+import io.reactivex.Completable
+import org.threeten.bp.LocalDate.now
+import javax.inject.Inject
+
+class CompletedLessonWork @Inject constructor(
+ private val completedLessonsRepository: CompletedLessonsRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return completedLessonsRepository.getCompletedLessons(semester, now().monday, now().friday, true)
+ .ignoreElement()
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt
new file mode 100644
index 00000000..8744fcc7
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt
@@ -0,0 +1,17 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.exam.ExamRepository
+import io.github.wulkanowy.utils.friday
+import io.github.wulkanowy.utils.monday
+import io.reactivex.Completable
+import org.threeten.bp.LocalDate.now
+import javax.inject.Inject
+
+class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return examRepository.getExams(semester, now().monday, now().friday, true).ignoreElement()
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt
new file mode 100644
index 00000000..1de39a95
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt
@@ -0,0 +1,16 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.gradestatistics.GradeStatisticsRepository
+import io.reactivex.Completable
+import javax.inject.Inject
+
+class GradeStatisticsWork @Inject constructor(private val gradeStatisticsRepository: GradeStatisticsRepository) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return gradeStatisticsRepository.getGradesStatistics(semester, "Wszystkie", false, true)
+ .ignoreElement()
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt
new file mode 100644
index 00000000..6de0bc5b
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt
@@ -0,0 +1,14 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository
+import io.reactivex.Completable
+import javax.inject.Inject
+
+class GradeSummaryWork @Inject constructor(private val gradeSummaryRepository: GradeSummaryRepository) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return gradeSummaryRepository.getGradesSummary(semester, true).ignoreElement()
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt
new file mode 100644
index 00000000..66316934
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt
@@ -0,0 +1,61 @@
+package io.github.wulkanowy.services.sync.works
+
+import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_UPDATE_CURRENT
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.app.NotificationCompat.DEFAULT_ALL
+import androidx.core.app.NotificationCompat.PRIORITY_HIGH
+import androidx.core.app.NotificationManagerCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.Grade
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.grade.GradeRepository
+import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
+import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
+import io.github.wulkanowy.utils.getCompatColor
+import io.reactivex.Completable
+import javax.inject.Inject
+import kotlin.random.Random
+
+class GradeWork @Inject constructor(
+ private val context: Context,
+ private val notificationManager: NotificationManagerCompat,
+ private val gradeRepository: GradeRepository,
+ private val preferencesRepository: PreferencesRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable)
+ .flatMap { gradeRepository.getNotNotifiedGrades(semester) }
+ .flatMapCompletable {
+ if (it.isNotEmpty()) notify(it)
+ gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true })
+ }
+ }
+
+ private fun notify(grades: List) {
+ notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
+ .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items, grades.size, grades.size))
+ .setContentText(context.resources.getQuantityString(R.plurals.grade_notify_new_items, grades.size, grades.size))
+ .setSmallIcon(R.drawable.ic_stat_notify_grade)
+ .setAutoCancel(true)
+ .setPriority(PRIORITY_HIGH)
+ .setDefaults(DEFAULT_ALL)
+ .setColor(context.getCompatColor(R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 0), FLAG_UPDATE_CURRENT))
+ .setStyle(NotificationCompat.InboxStyle().run {
+ setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, grades.size, grades.size))
+ grades.forEach { addLine("${it.subject}: ${it.entry}") }
+ this
+ })
+ .build()
+ )
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt
new file mode 100644
index 00000000..90d5f1c6
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt
@@ -0,0 +1,15 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.homework.HomeworkRepository
+import io.reactivex.Completable
+import org.threeten.bp.LocalDate.now
+import javax.inject.Inject
+
+class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return homeworkRepository.getHomework(semester, now(), true).ignoreElement()
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt
new file mode 100644
index 00000000..ca7aaac6
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt
@@ -0,0 +1,55 @@
+package io.github.wulkanowy.services.sync.works
+
+import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_UPDATE_CURRENT
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.app.NotificationCompat.DEFAULT_ALL
+import androidx.core.app.NotificationCompat.PRIORITY_HIGH
+import androidx.core.app.NotificationManagerCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.LuckyNumber
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.luckynumber.LuckyNumberRepository
+import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
+import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
+import io.github.wulkanowy.utils.getCompatColor
+import io.reactivex.Completable
+import javax.inject.Inject
+import kotlin.random.Random
+
+class LuckyNumberWork @Inject constructor(
+ private val context: Context,
+ private val notificationManager: NotificationManagerCompat,
+ private val luckyNumberRepository: LuckyNumberRepository,
+ private val preferencesRepository: PreferencesRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return luckyNumberRepository.getLuckyNumber(semester, true, preferencesRepository.isNotificationsEnable)
+ .flatMap { luckyNumberRepository.getNotNotifiedLuckyNumber(semester) }
+ .flatMapCompletable {
+ notify(it)
+ luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true })
+ }
+ }
+
+ private fun notify(luckyNumber: LuckyNumber) {
+ notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
+ .setContentTitle(context.getString(R.string.lucky_number_notify_new_item_title))
+ .setContentText(context.getString(R.string.lucky_number_notify_new_item, luckyNumber.luckyNumber))
+ .setSmallIcon(R.drawable.ic_stat_notify_lucky_number)
+ .setAutoCancel(true)
+ .setDefaults(DEFAULT_ALL)
+ .setPriority(PRIORITY_HIGH)
+ .setColor(context.getCompatColor(R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 4), FLAG_UPDATE_CURRENT)
+ )
+ .build())
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt
new file mode 100644
index 00000000..7ab2c8d4
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt
@@ -0,0 +1,61 @@
+package io.github.wulkanowy.services.sync.works
+
+import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_UPDATE_CURRENT
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.app.NotificationCompat.DEFAULT_ALL
+import androidx.core.app.NotificationCompat.PRIORITY_HIGH
+import androidx.core.app.NotificationManagerCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.Message
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED
+import io.github.wulkanowy.data.repositories.message.MessageRepository
+import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
+import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
+import io.github.wulkanowy.utils.getCompatColor
+import io.reactivex.Completable
+import javax.inject.Inject
+import kotlin.random.Random
+
+class MessageWork @Inject constructor(
+ private val context: Context,
+ private val notificationManager: NotificationManagerCompat,
+ private val messageRepository: MessageRepository,
+ private val preferencesRepository: PreferencesRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return messageRepository.getMessages(student, RECEIVED, true, preferencesRepository.isNotificationsEnable)
+ .flatMap { messageRepository.getNotNotifiedMessages(student) }
+ .flatMapCompletable {
+ if (it.isNotEmpty()) notify(it)
+ messageRepository.updateMessages(it.onEach { message -> message.isNotified = true })
+ }
+ }
+
+ private fun notify(messages: List) {
+ notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
+ .setContentTitle(context.resources.getQuantityString(R.plurals.message_new_items, messages.size, messages.size))
+ .setContentText(context.resources.getQuantityString(R.plurals.message_notify_new_items, messages.size, messages.size))
+ .setSmallIcon(R.drawable.ic_stat_notify_message)
+ .setAutoCancel(true)
+ .setDefaults(DEFAULT_ALL)
+ .setPriority(PRIORITY_HIGH)
+ .setColor(context.getCompatColor(R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 4), FLAG_UPDATE_CURRENT)
+ )
+ .setStyle(NotificationCompat.InboxStyle().run {
+ setSummaryText(context.resources.getQuantityString(R.plurals.message_number_item, messages.size, messages.size))
+ messages.forEach { addLine("${it.sender}: ${it.subject}") }
+ this
+ })
+ .build())
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt
new file mode 100644
index 00000000..d0e8fe21
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt
@@ -0,0 +1,61 @@
+package io.github.wulkanowy.services.sync.works
+
+import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_UPDATE_CURRENT
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.app.NotificationCompat.DEFAULT_ALL
+import androidx.core.app.NotificationCompat.PRIORITY_HIGH
+import androidx.core.app.NotificationManagerCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.Note
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.note.NoteRepository
+import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
+import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
+import io.github.wulkanowy.utils.getCompatColor
+import io.reactivex.Completable
+import javax.inject.Inject
+import kotlin.random.Random
+
+class NoteWork @Inject constructor(
+ private val context: Context,
+ private val notificationManager: NotificationManagerCompat,
+ private val noteRepository: NoteRepository,
+ private val preferencesRepository: PreferencesRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable)
+ .flatMap { noteRepository.getNotNotifiedNotes(student) }
+ .flatMapCompletable {
+ if (it.isNotEmpty()) notify(it)
+ noteRepository.updateNotes(it.onEach { note -> note.isNotified = true })
+ }
+ }
+
+ private fun notify(notes: List) {
+ notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
+ .setContentTitle(context.resources.getQuantityString(R.plurals.note_new_items, notes.size, notes.size))
+ .setContentText(context.resources.getQuantityString(R.plurals.note_notify_new_items, notes.size, notes.size))
+ .setSmallIcon(R.drawable.ic_stat_notify_note)
+ .setAutoCancel(true)
+ .setDefaults(DEFAULT_ALL)
+ .setPriority(PRIORITY_HIGH)
+ .setColor(context.getCompatColor(R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 4), FLAG_UPDATE_CURRENT)
+ )
+ .setStyle(NotificationCompat.InboxStyle().run {
+ setSummaryText(context.resources.getQuantityString(R.plurals.note_number_item, notes.size, notes.size))
+ notes.forEach { addLine("${it.teacher}: ${it.category}") }
+ this
+ })
+ .build())
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt
new file mode 100644
index 00000000..af8de434
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt
@@ -0,0 +1,24 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.recipient.RecipientRepository
+import io.github.wulkanowy.data.repositories.reportingunit.ReportingUnitRepository
+import io.reactivex.Completable
+import javax.inject.Inject
+
+class RecipientWork @Inject constructor(
+ private val reportingUnitRepository: ReportingUnitRepository,
+ private val recipientRepository: RecipientRepository
+) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return reportingUnitRepository.getReportingUnits(student)
+ .flatMapCompletable { units ->
+ Completable.mergeDelayError(units.map {
+ recipientRepository.getRecipients(student, 2, it).ignoreElement()
+ })
+ }
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt
new file mode 100644
index 00000000..bccc07c5
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt
@@ -0,0 +1,19 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.timetable.TimetableRepository
+import io.github.wulkanowy.utils.friday
+import io.github.wulkanowy.utils.monday
+import io.reactivex.Completable
+import org.threeten.bp.LocalDate.now
+import javax.inject.Inject
+
+class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work {
+
+ override fun create(student: Student, semester: Semester): Completable {
+ return timetableRepository.getTimetable(semester, now().monday, now().friday, true)
+ .ignoreElement()
+ }
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt
new file mode 100644
index 00000000..1601a103
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt
@@ -0,0 +1,11 @@
+package io.github.wulkanowy.services.sync.works
+
+import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.db.entities.Student
+import io.reactivex.Completable
+
+interface Work {
+
+ fun create(student: Student, semester: Semester): Completable
+}
+
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt
index 23ef30ce..0fc6cc45 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt
@@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.account
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.data.repositories.student.StudentRepository
+import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.SchedulersProvider
@@ -12,6 +13,7 @@ import javax.inject.Inject
class AccountPresenter @Inject constructor(
private val errorHandler: ErrorHandler,
private val studentRepository: StudentRepository,
+ private val syncManager: SyncManager,
private val schedulers: SchedulersProvider
) : BasePresenter(errorHandler) {
@@ -48,6 +50,7 @@ class AccountPresenter @Inject constructor(
view?.apply {
if (it.isEmpty()) {
Timber.i("Logout result: Open login view")
+ syncManager.stopSyncWorker()
openClearLoginView()
} else {
Timber.i("Logout result: Switch to another student")
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt
index 765af079..187f2a07 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsPresenter.kt
@@ -62,7 +62,7 @@ class GradeDetailsPresenter @Inject constructor(
Timber.i("Select mark grades as read")
disposable.add(studentRepository.getCurrentStudent()
.flatMap { semesterRepository.getSemesters(it) }
- .flatMap { gradeRepository.getNewGrades(it.first { item -> item.semesterId == currentSemesterId }) }
+ .flatMap { gradeRepository.getUnreadGrades(it.first { item -> item.semesterId == currentSemesterId }) }
.map { it.map { grade -> grade.apply { isRead = true } } }
.flatMapCompletable {
Timber.i("Mark as read ${it.size} grades")
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt
index efe5cc3a..5e0ed2b2 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt
@@ -14,7 +14,6 @@ import com.aurelhubert.ahbottomnavigation.AHBottomNavigationItem
import com.ncapdevi.fragnav.FragNavController
import com.ncapdevi.fragnav.FragNavController.Companion.HIDE
import io.github.wulkanowy.R
-import io.github.wulkanowy.services.notification.GradeNotification
import io.github.wulkanowy.ui.base.BaseActivity
import io.github.wulkanowy.ui.modules.account.AccountDialog
import io.github.wulkanowy.ui.modules.attendance.AttendanceFragment
@@ -164,10 +163,6 @@ class MainActivity : BaseActivity(), MainView {
presenter.onBackPressed { super.onBackPressed() }
}
- override fun cancelNotifications() {
- GradeNotification(applicationContext).cancelAll()
- }
-
override fun openLoginView() {
startActivity(LoginActivity.getStartIntent(this)
.apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) })
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt
index 57019f00..a2a973c6 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt
@@ -4,7 +4,7 @@ import com.google.firebase.analytics.FirebaseAnalytics.Event.APP_OPEN
import com.google.firebase.analytics.FirebaseAnalytics.Param.DESTINATION
import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
import io.github.wulkanowy.data.repositories.student.StudentRepository
-import io.github.wulkanowy.services.job.ServiceHelper
+import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
@@ -17,8 +17,8 @@ class MainPresenter @Inject constructor(
private val errorHandler: ErrorHandler,
private val studentRepository: StudentRepository,
private val prefRepository: PreferencesRepository,
+ private val syncManager: SyncManager,
private val schedulers: SchedulersProvider,
- private val serviceHelper: ServiceHelper,
private val analytics: FirebaseAnalyticsHelper
) : BasePresenter(errorHandler) {
@@ -26,11 +26,11 @@ class MainPresenter @Inject constructor(
super.onAttachView(view)
Timber.i("Main view is attached with $initMenuIndex menu index")
view.run {
- cancelNotifications()
startMenuIndex = if (initMenuIndex != -1) initMenuIndex else prefRepository.startMenuIndex
initView()
}
- serviceHelper.startFullSyncService()
+
+ syncManager.startSyncWorker()
analytics.logEvent(APP_OPEN, DESTINATION to when (initMenuIndex) {
1 -> "Grades"
@@ -92,8 +92,7 @@ class MainPresenter @Inject constructor(
if (it.isNotEmpty()) {
Timber.i("Switching current student")
studentRepository.switchStudent(it[0])
- }
- else Completable.complete()
+ } else Completable.complete()
}
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt
index 112f3f4e..d3d7e342 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainView.kt
@@ -26,8 +26,6 @@ interface MainView : BaseView {
fun popView()
- fun cancelNotifications()
-
fun openLoginView()
interface MainChildView {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt
index 0de50299..d8f4b61d 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt
@@ -7,9 +7,9 @@ import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.view.ViewGroup
import io.github.wulkanowy.R
-import io.github.wulkanowy.data.repositories.message.MessageRepository.MessageFolder.RECEIVED
-import io.github.wulkanowy.data.repositories.message.MessageRepository.MessageFolder.SENT
-import io.github.wulkanowy.data.repositories.message.MessageRepository.MessageFolder.TRASHED
+import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED
+import io.github.wulkanowy.data.repositories.message.MessageFolder.SENT
+import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED
import io.github.wulkanowy.ui.base.BaseFragment
import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter
import io.github.wulkanowy.ui.modules.main.MainActivity
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt
index a7173064..61572d72 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt
@@ -12,7 +12,7 @@ import eu.davidea.flexibleadapter.common.FlexibleItemDecoration
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.R
-import io.github.wulkanowy.data.repositories.message.MessageRepository
+import io.github.wulkanowy.data.repositories.message.MessageFolder
import io.github.wulkanowy.ui.base.session.BaseSessionFragment
import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.ui.modules.message.MessageFragment
@@ -34,7 +34,7 @@ class MessageTabFragment : BaseSessionFragment(), MessageTabView, MessageView.Me
companion object {
const val MESSAGE_TAB_FOLDER_ID = "message_tab_folder_id"
- fun newInstance(folder: MessageRepository.MessageFolder): MessageTabFragment {
+ fun newInstance(folder: MessageFolder): MessageTabFragment {
return MessageTabFragment().apply {
arguments = Bundle().apply {
putString(MESSAGE_TAB_FOLDER_ID, folder.name)
@@ -56,7 +56,7 @@ class MessageTabFragment : BaseSessionFragment(), MessageTabView, MessageView.Me
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
messageContainer = messageTabRecycler
- presenter.onAttachView(this, MessageRepository.MessageFolder.valueOf(
+ presenter.onAttachView(this, MessageFolder.valueOf(
(savedInstanceState ?: arguments)?.getString(MessageTabFragment.MESSAGE_TAB_FOLDER_ID) ?: ""
))
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt
index 3fab138f..cef6e562 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt
@@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.message.tab
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.data.db.entities.Message
+import io.github.wulkanowy.data.repositories.message.MessageFolder
import io.github.wulkanowy.data.repositories.message.MessageRepository
import io.github.wulkanowy.data.repositories.student.StudentRepository
import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
@@ -20,9 +21,9 @@ class MessageTabPresenter @Inject constructor(
private val analytics: FirebaseAnalyticsHelper
) : BaseSessionPresenter(errorHandler) {
- lateinit var folder: MessageRepository.MessageFolder
+ lateinit var folder: MessageFolder
- fun onAttachView(view: MessageTabView, folder: MessageRepository.MessageFolder) {
+ fun onAttachView(view: MessageTabView, folder: MessageFolder) {
super.onAttachView(view)
view.initView()
this.folder = folder
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt
index f75e566f..8e3cbf5f 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt
@@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.settings
import com.readystatesoftware.chuck.api.ChuckCollector
import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.services.job.ServiceHelper
+import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
@@ -14,36 +14,25 @@ import javax.inject.Inject
class SettingsPresenter @Inject constructor(
errorHandler: ErrorHandler,
private val preferencesRepository: PreferencesRepository,
- private val serviceHelper: ServiceHelper,
private val analytics: FirebaseAnalyticsHelper,
+ private val syncManager: SyncManager,
private val chuckCollector: ChuckCollector
) : BasePresenter(errorHandler) {
override fun onAttachView(view: SettingsView) {
super.onAttachView(view)
Timber.i("Settings view is attached")
-
- view.run {
- setServicesSuspended(preferencesRepository.serviceEnablesKey, now().isHolidays)
- }
+ view.setServicesSuspended(preferencesRepository.serviceEnableKey, now().isHolidays)
}
fun onSharedPreferenceChanged(key: String) {
Timber.i("Change settings $key")
- when (key) {
- preferencesRepository.serviceEnablesKey -> {
- if (preferencesRepository.isServiceEnabled) serviceHelper.startFullSyncService()
- else serviceHelper.stopFullSyncService()
- }
- preferencesRepository.servicesIntervalKey,
- preferencesRepository.servicesOnlyWifiKey -> {
- serviceHelper.reloadFullSyncService()
- }
- preferencesRepository.currentThemeKey -> {
- view?.setTheme(preferencesRepository.currentTheme)
- }
- preferencesRepository.isShowChuckerNotificationKey -> {
- chuckCollector.showNotification(preferencesRepository.isShowChuckerNotification)
+ preferencesRepository.apply {
+ when (key) {
+ serviceEnableKey -> syncManager.run { if (isServiceEnabled) startSyncWorker() else stopSyncWorker() }
+ servicesIntervalKey, servicesOnlyWifiKey -> syncManager.startSyncWorker(true)
+ currentThemeKey -> view?.setTheme(currentTheme)
+ isShowChuckerNotificationKey -> chuckCollector.showNotification(isShowChuckerNotification)
}
}
analytics.logEvent("setting_changed", "name" to key)
diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt
index e056bf7e..70368bad 100644
--- a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt
+++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt
@@ -3,13 +3,18 @@ package io.github.wulkanowy.utils
import android.content.Context
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
+import androidx.annotation.ColorRes
+import androidx.core.content.ContextCompat
@ColorInt
fun Context.getThemeAttrColor(@AttrRes colorAttr: Int): Int {
- val array = this.obtainStyledAttributes(null, intArrayOf(colorAttr))
- try {
- return array.getColor(0, 0)
+ val array = obtainStyledAttributes(null, intArrayOf(colorAttr))
+ return try {
+ array.getColor(0, 0)
} finally {
array.recycle()
}
}
+
+@ColorInt
+fun Context.getCompatColor(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes)
diff --git a/app/src/main/res/layout/item_login_options.xml b/app/src/main/res/layout/item_login_options.xml
index 39942c02..f13eb601 100644
--- a/app/src/main/res/layout/item_login_options.xml
+++ b/app/src/main/res/layout/item_login_options.xml
@@ -16,8 +16,8 @@
android:layout_height="40dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
- android:tint="@android:color/black"
- app:srcCompat="@drawable/ic_all_account_24dp" />
+ app:srcCompat="@drawable/ic_all_account_24dp"
+ app:tint="?android:textColorPrimary" />
Wulkanowy
+
Wybierz ucznia
Wulkanowy
@@ -70,17 +71,12 @@
- %d ocen
- %d ocen
-
- Nowa ocena
- Nowe oceny
- Nowe oceny
-
-
-
- Nowe oceny
-
+
- Dostałeś %1$d ocenę
- "Dostałeś %1$d oceny
- Dostałeś %1$d ocen
@@ -88,16 +84,6 @@
-
- Nowe uwagi
-
- - Dostałeś %1$d uwagę
- - "Dostałeś %1$d uwagi
- - Dostałeś %1$d uwag
- - Dostałeś %1$d uwag
-
-
-
Lekcja
Sala
@@ -106,6 +92,7 @@
Zmiany
Brak lekcji w tym dniu
+
Lekcje zrealizowane
Zobacz lekcje zrealizowane
@@ -114,6 +101,7 @@
Nieobecność
Zasoby
+
Podsumowanie frekwencji
Nieobecny z przyczyn szkolnych
@@ -131,9 +119,11 @@
- %1$d nieobecności
+
Frekwencja
+
Brak sprawdzianów w tym tygodniu
Typ
@@ -155,17 +145,12 @@
- %d wiadomości
- %d wiadomości
-
- Nowa wiadomość
- Nowe wiadomości
- Nowe wiadomości
-
-
-
- Nowe wiadomości
-
+
- Dostałeś %1$d wiadomość
- "Dostałeś %1$d wiadomości
- Dostałeś %1$d wiadomości
@@ -181,9 +166,6 @@
Musisz wybrać co najmniej 1 adresata
Treść wiadomości musi zawierać co najmniej 3 znaki
-
- Kod źródłowy
- Zgłoś błąd
Brak informacji o uwagach
@@ -193,27 +175,31 @@
- %d uwag
- %d uwag
-
- Nowa uwaga
- Nowe uwagi
- Nowych uwag
- Nowych uwag
+
+ - Dostałeś %1$d uwagę
+ - "Dostałeś %1$d uwagi
+ - Dostałeś %1$d uwag
+ - Dostałeś %1$d uwag
+
Brak zadań domowych
+
Szczęśliwy numerek
Dzisiejszym szczęśliwym numerkiem jest
Brak informacji o szczęśliwym numerku
+ Szczęśliwy numerek na dzisiaj
+ Dziś szczęśliwym numerkiem jest: %d
-
- Nowe szczęśliwe numerki
- Szczęśliwy numerek na dzisiaj
- Dziś szczęśliwym numerkiem jest: %d
Dodaj konto
@@ -222,6 +208,11 @@
Wylogowanie ucznia
+
+ Kod źródłowy
+ Zgłoś błąd
+
+
Treść
Opis
@@ -267,6 +258,10 @@
Tylko WiFi
+
+ Nowe wpisy w dzienniku
+
+
Czarny
Czerwony
@@ -279,6 +274,7 @@
Skopiowano
+
Brak połączenia z internetem
Zbyt długie oczekiwanie na połączenie
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b51387e9..d07ecaea 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,6 +1,7 @@
Wulkanowy
+
Select student
Wulkanowy
@@ -68,26 +69,15 @@
- %d grade
- %d grades
-
- New grade
- New grades
-
-
- New grades
-
+
- You received %1$d grade
- You received %1$d grades
-
- New notes
-
- - You received %1$d note
- - You received %1$d notes
-
-
Lesson
@@ -97,6 +87,7 @@
Changes
No lessons this day
+
Completed lessons
Show completed lessons
@@ -105,6 +96,7 @@
Absence
Resources
+
Attendance summary
Absent for school reasons
@@ -121,6 +113,7 @@
- %1$d absences
+
Attendance
@@ -145,15 +138,11 @@
- %d message
- %d messages
-
- New message
- New messages
-
-
- New messages
-
+
- You received %1$d message
- You received %1$d messages
@@ -168,9 +157,6 @@
You need to choose at least 1 recipient
The message content must be at least 3 characters
-
- Source code
- Report a bug
No info about notes
@@ -178,25 +164,27 @@
- %d note
- %d notes
-
- New note
- New notes
+
+ - You received %1$d note
+ - You received %1$d notes
+
No info about homework
+
Lucky number
Today\'s lucky number is
No info about the lucky number
+ Lucky number for today
+ Today\'s lucky number is: %d
-
- New lucky numbers
- Lucky number for today
- Today\'s lucky number is: %d
Add account
@@ -205,6 +193,11 @@
Student logout
+
+ Source code
+ Report a bug
+
+
Content
Description
@@ -250,6 +243,10 @@
Wi-Fi only
+
+ New entries in register
+
+
Black
Red
@@ -262,6 +259,7 @@
Copied
+
No internet connection
Too long wait for connection
diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt
index 2fd6dee6..f7c5559d 100644
--- a/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt
+++ b/app/src/test/java/io/github/wulkanowy/ui/modules/main/MainPresenterTest.kt
@@ -3,7 +3,7 @@ package io.github.wulkanowy.ui.modules.main
import io.github.wulkanowy.TestSchedulersProvider
import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
import io.github.wulkanowy.data.repositories.student.StudentRepository
-import io.github.wulkanowy.services.job.ServiceHelper
+import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
import org.junit.Before
@@ -25,7 +25,7 @@ class MainPresenterTest {
lateinit var prefRepository: PreferencesRepository
@Mock
- lateinit var serviceHelper: ServiceHelper
+ lateinit var syncManager: SyncManager
@Mock
lateinit var mainView: MainView
@@ -40,7 +40,7 @@ class MainPresenterTest {
MockitoAnnotations.initMocks(this)
clearInvocations(mainView)
- presenter = MainPresenter(errorHandler, studentRepository, prefRepository, TestSchedulersProvider(), serviceHelper, analytics)
+ presenter = MainPresenter(errorHandler, studentRepository, prefRepository, syncManager, TestSchedulersProvider(), analytics)
presenter.onAttachView(mainView, -1)
}