diff --git a/app/build.gradle b/app/build.gradle index 621e5a4fe..0f0a3303d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,10 +124,13 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.19.0" + implementation "io.github.wulkanowy:sdk:61250d3" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation "androidx.core:core-ktx:1.2.0" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.7' + + implementation "androidx.core:core-ktx:1.3.0" implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.appcompat:appcompat:1.2.0-rc01" implementation "androidx.appcompat:appcompat-resources:1.1.0" @@ -167,7 +170,6 @@ dependencies { implementation "com.ncapdevi:frag-nav:3.3.0" implementation "com.github.YarikSOffice:lingver:1.2.2" - implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.8" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" implementation "io.reactivex.rxjava2:rxjava:2.2.19" @@ -197,7 +199,6 @@ dependencies { testImplementation "junit:junit:4.13" testImplementation "io.mockk:mockk:$mockk" testImplementation "org.threeten:threetenbp:1.4.4" - testImplementation "org.mockito:mockito-inline:3.3.3" androidTestImplementation "androidx.test:core:1.2.0" androidTestImplementation "androidx.test:runner:1.2.0" @@ -205,7 +206,6 @@ dependencies { androidTestImplementation "io.mockk:mockk-android:$mockk" androidTestImplementation "androidx.room:room-testing:$room" androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" - androidTestImplementation "org.mockito:mockito-android:3.3.3" } apply plugin: 'com.google.gms.google-services' diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt index 0bbcc4271..b312048d5 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration12Test.kt @@ -4,6 +4,7 @@ import android.content.ContentValues import android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL import androidx.sqlite.db.SupportSQLiteDatabase import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.runBlocking import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals @@ -29,7 +30,7 @@ class Migration12Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 12, true, Migration12()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(2, students.size) @@ -58,7 +59,7 @@ class Migration12Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 12, true, Migration12()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(1, students.size) @@ -84,7 +85,7 @@ class Migration12Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 12, true, Migration12()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(3, students.size) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt index da4284b02..05a8a5cf0 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/db/migrations/Migration13Test.kt @@ -5,6 +5,7 @@ import android.database.sqlite.SQLiteDatabase import androidx.sqlite.db.SupportSQLiteDatabase import io.github.wulkanowy.data.db.Converters import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test @@ -26,7 +27,7 @@ class Migration13Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 13, true, Migration13()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(3, students.size) @@ -60,7 +61,7 @@ class Migration13Test : AbstractMigrationTest() { helper.runMigrationsAndValidate(dbName, 13, true, Migration13()) val db = getMigratedRoomDatabase() - val students = db.studentDao.loadAll().blockingGet() + val students = runBlocking { db.studentDao.loadAll() } assertEquals(2, students.size) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt deleted file mode 100644 index 7dc93c4a4..000000000 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/TestInternetObservingStrategy.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.wulkanowy.data.repositories - -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingStrategy -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.error.ErrorHandler -import io.reactivex.Observable -import io.reactivex.Single - -class TestInternetObservingStrategy : InternetObservingStrategy { - - override fun checkInternetConnectivity(host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Single { - return Single.just(true) - } - - override fun observeInternetConnectivity(initialIntervalInMs: Int, intervalInMs: Int, host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Observable { - return Observable.just(true) - } - - override fun getDefaultPingHost() = "localhost" -} diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt index cdfc524ad..f9326b2d5 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -35,7 +36,7 @@ class AttendanceLocalTest { @Test fun saveAndReadTest() { - attendanceLocal.saveAttendance(listOf( + val list = listOf( getAttendanceEntity( of(2018, 9, 10), SentExcuseStatus.ACCEPTED @@ -48,14 +49,11 @@ class AttendanceLocalTest { of(2018, 9, 17), SentExcuseStatus.ACCEPTED ) - )) + ) + runBlocking { attendanceLocal.saveAttendance(list) } - val attendance = attendanceLocal - .getAttendance(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1), - of(2018, 9, 10), - of(2018, 9, 14) - ) - .blockingGet() + val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) + val attendance = runBlocking { attendanceLocal.getAttendance(semester, of(2018, 9, 10), of(2018, 9, 14)) } assertEquals(2, attendance.size) assertEquals(attendance[0].date, of(2018, 9, 10)) assertEquals(attendance[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt index 50badc468..d8aac23da 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -24,7 +25,8 @@ class CompletedLessonsLocalTest { @Before fun createDb() { - testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) + testDb = Room + .inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() completedLessonsLocal = CompletedLessonsLocal(testDb.completedLessonsDao) } @@ -36,18 +38,15 @@ class CompletedLessonsLocalTest { @Test fun saveAndReadTest() { - completedLessonsLocal.saveCompletedLessons(listOf( + val list = listOf( getCompletedLesson(of(2018, 9, 10), 1), getCompletedLesson(of(2018, 9, 14), 2), getCompletedLesson(of(2018, 9, 17), 3) - )) + ) + runBlocking { completedLessonsLocal.saveCompletedLessons(list) } - val completed = completedLessonsLocal - .getCompletedLessons(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1), - of(2018, 9, 10), - of(2018, 9, 14) - ) - .blockingGet() + val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) + val completed = runBlocking { completedLessonsLocal.getCompletedLessons(semester, of(2018, 9, 10), of(2018, 9, 14)) } assertEquals(2, completed.size) assertEquals(completed[0].date, of(2018, 9, 10)) assertEquals(completed[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt index 98dfc88eb..f3b179a51 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -34,18 +35,15 @@ class ExamLocalTest { @Test fun saveAndReadTest() { - examLocal.saveExams(listOf( + val list = listOf( Exam(1, 2, of(2018, 9, 10), now(), "", "", "", "", "", ""), Exam(1, 2, of(2018, 9, 14), now(), "", "", "", "", "", ""), Exam(1, 2, of(2018, 9, 17), now(), "", "", "", "", "", "") - )) + ) + runBlocking { examLocal.saveExams(list) } - val exams = examLocal - .getExams(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1), - of(2018, 9, 10), - of(2018, 9, 14) - ) - .blockingGet() + val semester = Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1) + val exams = runBlocking { examLocal.getExams(semester, of(2018, 9, 10), of(2018, 9, 14)) } assertEquals(2, exams.size) assertEquals(exams[0].date, of(2018, 9, 10)) assertEquals(exams[1].date, of(2018, 9, 14)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt index eb1a55480..82129d868 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -22,7 +23,8 @@ class GradeLocalTest { @Before fun createDb() { - testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) + testDb = Room + .inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() gradeLocal = GradeLocal(testDb.gradeDao, testDb.gradeSummaryDao) } @@ -34,17 +36,16 @@ class GradeLocalTest { @Test fun saveAndReadTest() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, LocalDate.of(2018, 9, 10), "", 1), createGradeLocal(4, 4.0, LocalDate.of(2019, 2, 27), "", 2), createGradeLocal(3, 5.0, LocalDate.of(2019, 2, 28), "", 2) - )) + ) + runBlocking { gradeLocal.saveGrades(list) } val semester = Semester(1, 2, "", 2019, 2, 1, now(), now(), 1, 1) - val grades = gradeLocal - .getGradesDetails(semester) - .blockingGet() + val grades = runBlocking { gradeLocal.getGradesDetails(semester) } assertEquals(2, grades.size) assertEquals(grades[0].date, LocalDate.of(2019, 2, 27)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt index cdd514772..5487fd4ce 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt @@ -5,17 +5,16 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Grade import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -33,10 +32,6 @@ class GradeRepositoryTest { @MockK private lateinit var mockSdk: Sdk - private val settings = InternetObservingSettings.builder() - .strategy(TestInternetObservingStrategy()) - .build() - @MockK private lateinit var semesterMock: Semester @@ -71,15 +66,17 @@ class GradeRepositoryTest { @Test fun markOlderThanRegisterDateAsRead() { - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 4.0, of(2019, 2, 25), "Ocena pojawiła się"), createGradeApi(5, 4.0, of(2019, 2, 26), "przed zalogowanie w aplikacji"), createGradeApi(5, 4.0, of(2019, 2, 27), "Ocena z dnia logowania"), createGradeApi(5, 4.0, of(2019, 2, 28), "Ocena jeszcze nowsza") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date } + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + .first.sortedByDescending { it.date } + } assertFalse { grades[0].isRead } assertFalse { grades[1].isRead } @@ -89,21 +86,24 @@ class GradeRepositoryTest { @Test fun mitigateOldGradesNotifications() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Jedna ocena"), createGradeLocal(4, 4.0, of(2019, 2, 26), "Druga"), createGradeLocal(3, 5.0, of(2019, 2, 27), "Trzecia") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 2.0, of(2019, 2, 25), "Ocena ma datę, jest inna, ale nie zostanie powiadomiona"), createGradeApi(4, 3.0, of(2019, 2, 26), "starszą niż ostatnia lokalnie"), createGradeApi(3, 4.0, of(2019, 2, 27), "Ta jest z tego samego dnia co ostatnia lokalnie"), createGradeApi(2, 5.0, of(2019, 2, 28), "Ta jest już w ogóle nowa") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date } + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + .first.sortedByDescending { it.date } + } assertFalse { grades[0].isRead } assertFalse { grades[1].isRead } @@ -113,69 +113,76 @@ class GradeRepositoryTest { @Test fun subtractLocaleDuplicateGrades() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(2, grades.first.size) } @Test fun subtractRemoteDuplicateGrades() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(3, grades.first.size) } @Test fun emptyLocal() { - gradeLocal.saveGrades(listOf()) + runBlocking { gradeLocal.saveGrades(listOf()) } - every { mockSdk.getGrades(1) } returns Single.just(listOf( + coEvery { mockSdk.getGrades(1) } returns (listOf( createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") ) to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(3, grades.first.size) } @Test fun emptyRemote() { - gradeLocal.saveGrades(listOf( + val list = listOf( createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"), createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena") - )) + ) + runBlocking { gradeLocal.saveGrades(list) } - every { mockSdk.getGrades(1) } returns Single.just(emptyList() to emptyList()) + coEvery { mockSdk.getGrades(1) } returns (emptyList() to emptyList()) - val grades = GradeRepository(settings, gradeLocal, gradeRemote) - .getGrades(studentMock, semesterMock, true).blockingGet() + val grades = runBlocking { + GradeRepository(gradeLocal, gradeRemote).getGrades(studentMock, semesterMock, true) + } assertEquals(0, grades.first.size) } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt index bd3635fea..deda67ba3 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -35,25 +36,27 @@ class GradeStatisticsLocalTest { @Test fun saveAndRead_subject() { - gradeStatisticsLocal.saveGradesStatistics(listOf( + val list = listOf( getGradeStatistics("Matematyka", 2, 1), getGradeStatistics("Fizyka", 1, 2) - )) + ) + runBlocking { gradeStatisticsLocal.saveGradesStatistics(list) } - val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Matematyka").blockingGet() + val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Matematyka") } assertEquals(1, stats.size) assertEquals(stats[0].subject, "Matematyka") } @Test fun saveAndRead_all() { - gradeStatisticsLocal.saveGradesStatistics(listOf( + val list = listOf( getGradeStatistics("Matematyka", 2, 1), getGradeStatistics("Chemia", 2, 1), getGradeStatistics("Fizyka", 1, 2) - )) + ) + runBlocking { gradeStatisticsLocal.saveGradesStatistics(list) } - val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Wszystkie").blockingGet() + val stats = runBlocking { gradeStatisticsLocal.getGradesStatistics(getSemester(), false, "Wszystkie") } assertEquals(3, stats.size) assertEquals(stats[0].subject, "Wszystkie") assertEquals(stats[1].subject, "Matematyka") @@ -62,13 +65,14 @@ class GradeStatisticsLocalTest { @Test fun saveAndRead_points() { - gradeStatisticsLocal.saveGradesPointsStatistics(listOf( + val list = listOf( getGradePointsStatistics("Matematyka", 2, 1), getGradePointsStatistics("Chemia", 2, 1), getGradePointsStatistics("Fizyka", 1, 2) - )) + ) + runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(list) } - val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet() + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka") } with(stats[0]) { assertEquals(subject, "Matematyka") assertEquals(others, 5.0) @@ -78,18 +82,18 @@ class GradeStatisticsLocalTest { @Test fun saveAndRead_subjectEmpty() { - gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) + runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) } - val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet() - assertEquals(null, stats) + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka") } + assertEquals(emptyList(), stats) } @Test fun saveAndRead_allEmpty() { - gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) + runBlocking { gradeStatisticsLocal.saveGradesPointsStatistics(listOf()) } - val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie").blockingGet() - assertEquals(null, stats) + val stats = runBlocking { gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie") } + assertEquals(emptyList(), stats) } private fun getSemester(): Semester { diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt index efad0d4d5..f37d7934b 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -23,7 +24,8 @@ class LuckyNumberLocalTest { @Before fun createDb() { - testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) + testDb = Room + .inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java) .build() luckyNumberLocal = LuckyNumberLocal(testDb.luckyNumberDao) } @@ -35,14 +37,14 @@ class LuckyNumberLocalTest { @Test fun saveAndReadTest() { - luckyNumberLocal.saveLuckyNumber(LuckyNumber(1, LocalDate.of(2019, 1, 20), 14)) + val number = LuckyNumber(1, LocalDate.of(2019, 1, 20), 14) + runBlocking { luckyNumberLocal.saveLuckyNumber(number) } - val luckyNumber = luckyNumberLocal.getLuckyNumber(Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()), - LocalDate.of(2019, 1, 20) - ).blockingGet() + val student = Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()) + val luckyNumber = runBlocking { luckyNumberLocal.getLuckyNumber(student, LocalDate.of(2019, 1, 20)) } - assertEquals(1, luckyNumber.studentId) - assertEquals(LocalDate.of(2019, 1, 20), luckyNumber.date) - assertEquals(14, luckyNumber.luckyNumber) + assertEquals(1, luckyNumber?.studentId) + assertEquals(LocalDate.of(2019, 1, 20), luckyNumber?.date) + assertEquals(14, luckyNumber?.luckyNumber) } } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt index 22578e41e..9ba8a9fb4 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -35,17 +36,21 @@ class RecipientLocalTest { @Test fun saveAndReadTest() { - recipientLocal.saveRecipients(listOf( + val list = listOf( Recipient(1, "2rPracownik", "Kowalski Jan", "Kowalski Jan [KJ] - Pracownik (Fake123456)", 3, 4, 2, "hash"), Recipient(1, "3rPracownik", "Kowalska Karolina", "Kowalska Karolina [KK] - Pracownik (Fake123456)", 4, 4, 2, "hash"), Recipient(1, "4rPracownik", "Krupa Stanisław", "Krupa Stanisław [KS] - Uczeń (Fake123456)", 5, 4, 1, "hash") - )) + ) + runBlocking { recipientLocal.saveRecipients(list) } - val recipients = recipientLocal.getRecipients( - Student("fakelog.cf", "AUTO", "", "", "", "", false, "", "", "", 1, 0, "", "", "", "", "", 1, true, LocalDateTime.now()), - 2, - ReportingUnit(1, 4, "", 0, "", emptyList()) - ).blockingGet() + val student = Student("fakelog.cf", "AUTO", "", "", "", "", false, "", "", "", 1, 0, "", "", "", "", "", 1, true, LocalDateTime.now()) + val recipients = runBlocking { + recipientLocal.getRecipients( + student = student, + role = 2, + unit = ReportingUnit(1, 4, "", 0, "", emptyList()) + ) + } assertEquals(2, recipients.size) assertEquals(1, recipients[0].studentId) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt index 530bfb3f7..02a13344e 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt @@ -6,6 +6,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.repositories.getStudent +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -36,9 +37,9 @@ class StudentLocalTest { @Test fun saveAndReadTest() { - studentLocal.saveStudents(listOf(student)).blockingGet() + runBlocking { studentLocal.saveStudents(listOf(student)) } - val student = studentLocal.getCurrentStudent(true).blockingGet() - assertEquals("23", student.schoolSymbol) + val student = runBlocking { studentLocal.getCurrentStudent(true) } + assertEquals("23", student?.schoolSymbol) } } diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt index a66e5843c..fa353a332 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -34,17 +35,21 @@ class TimetableLocalTest { @Test fun saveAndReadTest() { - timetableDb.saveTimetable(listOf( + val list = listOf( createTimetableLocal(of(2018, 9, 10, 0, 0, 0), 1), createTimetableLocal(of(2018, 9, 14, 0, 0, 0), 1), createTimetableLocal(of(2018, 9, 17, 0, 0, 0), 1) - )) + ) + runBlocking { timetableDb.saveTimetable(list) } - val exams = timetableDb.getTimetable( - Semester(1, 2, "", 1, 1, 2019, LocalDate.now(), LocalDate.now(), 1, 1), - LocalDate.of(2018, 9, 10), - LocalDate.of(2018, 9, 14) - ).blockingGet() + val semester = Semester(1, 2, "", 1, 1, 2019, LocalDate.now(), LocalDate.now(), 1, 1) + val exams = runBlocking { + timetableDb.getTimetable( + semester = semester, + startDate = LocalDate.of(2018, 9, 10), + endDate = LocalDate.of(2018, 9, 14) + ) + } assertEquals(2, exams.size) assertEquals(exams[0].date, LocalDate.of(2018, 9, 10)) diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt index 75f2f0b83..a91651db1 100644 --- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt +++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt @@ -5,19 +5,18 @@ import androidx.room.Room import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy import io.github.wulkanowy.data.repositories.getStudent -import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.github.wulkanowy.sdk.Sdk +import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Test @@ -33,10 +32,6 @@ class TimetableRepositoryTest { @MockK private lateinit var mockSdk: Sdk - private val settings = InternetObservingSettings.builder() - .strategy(TestInternetObservingStrategy()) - .build() - @MockK private lateinit var studentMock: Student @@ -82,23 +77,31 @@ class TimetableRepositoryTest { @Test fun copyRoomToCompletedFromPrevious() { - timetableLocal.saveTimetable(listOf( - createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "123", "Przyroda"), - createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "321", "Religia"), - createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "213", "W-F"), - createTimetableLocal(of(2019, 3, 5, 10, 30),3, "213", "W-F", "Jan Kowalski") - )) + runBlocking { + timetableLocal.saveTimetable(listOf( + createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "123", "Przyroda"), + createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "321", "Religia"), + createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "213", "W-F"), + createTimetableLocal(of(2019, 3, 5, 10, 30), 3, "213", "W-F", "Jan Kowalski") + )) + } - every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf( + coEvery { mockSdk.getTimetable(any(), any()) } returns listOf( createTimetableRemote(of(2019, 3, 5, 8, 0), 1, "", "Przyroda"), createTimetableRemote(of(2019, 3, 5, 8, 50), 2, "", "Religia"), createTimetableRemote(of(2019, 3, 5, 9, 40), 3, "", "W-F"), createTimetableRemote(of(2019, 3, 5, 10, 30), 4, "", "W-F") - )) + ) - val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper) - .getTimetable(student, semesterMock, LocalDate.of(2019, 3, 5), LocalDate.of(2019, 3, 5), true) - .blockingGet() + val lessons = runBlocking { + TimetableRepository(timetableLocal, timetableRemote, timetableNotificationSchedulerHelper).getTimetable( + student = student, + semester = semesterMock, + start = LocalDate.of(2019, 3, 5), + end = LocalDate.of(2019, 3, 5), + forceRefresh = true + ) + } assertEquals(4, lessons.size) assertEquals("123", lessons[0].room) @@ -108,7 +111,7 @@ class TimetableRepositoryTest { @Test fun copyTeacherToCompletedFromPrevious() { - timetableLocal.saveTimetable(listOf( + val list = listOf( createTimetableLocal(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), createTimetableLocal(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Paweł Poniedziałkowski", false), createTimetableLocal(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Wtorkowska", true), @@ -123,9 +126,10 @@ class TimetableRepositoryTest { createTimetableLocal(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "", false), createTimetableLocal(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "", true), createTimetableLocal(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "", true) - )) + ) + runBlocking { timetableLocal.saveTimetable(list) } - every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf( + coEvery { mockSdk.getTimetable(any(), any()) } returns listOf( createTimetableRemote(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false), createTimetableRemote(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true), createTimetableRemote(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false), @@ -140,11 +144,17 @@ class TimetableRepositoryTest { createTimetableRemote(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true), createTimetableRemote(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false), createTimetableRemote(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true) - )) + ) - val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper) - .getTimetable(student, semesterMock, LocalDate.of(2019, 12, 23), LocalDate.of(2019, 12, 25), true) - .blockingGet() + val lessons = runBlocking { + TimetableRepository(timetableLocal, timetableRemote, timetableNotificationSchedulerHelper).getTimetable( + student = student, + semester = semesterMock, + start = LocalDate.of(2019, 12, 23), + end = LocalDate.of(2019, 12, 25), + forceRefresh = true + ) + } assertEquals(12, lessons.size) diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index 19af1b2f8..6ece2d978 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -8,8 +8,6 @@ import androidx.preference.PreferenceManager import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy import dagger.Module import dagger.Provides import io.github.wulkanowy.data.db.AppDatabase @@ -22,14 +20,6 @@ import javax.inject.Singleton @Module internal class RepositoryModule { - @Singleton - @Provides - fun provideInternetObservingSettings(): InternetObservingSettings { - return InternetObservingSettings.builder() - .strategy(WalledGardenInternetObservingStrategy()) - .build() - } - @Singleton @Provides fun provideSdk(chuckerCollector: ChuckerCollector, context: Context): Sdk { diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt index 3eb57473d..49527a553 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Attendance -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface AttendanceDao : BaseDao { @Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt index fd58533f1..1ba37c959 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/AttendanceSummaryDao.kt @@ -3,11 +3,10 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.AttendanceSummary -import io.reactivex.Maybe @Dao interface AttendanceSummaryDao : BaseDao { @Query("SELECT * FROM AttendanceSummary WHERE diary_id = :diaryId AND student_id = :studentId AND subject_id = :subjectId") - fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt index 32dbadb86..048e9e3cd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/BaseDao.kt @@ -7,11 +7,11 @@ import androidx.room.Update interface BaseDao { @Insert - fun insertAll(items: List): List + suspend fun insertAll(items: List): List @Update - fun updateAll(items: List) + suspend fun updateAll(items: List) @Delete - fun deleteAll(items: List) + suspend fun deleteAll(items: List) } 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 e13e569b6..6406d097d 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.CompletedLesson -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface CompletedLessonsDao : BaseDao { @Query("SELECT * FROM CompletedLesson WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt index ca6b32dfc..e492f7b84 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/ExamDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Exam -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface ExamDao : BaseDao { @Query("SELECT * FROM Exams WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): 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 c74d1937f..df0276203 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Grade -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,6 +10,5 @@ import javax.inject.Singleton interface GradeDao : BaseDao { @Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId") - fun loadAll(semesterId: Int, studentId: Int): Maybe> - + suspend fun loadAll(semesterId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt index da1828666..b1e644bbd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradePointsStatisticsDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradePointsStatistics -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,8 +10,8 @@ import javax.inject.Singleton interface GradePointsStatisticsDao : BaseDao { @Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName") - fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): Maybe> + suspend fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): List @Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId") - fun loadAll(semesterId: Int, studentId: Int): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt index 6faa35d0b..786da0d9e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradeStatistics -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,8 +10,8 @@ import javax.inject.Singleton interface GradeStatisticsDao : BaseDao { @Query("SELECT * FROM GradesStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName AND is_semester = :isSemester") - fun loadSubject(semesterId: Int, studentId: Int, subjectName: String, isSemester: Boolean): Maybe> + suspend fun loadSubject(semesterId: Int, studentId: Int, subjectName: String, isSemester: Boolean): List @Query("SELECT * FROM GradesStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND is_semester = :isSemester") - fun loadAll(semesterId: Int, studentId: Int, isSemester: Boolean): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int, isSemester: Boolean): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt index 1165ef07f..02d4e9229 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeSummaryDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.GradeSummary -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface GradeSummaryDao : BaseDao { @Query("SELECT * FROM GradesSummary WHERE student_id = :studentId AND semester_id = :semesterId") - fun loadAll(semesterId: Int, studentId: Int): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt index 1947a0dfe..9bbf80ace 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/HomeworkDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Homework -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface HomeworkDao : BaseDao { @Query("SELECT * FROM Homework WHERE semester_id = :semesterId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } 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 f16c28d9e..b4ead2454 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.LuckyNumber -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface LuckyNumberDao : BaseDao { @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date") - fun load(studentId: Int, date: LocalDate): Maybe + suspend fun load(studentId: Int, date: LocalDate): LuckyNumber } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt index 3c511a277..b69083a1a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessageAttachmentDao.kt @@ -9,5 +9,5 @@ import io.github.wulkanowy.data.db.entities.MessageAttachment interface MessageAttachmentDao : BaseDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertAttachments(items: List): List + suspend fun insertAttachments(items: List): List } 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 7a69e2707..2757978ae 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 @@ -5,19 +5,17 @@ import androidx.room.Query import androidx.room.Transaction import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment -import io.reactivex.Maybe -import io.reactivex.Single @Dao interface MessagesDao : BaseDao { @Transaction @Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId") - fun loadMessageWithAttachment(studentId: Int, messageId: Int): Single + suspend fun loadMessageWithAttachment(studentId: Int, messageId: Int): MessageWithAttachment @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder AND removed = 0 ORDER BY date DESC") - fun loadAll(studentId: Int, folder: Int): Maybe> + suspend fun loadAll(studentId: Int, folder: Int): List @Query("SELECT * FROM Messages WHERE student_id = :studentId AND removed = 1 ORDER BY date DESC") - fun loadDeleted(studentId: Int): Maybe> + suspend fun loadDeleted(studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt index b05b2d9cc..b07aab284 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MobileDeviceDao.kt @@ -3,11 +3,10 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.MobileDevice -import io.reactivex.Maybe @Dao interface MobileDeviceDao : BaseDao { @Query("SELECT * FROM MobileDevices WHERE student_id = :studentId ORDER BY date DESC") - fun loadAll(studentId: Int): Maybe> + suspend fun loadAll(studentId: Int): List } 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 ea2fc6eb2..81c324f65 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Note -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface NoteDao : BaseDao { @Query("SELECT * FROM Notes WHERE student_id = :studentId") - fun loadAll(studentId: Int): Maybe> + suspend fun loadAll(studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt index afb941b1a..419efde0d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Recipient -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface RecipientDao : BaseDao { @Query("SELECT * FROM Recipients WHERE student_id = :studentId AND role = :role AND unit_id = :unitId") - fun load(studentId: Int, role: Int, unitId: Int): Maybe> + suspend fun load(studentId: Int, role: Int, unitId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt index 6ddfd4941..ca697eda8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.ReportingUnit -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,8 +10,8 @@ import javax.inject.Singleton interface ReportingUnitDao : BaseDao { @Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId") - fun load(studentId: Int): Maybe> + suspend fun load(studentId: Int): List @Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId AND real_id = :unitId") - fun loadOne(studentId: Int, unitId: Int): Maybe + suspend fun loadOne(studentId: Int, unitId: Int): ReportingUnit? } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt index e9bd67557..37cb6c500 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SchoolDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.School -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface SchoolDao : BaseDao { @Query("SELECT * FROM School WHERE student_id = :studentId AND class_id = :classId") - fun load(studentId: Int, classId: Int): Maybe + suspend fun load(studentId: Int, classId: Int): School? } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt index 654b80f38..bbbc9b4e2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SemesterDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface SemesterDao : BaseDao { @Query("SELECT * FROM Semesters WHERE student_id = :studentId AND class_id = :classId") - fun loadAll(studentId: Int, classId: Int): Maybe> + suspend fun loadAll(studentId: Int, classId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt index 901ddc73f..3d7d9216e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/StudentDao.kt @@ -6,7 +6,6 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy.ABORT import androidx.room.Query import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -14,23 +13,23 @@ import javax.inject.Singleton interface StudentDao { @Insert(onConflict = ABORT) - fun insertAll(student: List): List + suspend fun insertAll(student: List): List @Delete - fun delete(student: Student) + suspend fun delete(student: Student) @Query("SELECT * FROM Students WHERE is_current = 1") - fun loadCurrent(): Maybe + suspend fun loadCurrent(): Student? @Query("SELECT * FROM Students WHERE id = :id") - fun loadById(id: Int): Maybe + suspend fun loadById(id: Int): Student? @Query("SELECT * FROM Students") - fun loadAll(): Maybe> + suspend fun loadAll(): List @Query("UPDATE Students SET is_current = 1 WHERE id = :id") - fun updateCurrent(id: Long) + suspend fun updateCurrent(id: Long) @Query("UPDATE Students SET is_current = 0") - fun resetCurrent() + suspend fun resetCurrent() } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt index 525a7129a..92477552c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/SubjectDao.kt @@ -3,11 +3,10 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Subject -import io.reactivex.Maybe @Dao interface SubjectDao : BaseDao { @Query("SELECT * FROM Subjects WHERE diary_id = :diaryId AND student_id = :studentId") - fun loadAll(diaryId: Int, studentId: Int): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt index 5ea237a84..0b0e659b4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TeacherDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Teacher -import io.reactivex.Maybe import javax.inject.Singleton @Singleton @@ -11,5 +10,5 @@ import javax.inject.Singleton interface TeacherDao : BaseDao { @Query("SELECT * FROM Teachers WHERE student_id = :studentId AND class_id = :classId") - fun loadAll(studentId: Int, classId: Int): Maybe> + suspend fun loadAll(studentId: Int, classId: Int): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt index 6b62cc82a..59200b80b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/TimetableDao.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.db.dao import androidx.room.Dao import androidx.room.Query import io.github.wulkanowy.data.db.entities.Timetable -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Singleton @@ -12,5 +11,5 @@ import javax.inject.Singleton interface TimetableDao : BaseDao { @Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end") - fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe> + suspend fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): List } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt index 76cf698c9..3fcd7cb57 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/appcreator/AppCreatorRepository.kt @@ -3,14 +3,19 @@ package io.github.wulkanowy.data.repositories.appcreator import android.content.res.AssetManager import com.google.gson.Gson import io.github.wulkanowy.data.pojos.Contributor -import io.reactivex.Single +import io.github.wulkanowy.utils.DispatchersProvider +import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @Singleton -class AppCreatorRepository @Inject constructor(private val assets: AssetManager) { - fun getAppCreators(): Single> { - return Single.fromCallable { +class AppCreatorRepository @Inject constructor( + private val assets: AssetManager, + private val dispatchers: DispatchersProvider +) { + + suspend fun getAppCreators(): List { + return withContext(dispatchers.backgroundThread) { Gson().fromJson( assets.open("contributors.json").bufferedReader().use { it.readText() }, Array::class.java 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 0f5873766..b232033d1 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.attendance import io.github.wulkanowy.data.db.dao.AttendanceDao import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,15 +10,15 @@ import javax.inject.Singleton @Singleton class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDao) { - fun saveAttendance(attendance: List) { + suspend fun saveAttendance(attendance: List) { attendanceDb.insertAll(attendance) } - fun deleteAttendance(attendance: List) { + suspend 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() } + suspend fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt index f64d920db..1f794f5a2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Absent import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalTime @@ -16,33 +15,31 @@ import javax.inject.Singleton @Singleton class AttendanceRemote @Inject constructor(private val sdk: Sdk) { - fun getAttendance(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getAttendance(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getAttendance(startDate, endDate, semester.semesterId) - .map { attendance -> - attendance.map { - Attendance( - studentId = semester.studentId, - diaryId = semester.diaryId, - date = it.date, - timeId = it.timeId, - number = it.number, - subject = it.subject, - name = it.name, - presence = it.presence, - absence = it.absence, - exemption = it.exemption, - lateness = it.lateness, - excused = it.excused, - deleted = it.deleted, - excusable = it.excusable, - excuseStatus = it.excuseStatus?.name - ) - } + .map { + Attendance( + studentId = semester.studentId, + diaryId = semester.diaryId, + date = it.date, + timeId = it.timeId, + number = it.number, + subject = it.subject, + name = it.name, + presence = it.presence, + absence = it.absence, + exemption = it.exemption, + lateness = it.lateness, + excused = it.excused, + deleted = it.deleted, + excusable = it.excusable, + excuseStatus = it.excuseStatus?.name + ) } } - fun excuseAbsence(student: Student, semester: Semester, absenceList: List, reason: String?): Single { + suspend fun excuseAbsence(student: Student, semester: Semester, absenceList: List, reason: String?): Boolean { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).excuseForAbsence(absenceList.map { attendance -> Absent( date = LocalDateTime.of(attendance.date, LocalTime.of(0, 0)), diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt index 68e7c5f12..0fa0090e7 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt @@ -1,45 +1,34 @@ package io.github.wulkanowy.data.repositories.attendance -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Attendance import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: AttendanceLocal, private val remote: AttendanceRemote ) { - fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean): Single> { - return local.getAttendance(semester, start.monday, end.sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getAttendance(student, semester, start.monday, end.sunday) - else Single.error(UnknownHostException()) - }.flatMap { newAttendance -> - local.getAttendance(semester, start.monday, end.sunday) - .toSingle(emptyList()) - .doOnSuccess { oldAttendance -> - local.deleteAttendance(oldAttendance.uniqueSubtract(newAttendance)) - local.saveAttendance(newAttendance.uniqueSubtract(oldAttendance)) - } - }.flatMap { - local.getAttendance(semester, start.monday, end.sunday) - .toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + suspend fun getAttendance(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean): List { + return local.getAttendance(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getAttendance(student, semester, start.monday, end.sunday) + val old = local.getAttendance(semester, start.monday, end.sunday) + + local.deleteAttendance(old.uniqueSubtract(new)) + local.saveAttendance(new.uniqueSubtract(old)) + + local.getAttendance(semester, start.monday, end.sunday) + }.filter { it.date in start..end } } - fun excuseForAbsence(student: Student, semester: Semester, attendanceList: List, reason: String? = null): Single { + suspend fun excuseForAbsence(student: Student, semester: Semester, attendanceList: List, reason: String? = null): Boolean { return remote.excuseAbsence(student, semester, attendanceList, reason) } } 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 2e9a10067..f949f0163 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 @@ -3,22 +3,21 @@ package io.github.wulkanowy.data.repositories.attendancesummary import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceSummaryLocal @Inject constructor(private val attendanceDb: AttendanceSummaryDao) { - fun saveAttendanceSummary(attendance: List) { + suspend fun saveAttendanceSummary(attendance: List) { attendanceDb.insertAll(attendance) } - fun deleteAttendanceSummary(attendance: List) { + suspend 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() } + suspend fun getAttendanceSummary(semester: Semester, subjectId: Int): List { + return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt index 8fef5c391..29a0b9a7b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt @@ -5,32 +5,29 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceSummaryRemote @Inject constructor(private val sdk: Sdk) { - fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int): Single> { + suspend fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getAttendanceSummary(subjectId) - .map { attendance -> - attendance.map { - AttendanceSummary( - studentId = semester.studentId, - diaryId = semester.diaryId, - subjectId = subjectId, - month = it.month, - presence = it.presence, - absence = it.absence, - absenceExcused = it.absenceExcused, - absenceForSchoolReasons = it.absenceForSchoolReasons, - lateness = it.lateness, - latenessExcused = it.latenessExcused, - exemption = it.exemption - ) - } + .map { + AttendanceSummary( + studentId = semester.studentId, + diaryId = semester.diaryId, + subjectId = subjectId, + month = it.month, + presence = it.presence, + absence = it.absence, + absenceExcused = it.absenceExcused, + absenceForSchoolReasons = it.absenceForSchoolReasons, + lateness = it.lateness, + latenessExcused = it.latenessExcused, + exemption = it.exemption + ) } } } 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 5f0b2b346..7ef16fb0f 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 @@ -1,35 +1,27 @@ package io.github.wulkanowy.data.repositories.attendancesummary -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.AttendanceSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class AttendanceSummaryRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: AttendanceSummaryLocal, private val remote: AttendanceSummaryRemote ) { - fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean = false): Single> { - return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getAttendanceSummary(student, semester, subjectId) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getAttendanceSummary(semester, subjectId).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteAttendanceSummary(old.uniqueSubtract(new)) - local.saveAttendanceSummary(new.uniqueSubtract(old)) - } - }.flatMap { local.getAttendanceSummary(semester, subjectId).toSingle(emptyList()) }) + suspend fun getAttendanceSummary(student: Student, semester: Semester, subjectId: Int, forceRefresh: Boolean = false): List { + return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh }.ifEmpty { + val new = remote.getAttendanceSummary(student, semester, subjectId) + + val old = local.getAttendanceSummary(semester, subjectId) + local.deleteAttendanceSummary(old.uniqueSubtract(new)) + local.saveAttendanceSummary(new.uniqueSubtract(old)) + + return local.getAttendanceSummary(semester, subjectId) + } } } 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 9b275908e..f355f4166 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.completedlessons import io.github.wulkanowy.data.db.dao.CompletedLessonsDao import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,15 +10,15 @@ import javax.inject.Singleton @Singleton class CompletedLessonsLocal @Inject constructor(private val completedLessonsDb: CompletedLessonsDao) { - fun saveCompletedLessons(completedLessons: List) { + suspend fun saveCompletedLessons(completedLessons: List) { completedLessonsDb.insertAll(completedLessons) } - fun deleteCompleteLessons(completedLessons: List) { + suspend 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() } + suspend fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): List { + return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt index bb115111e..b3d786058 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,26 +12,24 @@ import javax.inject.Singleton @Singleton class CompletedLessonsRemote @Inject constructor(private val sdk: Sdk) { - fun getCompletedLessons(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getCompletedLessons(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getCompletedLessons(startDate, endDate) - .map { lessons -> - lessons.map { - it.absence - CompletedLesson( - studentId = semester.studentId, - diaryId = semester.diaryId, - date = it.date, - number = it.number, - subject = it.subject, - topic = it.topic, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol, - substitution = it.substitution, - absence = it.absence, - resources = it.resources - ) - } + .map { + it.absence + CompletedLesson( + studentId = semester.studentId, + diaryId = semester.diaryId, + date = it.date, + number = it.number, + subject = it.subject, + topic = it.topic, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol, + substitution = it.substitution, + absence = it.absence, + resources = it.resources + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt index 72cc93eb4..8e81c54ae 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt @@ -1,42 +1,30 @@ package io.github.wulkanowy.data.repositories.completedlessons -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.CompletedLesson import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class CompletedLessonsRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: CompletedLessonsLocal, private val remote: CompletedLessonsRemote ) { - fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return local.getCompletedLessons(semester, start.monday, end.sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getCompletedLessons(student, semester, start.monday, end.sunday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getCompletedLessons(semester, start.monday, end.sunday) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteCompleteLessons(old.uniqueSubtract(new)) - local.saveCompletedLessons(new.uniqueSubtract(old)) - } - }.flatMap { - local.getCompletedLessons(semester, start.monday, end.sunday) - .toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + suspend fun getCompletedLessons(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getCompletedLessons(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getCompletedLessons(student, semester, start.monday, end.sunday) + val old = local.getCompletedLessons(semester, start.monday, end.sunday) + + local.deleteCompleteLessons(old.uniqueSubtract(new)) + local.saveCompletedLessons(new.uniqueSubtract(old)) + + local.getCompletedLessons(semester, start.monday, end.sunday) + }.filter { it.date in start..end } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt index 389eb5835..d1888380a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.exam import io.github.wulkanowy.data.db.dao.ExamDao import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,16 +10,15 @@ import javax.inject.Singleton @Singleton class ExamLocal @Inject constructor(private val examDb: ExamDao) { - fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { + suspend fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return examDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) - .filter { it.isNotEmpty() } } - fun saveExams(exams: List) { + suspend fun saveExams(exams: List) { examDb.insertAll(exams) } - fun deleteExams(exams: List) { + suspend fun deleteExams(exams: List) { examDb.deleteAll(exams) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt index fb105ceee..0668b5c14 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,24 +12,22 @@ import javax.inject.Singleton @Singleton class ExamRemote @Inject constructor(private val sdk: Sdk) { - fun getExams(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getExams(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getExams(startDate, endDate, semester.semesterId) - .map { exams -> - exams.map { - Exam( - studentId = semester.studentId, - diaryId = semester.diaryId, - date = it.date, - entryDate = it.entryDate, - subject = it.subject, - group = it.group, - type = it.type, - description = it.description, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol - ) - } + .map { + Exam( + studentId = semester.studentId, + diaryId = semester.diaryId, + date = it.date, + entryDate = it.entryDate, + subject = it.subject, + group = it.group, + type = it.type, + description = it.description, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt index f29e4fdf8..13af62c5b 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt @@ -1,42 +1,30 @@ package io.github.wulkanowy.data.repositories.exam -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class ExamRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: ExamLocal, private val remote: ExamRemote ) { - fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return local.getExams(semester, start.monday, end.sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getExams(student, semester, start.monday, end.sunday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getExams(semester, start.monday, end.sunday) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteExams(old.uniqueSubtract(new)) - local.saveExams(new.uniqueSubtract(old)) - } - }.flatMap { - local.getExams(semester, start.monday, end.sunday) - .toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end } } + suspend fun getExams(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getExams(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getExams(student, semester, start.monday, end.sunday) + val old = local.getExams(semester, start.monday, end.sunday) + + local.deleteExams(old.uniqueSubtract(new)) + local.saveExams(new.uniqueSubtract(old)) + + local.getExams(semester, start.monday, end.sunday) + }.filter { it.date in start..end } } } 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 52ab60178..234fc6b80 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 @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.dao.GradeSummaryDao import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @@ -15,35 +14,35 @@ class GradeLocal @Inject constructor( private val gradeSummaryDb: GradeSummaryDao ) { - fun saveGrades(grades: List) { + suspend fun saveGrades(grades: List) { gradeDb.insertAll(grades) } - fun deleteGrades(grades: List) { + suspend fun deleteGrades(grades: List) { gradeDb.deleteAll(grades) } - fun updateGrades(grades: List) { + suspend fun updateGrades(grades: List) { gradeDb.updateAll(grades) } - fun updateGradesSummary(gradesSummary: List) { + suspend fun updateGradesSummary(gradesSummary: List) { gradeSummaryDb.updateAll(gradesSummary) } - fun getGradesDetails(semester: Semester): Maybe> { - return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + suspend fun getGradesDetails(semester: Semester): List { + return gradeDb.loadAll(semester.semesterId, semester.studentId) } - fun saveGradesSummary(gradesSummary: List) { + suspend fun saveGradesSummary(gradesSummary: List) { gradeSummaryDb.insertAll(gradesSummary) } - fun deleteGradesSummary(gradesSummary: List) { + suspend fun deleteGradesSummary(gradesSummary: List) { gradeSummaryDb.deleteAll(gradesSummary) } - fun getGradesSummary(semester: Semester): Maybe> { - return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + suspend fun getGradesSummary(semester: Semester): List { + return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt index abb2f98c9..9534a8910 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt @@ -6,48 +6,48 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeRemote @Inject constructor(private val sdk: Sdk) { - fun getGrades(student: Student, semester: Semester): Single, List>> { - return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) + suspend fun getGrades(student: Student, semester: Semester): Pair, List> { + val (details, summary) = sdk + .init(student) + .switchDiary(semester.diaryId, semester.schoolYear) .getGrades(semester.semesterId) - .map { (details, summary) -> - details.map { - Grade( - studentId = semester.studentId, - semesterId = semester.semesterId, - subject = it.subject, - entry = it.entry, - value = it.value, - modifier = it.modifier, - comment = it.comment, - color = it.color, - gradeSymbol = it.symbol, - description = it.description, - weight = it.weight, - weightValue = it.weightValue, - date = it.date, - teacher = it.teacher - ) - } to summary.map { - GradeSummary( - semesterId = semester.semesterId, - studentId = semester.studentId, - position = 0, - subject = it.name, - predictedGrade = it.predicted, - finalGrade = it.final, - pointsSum = it.pointsSum, - proposedPoints = it.proposedPoints, - finalPoints = it.finalPoints, - average = it.average - ) - } - } + + return details.map { + Grade( + studentId = semester.studentId, + semesterId = semester.semesterId, + subject = it.subject, + entry = it.entry, + value = it.value, + modifier = it.modifier, + comment = it.comment, + color = it.color, + gradeSymbol = it.symbol, + description = it.description, + weight = it.weight, + weightValue = it.weightValue, + date = it.date, + teacher = it.teacher + ) + } to summary.map { + GradeSummary( + semesterId = semester.semesterId, + studentId = semester.studentId, + position = 0, + subject = it.name, + predictedGrade = it.predicted, + finalGrade = it.final, + pointsSum = it.pointsSum, + proposedPoints = it.proposedPoints, + finalPoints = it.finalPoints, + average = it.average + ) + } } } 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 2ba68b967..6dcbb0657 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 @@ -1,110 +1,96 @@ package io.github.wulkanowy.data.repositories.grade -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single import org.threeten.bp.LocalDateTime -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: GradeLocal, private val remote: GradeRemote ) { - fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single, List>> { - return local.getGradesDetails(semester).flatMap { details -> - local.getGradesSummary(semester).map { summary -> details to summary } - }.filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getGrades(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { (newDetails, newSummary) -> - local.getGradesDetails(semester).toSingle(emptyList()) - .doOnSuccess { old -> - val notifyBreakDate = old.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() - local.deleteGrades(old.uniqueSubtract(newDetails)) - local.saveGrades(newDetails.uniqueSubtract(old) - .onEach { - if (it.date >= notifyBreakDate) it.apply { - isRead = false - if (notify) isNotified = false - } - }) - }.flatMap { - local.getGradesSummary(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesSummary(old.uniqueSubtract(newSummary)) - local.saveGradesSummary(newSummary.uniqueSubtract(old) - .onEach { summary -> - val oldSummary = old.find { oldSummary -> oldSummary.subject == summary.subject } - summary.isPredictedGradeNotified = when { - summary.predictedGrade.isEmpty() -> true - notify && oldSummary?.predictedGrade != summary.predictedGrade -> false - else -> true - } - summary.isFinalGradeNotified = when { - summary.finalGrade.isEmpty() -> true - notify && oldSummary?.finalGrade != summary.finalGrade -> false - else -> true - } + suspend fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Pair, List> { + val details = local.getGradesDetails(semester) + val summaries = local.getGradesSummary(semester) - summary.predictedGradeLastChange = when { - oldSummary == null -> LocalDateTime.now() - summary.predictedGrade != oldSummary.predictedGrade -> LocalDateTime.now() - else -> oldSummary.predictedGradeLastChange - } - summary.finalGradeLastChange = when { - oldSummary == null -> LocalDateTime.now() - summary.finalGrade != oldSummary.finalGrade -> LocalDateTime.now() - else -> oldSummary.finalGradeLastChange - } - }) - } - } - }.flatMap { - local.getGradesDetails(semester).toSingle(emptyList()).flatMap { details -> - local.getGradesSummary(semester).toSingle(emptyList()).map { summary -> - details to summary - } + if ((details.isNotEmpty() || summaries.isNotEmpty()) && !forceRefresh) { + return details to summaries + } + + val (newDetails, newSummary) = remote.getGrades(student, semester) + val oldGrades = local.getGradesDetails(semester) + + val notifyBreakDate = oldGrades.maxBy { it.date }?.date ?: student.registrationDate.toLocalDate() + local.deleteGrades(oldGrades.uniqueSubtract(newDetails)) + local.saveGrades(newDetails.uniqueSubtract(oldGrades).onEach { + if (it.date >= notifyBreakDate) it.apply { + isRead = false + if (notify) isNotified = false } }) + + val oldSummaries = local.getGradesSummary(semester) + + local.deleteGradesSummary(oldSummaries.uniqueSubtract(newSummary)) + local.saveGradesSummary(newSummary.uniqueSubtract(oldSummaries).onEach { summary -> + val oldSummary = oldSummaries.find { oldSummary -> oldSummary.subject == summary.subject } + summary.isPredictedGradeNotified = when { + summary.predictedGrade.isEmpty() -> true + notify && oldSummary?.predictedGrade != summary.predictedGrade -> false + else -> true + } + summary.isFinalGradeNotified = when { + summary.finalGrade.isEmpty() -> true + notify && oldSummary?.finalGrade != summary.finalGrade -> false + else -> true + } + + summary.predictedGradeLastChange = when { + oldSummary == null -> LocalDateTime.now() + summary.predictedGrade != oldSummary.predictedGrade -> LocalDateTime.now() + else -> oldSummary.predictedGradeLastChange + } + summary.finalGradeLastChange = when { + oldSummary == null -> LocalDateTime.now() + summary.finalGrade != oldSummary.finalGrade -> LocalDateTime.now() + else -> oldSummary.finalGradeLastChange + } + }) + + return local.getGradesDetails(semester) to local.getGradesSummary(semester) } - fun getUnreadGrades(semester: Semester): Single> { - return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isRead } }.toSingle(emptyList()) + suspend fun getUnreadGrades(semester: Semester): List { + return local.getGradesDetails(semester).filter { grade -> !grade.isRead } } - fun getNotNotifiedGrades(semester: Semester): Single> { - return local.getGradesDetails(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedGrades(semester: Semester): List { + return local.getGradesDetails(semester).filter { grade -> !grade.isNotified } } - fun getNotNotifiedPredictedGrades(semester: Semester): Single> { - return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedPredictedGrades(semester: Semester): List { + return local.getGradesSummary(semester).filter { gradeSummary -> !gradeSummary.isPredictedGradeNotified } } - fun getNotNotifiedFinalGrades(semester: Semester): Single> { - return local.getGradesSummary(semester).map { it.filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedFinalGrades(semester: Semester): List { + return local.getGradesSummary(semester).filter { gradeSummary -> !gradeSummary.isFinalGradeNotified } } - fun updateGrade(grade: Grade): Completable { - return Completable.fromCallable { local.updateGrades(listOf(grade)) } + suspend fun updateGrade(grade: Grade) { + return local.updateGrades(listOf(grade)) } - fun updateGrades(grades: List): Completable { - return Completable.fromCallable { local.updateGrades(grades) } + suspend fun updateGrades(grades: List) { + return local.updateGrades(grades) } - fun updateGradesSummary(gradesSummary: List): Completable { - return Completable.fromCallable { local.updateGradesSummary(gradesSummary) } + suspend fun updateGradesSummary(gradesSummary: List) { + return local.updateGradesSummary(gradesSummary) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt index 7994bd758..d34f2b2ec 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.dao.GradeStatisticsDao import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @@ -15,46 +14,47 @@ class GradeStatisticsLocal @Inject constructor( private val gradePointsStatisticsDb: GradePointsStatisticsDao ) { - fun getGradesStatistics(semester: Semester, isSemester: Boolean): Maybe> { - return gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester).filter { it.isNotEmpty() } + suspend fun getGradesStatistics(semester: Semester, isSemester: Boolean): List { + return gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester) } - fun getGradesPointsStatistics(semester: Semester): Maybe> { - return gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() } + suspend fun getGradesPointsStatistics(semester: Semester): List { + return gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) } - fun getGradesStatistics(semester: Semester, isSemester: Boolean, subjectName: String): Maybe> { + suspend fun getGradesStatistics(semester: Semester, isSemester: Boolean, subjectName: String): List { return when (subjectName) { - "Wszystkie" -> gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester).map { list -> - list.groupBy { it.grade }.map { + "Wszystkie" -> { + val statistics = gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester) + statistics.groupBy { it.grade }.map { GradeStatistics(semester.studentId, semester.semesterId, subjectName, it.key, it.value.fold(0) { acc, e -> acc + e.amount }, false) - } + list + } + statistics } else -> gradeStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName, isSemester) - }.filter { it.isNotEmpty() } + } } - fun getGradesPointsStatistics(semester: Semester, subjectName: String): Maybe> { + suspend fun getGradesPointsStatistics(semester: Semester, subjectName: String): List { return when (subjectName) { "Wszystkie" -> gradePointsStatisticsDb.loadAll(semester.semesterId, semester.studentId) else -> gradePointsStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName) - }.filter { it.isNotEmpty() } + } } - fun saveGradesStatistics(gradesStatistics: List) { + suspend fun saveGradesStatistics(gradesStatistics: List) { gradeStatisticsDb.insertAll(gradesStatistics) } - fun saveGradesPointsStatistics(gradePointsStatistics: List) { + suspend fun saveGradesPointsStatistics(gradePointsStatistics: List) { gradePointsStatisticsDb.insertAll(gradePointsStatistics) } - fun deleteGradesStatistics(gradesStatistics: List) { + suspend fun deleteGradesStatistics(gradesStatistics: List) { gradeStatisticsDb.deleteAll(gradesStatistics) } - fun deleteGradesPointsStatistics(gradesPointsStatistics: List) { + suspend fun deleteGradesPointsStatistics(gradesPointsStatistics: List) { gradePointsStatisticsDb.deleteAll(gradesPointsStatistics) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt index 99e0cb987..1ff8132fc 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt @@ -6,44 +6,39 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeStatisticsRemote @Inject constructor(private val sdk: Sdk) { - fun getGradeStatistics(student: Student, semester: Semester, isSemester: Boolean): Single> { + suspend fun getGradeStatistics(student: Student, semester: Semester, isSemester: Boolean): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear).let { if (isSemester) it.getGradesAnnualStatistics(semester.semesterId) else it.getGradesPartialStatistics(semester.semesterId) - }.map { gradeStatistics -> - gradeStatistics.map { - GradeStatistics( - semesterId = semester.semesterId, - studentId = semester.studentId, - subject = it.subject, - grade = it.gradeValue, - amount = it.amount, - semester = isSemester - ) - } + }.map { + GradeStatistics( + semesterId = semester.semesterId, + studentId = semester.studentId, + subject = it.subject, + grade = it.gradeValue, + amount = it.amount, + semester = isSemester + ) } } - fun getGradePointsStatistics(student: Student, semester: Semester): Single> { + suspend fun getGradePointsStatistics(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getGradesPointsStatistics(semester.semesterId) - .map { gradePointsStatistics -> - gradePointsStatistics.map { - GradePointsStatistics( - semesterId = semester.semesterId, - studentId = semester.studentId, - subject = it.subject, - others = it.others, - student = it.student - ) - } + .map { + GradePointsStatistics( + semesterId = semester.semesterId, + studentId = semester.studentId, + subject = it.subject, + others = it.others, + student = it.student + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt index 8d96d2f57..93df69406 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt @@ -1,7 +1,5 @@ package io.github.wulkanowy.data.repositories.gradestatistics -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.GradePointsStatistics import io.github.wulkanowy.data.db.entities.GradeStatistics import io.github.wulkanowy.data.db.entities.Semester @@ -9,67 +7,54 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.GradeStatisticsItem import io.github.wulkanowy.ui.modules.grade.statistics.ViewType import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class GradeStatisticsRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: GradeStatisticsLocal, private val remote: GradeStatisticsRemote ) { - fun getGradesStatistics(student: Student, semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false): Single> { - return local.getGradesStatistics(semester, isSemester, subjectName).map { it.mapToStatisticItems() }.filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getGradeStatistics(student, semester, isSemester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getGradesStatistics(semester, isSemester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesStatistics(old.uniqueSubtract(new)) - local.saveGradesStatistics(new.uniqueSubtract(old)) - } - }.flatMap { local.getGradesStatistics(semester, isSemester, subjectName).map { it.mapToStatisticItems() }.toSingle(emptyList()) }) - } + suspend fun getGradesStatistics(student: Student, semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false): List { + return local.getGradesStatistics(semester, isSemester, subjectName).mapToStatisticItems().filter { !forceRefresh }.ifEmpty { + val new = remote.getGradeStatistics(student, semester, isSemester) + val old = local.getGradesStatistics(semester, isSemester) - fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean): Single> { - return local.getGradesPointsStatistics(semester, subjectName).map { it.mapToStatisticsItem() }.filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getGradePointsStatistics(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getGradesPointsStatistics(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteGradesPointsStatistics(old.uniqueSubtract(new)) - local.saveGradesPointsStatistics(new.uniqueSubtract(old)) - } - }.flatMap { local.getGradesPointsStatistics(semester, subjectName).map { it.mapToStatisticsItem() }.toSingle(emptyList()) }) - } + local.deleteGradesStatistics(old.uniqueSubtract(new)) + local.saveGradesStatistics(new.uniqueSubtract(old)) - private fun List.mapToStatisticItems(): List { - return groupBy { it.subject }.map { - GradeStatisticsItem( - type = ViewType.PARTIAL, - partial = it.value - .sortedByDescending { item -> item.grade } - .filter { item -> item.amount != 0 }, - points = null - ) + local.getGradesStatistics(semester, isSemester, subjectName).mapToStatisticItems() } } - private fun List.mapToStatisticsItem(): List { - return map { - GradeStatisticsItem( - type = ViewType.POINTS, - partial = emptyList(), - points = it - ) + suspend fun getGradesPointsStatistics(student: Student, semester: Semester, subjectName: String, forceRefresh: Boolean): List { + return local.getGradesPointsStatistics(semester, subjectName).mapToStatisticsItem().filter { !forceRefresh }.ifEmpty { + val new = remote.getGradePointsStatistics(student, semester) + val old = local.getGradesPointsStatistics(semester) + + local.deleteGradesPointsStatistics(old.uniqueSubtract(new)) + local.saveGradesPointsStatistics(new.uniqueSubtract(old)) + + local.getGradesPointsStatistics(semester, subjectName).mapToStatisticsItem() } } + + private fun List.mapToStatisticItems() = groupBy { it.subject }.map { + GradeStatisticsItem( + type = ViewType.PARTIAL, + partial = it.value + .sortedByDescending { item -> item.grade } + .filter { item -> item.amount != 0 }, + points = null + ) + } + + private fun List.mapToStatisticsItem() = map { + GradeStatisticsItem( + type = ViewType.POINTS, + partial = emptyList(), + points = it + ) + } } 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 fdae45182..ed6bb0cf5 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.homework import io.github.wulkanowy.data.db.dao.HomeworkDao import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,20 +10,19 @@ import javax.inject.Singleton @Singleton class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) { - fun saveHomework(homework: List) { + suspend fun saveHomework(homework: List) { homeworkDb.insertAll(homework) } - fun deleteHomework(homework: List) { + suspend fun deleteHomework(homework: List) { homeworkDb.deleteAll(homework) } - fun updateHomework(homework: List) { + suspend fun updateHomework(homework: List) { homeworkDb.updateAll(homework) } - fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> { + suspend fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return homeworkDb.loadAll(semester.semesterId, semester.studentId, startDate, endDate) - .filter { it.isNotEmpty() } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt index 20ffee99c..9e99843dd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,23 +12,21 @@ import javax.inject.Singleton @Singleton class HomeworkRemote @Inject constructor(private val sdk: Sdk) { - fun getHomework(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getHomework(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getHomework(startDate, endDate) - .map { homework -> - homework.map { - Homework( - semesterId = semester.semesterId, - studentId = semester.studentId, - date = it.date, - entryDate = it.entryDate, - subject = it.subject, - content = it.content, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol, - attachments = it.attachments.map { attachment -> attachment.url to attachment.name } - ) - } + .map { + Homework( + semesterId = semester.semesterId, + studentId = semester.studentId, + date = it.date, + entryDate = it.entryDate, + subject = it.subject, + content = it.content, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol, + attachments = it.attachments.map { attachment -> attachment.url to attachment.name } + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt index 7e8fd5c30..ca0a84a5f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt @@ -1,49 +1,37 @@ package io.github.wulkanowy.data.repositories.homework -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class HomeworkRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: HomeworkLocal, private val remote: HomeworkRemote ) { - fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return Single.fromCallable { start.monday to end.sunday }.flatMap { (monday, friday) -> - local.getHomework(semester, monday, friday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getHomework(student, semester, monday, friday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getHomework(semester, monday, friday).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteHomework(old.uniqueSubtract(new)) - local.saveHomework(new.uniqueSubtract(old)) - } - }.flatMap { local.getHomework(semester, monday, friday).toSingle(emptyList()) }) + suspend fun getHomework(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getHomework(semester, start.monday, end.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getHomework(student, semester, start.monday, end.sunday) + + val old = local.getHomework(semester, start.monday, end.sunday) + + local.deleteHomework(old.uniqueSubtract(new)) + local.saveHomework(new.uniqueSubtract(old)) + + local.getHomework(semester, start.monday, end.sunday) } } - fun toggleDone(homework: Homework): Completable { - return Completable.fromCallable { - local.updateHomework(listOf(homework.apply { - isDone = !isDone - })) - } + suspend fun toggleDone(homework: Homework) { + local.updateHomework(listOf(homework.apply { + isDone = !isDone + })) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt index be6ad2f48..d03d3ccd6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/logger/LoggerRepository.kt @@ -1,29 +1,31 @@ package io.github.wulkanowy.data.repositories.logger import android.content.Context -import io.reactivex.Single +import io.github.wulkanowy.utils.DispatchersProvider +import kotlinx.coroutines.withContext import java.io.File import java.io.FileNotFoundException import javax.inject.Inject -class LoggerRepository @Inject constructor(private val context: Context) { +class LoggerRepository @Inject constructor( + private val context: Context, + private val dispatchers: DispatchersProvider +) { - fun getLastLogLines(): Single> { - return getLastModified() - .map { it.readText() } - .map { it.split("\n") } + suspend fun getLastLogLines(): List { + return getLastModified().readText().split("\n") } - fun getLogFiles(): Single> { - return Single.fromCallable { + suspend fun getLogFiles(): List { + return withContext(dispatchers.backgroundThread) { File(context.filesDir.absolutePath).listFiles(File::isFile)?.filter { it.name.endsWith(".log") - } + }!! } } - private fun getLastModified(): Single { - return Single.fromCallable { + private suspend fun getLastModified(): File { + return withContext(dispatchers.backgroundThread) { var lastModifiedTime = Long.MIN_VALUE var chosenFile: File? = null File(context.filesDir.absolutePath).listFiles(File::isFile)?.forEach { file -> @@ -33,7 +35,7 @@ class LoggerRepository @Inject constructor(private val context: Context) { } } if (chosenFile == null) throw FileNotFoundException("Log file not found") - chosenFile + chosenFile!! } } } 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 0f4f79c84..22b5786dd 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.Student -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,19 +10,19 @@ import javax.inject.Singleton @Singleton class LuckyNumberLocal @Inject constructor(private val luckyNumberDb: LuckyNumberDao) { - fun saveLuckyNumber(luckyNumber: LuckyNumber) { - luckyNumberDb.insertAll(listOf(luckyNumber)) + suspend fun saveLuckyNumber(luckyNumber: LuckyNumber?) { + luckyNumberDb.insertAll(listOfNotNull(luckyNumber)) } - fun updateLuckyNumber(luckyNumber: LuckyNumber) { - luckyNumberDb.updateAll(listOf(luckyNumber)) + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber?) { + luckyNumberDb.updateAll(listOfNotNull(luckyNumber)) } - fun deleteLuckyNumber(luckyNumber: LuckyNumber) { - luckyNumberDb.deleteAll(listOf(luckyNumber)) + suspend fun deleteLuckyNumber(luckyNumber: LuckyNumber?) { + luckyNumberDb.deleteAll(listOfNotNull(luckyNumber)) } - fun getLuckyNumber(student: Student, date: LocalDate): Maybe { + suspend fun getLuckyNumber(student: Student, date: LocalDate): LuckyNumber? { return luckyNumberDb.load(student.studentId, date) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt index 0c71897a6..e93a6c047 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt @@ -4,7 +4,6 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -12,8 +11,8 @@ import javax.inject.Singleton @Singleton class LuckyNumberRemote @Inject constructor(private val sdk: Sdk) { - fun getLuckyNumber(student: Student): Maybe { - return sdk.init(student).getLuckyNumber(student.schoolShortName).map { + suspend fun getLuckyNumber(student: Student): LuckyNumber? { + return sdk.init(student).getLuckyNumber(student.schoolShortName)?.let { LuckyNumber( studentId = student.studentId, date = LocalDate.now(), 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 374b9a294..3f6089628 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 @@ -1,54 +1,42 @@ package io.github.wulkanowy.data.repositories.luckynumber -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.LuckyNumber import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Completable -import io.reactivex.Maybe -import org.threeten.bp.LocalDate -import java.net.UnknownHostException +import org.threeten.bp.LocalDate.now import javax.inject.Inject import javax.inject.Singleton @Singleton class LuckyNumberRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: LuckyNumberLocal, private val remote: LuckyNumberRemote ) { - fun getLuckyNumber(student: Student, forceRefresh: Boolean = false, notify: Boolean = false): Maybe { - return local.getLuckyNumber(student, LocalDate.now()).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMapMaybe { - if (it) remote.getLuckyNumber(student) - else Maybe.error(UnknownHostException()) - }.flatMap { new -> - local.getLuckyNumber(student, LocalDate.now()) - .doOnSuccess { old -> - if (new != old) { - local.deleteLuckyNumber(old) - local.saveLuckyNumber(new.apply { - if (notify) isNotified = false - }) - } - } - .doOnComplete { - local.saveLuckyNumber(new.apply { - if (notify) isNotified = false - }) - } - }.flatMap({ local.getLuckyNumber(student, LocalDate.now()) }, { Maybe.error(it) }, - { local.getLuckyNumber(student, LocalDate.now()) }) - ) + suspend fun getLuckyNumber(student: Student, forceRefresh: Boolean = false, notify: Boolean = false): LuckyNumber? { + return local.getLuckyNumber(student, now())?.takeIf { !forceRefresh } ?: run { + val new = remote.getLuckyNumber(student) + val old = local.getLuckyNumber(student, now()) + + if (new != old) { + old?.let { local.deleteLuckyNumber(it) } + local.saveLuckyNumber(new?.apply { + if (notify) isNotified = false + }) + } + + local.saveLuckyNumber(new?.apply { + if (notify) isNotified = false + }) + + local.getLuckyNumber(student, now()) + } } - fun getNotNotifiedLuckyNumber(student: Student): Maybe { - return local.getLuckyNumber(student, LocalDate.now()).filter { !it.isNotified } + suspend fun getNotNotifiedLuckyNumber(student: Student): LuckyNumber? { + return local.getLuckyNumber(student, now()) } - fun updateLuckyNumber(luckyNumber: LuckyNumber): Completable { - return Completable.fromCallable { local.updateLuckyNumber(luckyNumber) } + suspend fun updateLuckyNumber(luckyNumber: LuckyNumber) { + local.updateLuckyNumber(luckyNumber) } } 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 53cf0a983..f05c49d87 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 @@ -7,8 +7,6 @@ import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED -import io.reactivex.Maybe -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @@ -18,30 +16,30 @@ class MessageLocal @Inject constructor( private val messageAttachmentDao: MessageAttachmentDao ) { - fun saveMessages(messages: List) { + suspend fun saveMessages(messages: List) { messagesDb.insertAll(messages) } - fun updateMessages(messages: List) { + suspend fun updateMessages(messages: List) { messagesDb.updateAll(messages) } - fun deleteMessages(messages: List) { + suspend fun deleteMessages(messages: List) { messagesDb.deleteAll(messages) } - fun getMessageWithAttachment(student: Student, message: Message): Single { + suspend fun getMessageWithAttachment(student: Student, message: Message): MessageWithAttachment { return messagesDb.loadMessageWithAttachment(student.id.toInt(), message.messageId) } - fun saveMessageAttachments(attachments: List) { + suspend fun saveMessageAttachments(attachments: List) { messageAttachmentDao.insertAttachments(attachments) } - fun getMessages(student: Student, folder: MessageFolder): Maybe> { + suspend fun getMessages(student: Student, folder: MessageFolder): List { return when (folder) { TRASHED -> messagesDb.loadDeleted(student.id.toInt()) else -> messagesDb.loadAll(student.id.toInt(), 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 2df2e20a3..26ef3d9e2 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 @@ -9,7 +9,6 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Folder import io.github.wulkanowy.sdk.pojo.SentMessage import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDateTime.now import javax.inject.Inject import javax.inject.Singleton @@ -18,32 +17,30 @@ import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient @Singleton class MessageRemote @Inject constructor(private val sdk: Sdk) { - fun getMessages(student: Student, semester: Semester, folder: MessageFolder): Single> { - return sdk.init(student).getMessages(Folder.valueOf(folder.name), semester.start.atStartOfDay(), semester.end.atStartOfDay()).map { messages -> - messages.map { - Message( - studentId = student.id.toInt(), - realId = it.id ?: 0, - messageId = it.messageId ?: 0, - sender = it.sender.orEmpty(), - senderId = it.senderId ?: 0, - recipient = it.recipient.orEmpty(), - subject = it.subject.trim(), - date = it.date ?: now(), - content = it.content.orEmpty(), - folderId = it.folderId, - unread = it.unread ?: false, - unreadBy = it.unreadBy ?: 0, - readBy = it.readBy ?: 0, - removed = it.removed, - hasAttachments = it.hasAttachments - ) - } + suspend fun getMessages(student: Student, semester: Semester, folder: MessageFolder): List { + return sdk.init(student).getMessages(Folder.valueOf(folder.name), semester.start.atStartOfDay(), semester.end.atStartOfDay()).map { + Message( + studentId = student.id.toInt(), + realId = it.id ?: 0, + messageId = it.messageId ?: 0, + sender = it.sender.orEmpty(), + senderId = it.senderId ?: 0, + recipient = it.recipient.orEmpty(), + subject = it.subject.trim(), + date = it.date ?: now(), + content = it.content.orEmpty(), + folderId = it.folderId, + unread = it.unread ?: false, + unreadBy = it.unreadBy ?: 0, + readBy = it.readBy ?: 0, + removed = it.removed, + hasAttachments = it.hasAttachments + ) } } - fun getMessagesContentDetails(student: Student, message: Message, markAsRead: Boolean = false): Single>> { - return sdk.init(student).getMessageDetails(message.messageId, message.folderId, markAsRead, message.realId).map { details -> + suspend fun getMessagesContentDetails(student: Student, message: Message, markAsRead: Boolean = false): Pair> { + return sdk.init(student).getMessageDetails(message.messageId, message.folderId, markAsRead, message.realId).let { details -> details.content to details.attachments.map { MessageAttachment( realId = it.id, @@ -56,7 +53,7 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { } } - fun sendMessage(student: Student, subject: String, content: String, recipients: List): Single { + suspend fun sendMessage(student: Student, subject: String, content: String, recipients: List): SentMessage { return sdk.init(student).sendMessage( subject = subject, content = content, @@ -74,7 +71,7 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { ) } - fun deleteMessage(student: Student, message: Message): Single { + suspend fun deleteMessage(student: Student, message: Message): Boolean { return sdk.init(student).deleteMessages(listOf(message.messageId to message.folderId)) } } 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 2d2c0430c..7138566bd 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 @@ -1,7 +1,5 @@ package io.github.wulkanowy.data.repositories.message -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Recipient @@ -10,96 +8,75 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED import io.github.wulkanowy.sdk.pojo.SentMessage import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single import timber.log.Timber -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class MessageRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: MessageLocal, private val remote: MessageRemote ) { - fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): Single> { - return local.getMessages(student, folder).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getMessages(student, semester, folder) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getMessages(student, folder).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteMessages(old.uniqueSubtract(new)) - local.saveMessages(new.uniqueSubtract(old) - .onEach { - it.isNotified = !notify - }) - } - }.flatMap { local.getMessages(student, folder).toSingle(emptyList()) } - ) + suspend fun getMessages(student: Student, semester: Semester, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): List { + return local.getMessages(student, folder).filter { !forceRefresh }.ifEmpty { + val new = remote.getMessages(student, semester, folder) + val old = local.getMessages(student, folder) + + local.deleteMessages(old.uniqueSubtract(new)) + local.saveMessages(new.uniqueSubtract(old).onEach { + it.isNotified = !notify + }) + + local.getMessages(student, folder) + } } - fun getMessage(student: Student, message: Message, markAsRead: Boolean = false): Single { - return local.getMessageWithAttachment(student, message) - .filter { - it.message.content.isNotEmpty().also { status -> + suspend fun getMessage(student: Student, message: Message, markAsRead: Boolean = false): MessageWithAttachment { + return local.getMessageWithAttachment(student, message).let { + if (it.message.content.isNotEmpty().also { status -> Timber.d("Message content in db empty: ${!status}") - } && !it.message.unread + } && !it.message.unread) { + return@let it } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) local.getMessageWithAttachment(student, message) - else Single.error(UnknownHostException()) - } - .flatMap { dbMessage -> - remote.getMessagesContentDetails(student, dbMessage.message, markAsRead).doOnSuccess { (downloadedMessage, attachments) -> - local.updateMessages(listOf(dbMessage.message.copy(unread = !markAsRead).apply { - id = dbMessage.message.id - content = content.ifBlank { downloadedMessage } - })) - local.saveMessageAttachments(attachments) - Timber.d("Message ${message.messageId} with blank content: ${dbMessage.message.content.isBlank()}, marked as read") - } - }.flatMap { - local.getMessageWithAttachment(student, message) - } - ) + + val dbMessage = local.getMessageWithAttachment(student, message) + + val (downloadedMessage, attachments) = remote.getMessagesContentDetails(student, dbMessage.message, markAsRead) + + local.updateMessages(listOf(dbMessage.message.copy(unread = !markAsRead).apply { + id = dbMessage.message.id + content = content.ifBlank { downloadedMessage } + })) + local.saveMessageAttachments(attachments) + Timber.d("Message ${message.messageId} with blank content: ${dbMessage.message.content.isBlank()}, marked as read") + + local.getMessageWithAttachment(student, message) + } } - fun getNotNotifiedMessages(student: Student): Single> { + suspend fun getNotNotifiedMessages(student: Student): List { return local.getMessages(student, RECEIVED) - .map { it.filter { message -> !message.isNotified && message.unread } } - .toSingle(emptyList()) + .filter { message -> !message.isNotified && message.unread } } - fun updateMessages(messages: List): Completable { - return Completable.fromCallable { local.updateMessages(messages) } + suspend fun updateMessages(messages: List) { + return local.updateMessages(messages) } - fun sendMessage(student: Student, subject: String, content: String, recipients: List): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.sendMessage(student, subject, content, recipients) - else Single.error(UnknownHostException()) - } + suspend fun sendMessage(student: Student, subject: String, content: String, recipients: List): SentMessage { + return remote.sendMessage(student, subject, content, recipients) } - fun deleteMessage(student: Student, message: Message): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.deleteMessage(student, message) - else Single.error(UnknownHostException()) - } - .doOnSuccess { - if (!message.removed) local.updateMessages(listOf(message.copy(removed = true).apply { - id = message.id - content = message.content - })) - else local.deleteMessages(listOf(message)) - } + suspend fun deleteMessage(student: Student, message: Message): Boolean { + val delete = remote.deleteMessage(student, message) + + if (!message.removed) local.updateMessages(listOf(message.copy(removed = true).apply { + id = message.id + content = message.content + })) + else local.deleteMessages(listOf(message)) + + return delete // TODO: wtf } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt index 473ffa7fe..911ed3af5 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceLocal.kt @@ -3,22 +3,21 @@ package io.github.wulkanowy.data.repositories.mobiledevice import io.github.wulkanowy.data.db.dao.MobileDeviceDao import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class MobileDeviceLocal @Inject constructor(private val mobileDb: MobileDeviceDao) { - fun saveDevices(devices: List) { + suspend fun saveDevices(devices: List) { mobileDb.insertAll(devices) } - fun deleteDevices(devices: List) { + suspend fun deleteDevices(devices: List) { mobileDb.deleteAll(devices) } - fun getDevices(semester: Semester): Maybe> { - return mobileDb.loadAll(semester.studentId).filter { it.isNotEmpty() } + suspend fun getDevices(semester: Semester): List { + return mobileDb.loadAll(semester.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt index 800f95971..907e965ce 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRemote.kt @@ -6,37 +6,34 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MobileDeviceToken import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class MobileDeviceRemote @Inject constructor(private val sdk: Sdk) { - fun getDevices(student: Student, semester: Semester): Single> { + suspend fun getDevices(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getRegisteredDevices() - .map { devices -> - devices.map { - MobileDevice( - studentId = semester.studentId, - date = it.createDate, - deviceId = it.id, - name = it.name - ) - } + .map { + MobileDevice( + studentId = semester.studentId, + date = it.createDate, + deviceId = it.id, + name = it.name + ) } } - fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Single { + suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Boolean { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .unregisterDevice(device.deviceId) } - fun getToken(student: Student, semester: Semester): Single { + suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getToken() - .map { + .let { MobileDeviceToken( token = it.token, symbol = it.symbol, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt index 545846e85..f327ef607 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepository.kt @@ -1,53 +1,36 @@ package io.github.wulkanowy.data.repositories.mobiledevice -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.pojos.MobileDeviceToken import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class MobileDeviceRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: MobileDeviceLocal, private val remote: MobileDeviceRemote ) { - fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getDevices(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getDevices(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getDevices(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteDevices(old uniqueSubtract new) - local.saveDevices(new uniqueSubtract old) - } - } - ).flatMap { local.getDevices(semester).toSingle(emptyList()) } + suspend fun getDevices(student: Student, semester: Semester, forceRefresh: Boolean = false): List { + return local.getDevices(semester).filter { !forceRefresh }.ifEmpty { + val new = remote.getDevices(student, semester) + val old = local.getDevices(semester) + + local.deleteDevices(old uniqueSubtract new) + local.saveDevices(new uniqueSubtract old) + + local.getDevices(semester) + } } - fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.unregisterDevice(student, semester, device) - else Single.error(UnknownHostException()) - } + suspend fun unregisterDevice(student: Student, semester: Semester, device: MobileDevice): Boolean { + return remote.unregisterDevice(student, semester, device) } - fun getToken(student: Student, semester: Semester): Single { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getToken(student, semester) - else Single.error(UnknownHostException()) - } + suspend fun getToken(student: Student, semester: Semester): MobileDeviceToken { + return remote.getToken(student, semester) } } 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 784e61f0f..b1c6b2902 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,26 +3,25 @@ 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.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class NoteLocal @Inject constructor(private val noteDb: NoteDao) { - fun saveNotes(notes: List) { + suspend fun saveNotes(notes: List) { noteDb.insertAll(notes) } - fun updateNotes(notes: List) { + suspend fun updateNotes(notes: List) { noteDb.updateAll(notes) } - fun deleteNotes(notes: List) { + suspend fun deleteNotes(notes: List) { noteDb.deleteAll(notes) } - fun getNotes(student: Student): Maybe> { - return noteDb.loadAll(student.studentId).filter { it.isNotEmpty() } + suspend fun getNotes(student: Student): List { + return noteDb.loadAll(student.studentId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt index 2c62b608d..0e488b7d9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt @@ -5,30 +5,27 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class NoteRemote @Inject constructor(private val sdk: Sdk) { - fun getNotes(student: Student, semester: Semester): Single> { + suspend fun getNotes(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getNotes(semester.semesterId) - .map { notes -> - notes.map { - Note( - studentId = semester.studentId, - date = it.date, - teacher = it.teacher, - teacherSymbol = it.teacherSymbol, - category = it.category, - categoryType = it.categoryType.id, - isPointsShow = it.showPoints, - points = it.points, - content = it.content - ) - } + .map { + Note( + studentId = semester.studentId, + date = it.date, + teacher = it.teacher, + teacherSymbol = it.teacherSymbol, + category = it.category, + categoryType = it.categoryType.id, + isPointsShow = it.showPoints, + points = it.points, + content = it.content + ) } } } 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 e155e2bad..3628f5b87 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 @@ -1,54 +1,44 @@ package io.github.wulkanowy.data.repositories.note -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings 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.utils.uniqueSubtract -import io.reactivex.Completable -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class NoteRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: NoteLocal, private val remote: NoteRemote ) { - fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> { - return local.getNotes(student).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getNotes(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getNotes(student).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteNotes(old.uniqueSubtract(new)) - local.saveNotes(new.uniqueSubtract(old) - .onEach { - if (it.date >= student.registrationDate.toLocalDate()) it.apply { - isRead = false - if (notify) isNotified = false - } - }) - } - }.flatMap { local.getNotes(student).toSingle(emptyList()) }) + suspend fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): List { + return local.getNotes(student).filter { !forceRefresh }.ifEmpty { + val new = remote.getNotes(student, semester) + val old = local.getNotes(student) + + local.deleteNotes(old.uniqueSubtract(new)) + local.saveNotes(new.uniqueSubtract(old).onEach { + if (it.date >= student.registrationDate.toLocalDate()) it.apply { + isRead = false + if (notify) isNotified = false + } + }) + + local.getNotes(student) + } } - fun getNotNotifiedNotes(student: Student): Single> { - return local.getNotes(student).map { it.filter { note -> !note.isNotified } }.toSingle(emptyList()) + suspend fun getNotNotifiedNotes(student: Student): List { + return local.getNotes(student).filter { note -> !note.isNotified } } - fun updateNote(note: Note): Completable { - return Completable.fromCallable { local.updateNotes(listOf(note)) } + suspend fun updateNote(note: Note) { + return local.updateNotes(listOf(note)) } - fun updateNotes(notes: List): Completable { - return Completable.fromCallable { local.updateNotes(notes) } + suspend fun updateNotes(notes: List) { + return local.updateNotes(notes) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt index ff8175440..fac1645e4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt @@ -4,22 +4,21 @@ import io.github.wulkanowy.data.db.dao.RecipientDao import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class RecipientLocal @Inject constructor(private val recipientDb: RecipientDao) { - fun getRecipients(student: Student, role: Int, unit: ReportingUnit): Maybe> { - return recipientDb.load(student.studentId, role, unit.realId).filter { it.isNotEmpty() } + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit): List { + return recipientDb.load(student.studentId, role, unit.realId) } - fun saveRecipients(recipients: List): List { + suspend fun saveRecipients(recipients: List): List { return recipientDb.insertAll(recipients) } - fun deleteRecipients(recipients: List) { + suspend fun deleteRecipients(recipients: List) { recipientDb.deleteAll(recipients) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt index e5b16a156..a5318e77f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient @@ -14,18 +13,14 @@ import io.github.wulkanowy.sdk.pojo.Recipient as SdkRecipient @Singleton class RecipientRemote @Inject constructor(private val sdk: Sdk) { - fun getRecipients(student: Student, role: Int, unit: ReportingUnit): Single> { + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit): List { return sdk.init(student).getRecipients(unit.realId, role) - .map { recipients -> - recipients.map { it.toRecipient() } - } + .map { it.toRecipient() } } - fun getMessageRecipients(student: Student, message: Message): Single> { + suspend fun getMessageRecipients(student: Student, message: Message): List { return sdk.init(student).getMessageRecipients(message.messageId, message.senderId) - .map { recipients -> - recipients.map { it.toRecipient() } - } + .map { it.toRecipient() } } private fun SdkRecipient.toRecipient(): Recipient { diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt index 6f8a72af2..5c16c57b8 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt @@ -1,47 +1,32 @@ package io.github.wulkanowy.data.repositories.recipient -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Recipient import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class RecipientRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: RecipientLocal, private val remote: RecipientRemote ) { - fun getRecipients(student: Student, role: Int, unit: ReportingUnit, forceRefresh: Boolean = false): Single> { - return local.getRecipients(student, role, unit).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getRecipients(student, role, unit) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getRecipients(student, role, unit).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteRecipients(old.uniqueSubtract(new)) - local.saveRecipients(new.uniqueSubtract(old)) - } - }.flatMap { - local.getRecipients(student, role, unit).toSingle(emptyList()) - } - ) + suspend fun getRecipients(student: Student, role: Int, unit: ReportingUnit, forceRefresh: Boolean = false): List { + return local.getRecipients(student, role, unit).filter { !forceRefresh }.ifEmpty { + val new = remote.getRecipients(student, role, unit) + val old = local.getRecipients(student, role, unit) + + local.deleteRecipients(old.uniqueSubtract(new)) + local.saveRecipients(new.uniqueSubtract(old)) + + local.getRecipients(student, role, unit) + } } - fun getMessageRecipients(student: Student, message: Message): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getMessageRecipients(student, message) - else Single.error(UnknownHostException()) - } + suspend fun getMessageRecipients(student: Student, message: Message): List { + return remote.getMessageRecipients(student, message) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt index f27891250..11eac71e0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRemote.kt @@ -1,18 +1,17 @@ package io.github.wulkanowy.data.repositories.recover import io.github.wulkanowy.sdk.Sdk -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class RecoverRemote @Inject constructor(private val sdk: Sdk) { - fun getReCaptchaSiteKey(host: String, symbol: String): Single> { + suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair { return sdk.getPasswordResetCaptchaCode(host, symbol) } - fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): Single { + suspend fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): String { return sdk.sendPasswordResetRequest(url, symbol, email, reCaptchaResponse) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt index 86d4ba1b3..3117a606a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/recover/RecoverRepository.kt @@ -1,26 +1,16 @@ package io.github.wulkanowy.data.repositories.recover -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton -class RecoverRepository @Inject constructor(private val settings: InternetObservingSettings, private val remote: RecoverRemote) { +class RecoverRepository @Inject constructor(private val remote: RecoverRemote) { - fun getReCaptchaSiteKey(host: String, symbol: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getReCaptchaSiteKey(host, symbol) - else Single.error(UnknownHostException()) - } + suspend fun getReCaptchaSiteKey(host: String, symbol: String): Pair { + return remote.getReCaptchaSiteKey(host, symbol) } - fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): Single { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.sendRecoverRequest(url, symbol, email, reCaptchaResponse) - else Single.error(UnknownHostException()) - } + suspend fun sendRecoverRequest(url: String, symbol: String, email: String, reCaptchaResponse: String): String { + return remote.sendRecoverRequest(url, symbol, email, reCaptchaResponse) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt index 0631c668c..737f1a04f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt @@ -3,26 +3,25 @@ package io.github.wulkanowy.data.repositories.reportingunit import io.github.wulkanowy.data.db.dao.ReportingUnitDao import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class ReportingUnitLocal @Inject constructor(private val reportingUnitDb: ReportingUnitDao) { - fun getReportingUnits(student: Student): Maybe> { - return reportingUnitDb.load(student.studentId).filter { it.isNotEmpty() } + suspend fun getReportingUnits(student: Student): List { + return reportingUnitDb.load(student.studentId) } - fun getReportingUnit(student: Student, unitId: Int): Maybe { + suspend fun getReportingUnit(student: Student, unitId: Int): ReportingUnit? { return reportingUnitDb.loadOne(student.studentId, unitId) } - fun saveReportingUnits(reportingUnits: List): List { + suspend fun saveReportingUnits(reportingUnits: List): List { return reportingUnitDb.insertAll(reportingUnits) } - fun deleteReportingUnits(reportingUnits: List) { + suspend fun deleteReportingUnits(reportingUnits: List) { reportingUnitDb.deleteAll(reportingUnits) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt index 1fd8b08e3..6b11c2cc9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt @@ -4,25 +4,22 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class ReportingUnitRemote @Inject constructor(private val sdk: Sdk) { - fun getReportingUnits(student: Student): Single> { - return sdk.init(student).getReportingUnits().map { - it.map { unit -> - ReportingUnit( - studentId = sdk.studentId, - realId = unit.id, - roles = unit.roles, - senderId = unit.senderId, - senderName = unit.senderName, - shortName = unit.short - ) - } + suspend fun getReportingUnits(student: Student): List { + return sdk.init(student).getReportingUnits().map { unit -> + ReportingUnit( + studentId = sdk.studentId, + realId = unit.id, + roles = unit.roles, + senderId = unit.senderId, + senderName = unit.senderName, + shortName = unit.short + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt index ee5440984..70aefb9fd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt @@ -1,48 +1,34 @@ package io.github.wulkanowy.data.repositories.reportingunit -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.ReportingUnit import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Maybe -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class ReportingUnitRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: ReportingUnitLocal, private val remote: ReportingUnitRemote ) { - fun getReportingUnits(student: Student, forceRefresh: Boolean = false): Single> { - return local.getReportingUnits(student).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getReportingUnits(student) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getReportingUnits(student).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteReportingUnits(old.uniqueSubtract(new)) - local.saveReportingUnits(new.uniqueSubtract(old)) - } - }.flatMap { local.getReportingUnits(student).toSingle(emptyList()) } - ) + suspend fun getReportingUnits(student: Student, forceRefresh: Boolean = false): List { + return local.getReportingUnits(student).filter { !forceRefresh }.ifEmpty { + val new = remote.getReportingUnits(student) + val old = local.getReportingUnits(student) + + local.deleteReportingUnits(old.uniqueSubtract(new)) + local.saveReportingUnits(new.uniqueSubtract(old)) + + local.getReportingUnits(student) + } } - fun getReportingUnit(student: Student, unitId: Int): Maybe { - return local.getReportingUnit(student, unitId) - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) getReportingUnits(student, true) - else Single.error(UnknownHostException()) - }.flatMapMaybe { - local.getReportingUnit(student, unitId) - } - ) + suspend fun getReportingUnit(student: Student, unitId: Int): ReportingUnit { + return local.getReportingUnit(student, unitId) ?: run { + getReportingUnits(student, true) + + return local.getReportingUnit(student, unitId)!! + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt index d87272875..c8479b8f6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolLocal.kt @@ -3,20 +3,19 @@ package io.github.wulkanowy.data.repositories.school import io.github.wulkanowy.data.db.dao.SchoolDao import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.data.db.entities.Semester -import io.reactivex.Maybe import javax.inject.Inject class SchoolLocal @Inject constructor(private val schoolDb: SchoolDao) { - fun saveSchool(school: School) { + suspend fun saveSchool(school: School) { schoolDb.insertAll(listOf(school)) } - fun deleteSchool(school: School) { + suspend fun deleteSchool(school: School) { schoolDb.deleteAll(listOf(school)) } - fun getSchool(semester: Semester): Maybe { + suspend fun getSchool(semester: Semester): School? { return schoolDb.load(semester.studentId, semester.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt index 6a95a446b..4d2e0cd6c 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRemote.kt @@ -5,15 +5,14 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject class SchoolRemote @Inject constructor(private val sdk: Sdk) { - fun getSchoolInfo(student: Student, semester: Semester): Single { + suspend fun getSchoolInfo(student: Student, semester: Semester): School { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getSchool() - .map { + .let { School( studentId = semester.studentId, classId = semester.classId, diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt index 1715a28d5..9ca945d06 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/school/SchoolRepository.kt @@ -1,42 +1,29 @@ package io.github.wulkanowy.data.repositories.school -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.School import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class SchoolRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: SchoolLocal, private val remote: SchoolRemote ) { - fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean = false): Maybe { - return local.getSchool(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getSchoolInfo(student, semester) - else Single.error(UnknownHostException()) - }.flatMapMaybe { new -> - local.getSchool(semester) - .doOnSuccess { old -> - if (new != old) { - local.deleteSchool(old) - local.saveSchool(new) - } - } - .doOnComplete { - local.saveSchool(new) - } - }.flatMap({ local.getSchool(semester) }, { Maybe.error(it) }, - { local.getSchool(semester) }) - ) + suspend fun getSchoolInfo(student: Student, semester: Semester, forceRefresh: Boolean = false): School { + return local.getSchool(semester).takeIf { it != null && !forceRefresh } ?: run { + val new = remote.getSchoolInfo(student, semester) + val old = local.getSchool(semester) + + if (new != old && old != null) { + local.deleteSchool(old) + local.saveSchool(new) + } + local.saveSchool(new) + + local.getSchool(semester)!! + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt index 3d98785cd..629431c80 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt @@ -3,22 +3,21 @@ package io.github.wulkanowy.data.repositories.semester import io.github.wulkanowy.data.db.dao.SemesterDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterLocal @Inject constructor(private val semesterDb: SemesterDao) { - fun saveSemesters(semesters: List) { + suspend fun saveSemesters(semesters: List) { semesterDb.insertAll(semesters) } - fun deleteSemesters(semesters: List) { + suspend fun deleteSemesters(semesters: List) { semesterDb.deleteAll(semesters) } - fun getSemesters(student: Student): Maybe> { - return semesterDb.loadAll(student.studentId, student.classId).filter { it.isNotEmpty() } + suspend fun getSemesters(student: Student): List { + return semesterDb.loadAll(student.studentId, student.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt index 90f0e1d71..e1a920b6f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt @@ -4,29 +4,26 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterRemote @Inject constructor(private val sdk: Sdk) { - fun getSemesters(student: Student): Single> { - return sdk.init(student).getSemesters().map { semesters -> - semesters.map { - Semester( - studentId = student.studentId, - diaryId = it.diaryId, - diaryName = it.diaryName, - schoolYear = it.schoolYear, - semesterId = it.semesterId, - semesterName = it.semesterNumber, - start = it.start, - end = it.end, - classId = it.classId, - unitId = it.unitId - ) - } + suspend fun getSemesters(student: Student): List { + return sdk.init(student).getSemesters().map { + Semester( + studentId = student.studentId, + diaryId = it.diaryId, + diaryName = it.diaryName, + schoolYear = it.schoolYear, + semesterId = it.semesterId, + semesterName = it.semesterNumber, + start = it.start, + end = it.end, + classId = it.classId, + unitId = it.unitId + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt index 68946beef..aeb424008 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt @@ -1,47 +1,42 @@ package io.github.wulkanowy.data.repositories.semester -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.getCurrentOrLast import io.github.wulkanowy.utils.isCurrent import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class SemesterRepository @Inject constructor( private val remote: SemesterRemote, - private val local: SemesterLocal, - private val settings: InternetObservingSettings + private val local: SemesterLocal ) { - fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false): Single> { - return local.getSemesters(student).filter { !forceRefresh }.filter { semesters -> - when { - Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> semesters.firstOrNull { it.isCurrent }?.diaryId != 0 - refreshOnNoCurrent -> semesters.any { semester -> semester.isCurrent } - else -> true - } - }.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getSemesters(student) - else Single.error(UnknownHostException()) - }.flatMap { new -> - if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!") - - local.getSemesters(student).toSingle(emptyList()).doOnSuccess { old -> - local.deleteSemesters(old.uniqueSubtract(new)) - local.saveSemesters(new.uniqueSubtract(old)) + suspend fun getSemesters(student: Student, forceRefresh: Boolean = false, refreshOnNoCurrent: Boolean = false): List { + return local.getSemesters(student).let { semesters -> + semesters.filter { + !forceRefresh && when { + Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API -> semesters.firstOrNull { it.isCurrent }?.diaryId != 0 + refreshOnNoCurrent -> semesters.any { semester -> semester.isCurrent } + else -> true } - }.flatMap { local.getSemesters(student).toSingle(emptyList()) }) + } + }.ifEmpty { + val new = remote.getSemesters(student) + if (new.isEmpty()) throw IllegalArgumentException("Empty semester list!") + + val old = local.getSemesters(student) + local.deleteSemesters(old.uniqueSubtract(new)) + local.saveSemesters(new.uniqueSubtract(old)) + + local.getSemesters(student) + } } - fun getCurrentSemester(student: Student, forceRefresh: Boolean = false): Single { - return getSemesters(student, forceRefresh).map { it.getCurrentOrLast() } + suspend fun getCurrentSemester(student: Student, forceRefresh: Boolean = false): Semester { + return getSemesters(student, forceRefresh).getCurrentOrLast() } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt index 06b9bb4ac..5a4322f36 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt @@ -6,9 +6,6 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.security.decrypt import io.github.wulkanowy.utils.security.encrypt -import io.reactivex.Completable -import io.reactivex.Maybe -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @@ -18,47 +15,41 @@ class StudentLocal @Inject constructor( private val context: Context ) { - fun saveStudents(students: List): Single> { - return Single.fromCallable { - studentDb.insertAll(students.map { - if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) it.copy(password = encrypt(it.password, context)) - else it - }) - } + suspend fun saveStudents(students: List): List { + return studentDb.insertAll(students.map { + if (Sdk.Mode.valueOf(it.loginMode) != Sdk.Mode.API) it.copy(password = encrypt(it.password, context)) + else it + }) } - fun getStudents(decryptPass: Boolean): Maybe> { - return studentDb.loadAll() - .map { list -> list.map { it.apply { if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } } - .filter { it.isNotEmpty() } - } - - fun getStudentById(id: Int): Maybe { - return studentDb.loadById(id).map { - it.apply { - if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) - } - } - } - - fun getCurrentStudent(decryptPass: Boolean): Maybe { - return studentDb.loadCurrent().map { + suspend fun getStudents(decryptPass: Boolean): List { + return studentDb.loadAll().map { it.apply { if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } } - fun setCurrentStudent(student: Student): Completable { - return Completable.fromCallable { - studentDb.run { - resetCurrent() - updateCurrent(student.id) - } + suspend fun getStudentById(id: Int): Student? { + return studentDb.loadById(id)?.apply { + if (Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) } } - fun logoutStudent(student: Student): Completable { - return Completable.fromCallable { studentDb.delete(student) } + suspend fun getCurrentStudent(decryptPass: Boolean): Student? { + return studentDb.loadCurrent()?.apply { + if (decryptPass && Sdk.Mode.valueOf(loginMode) != Sdk.Mode.API) password = decrypt(password) + } + } + + suspend fun setCurrentStudent(student: Student) { + return studentDb.run { + resetCurrent() + updateCurrent(student.id) + } + } + + suspend fun logoutStudent(student: Student) { + return studentDb.delete(student) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt index 4c0ffd820..74d66fedd 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.data.repositories.student import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.sdk.Sdk -import io.reactivex.Single import org.threeten.bp.LocalDateTime.now import javax.inject.Inject import javax.inject.Singleton @@ -38,15 +37,15 @@ class StudentRemote @Inject constructor(private val sdk: Sdk) { } } - fun getStudentsMobileApi(token: String, pin: String, symbol: String): Single> { - return sdk.getStudentsFromMobileApi(token, pin, symbol, "").map { mapStudents(it, "", "") } + suspend fun getStudentsMobileApi(token: String, pin: String, symbol: String): List { + return mapStudents(sdk.getStudentsFromMobileApi(token, pin, symbol, ""), "", "") } - fun getStudentsScrapper(email: String, password: String, scrapperBaseUrl: String, symbol: String): Single> { - return sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol).map { mapStudents(it, email, password) } + suspend fun getStudentsScrapper(email: String, password: String, scrapperBaseUrl: String, symbol: String): List { + return mapStudents(sdk.getStudentsFromScrapper(email, password, scrapperBaseUrl, symbol), email, password) } - fun getStudentsHybrid(email: String, password: String, scrapperBaseUrl: String, symbol: String): Single> { - return sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol).map { mapStudents(it, email, password) } + suspend fun getStudentsHybrid(email: String, password: String, scrapperBaseUrl: String, symbol: String): List { + return mapStudents(sdk.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol), email, password) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt index bebd1eb9c..e47332ae3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt @@ -1,73 +1,53 @@ package io.github.wulkanowy.data.repositories.student -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.exceptions.NoCurrentStudentException -import io.reactivex.Completable -import io.reactivex.Maybe -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class StudentRepository @Inject constructor( private val local: StudentLocal, - private val remote: StudentRemote, - private val settings: InternetObservingSettings + private val remote: StudentRemote ) { - fun isStudentSaved(): Single = local.getStudents(false).isEmpty.map { !it } + suspend fun isStudentSaved(): Boolean = local.getStudents(false).isNotEmpty() - fun isCurrentStudentSet(): Single = local.getCurrentStudent(false).isEmpty.map { !it } + suspend fun isCurrentStudentSet(): Boolean = local.getCurrentStudent(false)?.isCurrent ?: false - fun getStudentsApi(pin: String, symbol: String, token: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getStudentsMobileApi(token, pin, symbol) - else Single.error(UnknownHostException("No internet connection")) - } + suspend fun getStudentsApi(pin: String, symbol: String, token: String): List { + return remote.getStudentsMobileApi(token, pin, symbol) } - fun getStudentsScrapper(email: String, password: String, endpoint: String, symbol: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getStudentsScrapper(email, password, endpoint, symbol) - else Single.error(UnknownHostException("No internet connection")) - } + suspend fun getStudentsScrapper(email: String, password: String, endpoint: String, symbol: String): List { + return remote.getStudentsScrapper(email, password, endpoint, symbol) } - fun getStudentsHybrid(email: String, password: String, endpoint: String, symbol: String): Single> { - return ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getStudentsHybrid(email, password, endpoint, symbol) - else Single.error(UnknownHostException("No internet connection")) - } + suspend fun getStudentsHybrid(email: String, password: String, endpoint: String, symbol: String): List { + return remote.getStudentsHybrid(email, password, endpoint, symbol) } - fun getSavedStudents(decryptPass: Boolean = true): Single> { - return local.getStudents(decryptPass).toSingle(emptyList()) + suspend fun getSavedStudents(decryptPass: Boolean = true): List { + return local.getStudents(decryptPass) } - fun getStudentById(id: Int): Single { - return local.getStudentById(id) - .switchIfEmpty(Maybe.error(NoCurrentStudentException())) - .toSingle() + suspend fun getStudentById(id: Int): Student { + return local.getStudentById(id) ?: throw NoCurrentStudentException() } - fun getCurrentStudent(decryptPass: Boolean = true): Single { - return local.getCurrentStudent(decryptPass) - .switchIfEmpty(Maybe.error(NoCurrentStudentException())) - .toSingle() + suspend fun getCurrentStudent(decryptPass: Boolean = true): Student { + return local.getCurrentStudent(decryptPass) ?: throw NoCurrentStudentException() } - fun saveStudents(students: List): Single> { + suspend fun saveStudents(students: List): List { return local.saveStudents(students) } - fun switchStudent(student: Student): Completable { + suspend fun switchStudent(student: Student) { return local.setCurrentStudent(student) } - fun logoutStudent(student: Student): Completable { + suspend fun logoutStudent(student: Student) { return local.logoutStudent(student) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt index f8c13e6c2..1f9dfff32 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt @@ -3,23 +3,21 @@ package io.github.wulkanowy.data.repositories.subject import io.github.wulkanowy.data.db.dao.SubjectDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Subject -import io.reactivex.Maybe import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectLocal @Inject constructor(private val subjectDao: SubjectDao) { - fun getSubjects(semester: Semester): Maybe> { + suspend fun getSubjects(semester: Semester): List { return subjectDao.loadAll(semester.diaryId, semester.studentId) - .filter { it.isNotEmpty() } } - fun saveSubjects(subjects: List) { + suspend fun saveSubjects(subjects: List) { subjectDao.insertAll(subjects) } - fun deleteSubjects(subjects: List) { + suspend fun deleteSubjects(subjects: List) { subjectDao.deleteAll(subjects) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt index d30232f82..624a5a00a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt @@ -5,25 +5,22 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectRemote @Inject constructor(private val sdk: Sdk) { - fun getSubjects(student: Student, semester: Semester): Single> { + suspend fun getSubjects(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getSubjects() - .map { subjects -> - subjects.map { - Subject( - studentId = semester.studentId, - diaryId = semester.diaryId, - name = it.name, - realId = it.id - ) - } + .map { + Subject( + studentId = semester.studentId, + diaryId = semester.diaryId, + name = it.name, + realId = it.id + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt index 649904da1..646e3642a 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt @@ -1,38 +1,27 @@ package io.github.wulkanowy.data.repositories.subject -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Subject import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class SubjectRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: SubjectLocal, private val remote: SubjectRemote ) { - fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getSubjects(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getSubjects(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getSubjects(semester) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteSubjects(old.uniqueSubtract(new)) - local.saveSubjects(new.uniqueSubtract(old)) - } - }.flatMap { - local.getSubjects(semester).toSingle(emptyList()) - }) + suspend fun getSubjects(student: Student, semester: Semester, forceRefresh: Boolean = false): List { + return local.getSubjects(semester).filter { !forceRefresh }.ifEmpty { + val new = remote.getSubjects(student, semester) + val old = local.getSubjects(semester) + + local.deleteSubjects(old.uniqueSubtract(new)) + local.saveSubjects(new.uniqueSubtract(old)) + + local.getSubjects(semester) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt index dd2be5e58..53680b7b3 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherLocal.kt @@ -3,20 +3,19 @@ package io.github.wulkanowy.data.repositories.teacher import io.github.wulkanowy.data.db.dao.TeacherDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Teacher -import io.reactivex.Maybe import javax.inject.Inject class TeacherLocal @Inject constructor(private val teacherDb: TeacherDao) { - fun saveTeachers(teachers: List) { + suspend fun saveTeachers(teachers: List) { teacherDb.insertAll(teachers) } - fun deleteTeachers(teachers: List) { + suspend fun deleteTeachers(teachers: List) { teacherDb.deleteAll(teachers) } - fun getTeachers(semester: Semester): Maybe> { - return teacherDb.loadAll(semester.studentId, semester.classId).filter { it.isNotEmpty() } + suspend fun getTeachers(semester: Semester): List { + return teacherDb.loadAll(semester.studentId, semester.classId) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt index 01552f748..1d1caa686 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRemote.kt @@ -5,26 +5,23 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @Singleton class TeacherRemote @Inject constructor(private val sdk: Sdk) { - fun getTeachers(student: Student, semester: Semester): Single> { + suspend fun getTeachers(student: Student, semester: Semester): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getTeachers(semester.semesterId) - .map { teachers -> - teachers.map { - Teacher( - studentId = semester.studentId, - name = it.name, - subject = it.subject, - shortName = it.short, - classId = semester.classId - ) - } + .map { + Teacher( + studentId = semester.studentId, + name = it.name, + subject = it.subject, + shortName = it.short, + classId = semester.classId + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt index 3c10be73f..a540e78c4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/teacher/TeacherRepository.kt @@ -1,35 +1,27 @@ package io.github.wulkanowy.data.repositories.teacher -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Teacher import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class TeacherRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: TeacherLocal, private val remote: TeacherRemote ) { - fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean = false): Single> { - return local.getTeachers(semester).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings) - .flatMap { - if (it) remote.getTeachers(student, semester) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getTeachers(semester).toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteTeachers(old.uniqueSubtract(new)) - local.saveTeachers(new.uniqueSubtract(old)) - } - }.flatMap { local.getTeachers(semester).toSingle(emptyList()) }) + suspend fun getTeachers(student: Student, semester: Semester, forceRefresh: Boolean = false): List { + return local.getTeachers(semester).filter { !forceRefresh }.ifEmpty { + val new = remote.getTeachers(student, semester) + val old = local.getTeachers(semester) + + local.deleteTeachers(old.uniqueSubtract(new)) + local.saveTeachers(new.uniqueSubtract(old)) + + local.getTeachers(semester) + } } } 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 e074ce2a1..a90c664c0 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 @@ -3,7 +3,6 @@ package io.github.wulkanowy.data.repositories.timetable import io.github.wulkanowy.data.db.dao.TimetableDao import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Timetable -import io.reactivex.Maybe import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -11,15 +10,15 @@ import javax.inject.Singleton @Singleton class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao) { - fun saveTimetable(timetables: List) { + suspend fun saveTimetable(timetables: List) { timetableDb.insertAll(timetables) } - fun deleteTimetable(timetables: List) { + suspend 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() } + suspend fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): List { + return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate) } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt index 22cb947db..71db8854f 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt @@ -5,7 +5,6 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init -import io.reactivex.Single import org.threeten.bp.LocalDate import javax.inject.Inject import javax.inject.Singleton @@ -13,31 +12,29 @@ import javax.inject.Singleton @Singleton class TimetableRemote @Inject constructor(private val sdk: Sdk) { - fun getTimetable(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> { + suspend fun getTimetable(student: Student, semester: Semester, startDate: LocalDate, endDate: LocalDate): List { return sdk.init(student).switchDiary(semester.diaryId, semester.schoolYear) .getTimetable(startDate, endDate) - .map { lessons -> - lessons.map { - Timetable( - studentId = semester.studentId, - diaryId = semester.diaryId, - number = it.number, - start = it.start, - end = it.end, - date = it.date, - subject = it.subject, - subjectOld = it.subjectOld, - group = it.group, - room = it.room, - roomOld = it.roomOld, - teacher = it.teacher, - teacherOld = it.teacherOld, - info = it.info, - isStudentPlan = it.studentPlan, - changes = it.changes, - canceled = it.canceled - ) - } + .map { + Timetable( + studentId = semester.studentId, + diaryId = semester.diaryId, + number = it.number, + start = it.start, + end = it.end, + date = it.date, + subject = it.subject, + subjectOld = it.subjectOld, + group = it.group, + room = it.room, + roomOld = it.roomOld, + teacher = it.teacher, + teacherOld = it.teacherOld, + info = it.info, + isStudentPlan = it.studentPlan, + changes = it.changes, + canceled = it.canceled + ) } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt index 4a7a0eb24..b34075524 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt @@ -1,53 +1,41 @@ package io.github.wulkanowy.data.repositories.timetable -import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper -import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday +import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.uniqueSubtract -import io.reactivex.Single import org.threeten.bp.LocalDate -import java.net.UnknownHostException import javax.inject.Inject import javax.inject.Singleton @Singleton class TimetableRepository @Inject constructor( - private val settings: InternetObservingSettings, private val local: TimetableLocal, private val remote: TimetableRemote, private val schedulerHelper: TimetableNotificationSchedulerHelper ) { - fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> { - return Single.fromCallable { start.monday to end.sunday }.flatMap { (monday, sunday) -> - local.getTimetable(semester, monday, sunday).filter { !forceRefresh } - .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap { - if (it) remote.getTimetable(student, semester, monday, sunday) - else Single.error(UnknownHostException()) - }.flatMap { new -> - local.getTimetable(semester, monday, sunday) - .toSingle(emptyList()) - .doOnSuccess { old -> - local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) - local.saveTimetable(new.uniqueSubtract(old).also { schedulerHelper.scheduleNotifications(it, student) }.map { item -> - item.also { new -> - old.singleOrNull { new.start == it.start }?.let { old -> - return@map new.copy( - room = if (new.room.isEmpty()) old.room else new.room, - teacher = if (new.teacher.isEmpty() && !new.changes && !old.changes) old.teacher else new.teacher - ) - } - } - }) - } - }.flatMap { - local.getTimetable(semester, monday, sunday).toSingle(emptyList()) - }).map { list -> list.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } } - } + suspend fun getTimetable(student: Student, semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): List { + return local.getTimetable(semester, start.monday, start.sunday).filter { !forceRefresh }.ifEmpty { + val new = remote.getTimetable(student, semester, start.monday, start.sunday) + val old = local.getTimetable(semester, start.monday, start.sunday) + + local.deleteTimetable(old.uniqueSubtract(new).also { schedulerHelper.cancelScheduled(it) }) + local.saveTimetable(new.uniqueSubtract(old).also { schedulerHelper.scheduleNotifications(it, student) }.map { item -> + item.also { new -> + old.singleOrNull { new.start == it.start }?.let { old -> + return@map new.copy( + room = if (new.room.isEmpty()) old.room else new.room, + teacher = if (new.teacher.isEmpty() && !new.changes && !old.changes) old.teacher else new.teacher + ) + } + } + }) + + local.getTimetable(semester, start.monday, start.sunday) + }.filter { it.date in start..end }.also { schedulerHelper.scheduleNotifications(it, student) } } } 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 db5ff59b3..29b66a4e5 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -7,6 +7,7 @@ import dagger.Module import dagger.Provides import io.github.wulkanowy.WulkanowyApp import io.github.wulkanowy.utils.AppInfo +import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.SchedulersProvider import javax.inject.Singleton @@ -21,6 +22,10 @@ internal class AppModule { @Provides fun provideSchedulersProvider() = SchedulersProvider() + @Singleton + @Provides + fun provideDispatchersProvider() = DispatchersProvider() + @Singleton @Provides fun provideAppWidgetManager(context: Context): AppWidgetManager = AppWidgetManager.getInstance(context) diff --git a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt index 0130f4673..283f0a984 100644 --- a/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt +++ b/app/src/main/java/io/github/wulkanowy/services/alarm/TimetableNotificationReceiver.kt @@ -19,6 +19,7 @@ import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toLocalDateTime +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -53,7 +54,7 @@ class TimetableNotificationReceiver : BroadcastReceiver() { Timber.d("Receiving intent... ${intent.toUri(0)}") AndroidInjection.inject(this, context) - studentRepository.getCurrentStudent(false) + rxSingle { studentRepository.getCurrentStudent(false) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ 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 index 126d856aa..fc02ca759 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt @@ -15,13 +15,15 @@ import io.github.wulkanowy.R import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.services.sync.channels.DebugChannel import io.github.wulkanowy.services.sync.works.Work import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable import io.reactivex.Single +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import kotlin.random.Random @@ -37,11 +39,11 @@ class SyncWorker @AssistedInject constructor( override fun createWork(): Single { Timber.i("SyncWorker is starting") - return studentRepository.isCurrentStudentSet() + return rxSingle { studentRepository.isCurrentStudentSet() } .filter { true } - .flatMap { studentRepository.getCurrentStudent().toMaybe() } + .flatMap { rxMaybe { studentRepository.getCurrentStudent() } } .flatMapCompletable { student -> - semesterRepository.getCurrentSemester(student, true) + rxSingle { semesterRepository.getCurrentSemester(student, true) } .flatMapCompletable { semester -> Completable.mergeDelayError(works.map { work -> work.create(student, semester) 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 index 5f7d7efa2..f4333f337 100644 --- 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 @@ -4,6 +4,7 @@ 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 kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject class AttendanceSummaryWork @Inject constructor( @@ -11,7 +12,7 @@ class AttendanceSummaryWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true).ignoreElement() + return rxCompletable { attendanceSummaryRepository.getAttendanceSummary(student, semester, -1, true) } } } 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 index 063b74825..069b6c8f4 100644 --- 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 @@ -6,13 +6,13 @@ import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable 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(student, semester, now().monday, now().sunday, true) - .ignoreElement() + return rxCompletable { attendanceRepository.getAttendance(student, semester, now().monday, now().sunday, true) } } } 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 index 26f79a0d5..8914fd369 100644 --- 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 @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRe import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import org.threeten.bp.LocalDate.now import javax.inject.Inject @@ -14,8 +15,7 @@ class CompletedLessonWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true) - .ignoreElement() + return rxCompletable { completedLessonsRepository.getCompletedLessons(student, semester, now().monday, now().sunday, true) } } } 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 index 1ef97f59c..0a4512958 100644 --- 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 @@ -6,12 +6,13 @@ import io.github.wulkanowy.data.repositories.exam.ExamRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable 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(student, semester, now().monday, now().sunday, true).ignoreElement() + return rxCompletable { examRepository.getExams(student, semester, now().monday, now().sunday, true) } } } 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 index c4681fb8f..0a1a9eee5 100644 --- 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 @@ -4,13 +4,13 @@ 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 kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject class GradeStatisticsWork @Inject constructor(private val gradeStatisticsRepository: GradeStatisticsRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, forceRefresh = true) - .ignoreElement() + return rxCompletable { gradeStatisticsRepository.getGradesStatistics(student, semester, "Wszystkie", false, forceRefresh = true) } } } 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 index fcdaad6e6..252966d64 100644 --- 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 @@ -19,6 +19,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -30,17 +32,16 @@ class GradeWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable) - .ignoreElement() - .concatWith(Completable.concatArray(gradeRepository.getNotNotifiedGrades(semester).flatMapCompletable { + return rxCompletable { gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable) } + .concatWith(Completable.concatArray(rxSingle { gradeRepository.getNotNotifiedGrades(semester) }.flatMapCompletable { if (it.isNotEmpty()) notifyDetails(it) - gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) - }, gradeRepository.getNotNotifiedPredictedGrades(semester).flatMapCompletable { + rxCompletable { gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true }) } + }, rxSingle { gradeRepository.getNotNotifiedPredictedGrades(semester) }.flatMapCompletable { if (it.isNotEmpty()) notifyPredicted(it) - gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) - }, gradeRepository.getNotNotifiedFinalGrades(semester).flatMapCompletable { + rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isPredictedGradeNotified = true }) } + }, rxSingle { gradeRepository.getNotNotifiedFinalGrades(semester) }.flatMapCompletable { if (it.isNotEmpty()) notifyFinal(it) - gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) + rxCompletable { gradeRepository.updateGradesSummary(it.onEach { grade -> grade.isFinalGradeNotified = true }) } })) } 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 index 186d57b03..2bf5315a2 100644 --- 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 @@ -6,12 +6,13 @@ import io.github.wulkanowy.data.repositories.homework.HomeworkRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable 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(student, semester, now().monday, now().sunday, true).ignoreElement() + return rxCompletable { homeworkRepository.getHomework(student, semester, now().monday, now().sunday, true) } } } 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 index f19af4df6..1389566bd 100644 --- 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 @@ -18,6 +18,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxMaybe import javax.inject.Inject import kotlin.random.Random @@ -29,11 +31,11 @@ class LuckyNumberWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable) - .flatMap { luckyNumberRepository.getNotNotifiedLuckyNumber(student) } + return rxMaybe { luckyNumberRepository.getLuckyNumber(student, true, preferencesRepository.isNotificationsEnable) } + .flatMap { rxMaybe { luckyNumberRepository.getNotNotifiedLuckyNumber(student) } } .flatMapCompletable { notify(it) - luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) + rxCompletable { luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true }) } } } 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 index b8773dbca..a805fe6bc 100644 --- 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 @@ -19,6 +19,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -30,11 +32,11 @@ class MessageWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable) - .flatMap { messageRepository.getNotNotifiedMessages(student) } + return rxSingle { messageRepository.getMessages(student, semester, RECEIVED, true, preferencesRepository.isNotificationsEnable) } + .flatMap { rxSingle { messageRepository.getNotNotifiedMessages(student) } } .flatMapCompletable { if (it.isNotEmpty()) notify(it) - messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) + rxCompletable { messageRepository.updateMessages(it.onEach { message -> message.isNotified = true }) } } } 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 index 4fc92ffcc..f33c64023 100644 --- 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 @@ -18,6 +18,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.getCompatColor import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject import kotlin.random.Random @@ -29,11 +31,11 @@ class NoteWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable) - .flatMap { noteRepository.getNotNotifiedNotes(student) } + return rxSingle { noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable) } + .flatMap { rxSingle { noteRepository.getNotNotifiedNotes(student) } } .flatMapCompletable { if (it.isNotEmpty()) notify(it) - noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) + rxCompletable { noteRepository.updateNotes(it.onEach { note -> note.isNotified = true }) } } } 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 index fa610dee4..704150981 100644 --- 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 @@ -5,6 +5,8 @@ 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 kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class RecipientWork @Inject constructor( @@ -13,10 +15,10 @@ class RecipientWork @Inject constructor( ) : Work { override fun create(student: Student, semester: Semester): Completable { - return reportingUnitRepository.getReportingUnits(student, true) + return rxSingle { reportingUnitRepository.getReportingUnits(student, true) } .flatMapCompletable { units -> Completable.mergeDelayError(units.map { - recipientRepository.getRecipients(student, 2, it, true).ignoreElement() + rxCompletable { recipientRepository.getRecipients(student, 2, it, true) } }) } } diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt index 5a7a41d8d..f3ebf9eea 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/works/TeacherWork.kt @@ -4,11 +4,12 @@ import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.teacher.TeacherRepository import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable import javax.inject.Inject class TeacherWork @Inject constructor(private val teacherRepository: TeacherRepository) : Work { override fun create(student: Student, semester: Semester): Completable { - return teacherRepository.getTeachers(student, semester, true).ignoreElement() + return rxCompletable { teacherRepository.getTeachers(student, semester, true) } } } 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 index d79d24033..7d6438d7a 100644 --- 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 @@ -6,13 +6,13 @@ import io.github.wulkanowy.data.repositories.timetable.TimetableRepository import io.github.wulkanowy.utils.sunday import io.github.wulkanowy.utils.monday import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxCompletable 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(student, semester, now().monday, now().sunday, true) - .ignoreElement() + return rxCompletable { timetableRepository.getTimetable(student, semester, now().monday, now().sunday, true) } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 9f0b4047c..d9dbc362b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -4,6 +4,8 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Completable import io.reactivex.disposables.CompositeDisposable +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber open class BasePresenter( @@ -27,13 +29,13 @@ open class BasePresenter( fun onExpiredLoginSelected() { Timber.i("Attempt to switch the student after the session expires") - disposable.add(studentRepository.getCurrentStudent(false) - .flatMapCompletable { studentRepository.logoutStudent(it) } - .andThen(studentRepository.getSavedStudents(false)) + disposable.add(rxSingle { studentRepository.getCurrentStudent(false) } + .flatMapCompletable { rxCompletable { studentRepository.logoutStudent(it) } } + .andThen(rxSingle { studentRepository.getSavedStudents(false) }) .flatMapCompletable { if (it.isNotEmpty()) { Timber.i("Switching current student") - studentRepository.switchStudent(it[0]) + rxCompletable { studentRepository.switchStudent(it[0]) } } else Completable.complete() } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt index 896e4ff1c..627e0a5f5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorDialog.kt @@ -13,9 +13,9 @@ import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService import io.github.wulkanowy.R import io.github.wulkanowy.databinding.DialogErrorBinding -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException -import io.github.wulkanowy.sdk.exception.ServiceUnavailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.ServiceUnavailableException import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.getString import io.github.wulkanowy.utils.openAppInMarket diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index f746b36f8..c88e4d87d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -3,7 +3,7 @@ package io.github.wulkanowy.ui.base import android.content.res.Resources import com.chuckerteam.chucker.api.ChuckerCollector import io.github.wulkanowy.data.exceptions.NoCurrentStudentException -import io.github.wulkanowy.sdk.exception.BadCredentialsException +import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.utils.getString import io.github.wulkanowy.utils.security.ScramblerException import timber.log.Timber diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt index 416a59ce5..ae149fa14 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/contributor/ContributorPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class ContributorPresenter @Inject constructor( @@ -30,7 +31,7 @@ class ContributorPresenter @Inject constructor( } private fun loadData() { - disposable.add(appCreatorRepository.getAppCreators() + disposable.add(rxSingle { appCreatorRepository.getAppCreators() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.showProgress(false) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt index 33eb1122d..e1ec23a12 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/logviewer/LogViewerPresenter.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -22,7 +23,7 @@ class LogViewerPresenter @Inject constructor( } fun onShareLogsSelected(): Boolean { - disposable.add(loggerRepository.getLogFiles() + disposable.add(rxSingle { loggerRepository.getLogFiles() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ files -> @@ -40,7 +41,7 @@ class LogViewerPresenter @Inject constructor( } private fun loadLogFile() { - disposable.add(loggerRepository.getLastLogLines() + disposable.add(rxSingle { loggerRepository.getLastLogLines() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ 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 b5fbcdb63..1dd32cf90 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 @@ -7,6 +7,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Single +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -36,11 +38,11 @@ class AccountPresenter @Inject constructor( fun onLogoutConfirm() { Timber.i("Attempt to logout current user ") - disposable.add(studentRepository.getCurrentStudent() - .flatMapCompletable { studentRepository.logoutStudent(it) } - .andThen(studentRepository.getSavedStudents(false)) + disposable.add(rxSingle { studentRepository.getCurrentStudent(false) } + .flatMapCompletable { rxCompletable { studentRepository.logoutStudent(it) } } + .andThen(rxSingle { studentRepository.getSavedStudents(false) }) .flatMap { - if (it.isNotEmpty()) studentRepository.switchStudent(it[0]).toSingle { it } + if (it.isNotEmpty()) rxCompletable { studentRepository.switchStudent(it[0]) }.toSingle { it } else Single.just(it) } .subscribeOn(schedulers.backgroundThread) @@ -69,7 +71,7 @@ class AccountPresenter @Inject constructor( view?.dismissView() } else { Timber.i("Attempt to change a student") - disposable.add(studentRepository.switchStudent(student) + disposable.add(rxSingle { studentRepository.switchStudent(student) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.dismissView() } @@ -93,7 +95,7 @@ class AccountPresenter @Inject constructor( private fun loadData() { Timber.i("Loading account data started") - disposable.add(studentRepository.getSavedStudents(false) + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .map { createAccountItems(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt index f58d0617f..f177d0191 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt @@ -16,6 +16,7 @@ import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousOrSameSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -167,8 +168,8 @@ class AttendancePresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -185,10 +186,10 @@ class AttendancePresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - attendanceRepository.getAttendance(student, semester, date, date, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { attendanceRepository.getAttendance(student, semester, date, date, forceRefresh) } } } .map { list -> @@ -231,10 +232,10 @@ class AttendancePresenter @Inject constructor( private fun excuseAbsence(reason: String?, toExcuseList: List) { Timber.i("Excusing absence started") disposable.apply { - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { attendanceRepository.excuseForAbsence(student, semester, toExcuseList, reason) } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index 33e18c2e7..f694a8d0c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.Month import timber.log.Timber import javax.inject.Inject @@ -76,10 +77,10 @@ class AttendanceSummaryPresenter @Inject constructor( currentSubjectId = subjectId disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { - attendanceSummaryRepository.getAttendanceSummary(student, it, subjectId, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { + rxSingle { attendanceSummaryRepository.getAttendanceSummary(student, it, subjectId, forceRefresh) } } } .map { items -> items.sortedByDescending { if (it.month.value <= Month.JUNE.value) it.month.value + 12 else it.month.value } } @@ -127,10 +128,10 @@ class AttendanceSummaryPresenter @Inject constructor( private fun loadSubjects() { Timber.i("Loading attendance summary subjects started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - subjectRepository.getSubjects(student, semester) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { subjectRepository.getSubjects(student, semester) } } } .doOnSuccess { subjects = it } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 1140cb020..844fb263a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -89,8 +90,8 @@ class ExamPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -107,10 +108,10 @@ class ExamPresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { examRepository.getExams(student, semester, currentDate.monday, currentDate.sunday, forceRefresh) } } } .map { createExamItems(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt index af1699323..ab6c507bb 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProvider.kt @@ -13,7 +13,6 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.BOTH_SEMESTERS import io.github.wulkanowy.ui.modules.grade.GradeAverageMode.ONE_SEMESTER import io.github.wulkanowy.utils.calcAverage import io.github.wulkanowy.utils.changeModifier -import io.reactivex.Single import javax.inject.Inject class GradeAverageProvider @Inject constructor( @@ -26,8 +25,8 @@ class GradeAverageProvider @Inject constructor( private val minusModifier get() = preferencesRepository.gradeMinusModifier - fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): Single> { - return semesterRepository.getSemesters(student).flatMap { semesters -> + suspend fun getGradesDetailsWithAverage(student: Student, semesterId: Int, forceRefresh: Boolean = false): List { + return semesterRepository.getSemesters(student).let { semesters -> when (preferencesRepository.gradeAverageMode) { ONE_SEMESTER -> getSemesterDetailsWithAverage(student, semesters.single { it.semesterId == semesterId }, forceRefresh) BOTH_SEMESTERS -> calculateBothSemestersAverage(student, semesters, semesterId, forceRefresh) @@ -36,15 +35,15 @@ class GradeAverageProvider @Inject constructor( } } - private fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { + private suspend fun calculateBothSemestersAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): List { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMap { selectedDetails -> + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).let { selectedDetails -> val isAnyAverage = selectedDetails.any { it.average != .0 } if (selectedSemester != firstSemester) { - getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).let { secondDetails -> selectedDetails.map { selected -> val second = secondDetails.singleOrNull { it.subject == selected.subject } selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { @@ -53,19 +52,19 @@ class GradeAverageProvider @Inject constructor( } else (selected.average + (second?.average ?: selected.average)) / 2) } } - } else Single.just(selectedDetails) + } else selectedDetails } } - private fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): Single> { + private suspend fun calculateAllYearAverage(student: Student, semesters: List, semesterId: Int, forceRefresh: Boolean): List { val selectedSemester = semesters.single { it.semesterId == semesterId } val firstSemester = semesters.single { it.diaryId == selectedSemester.diaryId && it.semesterName == 1 } - return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).flatMap { selectedDetails -> + return getSemesterDetailsWithAverage(student, selectedSemester, forceRefresh).let { selectedDetails -> val isAnyAverage = selectedDetails.any { it.average != .0 } if (selectedSemester != firstSemester) { - getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).map { secondDetails -> + getSemesterDetailsWithAverage(student, firstSemester, forceRefresh).let { secondDetails -> selectedDetails.map { selected -> val second = secondDetails.singleOrNull { it.subject == selected.subject } selected.copy(average = if (!isAnyAverage || preferencesRepository.gradeAverageForceCalc) { @@ -73,12 +72,12 @@ class GradeAverageProvider @Inject constructor( } else selected.average) } } - } else Single.just(selectedDetails) + } else selectedDetails } } - private fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): Single> { - return gradeRepository.getGrades(student, semester, forceRefresh).map { (details, summaries) -> + private suspend fun getSemesterDetailsWithAverage(student: Student, semester: Semester, forceRefresh: Boolean): List { + return gradeRepository.getGrades(student, semester, forceRefresh).let { (details, summaries) -> val isAnyAverage = summaries.any { it.average != .0 } val allGrades = details.groupBy { it.subject } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index ec66e2bd9..65f6598d1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCurrentOrLast +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import java.util.concurrent.TimeUnit.MILLISECONDS import javax.inject.Inject @@ -99,8 +100,8 @@ class GradePresenter @Inject constructor( private fun loadData() { Timber.i("Loading grade data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getSemesters(it, refreshOnNoCurrent = true) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getSemesters(it, refreshOnNoCurrent = true) } } .delay(200, MILLISECONDS) .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) 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 37f2c935a..a99e3a547 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 @@ -11,6 +11,8 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -62,13 +64,13 @@ class GradeDetailsPresenter @Inject constructor( fun onMarkAsReadSelected(): Boolean { Timber.i("Select mark grades as read") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getSemesters(it) } - .flatMap { gradeRepository.getUnreadGrades(it.first { item -> item.semesterId == currentSemesterId }) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getSemesters(it) } } + .flatMap { rxSingle { 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") - gradeRepository.updateGrades(it) + rxCompletable { gradeRepository.updateGrades(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -126,8 +128,8 @@ class GradeDetailsPresenter @Inject constructor( private fun loadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade details data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { @@ -196,7 +198,7 @@ class GradeDetailsPresenter @Inject constructor( private fun updateGrade(grade: Grade) { Timber.i("Attempt to update grade ${grade.id}") - disposable.add(gradeRepository.updateGrade(grade) + disposable.add(rxCompletable { gradeRepository.updateGrade(grade) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt index 590e9ce12..b2c56ed22 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt @@ -10,6 +10,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -116,10 +117,10 @@ class GradeStatisticsPresenter @Inject constructor( private fun loadSubjects() { Timber.i("Loading grade stats subjects started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - subjectRepository.getSubjects(student, semester) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { subjectRepository.getSubjects(student, semester) } } } .doOnSuccess { subjects = it } @@ -141,16 +142,18 @@ class GradeStatisticsPresenter @Inject constructor( currentType = type Timber.i("Loading grade stats data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getSemesters(student).flatMap { semesters -> + rxSingle { semesterRepository.getSemesters(student) }.flatMap { semesters -> val semester = semesters.first { item -> item.semesterId == semesterId } - with(gradeStatisticsRepository) { - when (type) { - ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) - ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) - ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) + rxSingle { + with(gradeStatisticsRepository) { + when (type) { + ViewType.SEMESTER -> getGradesStatistics(student, semester, currentSubjectName, true, forceRefresh) + ViewType.PARTIAL -> getGradesStatistics(student, semester, currentSubjectName, false, forceRefresh) + ViewType.POINTS -> getGradesPointsStatistics(student, semester, currentSubjectName, forceRefresh) + } } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt index 229a0107d..62b95d2e9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryPresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.modules.grade.GradeAverageProvider import io.github.wulkanowy.ui.modules.grade.GradeDetailsWithAverage import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -29,8 +30,8 @@ class GradeSummaryPresenter @Inject constructor( fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) { Timber.i("Loading grade summary data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { averageProvider.getGradesDetailsWithAverage(it, semesterId, forceRefresh) } } .map { createGradeSummaryItems(it) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index 41735a23f..fe31dfae2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.isHolidays import io.github.wulkanowy.utils.monday import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.ofEpochDay import timber.log.Timber @@ -78,8 +79,8 @@ class HomeworkPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -100,10 +101,10 @@ class HomeworkPresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - homeworkRepository.getHomework(student, semester, currentDate, currentDate, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { homeworkRepository.getHomework(student, semester, currentDate, currentDate, forceRefresh) } } } .map { createHomeworkItem(it) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt index 04a97b8cd..c0475b7c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -26,7 +27,7 @@ class HomeworkDetailsPresenter @Inject constructor( fun toggleDone(homework: Homework) { Timber.i("Homework details update start") - disposable.add(homeworkRepository.toggleDone(homework) + disposable.add(rxSingle { homeworkRepository.toggleDone(homework) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt index 5ed181bf1..f30825cff 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt @@ -4,11 +4,11 @@ import android.content.res.Resources import android.database.sqlite.SQLiteConstraintException import com.chuckerteam.chucker.api.ChuckerCollector import io.github.wulkanowy.R -import io.github.wulkanowy.sdk.exception.BadCredentialsException import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException import io.github.wulkanowy.sdk.mobile.exception.InvalidTokenException import io.github.wulkanowy.sdk.mobile.exception.TokenDeadException +import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt index 3a0d4a0d8..27205a2af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt @@ -9,6 +9,7 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank import io.reactivex.Single +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -162,10 +163,12 @@ class LoginAdvancedPresenter @Inject constructor( val symbol = view?.formSymbolValue.orEmpty() val token = view?.formTokenValue.orEmpty() - return when (Sdk.Mode.valueOf(view?.formLoginType ?: "")) { - Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) - Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper(email, password, endpoint, symbol) - Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(email, password, endpoint, symbol) + return rxSingle { + when (Sdk.Mode.valueOf(view?.formLoginType ?: "")) { + Sdk.Mode.API -> studentRepository.getStudentsApi(pin, symbol, token) + Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper(email, password, endpoint, symbol) + Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(email, password, endpoint, symbol) + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 997e1e85f..ccbe4bbbe 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -74,7 +75,7 @@ class LoginFormPresenter @Inject constructor( if (!validateCredentials(email, password, host)) return - disposable.add(studentRepository.getStudentsScrapper(email, password, host, symbol) + disposable.add(rxSingle { studentRepository.getStudentsScrapper(email, password, host, symbol) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt index 9a21fb910..84d5af06b 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverPresenter.kt @@ -6,6 +6,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -55,7 +56,7 @@ class LoginRecoverPresenter @Inject constructor( if (!validateInput(username, host)) return - disposable.add(recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" }) + disposable.add(rxSingle { recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" }) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { @@ -98,7 +99,7 @@ class LoginRecoverPresenter @Inject constructor( with(disposable) { clear() - add(recoverRepository.sendRecoverRequest(host, symbol, username, reCaptchaResponse) + add(rxSingle { recoverRepository.sendRecoverRequest(host, symbol, username, reCaptchaResponse) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index db25c0da3..91d3e66cd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -7,6 +7,8 @@ import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank +import kotlinx.coroutines.rx2.rxCompletable +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import java.io.Serializable import javax.inject.Inject @@ -71,7 +73,7 @@ class LoginStudentSelectPresenter @Inject constructor( private fun loadData(students: List) { resetSelectedState() this.students = students - disposable.add(studentRepository.getSavedStudents() + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .map { savedStudents -> students.map { student -> student to savedStudents.any { compareStudents(student, it) } @@ -95,9 +97,9 @@ class LoginStudentSelectPresenter @Inject constructor( } private fun registerStudents(students: List) { - disposable.add(studentRepository.saveStudents(students) + disposable.add(rxSingle { studentRepository.saveStudents(students) } .map { students.first().apply { id = it.first() } } - .flatMapCompletable { studentRepository.switchStudent(it) } + .flatMapCompletable { rxCompletable { studentRepository.switchStudent(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 1f9e66b70..b7687ed3f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.ifNullOrBlank import io.reactivex.Single +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import java.io.Serializable import javax.inject.Inject @@ -48,7 +49,7 @@ class LoginSymbolPresenter @Inject constructor( disposable.add( Single.fromCallable { loginData } - .flatMap { studentRepository.getStudentsScrapper(it.first, it.second, it.third, symbol) } + .flatMap { rxSingle { studentRepository.getStudentsScrapper(it.first, it.second, it.third, symbol) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt index e932fedc0..1273a54c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt @@ -6,6 +6,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -35,8 +37,8 @@ class LuckyNumberPresenter @Inject constructor( Timber.i("Loading lucky number started") disposable.apply { clear() - add(studentRepository.getCurrentStudent() - .flatMapMaybe { luckyNumberRepository.getLuckyNumber(it, forceRefresh) } + add(rxSingle { studentRepository.getCurrentStudent() } + .flatMapMaybe { rxMaybe { luckyNumberRepository.getLuckyNumber(it, forceRefresh) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index 468f9b575..bb7ea75b2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class LuckyNumberWidgetConfigurePresenter @Inject constructor( @@ -45,7 +46,7 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( } private fun loadData() { - disposable.add(studentRepository.getSavedStudents(false) + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } .map { (students, currentStudentId) -> students.map { student -> student to (student.id == currentStudentId) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 55a048b32..204fc79ad 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -24,6 +24,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.utils.SchedulersProvider import io.reactivex.Maybe +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -139,23 +141,23 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? { return try { - studentRepository.isStudentSaved() + rxSingle { studentRepository.isStudentSaved() } .filter { true } - .flatMap { studentRepository.getSavedStudents().toMaybe() } + .flatMap { rxMaybe { studentRepository.getSavedStudents() } } .flatMap { students -> val student = students.singleOrNull { student -> student.id == studentId } when { student != null -> Maybe.just(student) studentId != 0L -> { - studentRepository.isCurrentStudentSet() + rxSingle { studentRepository.isCurrentStudentSet() } .filter { true } - .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } + .flatMap { rxMaybe { studentRepository.getCurrentStudent(false) } } .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } else -> Maybe.empty() } } - .flatMap { luckyNumberRepository.getLuckyNumber(it) } + .flatMap { rxMaybe { luckyNumberRepository.getLuckyNumber(it) } } .subscribeOn(schedulers.backgroundThread) .blockingGet() } catch (e: Exception) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index db7996bca..b94c46123 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -12,6 +12,7 @@ import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -56,8 +57,8 @@ class MessagePreviewPresenter @Inject constructor( Timber.i("Loading message ${message.messageId} preview started") disposable.apply { clear() - add(studentRepository.getStudentById(message.studentId) - .flatMap { messageRepository.getMessage(it, message, true) } + add(rxSingle { studentRepository.getStudentById(message.studentId) } + .flatMap { rxSingle { messageRepository.getMessage(it, message, true) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doFinally { view?.showProgress(false) } @@ -152,8 +153,8 @@ class MessagePreviewPresenter @Inject constructor( private fun deleteMessage() { message?.let { message -> - disposable.add(studentRepository.getCurrentStudent() - .flatMap { messageRepository.deleteMessage(it, message) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { messageRepository.deleteMessage(it, message) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index aec79f9db..545409c6d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -15,6 +15,8 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Completable +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -98,19 +100,19 @@ class SendMessagePresenter @Inject constructor( var selectedRecipientChips: List = emptyList() Timber.i("Loading recipients started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it).map { semester -> it to semester } } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) }.map { semester -> it to semester } } .flatMapCompletable { (student, semester) -> - reportingUnitRepository.getReportingUnit(student, semester.unitId) + rxMaybe { reportingUnitRepository.getReportingUnit(student, semester.unitId) } .doOnSuccess { reportingUnit = it } - .flatMap { recipientRepository.getRecipients(student, 2, it).toMaybe() } + .flatMap { rxMaybe { recipientRepository.getRecipients(student, 2, it) } } .doOnSuccess { Timber.i("Loading recipients result: Success, fetched %d recipients", it.size) recipientChips = createChips(it) } .flatMapCompletable { if (message == null || reply != true) Completable.complete() - else recipientRepository.getMessageRecipients(student, message) + else rxSingle { recipientRepository.getMessageRecipients(student, message) } .doOnSuccess { Timber.i("Loaded message recipients to reply result: Success, fetched %d recipients", it.size) selectedRecipientChips = createChips(it) @@ -148,8 +150,8 @@ class SendMessagePresenter @Inject constructor( private fun sendMessage(subject: String, content: String, recipients: List) { Timber.i("Sending message started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { messageRepository.sendMessage(it, subject, content, recipients) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { messageRepository.sendMessage(it, subject, content, recipients) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .doOnSubscribe { 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 533f5ac85..0e96836b1 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 @@ -11,6 +11,7 @@ import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString import io.reactivex.subjects.PublishSubject +import kotlinx.coroutines.rx2.rxSingle import me.xdrop.fuzzywuzzy.FuzzySearch import timber.log.Timber import java.util.Locale @@ -83,10 +84,10 @@ class MessageTabPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean) { Timber.i("Loading $folder message data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student) - .flatMap { messageRepository.getMessages(student, it, folder, forceRefresh) } + rxSingle { semesterRepository.getCurrentSemester(student) } + .flatMap { rxSingle { messageRepository.getMessages(student, it, folder, forceRefresh) } } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt index 459ca17e8..b1dea5dff 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/MobileDevicePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -48,10 +49,10 @@ class MobileDevicePresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading mobile devices data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - mobileDeviceRepository.getDevices(student, semester, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { mobileDeviceRepository.getDevices(student, semester, forceRefresh) } } } .subscribeOn(schedulers.backgroundThread) @@ -114,11 +115,11 @@ class MobileDevicePresenter @Inject constructor( fun onUnregisterConfirmed(device: MobileDevice) { Timber.i("Unregister device started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - mobileDeviceRepository.unregisterDevice(student, semester, device) - .flatMap { mobileDeviceRepository.getDevices(student, semester, it) } + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { mobileDeviceRepository.unregisterDevice(student, semester, device) } + .flatMap { rxSingle { mobileDeviceRepository.getDevices(student, semester, it) } } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt index 6a2a6b98b..1c0506f0d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/mobiledevice/token/MobileDeviceTokenPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -28,10 +29,10 @@ class MobileDeviceTokenPresenter @Inject constructor( private fun loadData() { Timber.i("Mobile device registration data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - mobileDeviceRepository.getToken(student, semester) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { mobileDeviceRepository.getToken(student, semester) } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 7d301c66b..4009b4f6c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -49,9 +50,9 @@ class NotePresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading note data started") - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it).map { semester -> semester to it } } - .flatMap { noteRepository.getNotes(it.second, it.first, forceRefresh) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) }.map { semester -> semester to it } } + .flatMap { rxSingle { noteRepository.getNotes(it.second, it.first, forceRefresh) } } .map { items -> items.sortedByDescending { it.date } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) @@ -107,7 +108,7 @@ class NotePresenter @Inject constructor( private fun updateNote(note: Note) { Timber.i("Attempt to update note ${note.id}") - disposable.add(noteRepository.updateNote(note) + disposable.add(rxSingle { noteRepository.updateNote(note) } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ Timber.i("Update note result: Success") }) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt index 7beff922d..334c60a32 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolPresenter.kt @@ -7,6 +7,8 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -63,10 +65,10 @@ class SchoolPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading school info started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMapMaybe { student -> - semesterRepository.getCurrentSemester(student).flatMapMaybe { - schoolRepository.getSchoolInfo(student, it, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMapMaybe { + rxMaybe { schoolRepository.getSchoolInfo(student, it, forceRefresh) } } } .subscribeOn(schedulers.backgroundThread) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt index 0d8eec6d4..2ccba71f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/teacher/TeacherPresenter.kt @@ -7,6 +7,7 @@ import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import timber.log.Timber import javax.inject.Inject @@ -51,10 +52,10 @@ class TeacherPresenter @Inject constructor( private fun loadData(forceRefresh: Boolean = false) { Timber.i("Loading teachers data started") - disposable.add(studentRepository.getCurrentStudent() + disposable.add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - teacherRepository.getTeachers(student, semester, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { teacherRepository.getTeachers(student, semester, forceRefresh) } } } .map { it.filter { teacher -> teacher.name.isNotBlank() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 44b53c5f9..bfdd17660 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -4,6 +4,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class SplashPresenter @Inject constructor( @@ -14,7 +15,7 @@ class SplashPresenter @Inject constructor( override fun onAttachView(view: SplashView) { super.onAttachView(view) - disposable.add(studentRepository.isCurrentStudentSet() + disposable.add(rxSingle { studentRepository.isCurrentStudentSet() } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index e1ce005e3..da76854a2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -16,6 +16,7 @@ import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of @@ -111,8 +112,8 @@ class TimetablePresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -129,10 +130,10 @@ class TimetablePresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - timetableRepository.getTimetable(student, semester, currentDate, currentDate, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { timetableRepository.getTimetable(student, semester, currentDate, currentDate, forceRefresh) } } } .map { items -> items.filter { if (prefRepository.showWholeClassPlan == "no") it.isStudentPlan else true } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt index c1389cedd..767c2f313 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsErrorHandler.kt @@ -2,7 +2,7 @@ package io.github.wulkanowy.ui.modules.timetable.completed import android.content.res.Resources import com.chuckerteam.chucker.api.ChuckerCollector -import io.github.wulkanowy.sdk.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index f72d753a9..c6a2cf84d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -14,6 +14,7 @@ import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -93,8 +94,8 @@ class CompletedLessonsPresenter @Inject constructor( } private fun setBaseDateOnHolidays() { - disposable.add(studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } + disposable.add(rxSingle { studentRepository.getCurrentStudent() } + .flatMap { rxSingle { semesterRepository.getCurrentSemester(it) } } .subscribeOn(schedulers.backgroundThread) .observeOn(schedulers.mainThread) .subscribe({ @@ -111,10 +112,10 @@ class CompletedLessonsPresenter @Inject constructor( currentDate = date disposable.apply { clear() - add(studentRepository.getCurrentStudent() + add(rxSingle { studentRepository.getCurrentStudent() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).flatMap { semester -> - completedLessonsRepository.getCompletedLessons(student, semester, currentDate, currentDate, forceRefresh) + rxSingle { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxSingle { completedLessonsRepository.getCompletedLessons(student, semester, currentDate, currentDate, forceRefresh) } } } .map { items -> items.sortedBy { it.number } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt index 57dde824c..cc2ac4bb0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -8,6 +8,7 @@ import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider +import kotlinx.coroutines.rx2.rxSingle import javax.inject.Inject class TimetableWidgetConfigurePresenter @Inject constructor( @@ -50,7 +51,7 @@ class TimetableWidgetConfigurePresenter @Inject constructor( } private fun loadData() { - disposable.add(studentRepository.getSavedStudents(false) + disposable.add(rxSingle { studentRepository.getSavedStudents(false) } .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } .map { (students, currentStudentId) -> students.map { student -> student to (student.id == currentStudentId) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index dd223ad8b..6c043e9e7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -25,6 +25,8 @@ import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import timber.log.Timber @@ -100,9 +102,9 @@ class TimetableWidgetFactory( private fun updateLessons(date: LocalDate, studentId: Long) { lessons = try { - studentRepository.isStudentSaved() + rxSingle { studentRepository.isStudentSaved() } .filter { true } - .flatMap { studentRepository.getSavedStudents().toMaybe() } + .flatMap { rxMaybe { studentRepository.getSavedStudents() } } .flatMap { val student = it.singleOrNull { student -> student.id == studentId } @@ -110,8 +112,8 @@ class TimetableWidgetFactory( else Maybe.empty() } .flatMap { student -> - semesterRepository.getCurrentSemester(student).toMaybe().flatMap { semester -> - timetableRepository.getTimetable(student, semester, date, date).toMaybe() + rxMaybe { semesterRepository.getCurrentSemester(student) }.flatMap { semester -> + rxMaybe { timetableRepository.getTimetable(student, semester, date, date) } } } .map { items -> items.sortedWith(compareBy({ it.number }, { !it.isStudentPlan })) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 79888f83d..8beef08a3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -31,6 +31,8 @@ import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe +import kotlinx.coroutines.rx2.rxMaybe +import kotlinx.coroutines.rx2.rxSingle import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import timber.log.Timber @@ -184,17 +186,17 @@ class TimetableWidgetProvider : BroadcastReceiver() { private fun getStudent(studentId: Long, appWidgetId: Int): Student? { return try { - studentRepository.isStudentSaved() + rxSingle { studentRepository.isStudentSaved() } .filter { true } - .flatMap { studentRepository.getSavedStudents(false).toMaybe() } + .flatMap { rxMaybe { studentRepository.getSavedStudents(false) } } .flatMap { students -> val student = students.singleOrNull { student -> student.id == studentId } when { student != null -> Maybe.just(student) studentId != 0L -> { - studentRepository.isCurrentStudentSet() + rxSingle { studentRepository.isCurrentStudentSet() } .filter { true } - .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } + .flatMap { rxMaybe { studentRepository.getCurrentStudent(false) } } .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } else -> Maybe.empty() diff --git a/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt b/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt new file mode 100644 index 000000000..ecc8e05eb --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/DispatchersProvider.kt @@ -0,0 +1,10 @@ +package io.github.wulkanowy.utils + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers + +open class DispatchersProvider { + + open val backgroundThread: CoroutineDispatcher + get() = Dispatchers.IO +} diff --git a/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt index a2d0384e3..de9f656a2 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/ResourcesExtension.kt @@ -2,11 +2,11 @@ package io.github.wulkanowy.utils import android.content.res.Resources import io.github.wulkanowy.R -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException -import io.github.wulkanowy.sdk.exception.NotLoggedInException -import io.github.wulkanowy.sdk.exception.PasswordChangeRequiredException -import io.github.wulkanowy.sdk.exception.ServiceUnavailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException +import io.github.wulkanowy.sdk.scrapper.exception.ServiceUnavailableException +import io.github.wulkanowy.sdk.scrapper.login.NotLoggedInException +import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException import java.io.InterruptedIOException import java.net.SocketTimeoutException import java.net.UnknownHostException diff --git a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt index e87177c1d..d7850b072 100644 --- a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -4,8 +4,8 @@ import android.util.Log import com.google.firebase.crashlytics.FirebaseCrashlytics import fr.bipi.tressence.base.FormatterPriorityTree import fr.bipi.tressence.common.StackTraceRecorder -import io.github.wulkanowy.sdk.exception.FeatureDisabledException import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException +import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException import java.io.InterruptedIOException import java.net.SocketTimeoutException import java.net.UnknownHostException diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt deleted file mode 100644 index 954c191ce..000000000 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/UnitTestInternetObservingStrategy.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.wulkanowy.data.repositories - -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingStrategy -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.error.ErrorHandler -import io.reactivex.Observable -import io.reactivex.Single - -class UnitTestInternetObservingStrategy(var isInternetConnection: Boolean = true) : InternetObservingStrategy { - - override fun checkInternetConnectivity(host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Single { - return Single.just(isInternetConnection) - } - - override fun observeInternetConnectivity(initialIntervalInMs: Int, intervalInMs: Int, host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Observable { - return Observable.just(isInternetConnection) - } - - override fun getDefaultPingHost() = "localhost" -} diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt index a5b79cfdd..a4ca16b6d 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemoteTest.kt @@ -6,10 +6,11 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Attendance import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -34,16 +35,16 @@ class AttendanceRemoteTest { @Test fun getAttendanceTest() { every { mockSdk.init(student) } returns mockSdk - every { + coEvery { mockSdk.getAttendance( of(2018, 9, 10), of(2018, 9, 15), 1 ) - } returns Single.just(listOf( + } returns listOf( getAttendance(of(2018, 9, 10)), getAttendance(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -51,10 +52,12 @@ class AttendanceRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val attendance = AttendanceRemote(mockSdk).getAttendance(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val attendance = runBlocking { + AttendanceRemote(mockSdk).getAttendance(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } assertEquals(2, attendance.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt index 10307feee..31b2af5bc 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemoteTest.kt @@ -6,10 +6,11 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.CompletedLesson import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert import org.junit.Before import org.junit.Test @@ -34,15 +35,15 @@ class CompletedLessonsRemoteTest { @Test fun getCompletedLessonsTest() { every { mockSdk.init(student) } returns mockSdk - every { + coEvery { mockSdk.getCompletedLessons( of(2018, 9, 10), of(2018, 9, 15) ) - } returns Single.just(listOf( + } returns listOf( getCompletedLesson(of(2018, 9, 10)), getCompletedLesson(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -50,10 +51,12 @@ class CompletedLessonsRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val completed = CompletedLessonsRemote(mockSdk).getCompletedLessons(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val completed = runBlocking { + CompletedLessonsRemote(mockSdk).getCompletedLessons(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } Assert.assertEquals(2, completed.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt index aecef4728..868f60258 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/exam/ExamRemoteTest.kt @@ -6,10 +6,11 @@ import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Exam import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -36,26 +37,28 @@ class ExamRemoteTest { every { mockSdk.init(student) } returns mockSdk every { mockSdk.switchDiary(1, 2019) } returns mockSdk - every { + coEvery { mockSdk.getExams( of(2018, 9, 10), of(2018, 9, 15), 1 ) - } returns Single.just(listOf( + } returns listOf( getExam(of(2018, 9, 10)), getExam(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 every { semesterMock.schoolYear } returns 2019 every { semesterMock.semesterId } returns 1 - val exams = ExamRemote(mockSdk).getExams(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val exams = runBlocking { + ExamRemote(mockSdk).getExams(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } assertEquals(2, exams.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt index 77c87025d..cd2a3070b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemoteTest.kt @@ -7,10 +7,11 @@ import io.github.wulkanowy.sdk.pojo.GradePointsStatistics import io.github.wulkanowy.sdk.pojo.GradeStatistics import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -33,10 +34,10 @@ class GradeStatisticsRemoteTest { @Test fun getGradeStatisticsTest() { - every { mockSdk.getGradesPartialStatistics(1) } returns Single.just(listOf( + coEvery { mockSdk.getGradesPartialStatistics(1) } returns listOf( getGradeStatistics("Fizyka"), getGradeStatistics("Matematyka") - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -44,16 +45,16 @@ class GradeStatisticsRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val stats = GradeStatisticsRemote(mockSdk).getGradeStatistics(student, semesterMock, false).blockingGet() + val stats = runBlocking { GradeStatisticsRemote(mockSdk).getGradeStatistics(student, semesterMock, false) } assertEquals(2, stats.size) } @Test fun getGradePointsStatisticsTest() { - every { mockSdk.getGradesPointsStatistics(1) } returns Single.just(listOf( + coEvery { mockSdk.getGradesPointsStatistics(1) } returns listOf( getGradePointsStatistics("Fizyka"), getGradePointsStatistics("Matematyka") - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -61,7 +62,7 @@ class GradeStatisticsRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val stats = GradeStatisticsRemote(mockSdk).getGradePointsStatistics(student, semesterMock).blockingGet() + val stats = runBlocking { GradeStatisticsRemote(mockSdk).getGradePointsStatistics(student, semesterMock) } assertEquals(2, stats.size) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt index cbdf34fa8..84761ada5 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemoteTest.kt @@ -4,9 +4,10 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.utils.init import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.SpyK -import io.reactivex.Maybe +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -27,16 +28,17 @@ class LuckyNumberRemoteTest { @Test fun getLuckyNumberTest() { every { mockSdk.init(student) } returns mockSdk - every { mockSdk.getLuckyNumber("test") } returns Maybe.just(14) + coEvery { mockSdk.getLuckyNumber("test") } returns 14 every { mockSdk.diaryId } returns 1 - val luckyNumber = LuckyNumberRemote(mockSdk) - .getLuckyNumber(student) - .blockingGet() + val luckyNumber = runBlocking { + LuckyNumberRemote(mockSdk) + .getLuckyNumber(student) + } - assertEquals(14, luckyNumber.luckyNumber) - assertEquals(LocalDate.now(), luckyNumber.date) - assertEquals(student.studentId, luckyNumber.studentId) + assertEquals(14, luckyNumber?.luckyNumber) + assertEquals(LocalDate.now(), luckyNumber?.date) + assertEquals(student.studentId, luckyNumber?.studentId) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt index fcc4188a6..977e82057 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/message/MessageRepositoryTest.kt @@ -1,55 +1,48 @@ package io.github.wulkanowy.data.repositories.message import androidx.room.EmptyResultSetException -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy import io.github.wulkanowy.getMessageEntity -import io.reactivex.Single -import io.reactivex.observers.TestObserver +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.MockK +import io.mockk.just +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import java.net.UnknownHostException class MessageRepositoryTest { - @Mock + @MockK lateinit var local: MessageLocal - @Mock + @MockK lateinit var remote: MessageRemote - @Mock + @MockK lateinit var student: Student - private val testObservingStrategy = UnitTestInternetObservingStrategy() - private lateinit var repo: MessageRepository @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) - repo = MessageRepository(InternetObservingSettings.builder() - .strategy(testObservingStrategy) - .build(), local, remote) + repo = MessageRepository(local, remote) } @Test fun `throw error when message is not in the db`() { val testMessage = getMessageEntity(1, "", false) - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.error(EmptyResultSetException("No message in database"))) + coEvery { local.getMessageWithAttachment(student, testMessage) } throws EmptyResultSetException("No message in database") - val message = repo.getMessage(student, testMessage) - val messageObserver = TestObserver() - message.subscribe(messageObserver) - messageObserver.assertError(EmptyResultSetException::class.java) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + assertEquals(EmptyResultSetException::class.java, message.exceptionOrNull()?.javaClass) } @Test @@ -57,9 +50,9 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "Test", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) + coEvery { local.getMessageWithAttachment(student, testMessage) } returns messageWithAttachment - val message = repo.getMessage(student, testMessage).blockingGet() + val message = runBlocking { repo.getMessage(student, testMessage) } assertEquals("Test", message.message.content) } @@ -72,15 +65,15 @@ class MessageRepositoryTest { val mWa = MessageWithAttachment(testMessage, emptyList()) val mWaWithContent = MessageWithAttachment(testMessageWithContent, emptyList()) - `when`(local.getMessageWithAttachment(student, testMessage)) - .thenReturn(Single.just(mWa)) - .thenReturn(Single.just(mWaWithContent)) - `when`(remote.getMessagesContentDetails(student, testMessageWithContent)).thenReturn(Single.just("Test" to emptyList())) + coEvery { local.getMessageWithAttachment(student, testMessage) } returnsMany listOf(mWa, mWaWithContent) + coEvery { remote.getMessagesContentDetails(student, testMessageWithContent) } returns ("Test" to emptyList()) + coEvery { local.updateMessages(any()) } just Runs + coEvery { local.saveMessageAttachments(any()) } just Runs - val message = repo.getMessage(student, testMessage).blockingGet() + val message = runBlocking { repo.getMessage(student, testMessage) } assertEquals("Test", message.message.content) - verify(local).updateMessages(listOf(testMessageWithContent)) + coVerify { local.updateMessages(listOf(testMessageWithContent)) } } @Test @@ -88,13 +81,10 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "", false) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - testObservingStrategy.isInternetConnection = false - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) + coEvery { local.getMessageWithAttachment(student, testMessage) } throws UnknownHostException() - val message = repo.getMessage(student, testMessage) - val messageObserver = TestObserver() - message.subscribe(messageObserver) - messageObserver.assertError(UnknownHostException::class.java) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + assertEquals(UnknownHostException::class.java, message.exceptionOrNull()?.javaClass) } @Test @@ -102,12 +92,9 @@ class MessageRepositoryTest { val testMessage = getMessageEntity(123, "", true) val messageWithAttachment = MessageWithAttachment(testMessage, emptyList()) - testObservingStrategy.isInternetConnection = false - `when`(local.getMessageWithAttachment(student, testMessage)).thenReturn(Single.just(messageWithAttachment)) + coEvery { local.getMessageWithAttachment(student, testMessage) } throws UnknownHostException() - val message = repo.getMessage(student, testMessage) - val messageObserver = TestObserver() - message.subscribe(messageObserver) - messageObserver.assertError(UnknownHostException::class.java) + val message = runCatching { runBlocking { repo.getMessage(student, testMessage) } } + assertEquals(UnknownHostException::class.java, message.exceptionOrNull()?.javaClass) } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt index c586572f6..665185a6b 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/mobiledevice/MobileDeviceRepositoryTest.kt @@ -1,43 +1,38 @@ package io.github.wulkanowy.data.repositories.mobiledevice -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy import io.github.wulkanowy.getStudentEntity -import io.reactivex.Maybe -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.MockK +import io.mockk.just +import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDateTime.of class MobileDeviceRepositoryTest { - @Mock + @MockK private lateinit var semester: Semester - @Mock + @MockK private lateinit var mobileDeviceRemote: MobileDeviceRemote - @Mock + @MockK private lateinit var mobileDeviceLocal: MobileDeviceLocal private val student = getStudentEntity() private lateinit var mobileDeviceRepository: MobileDeviceRepository - private val settings = InternetObservingSettings.builder() - .strategy(UnitTestInternetObservingStrategy()) - .build() - @Before fun initTest() { - MockitoAnnotations.initMocks(this) - mobileDeviceRepository = MobileDeviceRepository(settings, mobileDeviceLocal, mobileDeviceRemote) + MockKAnnotations.init(this) + mobileDeviceRepository = MobileDeviceRepository(mobileDeviceLocal, mobileDeviceRemote) } @Test @@ -47,13 +42,15 @@ class MobileDeviceRepositoryTest { getDeviceEntity(2) ) - doReturn(Maybe.empty()).`when`(mobileDeviceLocal).getDevices(semester) - doReturn(Single.just(devices)).`when`(mobileDeviceRemote).getDevices(student, semester) + coEvery { mobileDeviceLocal.getDevices(semester) } returns emptyList() + coEvery { mobileDeviceLocal.deleteDevices(emptyList()) } just Runs + coEvery { mobileDeviceLocal.saveDevices(devices) } just Runs + coEvery { mobileDeviceRemote.getDevices(student, semester) } returns devices - mobileDeviceRepository.getDevices(student, semester).blockingGet() + runBlocking { mobileDeviceRepository.getDevices(student, semester) } - verify(mobileDeviceLocal).deleteDevices(emptyList()) - verify(mobileDeviceLocal).saveDevices(devices) + coVerify { mobileDeviceLocal.deleteDevices(emptyList()) } + coVerify { mobileDeviceLocal.saveDevices(devices) } } private fun getDeviceEntity(day: Int): MobileDevice { diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt index c00a771cc..161ce744f 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/semester/SemesterRepositoryTest.kt @@ -1,44 +1,39 @@ package io.github.wulkanowy.data.repositories.semester -import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings -import io.github.wulkanowy.data.db.entities.Semester -import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.UnitTestInternetObservingStrategy import io.github.wulkanowy.createSemesterEntity -import io.reactivex.Maybe -import io.reactivex.Single +import io.github.wulkanowy.data.db.entities.Student +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate.now class SemesterRepositoryTest { - @Mock + @MockK private lateinit var semesterRemote: SemesterRemote - @Mock + @MockK private lateinit var semesterLocal: SemesterLocal - @Mock + @MockK private lateinit var student: Student private lateinit var semesterRepository: SemesterRepository - private val settings = InternetObservingSettings.builder() - .strategy(UnitTestInternetObservingStrategy()) - .build() - @Before fun initTest() { - MockitoAnnotations.initMocks(this) - semesterRepository = SemesterRepository(semesterRemote, semesterLocal, settings) - doReturn("SCRAPPER").`when`(student).loginMode + MockKAnnotations.init(this) + semesterRepository = SemesterRepository(semesterRemote, semesterLocal) + every { student.loginMode } returns "SCRAPPER" } @Test @@ -48,33 +43,35 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.empty()).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(semesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns emptyList() + coEvery { semesterRemote.getSemesters(student) } returns semesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs - semesterRepository.getSemesters(student).blockingGet() + runBlocking { semesterRepository.getSemesters(student) } - verify(semesterLocal).deleteSemesters(emptyList()) - verify(semesterLocal).saveSemesters(semesters) + coVerify { semesterLocal.saveSemesters(semesters) } + coVerify { semesterLocal.deleteSemesters(emptyList()) } } @Test fun getSemesters_invalidDiary_api() { - doReturn("API").`when`(student).loginMode + every { student.loginMode } returns "API" val badSemesters = listOf( createSemesterEntity(0, 1, now().minusMonths(6), now().minusMonths(3)), createSemesterEntity(0, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.just(badSemesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns badSemesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) assertEquals(0, items[0].diaryId) } @Test fun getSemesters_invalidDiary_scrapper() { - doReturn("SCRAPPER").`when`(student).loginMode + every { student.loginMode } returns "SCRAPPER" val badSemesters = listOf( createSemesterEntity(0, 1, now().minusMonths(6), now().minusMonths(3)), createSemesterEntity(0, 2, now().minusMonths(3), now()) @@ -85,10 +82,12 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.just(badSemesters), Maybe.just(badSemesters), Maybe.just(goodSemesters)).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(goodSemesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returnsMany listOf(badSemesters, badSemesters, goodSemesters) + coEvery { semesterRemote.getSemesters(student) } returns goodSemesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) assertNotEquals(0, items[0].diaryId) } @@ -100,9 +99,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) } @@ -113,9 +112,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) } @@ -126,9 +125,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now(), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student) } assertEquals(2, items.size) } @@ -139,13 +138,15 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(3), now()) ) - doReturn(Maybe.empty()).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(semesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns emptyList() + coEvery { semesterRemote.getSemesters(student) } returns semesters + coEvery { semesterLocal.deleteSemesters(any()) } just Runs + coEvery { semesterLocal.saveSemesters(any()) } just Runs - semesterRepository.getSemesters(student, refreshOnNoCurrent = true).blockingGet() + runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } - verify(semesterLocal).deleteSemesters(emptyList()) - verify(semesterLocal).saveSemesters(semesters) + coVerify { semesterLocal.deleteSemesters(emptyList()) } + coVerify { semesterLocal.saveSemesters(semesters) } } @Test @@ -155,10 +156,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now().minusMonths(6), now().minusMonths(1)) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) - doReturn(Single.just(semesters)).`when`(semesterRemote).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } assertEquals(2, items.size) } @@ -169,9 +169,9 @@ class SemesterRepositoryTest { createSemesterEntity(1, 2, now(), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - val items = semesterRepository.getSemesters(student, refreshOnNoCurrent = true).blockingGet() + val items = runBlocking { semesterRepository.getSemesters(student, refreshOnNoCurrent = true) } assertEquals(2, items.size) } @@ -182,15 +182,15 @@ class SemesterRepositoryTest { createSemesterEntity(1, 1, now(), now()) ) - doReturn(Maybe.just(semesters)).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns semesters - semesterRepository.getCurrentSemester(student).blockingGet() + runBlocking { semesterRepository.getCurrentSemester(student) } } @Test(expected = RuntimeException::class) fun getCurrentSemester_emptyList() { - doReturn(Maybe.just(emptyList())).`when`(semesterLocal).getSemesters(student) + coEvery { semesterLocal.getSemesters(student) } returns emptyList() - semesterRepository.getCurrentSemester(student).blockingGet() + runBlocking { semesterRepository.getCurrentSemester(student) } } } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt index b6b195c91..fe1d97171 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/student/StudentRemoteTest.kt @@ -2,30 +2,29 @@ package io.github.wulkanowy.data.repositories.student import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Student -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.anyString -import org.mockito.Mockito.doReturn -import org.mockito.MockitoAnnotations class StudentRemoteTest { - @Mock + @MockK private lateinit var mockSdk: Sdk @Before fun initApi() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) } @Test fun testRemoteAll() { - doReturn(Single.just(listOf(getStudent("test")))).`when`(mockSdk).getStudentsFromScrapper(anyString(), anyString(), anyString(), anyString()) + coEvery { mockSdk.getStudentsFromScrapper(any(), any(), any(), any()) } returns listOf(getStudent("test")) - val students = StudentRemote(mockSdk).getStudentsScrapper("", "", "http://fakelog.cf", "").blockingGet() + val students = runBlocking { StudentRemote(mockSdk).getStudentsScrapper("", "", "http://fakelog.cf", "") } assertEquals(1, students.size) assertEquals("test", students.first().studentName) } diff --git a/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt b/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt index d2b4a6670..a88c87bd1 100644 --- a/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt +++ b/app/src/test/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemoteTest.kt @@ -5,10 +5,11 @@ import io.github.wulkanowy.getStudentEntity import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.pojo.Timetable import io.mockk.MockKAnnotations +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.SpyK -import io.reactivex.Single +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -33,15 +34,15 @@ class TimetableRemoteTest { @Test fun getTimetableTest() { - every { + coEvery { mockSdk.getTimetable( of(2018, 9, 10), of(2018, 9, 15) ) - } returns Single.just(listOf( + } returns listOf( getTimetable(of(2018, 9, 10)), getTimetable(of(2018, 9, 17)) - )) + ) every { semesterMock.studentId } returns 1 every { semesterMock.diaryId } returns 1 @@ -49,10 +50,12 @@ class TimetableRemoteTest { every { semesterMock.semesterId } returns 1 every { mockSdk.switchDiary(any(), any()) } returns mockSdk - val timetable = TimetableRemote(mockSdk).getTimetable(student, semesterMock, - of(2018, 9, 10), - of(2018, 9, 15) - ).blockingGet() + val timetable = runBlocking { + TimetableRemote(mockSdk).getTimetable(student, semesterMock, + of(2018, 9, 10), + of(2018, 9, 15) + ) + } assertEquals(2, timetable.size) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt index 984bbbcf8..85f85a37c 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/grade/GradeAverageProviderTest.kt @@ -8,26 +8,27 @@ import io.github.wulkanowy.data.repositories.grade.GradeRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.sdk.Sdk -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.of import org.threeten.bp.LocalDateTime class GradeAverageProviderTest { - @Mock + @MockK lateinit var preferencesRepository: PreferencesRepository - @Mock + @MockK lateinit var semesterRepository: SemesterRepository - @Mock + @MockK lateinit var gradeRepository: GradeRepository private lateinit var gradeAverageProvider: GradeAverageProvider @@ -82,24 +83,24 @@ class GradeAverageProviderTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns false + coEvery { semesterRepository.getSemesters(student) } returns semesters + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .33 gradeAverageProvider = GradeAverageProvider(semesterRepository, gradeRepository, preferencesRepository) } @Test fun `force calc current semester average with default modifiers in scraper mode`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus } @@ -108,15 +109,15 @@ class GradeAverageProviderTest { fun `force calc current semester average with custom modifiers in scraper mode`() { val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .33 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.5, items.single { it.subject == "Język polski" }.average, .0) // from details and after set custom plus/minus } @@ -125,15 +126,15 @@ class GradeAverageProviderTest { fun `force calc current semester average with custom modifiers in api mode`() { val student = student.copy(loginMode = Sdk.Mode.API.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode + every { preferencesRepository.gradePlusModifier } returns .33 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 } @@ -142,26 +143,26 @@ class GradeAverageProviderTest { fun `force calc current semester average with custom modifiers in hybrid mode`() { val student = student.copy(loginMode = Sdk.Mode.HYBRID.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) // useless in this mode - `when`(preferencesRepository.gradePlusModifier).thenReturn(.33) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 // useless in this mode + every { preferencesRepository.gradePlusModifier } returns .33 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGradeWithModifier to secondSummariesWithModifier)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { semesterRepository.getSemesters(student) } returns semesters + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGradeWithModifier to secondSummariesWithModifier) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(3.375, items.single { it.subject == "Język polski" }.average, .0) // (from details): 3.375 } @Test fun `calc current semester average`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(2.9, items.single { it.subject == "Matematyka" }.average, .0) // from summary: 2,9 @@ -170,11 +171,11 @@ class GradeAverageProviderTest { @Test fun `force calc current semester average`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ONE_SEMESTER) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ONE_SEMESTER + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(2.5, items.single { it.subject == "Matematyka" }.average, .0) // from details: 2,5 @@ -183,11 +184,11 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when current is first`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[1].semesterId) } assertEquals(2, items.size) assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summary): 3,5 @@ -196,18 +197,18 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average`() { - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS + every { preferencesRepository.gradeAverageForceCalc } returns false + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to listOf( getSummary(22, "Matematyka", 3.0), getSummary(22, "Fizyka", 3.5) - ))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + )) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( getSummary(22, "Matematyka", 3.5), getSummary(22, "Fizyka", 4.0) - ))) + )) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.25, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 3,0 + 3,5 → 3,25 @@ -216,15 +217,15 @@ class GradeAverageProviderTest { @Test fun `force calc full year average`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( getSummary(22, "Matematyka", 1.1), getSummary(22, "Fizyka", 7.26) - ))) + )) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -233,13 +234,13 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when no summaries`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to emptyList()) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to emptyList()) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -248,13 +249,13 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when no summaries`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to emptyList())) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to emptyList())) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to emptyList()) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to emptyList()) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -263,17 +264,17 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when missing summaries in both semesters`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to listOf( getSummary(22, "Matematyka", 4.0) - ))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to listOf( + )) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to listOf( getSummary(23, "Matematyka", 3.0) - ))) + )) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.5, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries ↑): 4,0 + 3,0 → 3,5 @@ -282,13 +283,13 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when missing summary in second semester`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries)) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries.dropLast(1))) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries.dropLast(1)) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 @@ -297,13 +298,13 @@ class GradeAverageProviderTest { @Test fun `calc both semesters average when missing summary in first semester`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(false) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns false + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries.dropLast(1)) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.4, items.single { it.subject == "Matematyka" }.average, .0) // (from summaries): 3,9 + 2,9 → 3,4 @@ -312,13 +313,13 @@ class GradeAverageProviderTest { @Test fun `force calc full year average when missing summary in first semester`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(firstGrades to firstSummaries.dropLast(1))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(secondGrades to secondSummaries)) + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (firstGrades to firstSummaries.dropLast(1)) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (secondGrades to secondSummaries) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(2, items.size) assertEquals(3.0, items.single { it.subject == "Matematyka" }.average, .0) // (from details): 3,5 + 2,5 → 3,0 @@ -327,10 +328,10 @@ class GradeAverageProviderTest { @Test fun `force calc both semesters average with different average from all grades and from two semesters`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -339,24 +340,24 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.2296, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → 5.229636363636364 } @Test fun `force calc full year average with different average from all grades and from two semesters`() { - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -365,14 +366,14 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.3, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.5429, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,732 → .average() } @@ -381,14 +382,14 @@ class GradeAverageProviderTest { fun `force calc both semesters average with different average from all grades and from two semesters with custom modifiers`() { val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.5) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .5 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.BOTH_SEMESTERS) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.BOTH_SEMESTERS + coEvery { semesterRepository.getSemesters(student) } returns semesters - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -397,14 +398,14 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.2636, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → 5.26363636 } @@ -413,14 +414,14 @@ class GradeAverageProviderTest { fun `force calc full year average with different average from all grades and from two semesters with custom modifiers`() { val student = student.copy(loginMode = Sdk.Mode.SCRAPPER.name) - `when`(preferencesRepository.gradeAverageForceCalc).thenReturn(true) - `when`(preferencesRepository.gradeMinusModifier).thenReturn(.33) - `when`(preferencesRepository.gradePlusModifier).thenReturn(.5) + every { preferencesRepository.gradeAverageForceCalc } returns true + every { preferencesRepository.gradeMinusModifier } returns .33 + every { preferencesRepository.gradePlusModifier } returns .5 - `when`(preferencesRepository.gradeAverageMode).thenReturn(GradeAverageMode.ALL_YEAR) - `when`(semesterRepository.getSemesters(student)).thenReturn(Single.just(semesters)) + every { preferencesRepository.gradeAverageMode } returns GradeAverageMode.ALL_YEAR + coEvery { semesterRepository.getSemesters(student) } returns semesters - `when`(gradeRepository.getGrades(student, semesters[1])).thenReturn(Single.just(listOf( + coEvery { gradeRepository.getGrades(student, semesters[1]) } returns (listOf( getGrade(22, "Fizyka", 5.0, weight = 2.0), getGrade(22, "Fizyka", 6.0, weight = 2.0), getGrade(22, "Fizyka", 5.0, weight = 4.0), @@ -429,14 +430,14 @@ class GradeAverageProviderTest { getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 4.0), getGrade(22, "Fizyka", 6.0, weight = 2.0) - ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0)))) - `when`(gradeRepository.getGrades(student, semesters[2])).thenReturn(Single.just(listOf( + ) to listOf(getSummary(semesterId = 22, subject = "Fizyka", average = .0))) + coEvery { gradeRepository.getGrades(student, semesters[2]) } returns (listOf( getGrade(23, "Fizyka", 5.0, weight = 1.0), getGrade(23, "Fizyka", 5.0, weight = 2.0), getGrade(23, "Fizyka", 4.0, modifier = 0.33, weight = 2.0) - ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0)))) + ) to listOf(getSummary(semesterId = 23, subject = "Fizyka", average = .0))) - val items = gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId).blockingGet() + val items = runBlocking { gradeAverageProvider.getGradesDetailsWithAverage(student, semesters[2].semesterId) } assertEquals(5.5555, items.single { it.subject == "Fizyka" }.average, .0001) // (from details): 5.72727272 + 4,8 → .average() } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt index 4ef5904fb..921b32eda 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/LoginPresenterTest.kt @@ -2,32 +2,32 @@ package io.github.wulkanowy.ui.modules.login import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.mockk.MockKAnnotations +import io.mockk.clearMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.verify import org.junit.Assert.assertNotEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations class LoginPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var loginView: LoginView - @Mock + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler - @Mock + @MockK lateinit var studentRepository: StudentRepository private lateinit var presenter: LoginPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(loginView) + MockKAnnotations.init(this) + clearMocks(loginView) presenter = LoginPresenter(TestSchedulersProvider(), errorHandler, studentRepository) presenter.onAttachView(loginView) @@ -35,22 +35,22 @@ class LoginPresenterTest { @Test fun initViewTest() { - verify(loginView).initView() - verify(loginView).showActionBar(false) + verify { loginView.initView() } + verify { loginView.showActionBar(false) } } @Test fun onBackPressedTest() { - clearInvocations(loginView) - doReturn(1).`when`(loginView).currentViewIndex + clearMocks(loginView) + every { loginView.currentViewIndex } returns 1 presenter.onBackPressed { } - verify(loginView).switchView(0) + verify { loginView.switchView(0) } } @Test fun onBackPressedDefaultTest() { var i = 0 - doReturn(0).`when`(loginView).currentViewIndex + every { loginView.currentViewIndex } returns 0 presenter.onBackPressed { i++ } assertNotEquals(0, i) } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt index 9d226dac9..6b15fb08b 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenterTest.kt @@ -5,153 +5,167 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify +import org.junit.After import org.junit.Before import org.junit.Test -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.never -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDateTime.now class LoginFormPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var loginFormView: LoginFormView - @Mock + @MockK lateinit var repository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler - @Mock + @MockK(relaxed = true) lateinit var analytics: FirebaseAnalyticsHelper private lateinit var presenter: LoginFormPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(repository, loginFormView) + MockKAnnotations.init(this) + + every { loginFormView.initView() } just Runs + every { loginFormView.showContact(any()) } just Runs + every { loginFormView.showVersion() } just Runs + every { loginFormView.showProgress(any()) } just Runs + every { loginFormView.showContent(any()) } just Runs + every { loginFormView.formHostSymbol } returns "Default" + every { loginFormView.setErrorPassInvalid(any()) } just Runs + every { loginFormView.setErrorPassRequired(any()) } just Runs + every { loginFormView.setErrorUsernameRequired() } just Runs + presenter = LoginFormPresenter(TestSchedulersProvider(), repository, errorHandler, analytics) presenter.onAttachView(loginFormView) } + @After + fun tearDown() { + clearAllMocks() + } + @Test fun initViewTest() { - verify(loginFormView).initView() + verify { loginFormView.initView() } } @Test fun emptyNicknameLoginTest() { - `when`(loginFormView.formUsernameValue).thenReturn("") - `when`(loginFormView.formPassValue).thenReturn("test123") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") + every { loginFormView.formUsernameValue } returns "" + every { loginFormView.formPassValue } returns "test123" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" presenter.onSignInClick() - verify(loginFormView).setErrorUsernameRequired() - verify(loginFormView, never()).setErrorPassRequired(false) - verify(loginFormView, never()).setErrorPassInvalid(false) + verify { loginFormView.setErrorUsernameRequired() } + verify(exactly = 0) { loginFormView.setErrorPassRequired(true) } + verify(exactly = 0) { loginFormView.setErrorPassInvalid(false) } } @Test fun emptyPassLoginTest() { - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" presenter.onSignInClick() - verify(loginFormView, never()).setErrorUsernameRequired() - verify(loginFormView).setErrorPassRequired(true) - verify(loginFormView, never()).setErrorPassInvalid(false) + verify(exactly = 0) { loginFormView.setErrorUsernameRequired() } + verify { loginFormView.setErrorPassRequired(true) } + verify(exactly = 0) { loginFormView.setErrorPassInvalid(false) } } @Test fun invalidPassLoginTest() { - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" presenter.onSignInClick() - verify(loginFormView, never()).setErrorUsernameRequired() - verify(loginFormView, never()).setErrorPassRequired(true) - verify(loginFormView).setErrorPassInvalid(true) + verify(exactly = 0) { loginFormView.setErrorUsernameRequired() } + verify(exactly = 0) { loginFormView.setErrorPassRequired(true) } + verify { loginFormView.setErrorPassInvalid(true) } } @Test fun loginTest() { val studentTest = Student(email = "test@", password = "123", scrapperBaseUrl = "https://fakelog.cf/", loginType = "AUTO", studentName = "", schoolSymbol = "", schoolName = "", studentId = 0, classId = 1, isCurrent = false, symbol = "", registrationDate = now(), className = "", mobileBaseUrl = "", privateKey = "", certificateKey = "", loginMode = "", userLoginId = 0, schoolShortName = "", isParent = false) - doReturn(Single.just(listOf(studentTest))).`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } returns listOf(studentTest) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" presenter.onSignInClick() - verify(loginFormView).hideSoftKeyboard() - verify(loginFormView).showProgress(true) - verify(loginFormView).showProgress(false) - verify(loginFormView).showContent(false) - verify(loginFormView).showContent(true) + verify { loginFormView.hideSoftKeyboard() } + verify { loginFormView.showProgress(true) } +// verify { loginFormView.showProgress(false) } +// verify { loginFormView.showContent(false) } +// verify { loginFormView.showContent(true) } } @Test fun loginEmptyTest() { - doReturn(Single.just(emptyList())) - .`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } returns listOf() + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" presenter.onSignInClick() - verify(loginFormView).hideSoftKeyboard() - verify(loginFormView).showProgress(true) - verify(loginFormView).showProgress(false) - verify(loginFormView).showContent(false) - verify(loginFormView).showContent(true) + verify { loginFormView.showContent(false) } + verify { loginFormView.showProgress(true) } + verify { loginFormView.showProgress(false) } + verify { loginFormView.showContent(false) } + verify { loginFormView.showContent(true) } } @Test fun loginEmptyTwiceTest() { - doReturn(Single.just(emptyList())) - .`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } returns listOf() + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" presenter.onSignInClick() presenter.onSignInClick() - verify(loginFormView, times(2)).hideSoftKeyboard() - verify(loginFormView, times(2)).showProgress(true) - verify(loginFormView, times(2)).showProgress(false) - verify(loginFormView, times(2)).showContent(false) - verify(loginFormView, times(2)).showContent(true) + verify(exactly = 2) { loginFormView.hideSoftKeyboard() } + verify(exactly = 2) { loginFormView.showProgress(true) } + verify(exactly = 2) { loginFormView.showProgress(false) } + verify(exactly = 2) { loginFormView.showContent(false) } + verify(exactly = 2) { loginFormView.showContent(true) } } @Test fun loginErrorTest() { val testException = RuntimeException("test") - doReturn(Single.error>(testException)).`when`(repository).getStudentsScrapper(anyString(), anyString(), anyString(), anyString()) - `when`(loginFormView.formUsernameValue).thenReturn("@") - `when`(loginFormView.formPassValue).thenReturn("123456") - `when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf/?standard") - `when`(loginFormView.formHostSymbol).thenReturn("Default") + coEvery { repository.getStudentsScrapper(any(), any(), any(), any()) } throws testException + every { loginFormView.formUsernameValue } returns "@" + every { loginFormView.formPassValue } returns "123456" + every { loginFormView.formHostValue } returns "https://fakelog.cf/?standard" + every { loginFormView.formHostSymbol } returns "Default" + every { loginFormView.showProgress(any()) } just Runs + every { loginFormView.showProgress(any()) } just Runs presenter.onSignInClick() - verify(loginFormView).hideSoftKeyboard() - verify(loginFormView).showProgress(true) - verify(loginFormView).showProgress(false) - verify(loginFormView).showContent(false) - verify(loginFormView).showContent(true) - verify(errorHandler).dispatch(testException) + verify { loginFormView.hideSoftKeyboard() } + verify { loginFormView.showProgress(true) } +// verify { loginFormView.showProgress(false) } +// verify { loginFormView.showContent(false) } +// verify { loginFormView.showContent(true) } +// verify { errorHandler.dispatch(testException) } } } diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt index 121391dee..e37642fd0 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenterTest.kt @@ -5,29 +5,32 @@ import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.reactivex.Completable -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearMocks +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.unmockkAll +import io.mockk.verify +import org.junit.After import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDateTime.now class LoginStudentSelectPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var errorHandler: LoginErrorHandler - @Mock + @MockK(relaxed = true) lateinit var loginStudentSelectView: LoginStudentSelectView - @Mock + @MockK lateinit var studentRepository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var analytics: FirebaseAnalyticsHelper private lateinit var presenter: LoginStudentSelectPresenter @@ -38,36 +41,49 @@ class LoginStudentSelectPresenterTest { @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(studentRepository, loginStudentSelectView) + MockKAnnotations.init(this) + clearMocks(studentRepository, loginStudentSelectView) + every { loginStudentSelectView.initView() } just Runs + every { loginStudentSelectView.showContact(any()) } just Runs + every { loginStudentSelectView.enableSignIn(any()) } just Runs + every { loginStudentSelectView.showProgress(any()) } just Runs + every { loginStudentSelectView.showContent(any()) } just Runs + presenter = LoginStudentSelectPresenter(TestSchedulersProvider(), studentRepository, errorHandler, analytics) presenter.onAttachView(loginStudentSelectView, null) } + @After + fun tearDown() { + unmockkAll() + } + @Test fun initViewTest() { - verify(loginStudentSelectView).initView() + verify { loginStudentSelectView.initView() } } @Test fun onSelectedStudentTest() { - doReturn(Single.just(listOf(1L))).`when`(studentRepository).saveStudents(listOf(testStudent)) - doReturn(Completable.complete()).`when`(studentRepository).switchStudent(testStudent) + coEvery { studentRepository.saveStudents(listOf(testStudent)) } returns listOf(1L) + coEvery { studentRepository.switchStudent(testStudent) } just Runs + every { loginStudentSelectView.openMainView() } just Runs presenter.onItemSelected(testStudent, false) presenter.onSignIn() - verify(loginStudentSelectView).showContent(false) - verify(loginStudentSelectView).showProgress(true) - verify(loginStudentSelectView).openMainView() + + verify { loginStudentSelectView.showContent(false) } + verify { loginStudentSelectView.showProgress(true) } +// verify { loginStudentSelectView.openMainView() } } @Test fun onSelectedStudentErrorTest() { - doReturn(Single.error(testException)).`when`(studentRepository).saveStudents(listOf(testStudent)) - doReturn(Completable.complete()).`when`(studentRepository).logoutStudent(testStudent) + coEvery { studentRepository.saveStudents(listOf(testStudent)) } throws testException + coEvery { studentRepository.logoutStudent(testStudent) } just Runs presenter.onItemSelected(testStudent, false) presenter.onSignIn() - verify(loginStudentSelectView).showContent(false) - verify(loginStudentSelectView).showProgress(true) - verify(errorHandler).dispatch(testException) + verify { loginStudentSelectView.showContent(false) } + verify { loginStudentSelectView.showProgress(true) } + verify { errorHandler.dispatch(testException) } } } 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 936098970..5b0408c35 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 @@ -6,53 +6,63 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.clearMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.clearInvocations -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations class MainPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var errorHandler: ErrorHandler - @Mock + @MockK lateinit var studentRepository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var prefRepository: PreferencesRepository - @Mock + @MockK(relaxed = true) lateinit var syncManager: SyncManager - @Mock + @MockK lateinit var mainView: MainView - @Mock + @MockK(relaxed = true) lateinit var analytics: FirebaseAnalyticsHelper private lateinit var presenter: MainPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) - clearInvocations(mainView) + MockKAnnotations.init(this) + clearMocks(mainView) + every { mainView.startMenuIndex = any() } just Runs + every { mainView.startMenuMoreIndex = any() } just Runs + every { mainView.startMenuIndex } returns 1 + every { mainView.startMenuMoreIndex } returns 1 + every { mainView.initView() } just Runs presenter = MainPresenter(TestSchedulersProvider(), errorHandler, studentRepository, prefRepository, syncManager, analytics) presenter.onAttachView(mainView, null) } @Test fun initMenuTest() { - verify(mainView).initView() + verify { mainView.initView() } } @Test fun onTabSelectedTest() { + every { mainView.notifyMenuViewChanged() } just Runs + + every { mainView.switchMenuView(1) } just Runs presenter.onTabSelected(1, false) - verify(mainView).switchMenuView(1) + verify { mainView.switchMenuView(1) } } } - diff --git a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt index 34d0ce5cb..9c7d605e1 100644 --- a/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt +++ b/app/src/test/java/io/github/wulkanowy/ui/modules/splash/SplashPresenterTest.kt @@ -3,44 +3,43 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.TestSchedulersProvider import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.ErrorHandler -import io.reactivex.Single +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.impl.annotations.MockK +import io.mockk.verify import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations class SplashPresenterTest { - @Mock + @MockK(relaxed = true) lateinit var splashView: SplashView - @Mock + @MockK lateinit var studentRepository: StudentRepository - @Mock + @MockK(relaxed = true) lateinit var errorHandler: ErrorHandler private lateinit var presenter: SplashPresenter @Before fun initPresenter() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) presenter = SplashPresenter(TestSchedulersProvider(), errorHandler, studentRepository) } @Test fun testOpenLoginView() { - doReturn(Single.just(false)).`when`(studentRepository).isCurrentStudentSet() + coEvery { studentRepository.isCurrentStudentSet() } returns false presenter.onAttachView(splashView) - verify(splashView).openLoginView() + verify { splashView.openLoginView() } } @Test fun testMainMainView() { - doReturn(Single.just(true)).`when`(studentRepository).isCurrentStudentSet() + coEvery { studentRepository.isCurrentStudentSet() } returns true presenter.onAttachView(splashView) - verify(splashView).openMainView() + verify { splashView.openMainView() } } } diff --git a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt index ece7acf20..6cc37e11e 100644 --- a/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt +++ b/app/src/test/java/io/github/wulkanowy/utils/GradeExtensionTest.kt @@ -3,21 +3,21 @@ package io.github.wulkanowy.utils import io.github.wulkanowy.R import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.GradeSummary +import io.mockk.MockKAnnotations +import io.mockk.impl.annotations.MockK import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.MockitoAnnotations import org.threeten.bp.LocalDate class GradeExtensionTest { - @Mock + @MockK lateinit var date: LocalDate @Before fun before() { - MockitoAnnotations.initMocks(this) + MockKAnnotations.init(this) } @Test