diff --git a/.circleci/config.yml b/.circleci/config.yml
index d4e59be19..1ae402f53 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -159,7 +159,7 @@ jobs:
openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks
- run:
name: Publish release
- command: ./gradlew publish --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex
+ command: ./gradlew publishRelease --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex
workflows:
version: 2
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index a8407c848..eb4efba71 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -19,7 +19,7 @@
-
+
diff --git a/.travis.yml b/.travis.yml
index 56c648589..a430c90ef 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,11 +11,6 @@ cache:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
-#branches:
-# only:
-# - master
-# - 0.7.x
-
android:
licenses:
- android-sdk-preview-license-.+
@@ -46,7 +41,7 @@ before_script:
- "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash"
script:
- - ./gradlew dependencies --stacktrace --daemon
+ - ./gradlew build -x test -x lint -x fabricGenerateResourcesRelease -x packageRelease --stacktrace --daemon
- fossa --no-ansi || true
- ./gradlew lint -x fabricGenerateResourcesRelease --stacktrace --daemon
- ./gradlew test -x fabricGenerateResourcesRelease --stacktrace --daemon
@@ -61,7 +56,7 @@ script:
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg;
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg;
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg;
- ./gradlew publish -PenableCrashlytics --stacktrace;
+ ./gradlew publishRelease -PenableCrashlytics --stacktrace;
fi
after_success:
diff --git a/README.md b/README.md
index 97a4172c4..ccbf14ca5 100644
--- a/README.md
+++ b/README.md
@@ -6,12 +6,12 @@
[](https://codecov.io/gh/wulkanowy/wulkanowy)
[](https://bettercodehub.com/)
[](https://sonarcloud.io/dashboard?id=io.github.wulkanowy%3Aapp)
-[](https://app.fossa.com/projects/custom%2B5644%2Fgithub.com%2Fwulkanowy%2Fwulkanowy?ref=badge_shield)
+[](https://app.fossa.io/projects/custom%2B5644%2Fgit%40github.com%3Awulkanowy%2Fwulkanowy.git?ref=badge_shield)
[](https://discord.gg/vccAQBr)
[Pobierz wersję beta z Google Play](https://play.google.com/store/apps/details?id=io.github.wulkanowy&utm_source=vcs)
-[Pobierz wersję DEV](https://bitrise-redirector.herokuapp.com/v0.1/apps/f841f20d8f8b1dc8/builds/master/artifacts/0)
+[Pobierz wersję DEV](https://bitrise-redirector.herokuapp.com/v0.1/apps/daeff1893f3c8128/builds/master/artifacts/0)
[(Więcej wersji DEV)](https://wulkanowy.github.io/dev.html)
Androidowy klient dziennika VULCAN UONET+.
@@ -19,4 +19,4 @@ Androidowy klient dziennika VULCAN UONET+.
## License
-[](https://app.fossa.com/projects/custom%2B5644%2Fgithub.com%2Fwulkanowy%2Fwulkanowy?ref=badge_large)
+[](https://app.fossa.io/projects/custom%2B5644%2Fgit%40github.com%3Awulkanowy%2Fwulkanowy.git?ref=badge_large)
diff --git a/app/build.gradle b/app/build.gradle
index 509e146f4..6382469da 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,20 +11,25 @@ android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
+ playAccountConfigs {
+ defaultAccountConfig {
+ serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL")
+ pk12File = file('key.p12')
+ }
+ }
+
defaultConfig {
applicationId "io.github.wulkanowy"
testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 15
targetSdkVersion 28
- versionCode 29
- versionName "0.7.3"
+ versionCode 19
+ versionName "0.6.0"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
- manifestPlaceholders = [
- fabric_api_key: System.getenv("FABRIC_API_KEY") ?: "null",
- crashlytics_enabled: project.hasProperty("enableCrashlytics")
- ]
+ playAccountConfig = playAccountConfigs.defaultAccountConfig
+ manifestPlaceholders = [crashlytics_enabled: project.hasProperty("enableCrashlytics")]
}
signingConfigs {
@@ -40,6 +45,7 @@ android {
release {
buildConfigField "boolean", "CRASHLYTICS_ENABLED", "true"
minifyEnabled true
+ useProguard false
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
@@ -57,11 +63,6 @@ android {
lintOptions {
disable 'HardwareIds'
}
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
}
androidExtensions {
@@ -69,74 +70,66 @@ androidExtensions {
}
play {
- serviceAccountEmail = System.getenv("PLAY_SERVICE_ACCOUNT_EMAIL") ?: "jan@fakelog.cf"
- serviceAccountCredentials = file('key.p12')
- defaultToAppBundles = true
track = 'alpha'
+ uploadImages = true
+}
+
+configurations.all {
+ resolutionStrategy.force "com.squareup.okhttp3:okhttp-urlconnection:3.11.0"
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
- implementation('io.github.wulkanowy:api:0.7.3') { exclude module: "threetenbp" }
+ implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
+ implementation('io.github.wulkanowy:api:0.6.0') { exclude module: "threetenbp" }
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.appcompat:appcompat:1.0.2"
implementation "androidx.cardview:cardview:1.0.0"
implementation "com.google.android.material:material:1.0.0"
- implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
- implementation 'androidx.multidex:multidex:2.0.1'
-
- implementation "androidx.work:work-runtime:2.0.0"
- implementation "androidx.work:work-rxjava2:2.0.0"
-
- implementation "androidx.room:room-runtime:2.1.0-alpha06"
- implementation "androidx.room:room-rxjava2:2.1.0-alpha06"
- kapt "androidx.room:room-compiler:2.1.0-alpha06"
+ implementation 'androidx.multidex:multidex:2.0.0'
implementation 'com.takisoft.preferencex:preferencex:1.0.0'
+ implementation "com.mikepenz:aboutlibraries:6.2.0"
+ implementation "com.firebase:firebase-jobdispatcher:0.8.5"
- implementation 'com.squareup.inject:assisted-inject-annotations-dagger2:0.3.3'
- kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.3.3'
+ implementation "com.google.dagger:dagger-android-support:2.19"
+ kapt "com.google.dagger:dagger-compiler:2.19"
+ kapt "com.google.dagger:dagger-android-processor:2.19"
- implementation "com.google.dagger:dagger-android-support:2.21"
- kapt "com.google.dagger:dagger-compiler:2.21"
- kapt "com.google.dagger:dagger-android-processor:2.21"
+ implementation "androidx.room:room-runtime:2.1.0-alpha03"
+ implementation "androidx.room:room-rxjava2:2.1.0-alpha03"
+ kapt "androidx.room:room-compiler:2.1.0-alpha03"
implementation "eu.davidea:flexible-adapter:5.1.0"
implementation "eu.davidea:flexible-adapter-ui:1.0.0"
- implementation "com.aurelhubert:ahbottomnavigation:2.3.4"
- implementation 'com.ncapdevi:frag-nav:3.2.0'
- implementation 'com.github.wulkanowy:MaterialChipsInput:b72fd0ee6f'
- implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ implementation "com.aurelhubert:ahbottomnavigation:2.2.0"
+ implementation 'com.ncapdevi:frag-nav:3.0.0'
- implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.2'
- implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
- implementation "io.reactivex.rxjava2:rxjava:2.2.7"
+ implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.1'
+ implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
+ implementation "io.reactivex.rxjava2:rxjava:2.2.4"
+
+ implementation "com.jakewharton.threetenabp:threetenabp:1.1.0"
- implementation "com.jakewharton.threetenabp:threetenabp:1.2.0"
implementation "com.jakewharton.timber:timber:4.7.1"
implementation "at.favre.lib:slf4j-timber:1.0.1"
- implementation "com.mikepenz:aboutlibraries:6.2.3"
- implementation 'com.google.firebase:firebase-core:16.0.8'
- implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9'
+ implementation 'com.google.firebase:firebase-core:16.0.6'
+ implementation 'com.crashlytics.sdk.android:crashlytics:2.9.7'
- releaseImplementation 'fr.o80.chucker:library-no-op:2.0.4'
-
- debugImplementation 'fr.o80.chucker:library:2.0.4'
- debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
+ debugImplementation "com.amitshekhar.android:debug-db:1.0.4"
testImplementation "junit:junit:4.12"
- testImplementation "io.mockk:mockk:1.9.2"
- testImplementation "org.mockito:mockito-inline:2.25.1"
+ testImplementation "io.mockk:mockk:1.8.13.kotlin13"
+ testImplementation "org.mockito:mockito-inline:2.23.4"
testImplementation 'org.threeten:threetenbp:1.3.8'
androidTestImplementation 'androidx.test:core:1.1.0'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
- androidTestImplementation "io.mockk:mockk-android:1.9.2"
- androidTestImplementation 'org.mockito:mockito-android:2.25.1'
+ androidTestImplementation 'org.mockito:mockito-android:2.23.4'
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
}
diff --git a/app/jacoco.gradle b/app/jacoco.gradle
index f2b01b483..4f94ef190 100644
--- a/app/jacoco.gradle
+++ b/app/jacoco.gradle
@@ -1,7 +1,7 @@
apply plugin: "jacoco"
jacoco {
- toolVersion "0.8.3"
+ toolVersion "0.8.2"
reportsDir = file("$buildDir/reports")
}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 15b628384..cebd3d94d 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -5,7 +5,6 @@
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
--dontobfuscate
-allowaccessmodification
-repackageclasses ''
-verbose
@@ -14,6 +13,7 @@
#Config for anallitycs
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
+-renamesourcefileattribute SourceFile
-keep class com.crashlytics.** {*;}
-keep public class * extends java.lang.Exception
-dontwarn com.crashlytics.**
@@ -32,8 +32,5 @@
-dontwarn rx.internal.util.**
-dontwarn sun.misc.Unsafe
-#Config for MPAndroidChart
--keep class com.github.mikephil.charting.** { *; }
-
#Config for API
-keep class io.github.wulkanowy.api.** {*;}
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/completedlessons/CompletedLessonsLocalTest.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt
deleted file mode 100644
index 014f0b8bc..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocalTest.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-package io.github.wulkanowy.data.repositories.completedlessons
-
-import androidx.room.Room
-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.CompletedLesson
-import io.github.wulkanowy.data.db.entities.Semester
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.threeten.bp.LocalDate
-import kotlin.test.assertEquals
-
-@RunWith(AndroidJUnit4::class)
-class CompletedLessonsLocalTest {
-
- private lateinit var completedLessonsLocal: CompletedLessonsLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun createDb() {
- testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
- .build()
- completedLessonsLocal = CompletedLessonsLocal(testDb.completedLessonsDao)
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun saveAndReadTest() {
- completedLessonsLocal.saveCompletedLessons(listOf(
- getCompletedLesson(LocalDate.of(2018, 9, 10), 1),
- getCompletedLesson(LocalDate.of(2018, 9, 14), 2),
- getCompletedLesson(LocalDate.of(2018, 9, 17), 3)
- ))
-
- val completed = completedLessonsLocal
- .getCompletedLessons(Semester(1, 2, "", 1, 3, true, 1, 1),
- LocalDate.of(2018, 9, 10),
- LocalDate.of(2018, 9, 14)
- )
- .blockingGet()
- assertEquals(2, completed.size)
- assertEquals(completed[0].date, LocalDate.of(2018, 9, 10))
- assertEquals(completed[1].date, LocalDate.of(2018, 9, 14))
- }
-
- private fun getCompletedLesson(date: LocalDate, number: Int): CompletedLesson {
- return CompletedLesson(1, 2, date, number, "", "", "", "", "", "", "")
- }
-}
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
deleted file mode 100644
index 36238f1b4..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeLocalTest.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package io.github.wulkanowy.data.repositories.grade
-
-import androidx.room.Room
-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 org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.threeten.bp.LocalDate
-import kotlin.test.assertEquals
-
-@RunWith(AndroidJUnit4::class)
-class GradeLocalTest {
-
- private lateinit var gradeLocal: GradeLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun createDb() {
- testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
- .build()
- gradeLocal = GradeLocal(testDb.gradeDao)
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun saveAndReadTest() {
- gradeLocal.saveGrades(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)
- ))
-
- val grades = gradeLocal
- .getGrades(Semester(1, 2, "", 2, 3, true, 1, 1))
- .blockingGet()
-
- assertEquals(2, grades.size)
- assertEquals(grades[0].date, LocalDate.of(2019, 2, 27))
- assertEquals(grades[1].date, LocalDate.of(2019, 2, 28))
- }
-}
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
deleted file mode 100644
index 17e788fc0..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/GradeRepositoryTest.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-package io.github.wulkanowy.data.repositories.grade
-
-import android.os.Build.VERSION_CODES.P
-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.api.Api
-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.mockk.MockKAnnotations
-import io.mockk.every
-import io.mockk.impl.annotations.MockK
-import io.mockk.impl.annotations.SpyK
-import io.reactivex.Single
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.threeten.bp.LocalDate.of
-import org.threeten.bp.LocalDateTime
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-import io.github.wulkanowy.api.grades.Grade as GradeApi
-
-@SdkSuppress(minSdkVersion = P)
-@RunWith(AndroidJUnit4::class)
-class GradeRepositoryTest {
-
- @SpyK
- private var mockApi = Api()
-
- private val settings = InternetObservingSettings.builder()
- .strategy(TestInternetObservingStrategy())
- .build()
-
- @MockK
- private lateinit var semesterMock: Semester
-
- @MockK
- private lateinit var studentMock: Student
-
- private lateinit var gradeRemote: GradeRemote
-
- private lateinit var gradeLocal: GradeLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun initApi() {
- MockKAnnotations.init(this)
- testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build()
- gradeLocal = GradeLocal(testDb.gradeDao)
- gradeRemote = GradeRemote(mockApi)
-
- every { mockApi.diaryId } returns 1
- every { studentMock.registrationDate } returns LocalDateTime.of(2019, 2, 27, 12, 0)
- every { semesterMock.studentId } returns 1
- every { semesterMock.semesterId } returns 1
- every { semesterMock.diaryId } returns 1
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun markOlderThanRegisterDateAsRead() {
- every { mockApi.getGrades(1) } returns Single.just(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")
- ))
-
- val grades = GradeRepository(settings, gradeLocal, gradeRemote)
- .getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date }
-
- assertFalse { grades[0].isRead }
- assertFalse { grades[1].isRead }
- assertTrue { grades[2].isRead }
- assertTrue { grades[3].isRead }
- }
-
- @Test
- fun mitigateOldGradesNotifications() {
- gradeLocal.saveGrades(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")
- ))
-
- every { mockApi.getGrades(1) } returns Single.just(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")
- ))
-
- val grades = GradeRepository(settings, gradeLocal, gradeRemote)
- .getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date }
-
- assertFalse { grades[0].isRead }
- assertFalse { grades[1].isRead }
- assertTrue { grades[2].isRead }
- assertTrue { grades[3].isRead }
- }
-}
diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt
deleted file mode 100644
index e0fd05a82..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/grade/TestGradeEntityCreator.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.github.wulkanowy.data.repositories.grade
-
-import io.github.wulkanowy.api.toDate
-import org.threeten.bp.LocalDate
-import io.github.wulkanowy.api.grades.Grade as GradeRemote
-import io.github.wulkanowy.data.db.entities.Grade as GradeLocal
-
-fun createGradeLocal(value: Int, weight: Double, date: LocalDate, desc: String, semesterId: Int = 1): GradeLocal {
- return GradeLocal(
- semesterId = semesterId,
- studentId = 1,
- modifier = .0,
- teacher = "",
- subject = "",
- date = date,
- color = "",
- comment = "",
- description = desc,
- entry = "",
- gradeSymbol = "",
- value = value,
- weight = "",
- weightValue = weight
- )
-}
-
-fun createGradeApi(value: Int, weight: Double, date: LocalDate, desc: String): GradeRemote {
- return GradeRemote().apply {
- this.value = value
- this.weightValue = weight
- this.date = date.toDate()
- this.description = desc
- }
-}
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
deleted file mode 100644
index 5c0590e75..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocalTest.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-package io.github.wulkanowy.data.repositories.gradestatistics
-
-import androidx.room.Room
-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.GradeStatistics
-import io.github.wulkanowy.data.db.entities.Semester
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import kotlin.test.assertEquals
-
-@RunWith(AndroidJUnit4::class)
-class GradeStatisticsLocalTest {
-
- private lateinit var gradeStatisticsLocal: GradeStatisticsLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun createDb() {
- testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
- .build()
- gradeStatisticsLocal = GradeStatisticsLocal(testDb.gradeStatistics)
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun saveAndRead_subject() {
- gradeStatisticsLocal.saveGradesStatistics(listOf(
- getGradeStatistics("Matematyka", 2, 1),
- getGradeStatistics("Fizyka", 1, 2)
- ))
-
- val stats = gradeStatisticsLocal.getGradesStatistics(
- Semester(2, 2, "", 1, 2, true, 1, 1), false,
- "Matematyka"
- ).blockingGet()
- assertEquals(1, stats.size)
- assertEquals(stats[0].subject, "Matematyka")
- }
-
- @Test
- fun saveAndRead_all() {
- gradeStatisticsLocal.saveGradesStatistics(listOf(
- getGradeStatistics("Matematyka", 2, 1),
- getGradeStatistics("Chemia", 2, 1),
- getGradeStatistics("Fizyka", 1, 2)
- ))
-
- val stats = gradeStatisticsLocal.getGradesStatistics(
- Semester(2, 2, "", 1, 2, true, 1, 1), false,
- "Wszystkie"
- ).blockingGet()
- assertEquals(1, stats.size)
- assertEquals(stats[0].subject, "Wszystkie")
- }
-
- private fun getGradeStatistics(subject: String, studentId: Int, semesterId: Int): GradeStatistics {
- return GradeStatistics(studentId, semesterId, subject, 5, 5, false)
- }
-}
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/local/AttendanceLocalTest.kt
similarity index 85%
rename from app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt
rename to app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/AttendanceLocalTest.kt
index ee65cf844..8cbd13cd3 100644
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocalTest.kt
+++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/AttendanceLocalTest.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.attendance
+package io.github.wulkanowy.data.repositories.local
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
@@ -34,13 +34,13 @@ class AttendanceLocalTest {
@Test
fun saveAndReadTest() {
attendanceLocal.saveAttendance(listOf(
- Attendance(1, 2, LocalDate.of(2018, 9, 10), 0, "", "", false, false, false, false, false, false),
- Attendance(1, 2, LocalDate.of(2018, 9, 14), 0, "", "", false, false, false, false, false, false),
- Attendance(1, 2, LocalDate.of(2018, 9, 17), 0, "", "", false, false, false, false, false, false)
+ Attendance(1, 2, LocalDate.of(2018, 9, 10), 0, "", ""),
+ Attendance(1, 2, LocalDate.of(2018, 9, 14), 0, "", ""),
+ Attendance(1, 2, LocalDate.of(2018, 9, 17), 0, "", "")
))
val attendance = attendanceLocal
- .getAttendance(Semester(1, 2, "", 1, 3, true, 1, 1),
+ .getAttendance(Semester(1, 1, 2, "", 3, 1),
LocalDate.of(2018, 9, 10),
LocalDate.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/local/ExamLocalTest.kt
similarity index 93%
rename from app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt
rename to app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/ExamLocalTest.kt
index dc66fa428..c60348e3a 100644
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/exam/ExamLocalTest.kt
+++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/ExamLocalTest.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.exam
+package io.github.wulkanowy.data.repositories.local
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
@@ -40,7 +40,7 @@ class ExamLocalTest {
))
val exams = examLocal
- .getExams(Semester(1, 2, "", 1, 3, true, 1, 1),
+ .getExams(Semester(1, 1, 2, "", 3, 1),
LocalDate.of(2018, 9, 10),
LocalDate.of(2018, 9, 14)
)
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/local/StudentLocalTest.kt
similarity index 82%
rename from app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt
rename to app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/StudentLocalTest.kt
index c31bc806a..732dc5bc4 100644
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/student/StudentLocalTest.kt
+++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/StudentLocalTest.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.student
+package io.github.wulkanowy.data.repositories.local
import android.content.Context
import androidx.room.Room
@@ -11,7 +11,6 @@ import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.threeten.bp.LocalDateTime.now
import kotlin.test.assertEquals
@RunWith(AndroidJUnit4::class)
@@ -29,7 +28,7 @@ class StudentLocalTest {
testDb = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)
.build()
sharedHelper = SharedPrefHelper(context.getSharedPreferences("TEST", Context.MODE_PRIVATE))
- studentLocal = StudentLocal(testDb.studentDao, context)
+ studentLocal = StudentLocal(testDb.studentDao, sharedHelper, context)
}
@After
@@ -39,8 +38,9 @@ class StudentLocalTest {
@Test
fun saveAndReadTest() {
- studentLocal.saveStudent(Student(email = "test", password = "test123", schoolSymbol = "23", endpoint = "fakelog.cf", loginType = "AUTO", isCurrent = true, studentName = "", schoolName = "", studentId = 0, symbol = "", registrationDate = now()))
+ studentLocal.saveStudent(Student(email = "test", password = "test123", schoolSymbol = "23", endpoint = "fakelog.cf", loginType = "AUTO", isCurrent = true))
.blockingGet()
+ assert(studentLocal.isStudentSaved)
val student = studentLocal.getCurrentStudent(true).blockingGet()
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/local/TimetableLocalTest.kt
similarity index 58%
rename from app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt
rename to app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/TimetableLocalTest.kt
index 0ecbcf92e..df0a79948 100644
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocalTest.kt
+++ b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/local/TimetableLocalTest.kt
@@ -1,16 +1,17 @@
-package io.github.wulkanowy.data.repositories.timetable
+package io.github.wulkanowy.data.repositories.local
import androidx.room.Room
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 io.github.wulkanowy.data.db.entities.Timetable
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.threeten.bp.LocalDate
-import org.threeten.bp.LocalDateTime.of
+import org.threeten.bp.LocalDateTime
import kotlin.test.assertEquals
@RunWith(AndroidJUnit4::class)
@@ -22,8 +23,7 @@ class TimetableLocalTest {
@Before
fun createDb() {
- testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
- .build()
+ testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java).build()
timetableDb = TimetableLocal(testDb.timetableDao)
}
@@ -35,17 +35,19 @@ class TimetableLocalTest {
@Test
fun saveAndReadTest() {
timetableDb.saveTimetable(listOf(
- createTimetableLocal(1, of(2018, 9, 10, 0, 0, 0)),
- createTimetableLocal(1, of(2018, 9, 14, 0, 0, 0)),
- createTimetableLocal(1, of(2018, 9, 17, 0, 0, 0))
+ Timetable(1, 2, 1, LocalDateTime.now(), LocalDateTime.now(),
+ LocalDate.of(2018, 9, 10), "", "", "", "", ""),
+ Timetable(1, 2, 1, LocalDateTime.now(), LocalDateTime.now(),
+ LocalDate.of(2018, 9, 14), "", "", "", "", ""),
+ Timetable(1, 2, 1, LocalDateTime.now(), LocalDateTime.now(),
+ LocalDate.of(2018, 9, 17), "", "", "", "", "")
))
val exams = timetableDb.getTimetable(
- Semester(1, 2, "", 1, 1, true, 1, 1),
- LocalDate.of(2018, 9, 10),
- LocalDate.of(2018, 9, 14)
+ Semester(0, 1, 2, "3", 1, 1),
+ LocalDate.of(2018, 9, 10),
+ LocalDate.of(2018, 9, 14)
).blockingGet()
-
assertEquals(2, exams.size)
assertEquals(exams[0].date, LocalDate.of(2018, 9, 10))
assertEquals(exams[1].date, LocalDate.of(2018, 9, 14))
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
deleted file mode 100644
index a656ac058..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocalTest.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package io.github.wulkanowy.data.repositories.luckynumber
-
-import androidx.room.Room
-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.LuckyNumber
-import io.github.wulkanowy.data.db.entities.Semester
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.threeten.bp.LocalDate
-import kotlin.test.assertEquals
-
-@RunWith(AndroidJUnit4::class)
-class LuckyNumberLocalTest {
-
- private lateinit var luckyNumberLocal: LuckyNumberLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun createDb() {
- testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
- .build()
- luckyNumberLocal = LuckyNumberLocal(testDb.luckyNumberDao)
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun saveAndReadTest() {
- luckyNumberLocal.saveLuckyNumber(LuckyNumber(1, LocalDate.of(2019, 1, 20), 14))
-
- val luckyNumber = luckyNumberLocal.getLuckyNumber(Semester(1, 1, "", 1, 3, true, 1, 1),
- LocalDate.of(2019, 1, 20)
- ).blockingGet()
-
- 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
deleted file mode 100644
index 1f6562a29..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocalTest.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-package io.github.wulkanowy.data.repositories.recipient
-
-import androidx.room.Room
-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.Recipient
-import io.github.wulkanowy.data.db.entities.ReportingUnit
-import io.github.wulkanowy.data.db.entities.Student
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.threeten.bp.LocalDateTime
-import kotlin.test.assertEquals
-
-@RunWith(AndroidJUnit4::class)
-class RecipientLocalTest {
-
- private lateinit var recipientLocal: RecipientLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun createDb() {
- testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
- .build()
- recipientLocal = RecipientLocal(testDb.recipientDao)
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun saveAndReadTest() {
- recipientLocal.saveRecipients(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")
- ))
-
- val recipients = recipientLocal.getRecipients(
- Student("fakelog.cf", "AUTO", "", "", "", 1, "", "", "", true, LocalDateTime.now()),
- 2,
- ReportingUnit(1, 4, "", 0, "", emptyList())
- ).blockingGet()
-
- assertEquals(2, recipients.size)
- assertEquals(1, recipients[0].studentId)
- assertEquals("3rPracownik", recipients[1].realId)
- assertEquals("Kowalski Jan", recipients[0].name)
- assertEquals("Kowalska Karolina [KK] - Pracownik (Fake123456)", recipients[1].realName)
- assertEquals(3, recipients[0].loginId)
- assertEquals(4, recipients[1].unitId)
- assertEquals(2, recipients[0].role)
- assertEquals("hash", recipients[1].hash)
- }
-}
diff --git a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt b/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt
deleted file mode 100644
index 438e95f48..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TestTimetableEntityCreator.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package io.github.wulkanowy.data.repositories.timetable
-
-import io.github.wulkanowy.api.toDate
-import io.github.wulkanowy.utils.toDate
-import org.threeten.bp.LocalDateTime
-import org.threeten.bp.LocalDateTime.now
-import io.github.wulkanowy.api.timetable.Timetable as TimetableRemote
-import io.github.wulkanowy.data.db.entities.Timetable as TimetableLocal
-
-fun createTimetableLocal(number: Int, start: LocalDateTime, room: String = "", subject: String = ""): TimetableLocal {
- return TimetableLocal(
- studentId = 1,
- diaryId = 2,
- number = number,
- start = start,
- end = now(),
- date = start.toLocalDate(),
- subject = subject,
- subjectOld = "",
- group = "",
- room = room,
- roomOld = "",
- teacher = "",
- teacherOld = "",
- info = "",
- changes = false,
- canceled = false
- )
-}
-
-fun createTimetableRemote(number: Int, start: LocalDateTime, room: String, subject: String = ""): TimetableRemote {
- return TimetableRemote(
- number = number,
- start = start.toDate(),
- end = start.plusMinutes(45).toDate(),
- date = start.toLocalDate().toDate(),
- subject = subject,
- group = "",
- room = room,
- teacher = "",
- info = "",
- changes = false,
- canceled = false
- )
-}
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
deleted file mode 100644
index 1c0802637..000000000
--- a/app/src/androidTest/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepositoryTest.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-package io.github.wulkanowy.data.repositories.timetable
-
-import android.os.Build.VERSION_CODES.P
-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.api.Api
-import io.github.wulkanowy.data.db.AppDatabase
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy
-import io.mockk.MockKAnnotations
-import io.mockk.every
-import io.mockk.impl.annotations.MockK
-import io.mockk.impl.annotations.SpyK
-import io.reactivex.Single
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.threeten.bp.LocalDate
-import org.threeten.bp.LocalDateTime.of
-import kotlin.test.assertEquals
-
-@SdkSuppress(minSdkVersion = P)
-@RunWith(AndroidJUnit4::class)
-class TimetableRepositoryTest {
-
- @SpyK
- private var mockApi = Api()
-
- private val settings = InternetObservingSettings.builder()
- .strategy(TestInternetObservingStrategy())
- .build()
-
- @MockK
- private lateinit var semesterMock: Semester
-
- private lateinit var timetableRemote: TimetableRemote
-
- private lateinit var timetableLocal: TimetableLocal
-
- private lateinit var testDb: AppDatabase
-
- @Before
- fun initApi() {
- MockKAnnotations.init(this)
- testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build()
- timetableLocal = TimetableLocal(testDb.timetableDao)
- timetableRemote = TimetableRemote(mockApi)
-
- every { semesterMock.studentId } returns 1
- every { semesterMock.diaryId } returns 2
- }
-
- @After
- fun closeDb() {
- testDb.close()
- }
-
- @Test
- fun copyDetailsToCompletedFromPrevious() {
- timetableLocal.saveTimetable(listOf(
- createTimetableLocal(1, of(2019, 3, 5, 8, 0), "123", "Przyroda"),
- createTimetableLocal(1, of(2019, 3, 5, 8, 50), "321", "Religia"),
- createTimetableLocal(1, of(2019, 3, 5, 9, 40), "213", "W-F")
- ))
-
- every { mockApi.getTimetable(any(), any()) } returns Single.just(listOf(
- createTimetableRemote(1, of(2019, 3, 5, 8, 0), "", "Przyroda"),
- createTimetableRemote(1, of(2019, 3, 5, 8, 50), "", "Religia"),
- createTimetableRemote(1, of(2019, 3, 5, 9, 40), "", "W-F")
- ))
-
- val lessons = TimetableRepository(settings, timetableLocal, timetableRemote)
- .getTimetable(semesterMock, LocalDate.of(2019, 3, 5), LocalDate.of(2019, 3, 5), true)
- .blockingGet()
-
- assertEquals(3, lessons.size)
- assertEquals("123", lessons[0].room)
- assertEquals("321", lessons[1].room)
- assertEquals("213", lessons[2].room)
- }
-}
diff --git a/app/src/debug/res/drawable/ic_launcher_foreground.xml b/app/src/debug/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 6be799094..000000000
--- a/app/src/debug/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index 7353dbd1f..000000000
--- a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index 7353dbd1f..000000000
--- a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher.png b/app/src/debug/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 5b688d7cb..000000000
Binary files a/app/src/debug/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index 81e723ecc..000000000
Binary files a/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher.png b/app/src/debug/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 48b13240c..000000000
Binary files a/app/src/debug/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png
deleted file mode 100644
index 394b57076..000000000
Binary files a/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index ff8bfa3e9..000000000
Binary files a/app/src/debug/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png
deleted file mode 100644
index 365b4d663..000000000
Binary files a/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 96be1ed4f..000000000
Binary files a/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png
deleted file mode 100644
index 463c089b3..000000000
Binary files a/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 57c7416f1..000000000
Binary files a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png
deleted file mode 100644
index 53d6f5bbd..000000000
Binary files a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/debug/res/values/ic_launcher_background.xml b/app/src/debug/res/values/ic_launcher_background.xml
deleted file mode 100644
index 9646c0b4e..000000000
--- a/app/src/debug/res/values/ic_launcher_background.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #D32F2F
-
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0c6edab46..643fd2929 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,8 +4,6 @@
package="io.github.wulkanowy"
android:installLocation="internalOnly">
-
-
@@ -20,13 +18,14 @@
android:supportsRtl="false"
android:theme="@style/WulkanowyTheme"
android:usesCleartextTraffic="true"
- tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
+ tools:ignore="GoogleAppIndexingWarning">
+
@@ -40,19 +39,20 @@
android:configChanges="orientation|screenSize"
android:label="@string/main_title"
android:theme="@style/WulkanowyTheme.NoActionBar" />
-
+
+
+
+
+
@@ -62,15 +62,6 @@
android:resource="@xml/provider_widget_timetable" />
-
-
-
diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png
new file mode 100644
index 000000000..de216d36b
Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ
diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt
index e427647f6..628d6ce6f 100644
--- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt
+++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt
@@ -3,8 +3,6 @@ package io.github.wulkanowy
import android.content.Context
import androidx.appcompat.app.AppCompatDelegate
import androidx.multidex.MultiDex
-import androidx.work.Configuration
-import androidx.work.WorkManager
import com.crashlytics.android.Crashlytics
import com.crashlytics.android.core.CrashlyticsCore
import com.jakewharton.threetenabp.AndroidThreeTen
@@ -14,16 +12,11 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.utils.Log
import io.fabric.sdk.android.Fabric
import io.github.wulkanowy.BuildConfig.DEBUG
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
+import io.github.wulkanowy.data.repositories.PreferencesRepository
import io.github.wulkanowy.di.DaggerAppComponent
-import io.github.wulkanowy.services.sync.SyncWorkerFactory
import io.github.wulkanowy.utils.CrashlyticsTree
import io.github.wulkanowy.utils.DebugLogTree
-import io.reactivex.exceptions.UndeliverableException
-import io.reactivex.plugins.RxJavaPlugins
import timber.log.Timber
-import java.io.IOException
-import java.lang.Exception
import javax.inject.Inject
class WulkanowyApp : DaggerApplication() {
@@ -31,9 +24,6 @@ class WulkanowyApp : DaggerApplication() {
@Inject
lateinit var prefRepository: PreferencesRepository
- @Inject
- lateinit var workerFactory: SyncWorkerFactory
-
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
MultiDex.install(this)
@@ -45,8 +35,6 @@ class WulkanowyApp : DaggerApplication() {
initializeFabric()
if (DEBUG) enableDebugLog()
AppCompatDelegate.setDefaultNightMode(prefRepository.currentTheme)
- WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(workerFactory).build())
- RxJavaPlugins.setErrorHandler(::onError)
}
private fun enableDebugLog() {
@@ -61,12 +49,6 @@ class WulkanowyApp : DaggerApplication() {
Timber.plant(CrashlyticsTree())
}
- private fun onError(t: Throwable) {
- if (t is UndeliverableException && t.cause is IOException || t.cause is InterruptedException) {
- Timber.e(t.cause, "An undeliverable error occurred")
- } else throw t
- }
-
override fun applicationInjector(): AndroidInjector {
return DaggerAppComponent.builder().create(this)
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/ApiHelper.kt b/app/src/main/java/io/github/wulkanowy/data/ApiHelper.kt
index 5ef40ce8a..5b7b1072c 100644
--- a/app/src/main/java/io/github/wulkanowy/data/ApiHelper.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/ApiHelper.kt
@@ -14,20 +14,14 @@ class ApiHelper @Inject constructor(private val api: Api) {
symbol = student.symbol
schoolSymbol = student.schoolSymbol
studentId = student.studentId
+ useNewStudent = false
host = URL(student.endpoint).run { host + ":$port".removeSuffix(":-1") }
ssl = student.endpoint.startsWith("https")
loginType = Api.LoginType.valueOf(student.loginType)
- useNewStudent = true
}
}
fun initApi(email: String, password: String, symbol: String, endpoint: String) {
- api.apply {
- this.email = email
- this.password = password
- this.symbol = symbol
- host = URL(endpoint).run { host + ":$port".removeSuffix(":-1") }
- ssl = endpoint.startsWith("https")
- }
+ initApi(Student(email = email, password = password, symbol = symbol, endpoint = endpoint, loginType = "AUTO"))
}
}
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 c832368a5..3c58ea4bd 100644
--- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt
@@ -5,15 +5,11 @@ import android.content.SharedPreferences
import android.content.res.Resources
import androidx.preference.PreferenceManager
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
-import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy
-import com.readystatesoftware.chuck.api.ChuckCollector
-import com.readystatesoftware.chuck.api.ChuckInterceptor
-import com.readystatesoftware.chuck.api.RetentionManager
+import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.SocketInternetObservingStrategy
import dagger.Module
import dagger.Provides
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.AppDatabase
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
import okhttp3.logging.HttpLoggingInterceptor
import okhttp3.logging.HttpLoggingInterceptor.Level.BASIC
import okhttp3.logging.HttpLoggingInterceptor.Level.NONE
@@ -27,32 +23,22 @@ internal class RepositoryModule {
@Provides
fun provideInternetObservingSettings(): InternetObservingSettings {
return InternetObservingSettings.builder()
- .strategy(WalledGardenInternetObservingStrategy())
+ .strategy(SocketInternetObservingStrategy())
+ .host("www.google.com")
.build()
}
@Singleton
@Provides
- fun provideApi(chuckCollector: ChuckCollector, context: Context): Api {
+ fun provideApi(): Api {
return Api().apply {
logLevel = NONE
androidVersion = android.os.Build.VERSION.RELEASE
buildTag = android.os.Build.MODEL
setInterceptor(HttpLoggingInterceptor(HttpLoggingInterceptor.Logger { Timber.d(it) }).setLevel(BASIC))
-
- // for debug only
- setInterceptor(ChuckInterceptor(context, chuckCollector).maxContentLength(250000L), true, 0)
}
}
- @Singleton
- @Provides
- fun provideChuckCollector(context: Context, prefRepository: PreferencesRepository): ChuckCollector {
- return ChuckCollector(context)
- .showNotification(prefRepository.isDebugNotificationEnable)
- .retentionManager(RetentionManager(context, ChuckCollector.Period.ONE_HOUR))
- }
-
@Singleton
@Provides
fun provideDatabase(context: Context) = AppDatabase.newInstance(context)
@@ -81,10 +67,6 @@ internal class RepositoryModule {
@Provides
fun provideGradeSummaryDao(database: AppDatabase) = database.gradeSummaryDao
- @Singleton
- @Provides
- fun provideGradeStatisticsDao(database: AppDatabase) = database.gradeStatistics
-
@Singleton
@Provides
fun provideMessagesDao(database: AppDatabase) = database.messagesDao
@@ -116,20 +98,4 @@ internal class RepositoryModule {
@Singleton
@Provides
fun provideSubjectDao(database: AppDatabase) = database.subjectDao
-
- @Singleton
- @Provides
- fun provideLuckyNumberDao(database: AppDatabase) = database.luckyNumberDao
-
- @Singleton
- @Provides
- fun provideCompletedLessonsDao(database: AppDatabase) = database.completedLessonsDao
-
- @Singleton
- @Provides
- fun provideReportingUnitDao(database: AppDatabase) = database.reportingUnitDao
-
- @Singleton
- @Provides
- fun provideRecipientDao(database: AppDatabase) = database.recipientDao
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt
index 4fefd9c90..30c957b43 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/AppDatabase.kt
@@ -8,48 +8,28 @@ import androidx.room.RoomDatabase.JournalMode.TRUNCATE
import androidx.room.TypeConverters
import io.github.wulkanowy.data.db.dao.AttendanceDao
import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao
-import io.github.wulkanowy.data.db.dao.CompletedLessonsDao
import io.github.wulkanowy.data.db.dao.ExamDao
import io.github.wulkanowy.data.db.dao.GradeDao
-import io.github.wulkanowy.data.db.dao.GradeStatisticsDao
import io.github.wulkanowy.data.db.dao.GradeSummaryDao
-import io.github.wulkanowy.data.db.dao.HomeworkDao
-import io.github.wulkanowy.data.db.dao.LuckyNumberDao
import io.github.wulkanowy.data.db.dao.MessagesDao
+import io.github.wulkanowy.data.db.dao.HomeworkDao
import io.github.wulkanowy.data.db.dao.NoteDao
-import io.github.wulkanowy.data.db.dao.RecipientDao
-import io.github.wulkanowy.data.db.dao.ReportingUnitDao
import io.github.wulkanowy.data.db.dao.SemesterDao
import io.github.wulkanowy.data.db.dao.StudentDao
import io.github.wulkanowy.data.db.dao.SubjectDao
import io.github.wulkanowy.data.db.dao.TimetableDao
import io.github.wulkanowy.data.db.entities.Attendance
import io.github.wulkanowy.data.db.entities.AttendanceSummary
-import io.github.wulkanowy.data.db.entities.CompletedLesson
import io.github.wulkanowy.data.db.entities.Exam
import io.github.wulkanowy.data.db.entities.Grade
-import io.github.wulkanowy.data.db.entities.GradeStatistics
import io.github.wulkanowy.data.db.entities.GradeSummary
-import io.github.wulkanowy.data.db.entities.Homework
-import io.github.wulkanowy.data.db.entities.LuckyNumber
import io.github.wulkanowy.data.db.entities.Message
+import io.github.wulkanowy.data.db.entities.Homework
import io.github.wulkanowy.data.db.entities.Note
-import io.github.wulkanowy.data.db.entities.Recipient
-import io.github.wulkanowy.data.db.entities.ReportingUnit
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.data.db.entities.Timetable
-import io.github.wulkanowy.data.db.migrations.Migration10
-import io.github.wulkanowy.data.db.migrations.Migration11
-import io.github.wulkanowy.data.db.migrations.Migration2
-import io.github.wulkanowy.data.db.migrations.Migration3
-import io.github.wulkanowy.data.db.migrations.Migration4
-import io.github.wulkanowy.data.db.migrations.Migration5
-import io.github.wulkanowy.data.db.migrations.Migration6
-import io.github.wulkanowy.data.db.migrations.Migration7
-import io.github.wulkanowy.data.db.migrations.Migration8
-import io.github.wulkanowy.data.db.migrations.Migration9
import javax.inject.Singleton
@Singleton
@@ -63,42 +43,21 @@ import javax.inject.Singleton
AttendanceSummary::class,
Grade::class,
GradeSummary::class,
- GradeStatistics::class,
Message::class,
Note::class,
Homework::class,
- Subject::class,
- LuckyNumber::class,
- CompletedLesson::class,
- ReportingUnit::class,
- Recipient::class
+ Subject::class
],
- version = AppDatabase.VERSION_SCHEMA,
+ version = 1,
exportSchema = false
)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
companion object {
- const val VERSION_SCHEMA = 11
-
fun newInstance(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "wulkanowy_database")
.setJournalMode(TRUNCATE)
- .fallbackToDestructiveMigrationFrom(VERSION_SCHEMA + 1)
- .fallbackToDestructiveMigrationOnDowngrade()
- .addMigrations(
- Migration2(),
- Migration3(),
- Migration4(),
- Migration5(),
- Migration6(),
- Migration7(),
- Migration8(),
- Migration9(),
- Migration10(),
- Migration11()
- )
.build()
}
}
@@ -119,8 +78,6 @@ abstract class AppDatabase : RoomDatabase() {
abstract val gradeSummaryDao: GradeSummaryDao
- abstract val gradeStatistics: GradeStatisticsDao
-
abstract val messagesDao: MessagesDao
abstract val noteDao: NoteDao
@@ -128,12 +85,4 @@ abstract class AppDatabase : RoomDatabase() {
abstract val homeworkDao: HomeworkDao
abstract val subjectDao: SubjectDao
-
- abstract val luckyNumberDao: LuckyNumberDao
-
- abstract val completedLessonsDao: CompletedLessonsDao
-
- abstract val reportingUnitDao: ReportingUnitDao
-
- abstract val recipientDao: RecipientDao
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt
index 73a04d236..a550df893 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/Converters.kt
@@ -1,8 +1,6 @@
package io.github.wulkanowy.data.db
import androidx.room.TypeConverter
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
import org.threeten.bp.DateTimeUtils
import org.threeten.bp.Instant
import org.threeten.bp.LocalDate
@@ -38,14 +36,4 @@ class Converters {
@TypeConverter
fun intToMonth(value: Int?) = value?.let { Month.of(it) }
-
- @TypeConverter
- fun intListToGson(list: List): String {
- return Gson().toJson(list)
- }
-
- @TypeConverter
- fun gsonToIntList(value: String): List {
- return Gson().fromJson(value, object : TypeToken>() {}.type)
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt b/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt
index b3b6f5e3e..656b39d49 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt
@@ -19,6 +19,14 @@ class SharedPrefHelper @Inject constructor(private val sharedPref: SharedPrefere
return sharedPref.getLong(key, defaultValue)
}
+ fun putBoolean(key: String, value: Boolean) {
+ sharedPref.edit().putBoolean(key, value).apply()
+ }
+
+ fun getBoolean(key: String, defaultValue: Boolean): Boolean {
+ return sharedPref.getBoolean(key, defaultValue)
+ }
+
fun delete(key: String) {
sharedPref.edit().remove(key).apply()
}
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
deleted file mode 100644
index 6816ceaaf..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/CompletedLessonsDao.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.github.wulkanowy.data.db.dao
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-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
-
-@Singleton
-@Dao
-interface CompletedLessonsDao {
-
- @Insert
- fun insertAll(exams: List)
-
- @Delete
- fun deleteAll(exams: List)
-
- @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>
-}
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 0bd210b02..629f201d4 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeDao.kt
@@ -16,6 +16,9 @@ interface GradeDao {
@Insert
fun insertAll(grades: List)
+ @Update
+ fun update(grade: Grade)
+
@Update
fun updateAll(grade: List)
@@ -25,4 +28,6 @@ interface GradeDao {
@Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId")
fun loadAll(semesterId: Int, studentId: Int): Maybe>
+ @Query("SELECT * FROM Grades WHERE is_read = 0 AND semester_id = :semesterId AND student_id = :studentId")
+ fun loadAllNew(semesterId: Int, studentId: Int): Maybe>
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt
deleted file mode 100644
index 338c369fa..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/GradeStatisticsDao.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.github.wulkanowy.data.db.dao
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.Query
-import io.github.wulkanowy.data.db.entities.GradeStatistics
-import io.reactivex.Maybe
-import javax.inject.Singleton
-
-@Singleton
-@Dao
-interface GradeStatisticsDao {
-
- @Insert
- fun insertAll(gradesStatistics: List)
-
- @Delete
- fun deleteAll(gradesStatistics: List)
-
- @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>
-
- @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>
-}
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 3f2e87bd0..3530118c2 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
@@ -18,6 +18,6 @@ interface GradeSummaryDao {
@Delete
fun deleteAll(gradesSummary: List)
- @Query("SELECT * FROM GradesSummary WHERE student_id = :studentId AND semester_id = :semesterId")
+ @Query("SELECT * FROM grades_summary WHERE student_id = :studentId AND semester_id = :semesterId")
fun loadAll(semesterId: Int, studentId: Int): Maybe>
}
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 253bdb11f..4127460f0 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
@@ -19,6 +19,6 @@ interface HomeworkDao {
@Delete
fun deleteAll(homework: List)
- @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>
+ @Query("SELECT * FROM Homework WHERE semester_id = :semesterId AND student_id = :studentId AND date = :date")
+ fun loadAll(semesterId: Int, studentId: Int, date: LocalDate): Maybe>
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt
deleted file mode 100644
index afd7905c0..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/LuckyNumberDao.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.github.wulkanowy.data.db.dao
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.Query
-import androidx.room.Update
-import io.github.wulkanowy.data.db.entities.LuckyNumber
-import io.reactivex.Maybe
-import org.threeten.bp.LocalDate
-import javax.inject.Singleton
-
-@Singleton
-@Dao
-interface LuckyNumberDao {
-
- @Insert
- fun insert(luckyNumber: LuckyNumber)
-
- @Update
- fun update(luckyNumber: LuckyNumber)
-
- @Delete
- fun delete(luckyNumber: LuckyNumber)
-
- @Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date")
- fun load(studentId: Int, date: LocalDate): Maybe
-
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt
index 3ef5d6905..5018b6900 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt
@@ -12,20 +12,26 @@ import io.reactivex.Maybe
interface MessagesDao {
@Insert
- fun insertAll(messages: List)
+ fun insertAll(messages: List): List
@Delete
fun deleteAll(messages: List)
+ @Update
+ fun update(message: Message)
+
@Update
fun updateAll(messages: List)
- @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder AND removed = 0 ORDER BY date DESC")
- fun loadAll(studentId: Int, folder: Int): Maybe>
-
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND real_id = :id")
- fun load(studentId: Int, id: Int): Maybe
+ fun loadOne(studentId: Int, id: Int): Maybe
+
+ @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder ORDER BY date DESC")
+ fun load(studentId: Int, folder: Int): Maybe>
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND removed = 1 ORDER BY date DESC")
fun loadDeleted(studentId: Int): Maybe>
+
+ @Query("SELECT * FROM Messages WHERE unread = 1 AND student_id = :studentId")
+ fun loadNewMessages(studentId: Int): Maybe>
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt
index 867e06a25..2c1828606 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/NoteDao.kt
@@ -16,13 +16,18 @@ interface NoteDao {
@Insert
fun insertAll(notes: List)
+ @Update
+ fun update(note: Note)
+
@Update
fun updateAll(notes: List)
@Delete
fun deleteAll(notes: List)
- @Query("SELECT * FROM Notes WHERE student_id = :studentId")
- fun loadAll(studentId: Int): Maybe>
+ @Query("SELECT * FROM Notes WHERE semester_id = :semesterId AND student_id = :studentId")
+ fun loadAll(semesterId: Int, studentId: Int): Maybe>
+ @Query("SELECT * FROM Notes WHERE is_read = 0 AND semester_id = :semesterId AND student_id = :studentId")
+ fun loadNew(semesterId: Int, studentId: Int): Maybe>
}
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
deleted file mode 100644
index 7c5fd6ca6..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/RecipientDao.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package io.github.wulkanowy.data.db.dao
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.Query
-import io.github.wulkanowy.data.db.entities.Recipient
-import io.reactivex.Maybe
-import javax.inject.Singleton
-
-@Singleton
-@Dao
-interface RecipientDao {
-
- @Insert
- fun insertAll(messages: List)
-
- @Delete
- fun deleteAll(messages: List)
-
- @Query("SELECT * FROM Recipients WHERE student_id = :studentId AND role = :role AND unit_id = :unitId")
- fun load(studentId: Int, role: Int, unitId: Int): Maybe>
-}
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
deleted file mode 100644
index 1898390a9..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/dao/ReportingUnitDao.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.github.wulkanowy.data.db.dao
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.Query
-import io.github.wulkanowy.data.db.entities.ReportingUnit
-import io.reactivex.Maybe
-import javax.inject.Singleton
-
-@Singleton
-@Dao
-interface ReportingUnitDao {
-
- @Insert
- fun insertAll(reportingUnits: List)
-
- @Delete
- fun deleteAll(reportingUnits: List)
-
- @Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId")
- fun load(studentId: Int): Maybe>
-
- @Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId AND real_id = :unitId")
- fun loadOne(studentId: Int, unitId: Int): Maybe
-}
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 608a66630..44de31d85 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
@@ -1,8 +1,8 @@
package io.github.wulkanowy.data.db.dao
import androidx.room.Dao
-import androidx.room.Delete
import androidx.room.Insert
+import androidx.room.OnConflictStrategy.IGNORE
import androidx.room.Query
import io.github.wulkanowy.data.db.entities.Semester
import io.reactivex.Maybe
@@ -12,12 +12,15 @@ import javax.inject.Singleton
@Dao
interface SemesterDao {
- @Insert
+ @Insert(onConflict = IGNORE)
fun insertAll(semester: List)
- @Delete
- fun deleteAll(semester: List)
-
@Query("SELECT * FROM Semesters WHERE student_id = :studentId")
fun loadAll(studentId: Int): Maybe>
+
+ @Query("UPDATE Semesters SET is_current = 1 WHERE semester_id = :semesterId AND diary_id = :diaryId")
+ fun updateCurrent(semesterId: Int, diaryId: Int)
+
+ @Query("UPDATE Semesters SET is_current = 0 WHERE student_id = :studentId")
+ fun resetCurrent(studentId: Int)
}
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 c0c054c88..76e295392 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
@@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
-import androidx.room.OnConflictStrategy.ABORT
+import androidx.room.OnConflictStrategy.FAIL
import androidx.room.Query
import io.github.wulkanowy.data.db.entities.Student
import io.reactivex.Maybe
@@ -13,7 +13,7 @@ import javax.inject.Singleton
@Dao
interface StudentDao {
- @Insert(onConflict = ABORT)
+ @Insert(onConflict = FAIL)
fun insert(student: Student): Long
@Delete
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt
index 3c58971ae..7588201b3 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Attendance.kt
@@ -10,30 +10,30 @@ import java.io.Serializable
data class Attendance(
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
@ColumnInfo(name = "diary_id")
- val diaryId: Int,
+ var diaryId: Int,
- val date: LocalDate,
+ var date: LocalDate,
- val number: Int,
+ var number: Int,
- val subject: String,
+ var subject: String,
- val name: String,
+ var name: String,
- val presence: Boolean,
+ var presence: Boolean = false,
- val absence: Boolean,
+ var absence: Boolean = false,
- val exemption: Boolean,
+ var exemption: Boolean = false,
- val lateness: Boolean,
+ var lateness: Boolean = false,
- val excused: Boolean,
+ var excused: Boolean = false,
- val deleted: Boolean
+ var deleted: Boolean = false
) : Serializable {
@PrimaryKey(autoGenerate = true)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt
index d2e1f174e..de2de98f6 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/AttendanceSummary.kt
@@ -10,13 +10,13 @@ import java.io.Serializable
data class AttendanceSummary(
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
@ColumnInfo(name = "diary_id")
- val diaryId: Int,
+ var diaryId: Int,
@ColumnInfo(name = "subject_id")
- val subjectId: Int,
+ var subjectId: Int = 0,
val month: Month,
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt
deleted file mode 100644
index 775f3f558..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/CompletedLesson.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-package io.github.wulkanowy.data.db.entities
-
-import androidx.room.ColumnInfo
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import org.threeten.bp.LocalDate
-import java.io.Serializable
-
-@Entity(tableName = "CompletedLesson")
-data class CompletedLesson(
-
- @ColumnInfo(name = "student_id")
- val studentId: Int,
-
- @ColumnInfo(name = "diary_id")
- val diaryId: Int,
-
- val date: LocalDate,
-
- val number: Int,
-
- val subject: String,
-
- val topic: String,
-
- val teacher: String,
-
- @ColumnInfo(name = "teacher_symbol")
- val teacherSymbol: String,
-
- val substitution: String,
-
- val absence: String,
-
- val resources: String
-) : Serializable {
-
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt
index 9ae795e71..daa886d54 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Exam.kt
@@ -9,29 +9,29 @@ import java.io.Serializable
@Entity(tableName = "Exams")
data class Exam(
- @ColumnInfo(name = "student_id")
- val studentId: Int,
+ @ColumnInfo(name = "student_id")
+ var studentId: Int,
- @ColumnInfo(name = "diary_id")
- val diaryId: Int,
+ @ColumnInfo(name = "diary_id")
+ var diaryId: Int,
- val date: LocalDate,
+ var date: LocalDate,
- @ColumnInfo(name = "entry_date")
- val entryDate: LocalDate,
+ @ColumnInfo(name = "entry_date")
+ var entryDate: LocalDate = LocalDate.now(),
- val subject: String,
+ var subject: String,
- val group: String,
+ var group: String,
- val type: String,
+ var type: String,
- val description: String,
+ var description: String,
- val teacher: String,
+ var teacher: String,
- @ColumnInfo(name = "teacher_symbol")
- val teacherSymbol: String
+ @ColumnInfo(name = "teacher_symbol")
+ var teacherSymbol: String
) : Serializable {
@PrimaryKey(autoGenerate = true)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt
index 1221a7aab..d665f9d20 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Grade.kt
@@ -10,35 +10,35 @@ import java.io.Serializable
data class Grade(
@ColumnInfo(name = "semester_id")
- val semesterId: Int,
+ var semesterId: Int,
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
- val subject: String,
+ var subject: String,
- val entry: String,
+ var entry: String,
- val value: Int,
+ var value: Int,
- val modifier: Double,
+ var modifier: Double,
- val comment: String,
+ var comment: String,
- val color: String,
+ var color: String,
@ColumnInfo(name = "grade_symbol")
- val gradeSymbol: String,
+ var gradeSymbol: String,
- val description: String,
+ var description: String,
- val weight: String,
+ var weight: String,
- val weightValue: Double,
+ var weightValue: Int,
- val date: LocalDate,
+ var date: LocalDate,
- val teacher: String
+ var teacher: String
) : Serializable {
@PrimaryKey(autoGenerate = true)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeStatistics.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeStatistics.kt
deleted file mode 100644
index 8ad8b8b8d..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeStatistics.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package io.github.wulkanowy.data.db.entities
-
-import androidx.room.ColumnInfo
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-
-@Entity(tableName = "GradesStatistics")
-data class GradeStatistics(
-
- @ColumnInfo(name = "student_id")
- val studentId: Int,
-
- @ColumnInfo(name = "semester_id")
- val semesterId: Int,
-
- val subject: String,
-
- val grade: Int,
-
- val amount: Int,
-
- @ColumnInfo(name = "is_semester")
- val semester: Boolean
-) {
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt
index e6ac4926d..74d709bb3 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/GradeSummary.kt
@@ -4,21 +4,22 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
-@Entity(tableName = "GradesSummary")
+@Entity(tableName = "Grades_Summary")
data class GradeSummary(
- @ColumnInfo(name = "semester_id")
- val semesterId: Int,
+ @ColumnInfo(name = "semester_id")
+ var semesterId: Int,
- @ColumnInfo(name = "student_id")
- val studentId: Int,
+ @ColumnInfo(name = "student_id")
+ var studentId: Int,
- val subject: String,
+ var subject: String,
- val predictedGrade: String,
+ var predictedGrade: String,
- val finalGrade: String
+ var finalGrade: String
) {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
+
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt
index a22df0961..705d1d639 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Homework.kt
@@ -10,24 +10,24 @@ import java.io.Serializable
data class Homework(
@ColumnInfo(name = "semester_id")
- val semesterId: Int,
+ var semesterId: Int,
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
- val date: LocalDate,
+ var date: LocalDate,
@ColumnInfo(name = "entry_date")
- val entryDate: LocalDate,
+ var entryDate: LocalDate,
- val subject: String,
+ var subject: String,
- val content: String,
+ var content: String,
- val teacher: String,
+ var teacher: String,
@ColumnInfo(name = "teacher_symbol")
- val teacherSymbol: String
+ var teacherSymbol: String
) : Serializable {
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt
deleted file mode 100644
index 5b9130f5d..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/LuckyNumber.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package io.github.wulkanowy.data.db.entities
-
-import androidx.room.ColumnInfo
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import org.threeten.bp.LocalDate
-import java.io.Serializable
-
-@Entity(tableName = "LuckyNumbers")
-data class LuckyNumber (
-
- @ColumnInfo(name = "student_id")
- val studentId: Int,
-
- val date: LocalDate,
-
- @ColumnInfo(name = "lucky_number")
- val luckyNumber: Int
-
-) : Serializable {
-
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-
- @ColumnInfo(name = "is_notified")
- var isNotified: Boolean = true
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt
index 48b4fd022..320e9322e 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt
@@ -10,39 +10,40 @@ import java.io.Serializable
data class Message(
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int? = null,
@ColumnInfo(name = "real_id")
- val realId: Int,
+ val realId: Int? = null,
@ColumnInfo(name = "message_id")
- val messageId: Int,
+ val messageId: Int? = null,
@ColumnInfo(name = "sender_name")
- val sender: String,
+ val sender: String? = null,
@ColumnInfo(name = "sender_id")
- val senderId: Int,
+ val senderId: Int? = null,
+
+ @ColumnInfo(name = "recipient_id")
+ val recipientId: Int? = null,
@ColumnInfo(name = "recipient_name")
- val recipient: String,
+ val recipient: String? = "",
- val subject: String,
+ val subject: String = "",
- val date: LocalDateTime,
+ val date: LocalDateTime? = null,
@ColumnInfo(name = "folder_id")
- val folderId: Int,
+ val folderId: Int = 0,
- var unread: Boolean,
+ var unread: Boolean? = false,
- @ColumnInfo(name = "unread_by")
- val unreadBy: Int,
+ val unreadBy: Int? = 0,
- @ColumnInfo(name = "read_by")
- val readBy: Int,
+ val readBy: Int? = 0,
- val removed: Boolean
+ val removed: Boolean = false
) : Serializable {
@PrimaryKey(autoGenerate = true)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt
index 5f3a92ab6..1f61f0870 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Note.kt
@@ -9,23 +9,26 @@ import java.io.Serializable
@Entity(tableName = "Notes")
data class Note(
+ @ColumnInfo(name = "semester_id")
+ var semesterId: Int,
+
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
- val date: LocalDate,
+ var date: LocalDate,
- val teacher: String,
+ var teacher: String,
- val category: String,
+ var category: String,
- val content: String
+ var content: String
) : Serializable {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
@ColumnInfo(name = "is_read")
- var isRead: Boolean = true
+ var isRead: Boolean = false
@ColumnInfo(name = "is_notified")
var isNotified: Boolean = true
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt
deleted file mode 100644
index 3021da72d..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Recipient.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.github.wulkanowy.data.db.entities
-
-import androidx.room.ColumnInfo
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import java.io.Serializable
-
-@Entity(tableName = "Recipients")
-data class Recipient(
-
- @ColumnInfo(name = "student_id")
- val studentId: Int,
-
- @ColumnInfo(name = "real_id")
- val realId: String,
-
- val name: String,
-
- @ColumnInfo(name = "real_name")
- val realName: String,
-
- @ColumnInfo(name = "login_id")
- val loginId: Int,
-
- @ColumnInfo(name = "unit_id")
- val unitId: Int,
-
- val role: Int,
-
- val hash: String
-
-) : Serializable {
-
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-
- override fun toString() = name
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/ReportingUnit.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/ReportingUnit.kt
deleted file mode 100644
index 601d8aac7..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/ReportingUnit.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package io.github.wulkanowy.data.db.entities
-
-import androidx.room.ColumnInfo
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import java.io.Serializable
-
-@Entity(tableName = "ReportingUnits")
-data class ReportingUnit(
-
- @ColumnInfo(name = "student_id")
- val studentId: Int,
-
- @ColumnInfo(name = "real_id")
- val realId: Int,
-
- @ColumnInfo(name = "short")
- val shortName: String,
-
- @ColumnInfo(name = "sender_id")
- val senderId: Int,
-
- @ColumnInfo(name = "sender_name")
- val senderName: String,
-
- val roles: List
-
-) : Serializable {
-
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt
index 0f44fa2d9..509a692e6 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Semester.kt
@@ -8,31 +8,24 @@ import androidx.room.PrimaryKey
@Entity(tableName = "Semesters", indices = [Index(value = ["student_id", "diary_id", "semester_id"], unique = true)])
data class Semester(
+ @PrimaryKey(autoGenerate = true)
+ var id: Long = 0,
+
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
@ColumnInfo(name = "diary_id")
- val diaryId: Int,
+ var diaryId: Int,
@ColumnInfo(name = "diary_name")
- val diaryName: String,
+ var diaryName: String,
@ColumnInfo(name = "semester_id")
- val semesterId: Int,
+ var semesterId: Int,
@ColumnInfo(name = "semester_name")
- val semesterName: Int,
+ var semesterName: Int,
@ColumnInfo(name = "is_current")
- val isCurrent: Boolean,
-
- @ColumnInfo(name = "class_id")
- val classId: Int,
-
- @ColumnInfo(name = "unit_id")
- val unitId: Int
-) {
-
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-}
+ var isCurrent: Boolean = false
+)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt
index 261b35fbd..1fe4cf8d0 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Student.kt
@@ -4,41 +4,35 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
-import org.threeten.bp.LocalDateTime
-import java.io.Serializable
@Entity(tableName = "Students", indices = [Index(value = ["email", "symbol", "student_id", "school_id"], unique = true)])
data class Student(
- val endpoint: String,
+ @PrimaryKey(autoGenerate = true)
+ var id: Long = 0,
- val loginType: String,
+ var endpoint: String,
- val email: String,
+ var loginType: String,
+
+ var email: String,
var password: String,
- val symbol: String,
+ var symbol: String = "",
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int = 0,
@ColumnInfo(name = "student_name")
- val studentName: String,
+ var studentName: String = "",
@ColumnInfo(name = "school_id")
- val schoolSymbol: String,
+ var schoolSymbol: String = "",
@ColumnInfo(name = "school_name")
- val schoolName: String,
+ var schoolName: String = "",
@ColumnInfo(name = "is_current")
- val isCurrent: Boolean,
-
- @ColumnInfo(name = "registration_date")
- val registrationDate: LocalDateTime
-) : Serializable {
-
- @PrimaryKey(autoGenerate = true)
- var id: Long = 0
-}
+ var isCurrent: Boolean = false
+)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Subject.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Subject.kt
index dbaa6f4ed..45306be36 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Subject.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Subject.kt
@@ -9,15 +9,15 @@ import java.io.Serializable
data class Subject(
@ColumnInfo(name = "student_id")
- val studentId: Int,
+ var studentId: Int,
@ColumnInfo(name = "diary_id")
- val diaryId: Int,
+ var diaryId: Int,
@ColumnInfo(name = "real_id")
- val realId: Int,
+ var realId: Int,
- val name: String
+ var name: String
) : Serializable {
@PrimaryKey(autoGenerate = true)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt
index 9bc3d2140..2aa1eafa7 100644
--- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Timetable.kt
@@ -10,39 +10,33 @@ import java.io.Serializable
@Entity(tableName = "Timetable")
data class Timetable(
- @ColumnInfo(name = "student_id")
- val studentId: Int,
+ @ColumnInfo(name = "student_id")
+ var studentId: Int,
- @ColumnInfo(name = "diary_id")
- val diaryId: Int,
+ @ColumnInfo(name = "diary_id")
+ var diaryId: Int,
- val number: Int,
+ val number: Int = 0,
- val start: LocalDateTime,
+ val start: LocalDateTime = LocalDateTime.now(),
- val end: LocalDateTime,
+ val end: LocalDateTime = LocalDateTime.now(),
- val date: LocalDate,
+ val date: LocalDate,
- val subject: String,
+ val subject: String,
- val subjectOld: String,
+ val group: String,
- val group: String,
+ val room: String,
- val room: String,
+ val teacher: String,
- val roomOld: String,
+ val info: String,
- val teacher: String,
+ val changes: Boolean = false,
- val teacherOld: String,
-
- val info: String,
-
- val changes: Boolean,
-
- val canceled: Boolean
+ val canceled: Boolean = false
) : Serializable {
@PrimaryKey(autoGenerate = true)
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt
deleted file mode 100644
index c26a02d1f..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration10.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration10 : Migration(9, 10) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE Grades_Summary RENAME TO GradesSummary")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt
deleted file mode 100644
index cb437c0ee..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration11.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration11 : Migration(10, 11) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS Grades_temp (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
- is_read INTEGER NOT NULL,
- is_notified INTEGER NOT NULL,
- semester_id INTEGER NOT NULL,
- student_id INTEGER NOT NULL,
- subject TEXT NOT NULL,
- entry TEXT NOT NULL,
- value INTEGER NOT NULL,
- modifier REAL NOT NULL,
- comment TEXT NOT NULL,
- color TEXT NOT NULL,
- grade_symbol TEXT NOT NULL,
- description TEXT NOT NULL,
- weight TEXT NOT NULL,
- weightValue REAL NOT NULL,
- date INTEGER NOT NULL,
- teacher TEXT NOT NULL
- )
- """)
- database.execSQL("INSERT INTO Grades_temp SELECT * FROM Grades")
- database.execSQL("DROP TABLE Grades")
- database.execSQL("ALTER TABLE Grades_temp RENAME TO Grades")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt
deleted file mode 100644
index c5a30991a..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration2.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration2 : Migration(1, 2) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS LuckyNumbers (
- id INTEGER PRIMARY KEY NOT NULL,
- is_notified INTEGER NOT NULL,
- student_id INTEGER NOT NULL,
- date INTEGER NOT NULL,
- lucky_number INTEGER NOT NULL)
- """)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt
deleted file mode 100644
index d9699c0f4..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration3.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration3 : Migration(2, 3) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS CompletedLesson (
- id INTEGER PRIMARY KEY NOT NULL,
- student_id INTEGER NOT NULL,
- diary_id INTEGER NOT NULL,
- date INTEGER NOT NULL,
- number INTEGER NOT NULL,
- subject TEXT NOT NULL,
- topic TEXT NOT NULL,
- teacher TEXT NOT NULL,
- teacher_symbol TEXT NOT NULL,
- substitution TEXT NOT NULL,
- absence TEXT NOT NULL,
- resources TEXT NOT NULL)
- """)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt
deleted file mode 100644
index 0ae89bdd6..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration4.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration4 : Migration(3, 4) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("DROP TABLE IF EXISTS Messages")
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS Messages (
- id INTEGER PRIMARY KEY NOT NULL,
- is_notified INTEGER NOT NULL,
- content TEXT,
- student_id INTEGER NOT NULL,
- real_id INTEGER NOT NULL,
- message_id INTEGER NOT NULL,
- sender_name TEXT NOT NULL,
- sender_id INTEGER NOT NULL,
- recipient_id INTEGER NOT NULL,
- recipient_name TEXT NOT NULL,
- subject TEXT NOT NULL,
- date INTEGER NOT NULL,
- folder_id INTEGER NOT NULL,
- unread INTEGER NOT NULL,
- unreadBy INTEGER NOT NULL,
- readBy INTEGER NOT NULL,
- removed INTEGER NOT NULL)
- """)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt
deleted file mode 100644
index fe0dec48f..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration5.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-import org.threeten.bp.LocalDateTime.now
-import org.threeten.bp.ZoneOffset
-
-class Migration5 : Migration(4, 5) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE Students ADD COLUMN registration_date INTEGER DEFAULT 0 NOT NULL")
- database.execSQL("UPDATE Students SET registration_date = '${now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli()}'")
- database.execSQL("DROP TABLE IF EXISTS Notes")
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS Notes (
- id INTEGER PRIMARY KEY NOT NULL,
- is_read INTEGER NOT NULL,
- is_notified INTEGER NOT NULL,
- student_id INTEGER NOT NULL,
- date INTEGER NOT NULL,
- teacher TEXT NOT NULL,
- category TEXT NOT NULL,
- content TEXT NOT NULL)
- """)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt
deleted file mode 100644
index fa9436187..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration6.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration6 : Migration(5, 6) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS ReportingUnits (
- id INTEGER PRIMARY KEY NOT NULL,
- student_id INTEGER NOT NULL,
- real_id INTEGER NOT NULL,
- short TEXT NOT NULL,
- sender_id INTEGER NOT NULL,
- sender_name TEXT NOT NULL,
- roles TEXT NOT NULL)
- """)
-
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS Recipients (
- id INTEGER PRIMARY KEY NOT NULL,
- student_id INTEGER NOT NULL,
- real_id TEXT NOT NULL,
- name TEXT NOT NULL,
- real_name TEXT NOT NULL,
- login_id INTEGER NOT NULL,
- unit_id INTEGER NOT NULL,
- role INTEGER NOT NULL,
- hash TEXT NOT NULL)
- """)
-
- database.execSQL("DELETE FROM Semesters WHERE 1")
- database.execSQL("ALTER TABLE Semesters ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL")
- database.execSQL("ALTER TABLE Semesters ADD COLUMN unit_id INTEGER DEFAULT 0 NOT NULL")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt
deleted file mode 100644
index 120716c81..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration7.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration7 : Migration(6, 7) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS GradesStatistics (
- id INTEGER PRIMARY KEY NOT NULL,
- student_id INTEGER NOT NULL,
- semester_id INTEGER NOT NULL,
- subject TEXT NOT NULL,
- grade INTEGER NOT NULL,
- amount INTEGER NOT NULL,
- is_semester INTEGER NOT NULL)
- """)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt
deleted file mode 100644
index 7009ee129..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration8.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration8 : Migration(7, 8) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE Timetable ADD COLUMN subjectOld TEXT DEFAULT \"\" NOT NULL")
- database.execSQL("ALTER TABLE Timetable ADD COLUMN roomOld TEXT DEFAULT \"\" NOT NULL")
- database.execSQL("ALTER TABLE Timetable ADD COLUMN teacherOld TEXT DEFAULT \"\" NOT NULL")
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt b/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt
deleted file mode 100644
index d79a57062..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/db/migrations/Migration9.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package io.github.wulkanowy.data.db.migrations
-
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-
-class Migration9 : Migration(8, 9) {
-
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("DROP TABLE IF EXISTS Messages")
- database.execSQL("""
- CREATE TABLE IF NOT EXISTS Messages (
- id INTEGER PRIMARY KEY NOT NULL,
- student_id INTEGER NOT NULL,
- real_id INTEGER NOT NULL,
- message_id INTEGER NOT NULL,
- sender_name TEXT NOT NULL,
- sender_id INTEGER NOT NULL,
- recipient_name TEXT NOT NULL,
- subject TEXT NOT NULL,
- date INTEGER NOT NULL,
- folder_id INTEGER NOT NULL,
- unread INTEGER NOT NULL,
- unread_by INTEGER NOT NULL,
- read_by INTEGER NOT NULL,
- removed INTEGER NOT NULL,
- is_notified INTEGER NOT NULL,
- content TEXT)
- """)
- }
-}
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/AttendanceRepository.kt
similarity index 91%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceRepository.kt
index f6eb07dae..eb7230ae5 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceRepository.kt
@@ -1,9 +1,11 @@
-package io.github.wulkanowy.data.repositories.attendance
+package io.github.wulkanowy.data.repositories
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.repositories.local.AttendanceLocal
+import io.github.wulkanowy.data.repositories.remote.AttendanceRemote
import io.github.wulkanowy.utils.friday
import io.github.wulkanowy.utils.monday
import io.reactivex.Single
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/AttendanceSummaryRepository.kt
similarity index 88%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt
index 90d39aab2..8e21b12c6 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/AttendanceSummaryRepository.kt
@@ -1,9 +1,11 @@
-package io.github.wulkanowy.data.repositories.attendancesummary
+package io.github.wulkanowy.data.repositories
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.repositories.local.AttendanceSummaryLocal
+import io.github.wulkanowy.data.repositories.remote.AttendanceSummaryRemote
import io.reactivex.Single
import java.net.UnknownHostException
import javax.inject.Inject
@@ -16,7 +18,7 @@ class AttendanceSummaryRepository @Inject constructor(
private val remote: AttendanceSummaryRemote
) {
- fun getAttendanceSummary(semester: Semester, subjectId: Int, forceRefresh: Boolean = false): Single> {
+ fun getAttendanceSummary(semester: Semester, subjectId: Int, forceRefresh: Boolean = false): Single>? {
return local.getAttendanceSummary(semester, subjectId).filter { !forceRefresh }
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt
similarity index 92%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt
index a0cb5ba11..cb78df53d 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/ExamRepository.kt
@@ -1,9 +1,11 @@
-package io.github.wulkanowy.data.repositories.exam
+package io.github.wulkanowy.data.repositories
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.repositories.local.ExamLocal
+import io.github.wulkanowy.data.repositories.remote.ExamRemote
import io.github.wulkanowy.utils.friday
import io.github.wulkanowy.utils.monday
import io.reactivex.Single
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/GradeRepository.kt
similarity index 56%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/GradeRepository.kt
index 3dd456bff..42266955e 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeRepository.kt
@@ -1,10 +1,11 @@
-package io.github.wulkanowy.data.repositories.grade
+package io.github.wulkanowy.data.repositories
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.Semester
-import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.local.GradeLocal
+import io.github.wulkanowy.data.repositories.remote.GradeRemote
import io.reactivex.Completable
import io.reactivex.Single
import java.net.UnknownHostException
@@ -18,7 +19,7 @@ class GradeRepository @Inject constructor(
private val remote: GradeRemote
) {
- fun getGrades(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
+ fun getGrades(semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
return local.getGrades(semester).filter { !forceRefresh }
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
@@ -27,33 +28,25 @@ class GradeRepository @Inject constructor(
}.flatMap { newGrades ->
local.getGrades(semester).toSingle(emptyList())
.doOnSuccess { oldGrades ->
- val notifyBreakDate = oldGrades.maxBy { it.date }?.date
- ?: student.registrationDate.toLocalDate()
local.deleteGrades(oldGrades - newGrades)
local.saveGrades((newGrades - oldGrades)
.onEach {
- if (it.date >= notifyBreakDate) it.apply {
- isRead = false
- if (notify) isNotified = false
- }
+ if (oldGrades.isNotEmpty()) it.isRead = false
+ if (notify) it.isNotified = false
})
}
}.flatMap { local.getGrades(semester).toSingle(emptyList()) })
}
- fun getUnreadGrades(semester: Semester): Single> {
- return local.getGrades(semester).map { it.filter { grade -> !grade.isRead } }.toSingle(emptyList())
- }
-
- fun getNotNotifiedGrades(semester: Semester): Single> {
- return local.getGrades(semester).map { it.filter { grade -> !grade.isNotified } }.toSingle(emptyList())
+ fun getNewGrades(semester: Semester): Single> {
+ return local.getNewGrades(semester).toSingle(emptyList())
}
fun updateGrade(grade: Grade): Completable {
- return Completable.fromCallable { local.updateGrades(listOf(grade)) }
+ return local.updateGrade(grade)
}
fun updateGrades(grades: List): Completable {
- return Completable.fromCallable { local.updateGrades(grades) }
+ return local.updateGrades(grades)
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeSummaryRepository.kt
similarity index 88%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/GradeSummaryRepository.kt
index b19e07f00..a59a2cd54 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/GradeSummaryRepository.kt
@@ -1,9 +1,11 @@
-package io.github.wulkanowy.data.repositories.gradessummary
+package io.github.wulkanowy.data.repositories
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.GradeSummary
import io.github.wulkanowy.data.db.entities.Semester
+import io.github.wulkanowy.data.repositories.local.GradeSummaryLocal
+import io.github.wulkanowy.data.repositories.remote.GradeSummaryRemote
import io.reactivex.Single
import java.net.UnknownHostException
import javax.inject.Inject
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt
new file mode 100644
index 000000000..a2a477b56
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/HomeworkRepository.kt
@@ -0,0 +1,36 @@
+package io.github.wulkanowy.data.repositories
+
+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.repositories.local.HomeworkLocal
+import io.github.wulkanowy.data.repositories.remote.HomeworkRemote
+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(semester: Semester, date: LocalDate, forceRefresh: Boolean = false): Single> {
+ return local.getHomework(semester, date).filter { !forceRefresh }
+ .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
+ .flatMap {
+ if (it) remote.getHomework(semester, date)
+ else Single.error(UnknownHostException())
+ }.flatMap { newGrades ->
+ local.getHomework(semester, date).toSingle(emptyList())
+ .doOnSuccess { oldGrades ->
+ local.deleteHomework(oldGrades - newGrades)
+ local.saveHomework(newGrades - oldGrades)
+ }
+ }.flatMap { local.getHomework(semester, date).toSingle(emptyList()) })
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/MessagesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/MessagesRepository.kt
new file mode 100644
index 000000000..06a0f6f95
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/MessagesRepository.kt
@@ -0,0 +1,79 @@
+package io.github.wulkanowy.data.repositories
+
+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.Student
+import io.github.wulkanowy.data.repositories.local.MessagesLocal
+import io.github.wulkanowy.data.repositories.remote.MessagesRemote
+import io.reactivex.Completable
+import io.reactivex.Single
+import java.net.UnknownHostException
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class MessagesRepository @Inject constructor(
+ private val settings: InternetObservingSettings,
+ private val local: MessagesLocal,
+ private val remote: MessagesRemote
+) {
+
+ enum class MessageFolder(val id: Int = 1) {
+ RECEIVED(1),
+ SENT(2),
+ TRASHED(3)
+ }
+
+ fun getMessages(studentId: Int, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
+ return local.getMessages(studentId, folder).filter { !forceRefresh }
+ .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
+ .flatMap {
+ if (it) remote.getMessages(studentId, folder)
+ else Single.error(UnknownHostException())
+ }.flatMap { new ->
+ local.getMessages(studentId, folder).toSingle(emptyList())
+ .doOnSuccess { old ->
+ local.deleteMessages(old - new)
+ local.saveMessages((new - old)
+ .onEach {
+ it.isNotified = !notify
+ })
+ }
+ }.flatMap { local.getMessages(studentId, folder).toSingle(emptyList()) }
+ )
+ }
+
+ fun getMessage(studentId: Int, messageId: Int, markAsRead: Boolean = false): Single {
+ return local.getMessage(studentId, messageId)
+ .filter { !it.content.isNullOrEmpty() }
+ .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
+ .flatMap {
+ if (it) local.getMessage(studentId, messageId).toSingle()
+ else Single.error(UnknownHostException())
+ }
+ .flatMap { dbMessage ->
+ remote.getMessagesContent(dbMessage, markAsRead).doOnSuccess {
+ local.updateMessage(dbMessage.copy(unread = false).apply {
+ id = dbMessage.id
+ content = it
+ })
+ }
+ }.flatMap {
+ local.getMessage(studentId, messageId).toSingle()
+ }
+ )
+ }
+
+ fun getNewMessages(student: Student): Single> {
+ return local.getNewMessages(student).toSingle(emptyList())
+ }
+
+ fun updateMessage(message: Message): Completable {
+ return Completable.fromCallable { local.updateMessage(message) }
+ }
+
+ fun updateMessages(messages: List): Completable {
+ return Completable.fromCallable { local.updateMessages(messages) }
+ }
+}
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/NoteRepository.kt
similarity index 54%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/NoteRepository.kt
index d74bc7eaf..2836894f2 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/NoteRepository.kt
@@ -1,10 +1,11 @@
-package io.github.wulkanowy.data.repositories.note
+package io.github.wulkanowy.data.repositories
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.data.repositories.local.NoteLocal
+import io.github.wulkanowy.data.repositories.remote.NoteRemote
import io.reactivex.Completable
import io.reactivex.Single
import java.net.UnknownHostException
@@ -18,36 +19,34 @@ class NoteRepository @Inject constructor(
private val remote: NoteRemote
) {
- fun getNotes(student: Student, semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
- return local.getNotes(student).filter { !forceRefresh }
+ fun getNotes(semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
+ return local.getNotes(semester).filter { !forceRefresh }
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
if (it) remote.getNotes(semester)
else Single.error(UnknownHostException())
}.flatMap { new ->
- local.getNotes(student).toSingle(emptyList())
+ local.getNotes(semester).toSingle(emptyList())
.doOnSuccess { old ->
local.deleteNotes(old - new)
local.saveNotes((new - old)
.onEach {
- if (it.date >= student.registrationDate.toLocalDate()) it.apply {
- isRead = false
- if (notify) isNotified = false
- }
+ if (notify) it.isNotified = false
})
}
- }.flatMap { local.getNotes(student).toSingle(emptyList()) })
+ }.flatMap { local.getNotes(semester).toSingle(emptyList()) }
+ )
}
- fun getNotNotifiedNotes(student: Student): Single> {
- return local.getNotes(student).map { it.filter { note -> !note.isNotified } }.toSingle(emptyList())
+ fun getNewNotes(semester: Semester): Single> {
+ return local.getNewNotes(semester).toSingle(emptyList())
}
fun updateNote(note: Note): Completable {
- return Completable.fromCallable { local.updateNotes(listOf(note)) }
+ return local.updateNote(note)
}
fun updateNotes(notes: List): Completable {
- return Completable.fromCallable { local.updateNotes(notes) }
+ return local.updateNotes(notes)
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt
similarity index 64%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt
index d51fc4957..205baa3aa 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/preferences/PreferencesRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.preferences
+package io.github.wulkanowy.data.repositories
import android.content.Context
import android.content.SharedPreferences
@@ -12,7 +12,7 @@ class PreferencesRepository @Inject constructor(
val context: Context
) {
val startMenuIndex: Int
- get() = sharedPref.getString(context.getString(R.string.pref_key_start_menu), "0")?.toIntOrNull() ?: 0
+ get() = sharedPref.getString(context.getString(R.string.pref_key_start_menu), "0")?.toInt() ?: 0
val isShowPresent: Boolean
get() = sharedPref.getBoolean(context.getString(R.string.pref_key_attendance_present), true)
@@ -22,18 +22,21 @@ class PreferencesRepository @Inject constructor(
val currentThemeKey: String = context.getString(R.string.pref_key_theme)
val currentTheme: Int
- get() = sharedPref.getString(currentThemeKey, "1")?.toIntOrNull() ?: 1
+ get() = sharedPref.getString(currentThemeKey, "1")?.toInt() ?: 1
- val gradeColorTheme: String
- get() = sharedPref.getString(context.getString(R.string.pref_key_grade_color_scheme), "vulcan") ?: "vulcan"
+ val gradePlusModifier: Double
+ get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_plus), "0.0")?.toDouble() ?: 0.0
- val serviceEnableKey: String = context.getString(R.string.pref_key_services_enable)
+ val gradeMinusModifier: Double
+ get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_minus), "0.0")?.toDouble() ?: 0.0
+
+ val serviceEnablesKey: String = context.getString(R.string.pref_key_services_enable)
val isServiceEnabled: Boolean
- get() = sharedPref.getBoolean(serviceEnableKey, true)
+ get() = sharedPref.getBoolean(serviceEnablesKey, true)
val servicesIntervalKey: String = context.getString(R.string.pref_key_services_interval)
- val servicesInterval: Long
- get() = sharedPref.getString(servicesIntervalKey, "60")?.toLongOrNull() ?: 60
+ val servicesInterval: Int
+ get() = sharedPref.getString(servicesIntervalKey, "60")?.toInt() ?: 60
val servicesOnlyWifiKey: String = context.getString(R.string.pref_key_services_wifi_only)
val isServicesOnlyWifi: Boolean
@@ -41,18 +44,4 @@ class PreferencesRepository @Inject constructor(
val isNotificationsEnable: Boolean
get() = sharedPref.getBoolean(context.getString(R.string.pref_key_notifications_enable), true)
-
- val isDebugNotificationEnableKey: String = context.getString(R.string.pref_key_notification_debug)
- val isDebugNotificationEnable: Boolean
- get() = sharedPref.getBoolean(isDebugNotificationEnableKey, false)
-
- val gradePlusModifier: Double
- get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_plus), "0.0")?.toDouble() ?: 0.0
-
- val gradeMinusModifier: Double
- get() = sharedPref.getString(context.getString(R.string.pref_key_grade_modifier_minus), "0.0")?.toDouble()
- ?: 0.0
-
- val fillMessageContent: Boolean
- get() = sharedPref.getBoolean(context.getString(R.string.pref_key_fill_message_content), true)
}
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/SemesterRepository.kt
similarity index 65%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt
index 9735f0290..b79021064 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SemesterRepository.kt
@@ -1,13 +1,14 @@
-package io.github.wulkanowy.data.repositories.semester
+package io.github.wulkanowy.data.repositories
import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
import io.github.wulkanowy.data.ApiHelper
import io.github.wulkanowy.data.db.entities.Semester
import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.local.SemesterLocal
+import io.github.wulkanowy.data.repositories.remote.SemesterRemote
import io.reactivex.Maybe
import io.reactivex.Single
-import timber.log.Timber
import java.net.UnknownHostException
import javax.inject.Inject
import javax.inject.Singleton
@@ -26,17 +27,10 @@ class SemesterRepository @Inject constructor(
.switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
if (it) remote.getSemesters(student) else Single.error(UnknownHostException())
- }.flatMap { new ->
- val currentSemesters = new.filter { it.isCurrent }
- if (currentSemesters.size == 1) {
- local.getSemesters(student).toSingle(emptyList())
- .doOnSuccess { old ->
- local.deleteSemesters(old - new)
- local.saveSemesters(new - old)
- }
- } else {
- Timber.i("Current semesters list:\n${currentSemesters.joinToString(separator = "\n")}")
- throw IllegalArgumentException("Current semester can be only one.")
+ }.map { newSemesters ->
+ local.apply {
+ saveSemesters(newSemesters)
+ setCurrentSemester(newSemesters.single { it.isCurrent })
}
}.flatMap { local.getSemesters(student).toSingle(emptyList()) })
}
@@ -45,3 +39,4 @@ class SemesterRepository @Inject constructor(
return getSemesters(student, forceRefresh).map { item -> item.single { it.isCurrent } }
}
}
+
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/StudentRepository.kt
similarity index 68%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt
index 7ddff0aa4..97210da0b 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/StudentRepository.kt
@@ -1,11 +1,12 @@
-package io.github.wulkanowy.data.repositories.student
+package io.github.wulkanowy.data.repositories
import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
import io.github.wulkanowy.data.ApiHelper
import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.local.StudentLocal
+import io.github.wulkanowy.data.repositories.remote.StudentRemote
import io.reactivex.Completable
-import io.reactivex.Maybe
import io.reactivex.Single
import java.net.UnknownHostException
import javax.inject.Inject
@@ -19,15 +20,20 @@ class StudentRepository @Inject constructor(
private val apiHelper: ApiHelper
) {
- fun isStudentSaved(): Single = local.getStudents(false).isEmpty.map { !it }
+ val isStudentSaved
+ get() = local.isStudentSaved
- fun getStudents(email: String, password: String, endpoint: String, symbol: String = ""): Single> {
- return ReactiveNetwork.checkInternetConnectivity(settings)
+ lateinit var cachedStudents: Single>
+ private set
+
+ fun getStudents(email: String, password: String, symbol: String, endpoint: String): Single> {
+ cachedStudents = ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
apiHelper.initApi(email, password, symbol, endpoint)
if (it) remote.getStudents(email, password, endpoint)
else Single.error(UnknownHostException("No internet connection"))
- }
+ }.doOnSuccess { cachedStudents = Single.just(it) }
+ return cachedStudents
}
fun getSavedStudents(decryptPass: Boolean = true): Single> {
@@ -35,9 +41,7 @@ class StudentRepository @Inject constructor(
}
fun getCurrentStudent(decryptPass: Boolean = true): Single {
- return local.getCurrentStudent(decryptPass)
- .switchIfEmpty(Maybe.error(NoSuchElementException("No current student")))
- .toSingle()
+ return local.getCurrentStudent(decryptPass).toSingle()
}
fun saveStudent(student: Student): Single {
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/SubjectRepostory.kt
similarity index 86%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepostory.kt
index 6167251b9..e3e8a2a7b 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRepository.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/SubjectRepostory.kt
@@ -1,16 +1,18 @@
-package io.github.wulkanowy.data.repositories.subject
+package io.github.wulkanowy.data.repositories
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.Subject
+import io.github.wulkanowy.data.repositories.local.SubjectLocal
+import io.github.wulkanowy.data.repositories.remote.SubjectRemote
import io.reactivex.Single
import java.net.UnknownHostException
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
-class SubjectRepository @Inject constructor(
+class SubjectRepostory @Inject constructor(
private val settings: InternetObservingSettings,
private val local: SubjectLocal,
private val remote: SubjectRemote
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt
new file mode 100644
index 000000000..6cc6a0435
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/TimetableRepository.kt
@@ -0,0 +1,46 @@
+package io.github.wulkanowy.data.repositories
+
+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.Timetable
+import io.github.wulkanowy.data.repositories.local.TimetableLocal
+import io.github.wulkanowy.data.repositories.remote.TimetableRemote
+import io.github.wulkanowy.utils.friday
+import io.github.wulkanowy.utils.monday
+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
+) {
+
+ fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate, forceRefresh: Boolean = false)
+ : Single> {
+ return Single.fromCallable { startDate.monday to endDate.friday }
+ .flatMap { dates ->
+ local.getTimetable(semester, dates.first, dates.second).filter { !forceRefresh }
+ .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
+ .flatMap {
+ if (it) remote.getTimetable(semester, dates.first, dates.second)
+ else Single.error(UnknownHostException())
+ }.flatMap { newTimetable ->
+ local.getTimetable(semester, dates.first, dates.second)
+ .toSingle(emptyList())
+ .doOnSuccess { oldTimetable ->
+ local.deleteTimetable(oldTimetable - newTimetable)
+ local.saveTimetable(newTimetable - oldTimetable)
+ }
+ }.flatMap {
+ local.getTimetable(semester, dates.first, dates.second)
+ .toSingle(emptyList())
+ }).map { list -> list.filter { it.date in startDate..endDate } }
+ }
+ }
+}
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
deleted file mode 100644
index 9b275908e..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsLocal.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-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
-
-@Singleton
-class CompletedLessonsLocal @Inject constructor(private val completedLessonsDb: CompletedLessonsDao) {
-
- fun saveCompletedLessons(completedLessons: List) {
- completedLessonsDb.insertAll(completedLessons)
- }
-
- fun deleteCompleteLessons(completedLessons: List) {
- completedLessonsDb.deleteAll(completedLessons)
- }
-
- fun getCompletedLessons(semester: Semester, start: LocalDate, end: LocalDate): Maybe> {
- return completedLessonsDb.loadAll(semester.diaryId, semester.studentId, start, end).filter { it.isNotEmpty() }
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt
deleted file mode 100644
index 58dd5a9d1..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRemote.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package io.github.wulkanowy.data.repositories.completedlessons
-
-import io.github.wulkanowy.api.Api
-import io.github.wulkanowy.api.toLocalDate
-import io.github.wulkanowy.data.db.entities.CompletedLesson
-import io.github.wulkanowy.data.db.entities.Semester
-import io.reactivex.Single
-import org.threeten.bp.LocalDate
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class CompletedLessonsRemote @Inject constructor(private val api: Api) {
-
- fun getCompletedLessons(semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> {
- return Single.just(api.apply { diaryId = semester.diaryId })
- .flatMap { it.getCompletedLessons(startDate, endDate) }
- .map { lessons ->
- lessons.map {
- it.absence
- CompletedLesson(
- studentId = semester.studentId,
- diaryId = semester.diaryId,
- date = it.date.toLocalDate(),
- 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
deleted file mode 100644
index 5b5941076..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/completedlessons/CompletedLessonsRepository.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-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.utils.friday
-import io.github.wulkanowy.utils.monday
-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(semester: Semester, startDate: LocalDate, endDate: LocalDate, forceRefresh: Boolean = false): Single> {
- return Single.fromCallable { startDate.monday to endDate.friday }
- .flatMap { dates ->
- local.getCompletedLessons(semester, dates.first, dates.second).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.getCompletedLessons(semester, dates.first, dates.second)
- else Single.error(UnknownHostException())
- }.flatMap { new ->
- local.getCompletedLessons(semester, dates.first, dates.second)
- .toSingle(emptyList())
- .doOnSuccess { old ->
- local.deleteCompleteLessons(old - new)
- local.saveCompletedLessons(new - old)
- }
- }.flatMap {
- local.getCompletedLessons(semester, dates.first, dates.second)
- .toSingle(emptyList())
- }).map { list -> list.filter { it.date in startDate..endDate } }
- }
- }
-}
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
deleted file mode 100644
index 581ac2f81..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsLocal.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.github.wulkanowy.data.repositories.gradestatistics
-
-import io.github.wulkanowy.data.db.dao.GradeStatisticsDao
-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
-
-@Singleton
-class GradeStatisticsLocal @Inject constructor(private val gradeStatisticsDb: GradeStatisticsDao) {
-
- fun getGradesStatistics(semester: Semester, isSemester: Boolean): Maybe> {
- return gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester)
- .filter { !it.isEmpty() }
- }
-
- fun getGradesStatistics(semester: Semester, isSemester: Boolean, subjectName: String): Maybe> {
- return (if ("Wszystkie" == subjectName) gradeStatisticsDb.loadAll(semester.semesterId, semester.studentId, isSemester).map { list ->
- list.groupBy { it.grade }.map {
- GradeStatistics(semester.studentId, semester.semesterId, subjectName, it.key, it.value.fold(0) { acc, e -> acc + e.amount }, false)
- }
- }
- else gradeStatisticsDb.loadSubject(semester.semesterId, semester.studentId, subjectName, isSemester)).filter { !it.isEmpty() }
- }
-
- fun saveGradesStatistics(gradesStatistics: List) {
- gradeStatisticsDb.insertAll(gradesStatistics)
- }
-
- fun deleteGradesStatistics(gradesStatistics: List) {
- gradeStatisticsDb.deleteAll(gradesStatistics)
- }
-}
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
deleted file mode 100644
index fa3b951f6..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRemote.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.github.wulkanowy.data.repositories.gradestatistics
-
-import io.github.wulkanowy.api.Api
-import io.github.wulkanowy.data.db.entities.GradeStatistics
-import io.github.wulkanowy.data.db.entities.Semester
-import io.reactivex.Single
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class GradeStatisticsRemote @Inject constructor(private val api: Api) {
-
- fun getGradeStatistics(semester: Semester, isSemester: Boolean): Single> {
- return Single.just(api.apply { diaryId = semester.diaryId })
- .flatMap { it.getGradesStatistics(semester.semesterId, isSemester) }
- .map { gradeStatistics ->
- gradeStatistics.map {
- GradeStatistics(
- semesterId = semester.semesterId,
- studentId = semester.studentId,
- subject = it.subject,
- grade = it.gradeValue,
- amount = it.amount ?: 0,
- semester = isSemester
- )
- }
- }
- }
-}
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
deleted file mode 100644
index 870bd1e93..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradestatistics/GradeStatisticsRepository.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-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.GradeStatistics
-import io.github.wulkanowy.data.db.entities.Semester
-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(semester: Semester, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false): Single> {
- return local.getGradesStatistics(semester, isSemester, subjectName).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.getGradeStatistics(semester, isSemester)
- else Single.error(UnknownHostException())
- }.flatMap { newGradesStats ->
- local.getGradesStatistics(semester, isSemester).toSingle(emptyList())
- .doOnSuccess { oldGradesStats ->
- local.deleteGradesStatistics(oldGradesStats - newGradesStats)
- local.saveGradesStatistics(newGradesStats - oldGradesStats)
- }
- }.flatMap { local.getGradesStatistics(semester, isSemester, subjectName).toSingle(emptyList()) })
- }
-}
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
deleted file mode 100644
index 0447c86fe..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRepository.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-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.utils.friday
-import io.github.wulkanowy.utils.monday
-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(semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> {
- return Single.fromCallable { start.monday to end.friday }.flatMap { (monday, friday) ->
- local.getHomework(semester, monday, friday).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.getHomework(semester, monday, friday)
- else Single.error(UnknownHostException())
- }.flatMap { newGrades ->
- local.getHomework(semester, monday, friday).toSingle(emptyList())
- .doOnSuccess { oldGrades ->
- local.deleteHomework(oldGrades - newGrades)
- local.saveHomework(newGrades - oldGrades)
- }
- }.flatMap { local.getHomework(semester, monday, friday).toSingle(emptyList()) })
- }
- }
-}
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/local/AttendanceLocal.kt
similarity index 82%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/AttendanceLocal.kt
index 0f5873766..9a318dba2 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/AttendanceLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.attendance
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.AttendanceDao
import io.github.wulkanowy.data.db.entities.Attendance
@@ -6,11 +6,14 @@ 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
-@Singleton
class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDao) {
+ fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
+ return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate)
+ .filter { !it.isEmpty() }
+ }
+
fun saveAttendance(attendance: List) {
attendanceDb.insertAll(attendance)
}
@@ -18,8 +21,4 @@ class AttendanceLocal @Inject constructor(private val attendanceDb: AttendanceDa
fun deleteAttendance(attendance: List) {
attendanceDb.deleteAll(attendance)
}
-
- fun getAttendance(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
- return attendanceDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate).filter { it.isNotEmpty() }
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/local/AttendanceSummaryLocal.kt
similarity index 82%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/AttendanceSummaryLocal.kt
index 2e9a10067..2bb9f1220 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/AttendanceSummaryLocal.kt
@@ -1,15 +1,17 @@
-package io.github.wulkanowy.data.repositories.attendancesummary
+package io.github.wulkanowy.data.repositories.local
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 getAttendanceSummary(semester: Semester, subjectId: Int): Maybe> {
+ return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId).filter { !it.isEmpty() }
+ }
+
fun saveAttendanceSummary(attendance: List) {
attendanceDb.insertAll(attendance)
}
@@ -17,8 +19,4 @@ class AttendanceSummaryLocal @Inject constructor(private val attendanceDb: Atten
fun deleteAttendanceSummary(attendance: List) {
attendanceDb.deleteAll(attendance)
}
-
- fun getAttendanceSummary(semester: Semester, subjectId: Int): Maybe> {
- return attendanceDb.loadAll(semester.diaryId, semester.studentId, subjectId).filter { it.isNotEmpty() }
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/local/ExamLocal.kt
similarity index 88%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/ExamLocal.kt
index 0f484d323..3e32a6357 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/ExamLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.exam
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.ExamDao
import io.github.wulkanowy.data.db.entities.Exam
@@ -6,9 +6,7 @@ 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
-@Singleton
class ExamLocal @Inject constructor(private val examDb: ExamDao) {
fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
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/local/GradeLocal.kt
similarity index 55%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/GradeLocal.kt
index 4983a4740..d6d46340f 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/GradeLocal.kt
@@ -1,8 +1,9 @@
-package io.github.wulkanowy.data.repositories.grade
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.GradeDao
import io.github.wulkanowy.data.db.entities.Grade
import io.github.wulkanowy.data.db.entities.Semester
+import io.reactivex.Completable
import io.reactivex.Maybe
import javax.inject.Inject
import javax.inject.Singleton
@@ -10,19 +11,27 @@ import javax.inject.Singleton
@Singleton
class GradeLocal @Inject constructor(private val gradeDb: GradeDao) {
+ fun getGrades(semester: Semester): Maybe> {
+ return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { !it.isEmpty() }
+ }
+
+ fun getNewGrades(semester: Semester): Maybe> {
+ return gradeDb.loadAllNew(semester.semesterId, semester.studentId)
+ }
+
fun saveGrades(grades: List) {
gradeDb.insertAll(grades)
}
+ fun updateGrade(grade: Grade): Completable {
+ return Completable.fromCallable { gradeDb.update(grade) }
+ }
+
+ fun updateGrades(grades: List): Completable {
+ return Completable.fromCallable { gradeDb.updateAll(grades) }
+ }
+
fun deleteGrades(grades: List) {
gradeDb.deleteAll(grades)
}
-
- fun updateGrades(grades: List) {
- gradeDb.updateAll(grades)
- }
-
- fun getGrades(semester: Semester): Maybe> {
- return gradeDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() }
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/local/GradeSummaryLocal.kt
similarity index 87%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/GradeSummaryLocal.kt
index e74641d3a..6a72416d2 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/GradeSummaryLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.gradessummary
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.GradeSummaryDao
import io.github.wulkanowy.data.db.entities.GradeSummary
@@ -10,6 +10,11 @@ import javax.inject.Singleton
@Singleton
class GradeSummaryLocal @Inject constructor(private val gradeSummaryDb: GradeSummaryDao) {
+ fun getGradesSummary(semester: Semester): Maybe> {
+ return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId)
+ .filter { !it.isEmpty() }
+ }
+
fun saveGradesSummary(gradesSummary: List) {
gradeSummaryDb.insertAll(gradesSummary)
}
@@ -17,8 +22,4 @@ class GradeSummaryLocal @Inject constructor(private val gradeSummaryDb: GradeSum
fun deleteGradesSummary(gradesSummary: List) {
gradeSummaryDb.deleteAll(gradesSummary)
}
-
- fun getGradesSummary(semester: Semester): Maybe> {
- return gradeSummaryDb.loadAll(semester.semesterId, semester.studentId).filter { it.isNotEmpty() }
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/local/HomeworkLocal.kt
similarity index 73%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/HomeworkLocal.kt
index 671ecafd7..ea18d8145 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/HomeworkLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.homework
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.HomeworkDao
import io.github.wulkanowy.data.db.entities.Homework
@@ -11,6 +11,10 @@ import javax.inject.Singleton
@Singleton
class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) {
+ fun getHomework(semester: Semester, date: LocalDate): Maybe> {
+ return homeworkDb.loadAll(semester.semesterId, semester.studentId, date).filter { !it.isEmpty() }
+ }
+
fun saveHomework(homework: List) {
homeworkDb.insertAll(homework)
}
@@ -18,9 +22,4 @@ class HomeworkLocal @Inject constructor(private val homeworkDb: HomeworkDao) {
fun deleteHomework(homework: List) {
homeworkDb.deleteAll(homework)
}
-
- fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
- return homeworkDb.loadAll(semester.semesterId, semester.studentId, startDate, endDate)
- .filter { it.isNotEmpty() }
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/local/MessagesLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/local/MessagesLocal.kt
new file mode 100644
index 000000000..531cd8b0d
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/MessagesLocal.kt
@@ -0,0 +1,44 @@
+package io.github.wulkanowy.data.repositories.local
+
+import io.github.wulkanowy.data.db.dao.MessagesDao
+import io.github.wulkanowy.data.db.entities.Message
+import io.github.wulkanowy.data.db.entities.Student
+import io.github.wulkanowy.data.repositories.MessagesRepository
+import io.reactivex.Maybe
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class MessagesLocal @Inject constructor(private val messagesDb: MessagesDao) {
+
+ fun getMessage(studentId: Int, id: Int): Maybe {
+ return messagesDb.loadOne(studentId, id)
+ }
+
+ fun getMessages(studentId: Int, folder: MessagesRepository.MessageFolder): Maybe> {
+ return when (folder) {
+ MessagesRepository.MessageFolder.TRASHED -> messagesDb.loadDeleted(studentId)
+ else -> messagesDb.load(studentId, folder.id)
+ }.filter { !it.isEmpty() }
+ }
+
+ fun getNewMessages(student: Student): Maybe> {
+ return messagesDb.loadNewMessages(student.studentId)
+ }
+
+ fun saveMessages(messages: List): List {
+ return messagesDb.insertAll(messages)
+ }
+
+ fun updateMessage(message: Message) {
+ return messagesDb.update(message)
+ }
+
+ fun updateMessages(messages: List) {
+ return messagesDb.updateAll(messages)
+ }
+
+ fun deleteMessages(messages: List) {
+ messagesDb.deleteAll(messages)
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/local/NoteLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/local/NoteLocal.kt
new file mode 100644
index 000000000..543eab9b3
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/NoteLocal.kt
@@ -0,0 +1,37 @@
+package io.github.wulkanowy.data.repositories.local
+
+import io.github.wulkanowy.data.db.dao.NoteDao
+import io.github.wulkanowy.data.db.entities.Note
+import io.github.wulkanowy.data.db.entities.Semester
+import io.reactivex.Completable
+import io.reactivex.Maybe
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NoteLocal @Inject constructor(private val noteDb: NoteDao) {
+
+ fun getNotes(semester: Semester): Maybe> {
+ return noteDb.loadAll(semester.semesterId, semester.studentId).filter { !it.isEmpty() }
+ }
+
+ fun getNewNotes(semester: Semester): Maybe> {
+ return noteDb.loadNew(semester.semesterId, semester.studentId)
+ }
+
+ fun saveNotes(notes: List) {
+ noteDb.insertAll(notes)
+ }
+
+ fun updateNote(note: Note): Completable {
+ return Completable.fromCallable { noteDb.update(note) }
+ }
+
+ fun updateNotes(notes: List): Completable {
+ return Completable.fromCallable { noteDb.updateAll(notes) }
+ }
+
+ fun deleteNotes(notes: List) {
+ noteDb.deleteAll(notes)
+ }
+}
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/local/SemesterLocal.kt
similarity index 65%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/SemesterLocal.kt
index 37d4a2687..77000478f 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/SemesterLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.semester
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.SemesterDao
import io.github.wulkanowy.data.db.entities.Semester
@@ -11,14 +11,17 @@ import javax.inject.Singleton
class SemesterLocal @Inject constructor(private val semesterDb: SemesterDao) {
fun saveSemesters(semesters: List) {
- semesterDb.insertAll(semesters)
- }
-
- fun deleteSemesters(semesters: List) {
- semesterDb.deleteAll(semesters)
+ return semesterDb.insertAll(semesters)
}
fun getSemesters(student: Student): Maybe> {
return semesterDb.loadAll(student.studentId).filter { !it.isEmpty() }
}
+
+ fun setCurrentSemester(semester: Semester) {
+ semesterDb.run {
+ resetCurrent(semester.studentId)
+ updateCurrent(semester.semesterId, semester.diaryId)
+ }
+ }
}
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/local/StudentLocal.kt
similarity index 68%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/StudentLocal.kt
index e05e72234..0e4e9cbd0 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/StudentLocal.kt
@@ -1,6 +1,7 @@
-package io.github.wulkanowy.data.repositories.student
+package io.github.wulkanowy.data.repositories.local
import android.content.Context
+import io.github.wulkanowy.data.db.SharedPrefHelper
import io.github.wulkanowy.data.db.dao.StudentDao
import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.utils.security.decrypt
@@ -14,17 +15,25 @@ import javax.inject.Singleton
@Singleton
class StudentLocal @Inject constructor(
private val studentDb: StudentDao,
+ private val sharedPref: SharedPrefHelper,
private val context: Context
) {
+ companion object {
+ const val STUDENT_SAVED_KEY: String = "is_student_saved"
+ }
+
+ val isStudentSaved
+ get() = sharedPref.getBoolean(STUDENT_SAVED_KEY, false)
+
fun saveStudent(student: Student): Single {
return Single.fromCallable { studentDb.insert(student.copy(password = encrypt(student.password, context))) }
+ .doOnSuccess { sharedPref.putBoolean(STUDENT_SAVED_KEY, true) }
}
fun getStudents(decryptPass: Boolean): Maybe> {
return studentDb.loadAll()
.map { list -> list.map { it.apply { if (decryptPass) password = decrypt(password) } } }
- .filter { !it.isEmpty() }
}
fun getCurrentStudent(decryptPass: Boolean): Maybe {
@@ -37,10 +46,13 @@ class StudentLocal @Inject constructor(
resetCurrent()
updateCurrent(student.studentId)
}
- }
+ }.doOnComplete { sharedPref.putBoolean(STUDENT_SAVED_KEY, true) }
}
fun logoutStudent(student: Student): Completable {
- return Completable.fromCallable { studentDb.delete(student) }
+ return Completable.fromCallable {
+ studentDb.delete(student)
+ if (student.isCurrent) sharedPref.putBoolean(STUDENT_SAVED_KEY, false)
+ }
}
}
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/local/SubjectLocal.kt
similarity index 92%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/SubjectLocal.kt
index 63e334019..7ca7c1b06 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/SubjectLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.subject
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.SubjectDao
import io.github.wulkanowy.data.db.entities.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/local/TimetableLocal.kt
similarity index 82%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/local/TimetableLocal.kt
index e074ce2a1..63cc7c94b 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableLocal.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/local/TimetableLocal.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.timetable
+package io.github.wulkanowy.data.repositories.local
import io.github.wulkanowy.data.db.dao.TimetableDao
import io.github.wulkanowy.data.db.entities.Semester
@@ -6,11 +6,14 @@ 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
-@Singleton
class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao) {
+ fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
+ return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate)
+ .filter { !it.isEmpty() }
+ }
+
fun saveTimetable(timetables: List) {
timetableDb.insertAll(timetables)
}
@@ -18,8 +21,4 @@ class TimetableLocal @Inject constructor(private val timetableDb: TimetableDao)
fun deleteTimetable(timetables: List) {
timetableDb.deleteAll(timetables)
}
-
- fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Maybe> {
- return timetableDb.loadAll(semester.diaryId, semester.studentId, startDate, endDate).filter { it.isNotEmpty() }
- }
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt
deleted file mode 100644
index 115c89652..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberLocal.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.github.wulkanowy.data.repositories.luckynumber
-
-import io.github.wulkanowy.data.db.dao.LuckyNumberDao
-import io.github.wulkanowy.data.db.entities.LuckyNumber
-import io.github.wulkanowy.data.db.entities.Semester
-import io.reactivex.Maybe
-import org.threeten.bp.LocalDate
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class LuckyNumberLocal @Inject constructor(private val luckyNumberDb: LuckyNumberDao) {
-
- fun saveLuckyNumber(luckyNumber: LuckyNumber) {
- luckyNumberDb.insert(luckyNumber)
- }
-
- fun updateLuckyNumber(luckyNumber: LuckyNumber) {
- luckyNumberDb.update(luckyNumber)
- }
-
- fun deleteLuckyNumber(luckyNumber: LuckyNumber) {
- luckyNumberDb.delete(luckyNumber)
- }
-
- fun getLuckyNumber(semester: Semester, date: LocalDate): Maybe {
- return luckyNumberDb.load(semester.studentId, date)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt
deleted file mode 100644
index 1b0f12b3e..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRemote.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.github.wulkanowy.data.repositories.luckynumber
-
-import io.github.wulkanowy.api.Api
-import io.github.wulkanowy.data.db.entities.LuckyNumber
-import io.github.wulkanowy.data.db.entities.Semester
-import io.reactivex.Maybe
-import io.reactivex.Single
-import org.threeten.bp.LocalDate
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class LuckyNumberRemote @Inject constructor(private val api: Api) {
-
- fun getLuckyNumber(semester: Semester): Maybe {
- return Single.just(api.apply { diaryId = semester.diaryId })
- .flatMapMaybe { it.getLuckyNumber() }
- .map {
- LuckyNumber(
- studentId = semester.studentId,
- date = LocalDate.now(),
- luckyNumber = it
- )
- }
- }
-}
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
deleted file mode 100644
index 4036521f7..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/luckynumber/LuckyNumberRepository.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-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.Semester
-import io.reactivex.Completable
-import io.reactivex.Maybe
-import org.threeten.bp.LocalDate
-import java.net.UnknownHostException
-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(semester: Semester, forceRefresh: Boolean = false, notify: Boolean = false): Maybe {
- return local.getLuckyNumber(semester, LocalDate.now()).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMapMaybe {
- if (it) remote.getLuckyNumber(semester)
- else Maybe.error(UnknownHostException())
- }.flatMap { new ->
- local.getLuckyNumber(semester, 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(semester, LocalDate.now()) }, { Maybe.error(it) },
- { local.getLuckyNumber(semester, LocalDate.now()) })
- )
- }
-
- fun getNotNotifiedLuckyNumber(semester: Semester): Maybe {
- return local.getLuckyNumber(semester, LocalDate.now()).filter { !it.isNotified }
- }
-
- fun updateLuckyNumber(luckyNumber: LuckyNumber): Completable {
- return Completable.fromCallable { local.updateLuckyNumber(luckyNumber) }
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageFolder.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageFolder.kt
deleted file mode 100644
index 06f5a1e05..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageFolder.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.github.wulkanowy.data.repositories.message
-
-enum class MessageFolder(val id: Int = 1) {
- RECEIVED(1),
- SENT(2),
- TRASHED(3)
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt
deleted file mode 100644
index e9ab72973..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package io.github.wulkanowy.data.repositories.message
-
-import io.github.wulkanowy.data.db.dao.MessagesDao
-import io.github.wulkanowy.data.db.entities.Message
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED
-import io.reactivex.Maybe
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class MessageLocal @Inject constructor(private val messagesDb: MessagesDao) {
-
- fun saveMessages(messages: List) {
- messagesDb.insertAll(messages)
- }
-
- fun updateMessages(messages: List) {
- messagesDb.updateAll(messages)
- }
-
- fun deleteMessages(messages: List) {
- messagesDb.deleteAll(messages)
- }
-
- fun getMessage(student: Student, id: Int): Maybe {
- return messagesDb.load(student.studentId, id)
- }
-
- fun getMessages(student: Student, folder: MessageFolder): Maybe> {
- return when (folder) {
- TRASHED -> messagesDb.loadDeleted(student.studentId)
- else -> messagesDb.loadAll(student.studentId, folder.id)
- }.filter { it.isNotEmpty() }
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt
deleted file mode 100644
index 3fb01d30e..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.github.wulkanowy.data.repositories.message
-
-import io.github.wulkanowy.api.Api
-import io.github.wulkanowy.api.messages.Folder
-import io.github.wulkanowy.api.messages.SentMessage
-import io.github.wulkanowy.data.db.entities.Message
-import io.github.wulkanowy.data.db.entities.Recipient
-import io.github.wulkanowy.utils.toLocalDateTime
-import io.reactivex.Single
-import org.threeten.bp.LocalDateTime.now
-import javax.inject.Inject
-import javax.inject.Singleton
-import io.github.wulkanowy.api.messages.Message as ApiMessage
-import io.github.wulkanowy.api.messages.Recipient as ApiRecipient
-
-@Singleton
-class MessageRemote @Inject constructor(private val api: Api) {
-
- fun getMessages(studentId: Int, folder: MessageFolder): Single> {
- return api.getMessages(Folder.valueOf(folder.name)).map { messages ->
- messages.map {
- Message(
- studentId = studentId,
- 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?.toLocalDateTime() ?: now(),
- folderId = it.folderId,
- unread = it.unread ?: false,
- unreadBy = it.unreadBy ?: 0,
- readBy = it.readBy ?: 0,
- removed = it.removed
- )
- }
- }
- }
-
- fun getMessagesContent(message: Message, markAsRead: Boolean = false): Single {
- return api.getMessageContent(message.messageId, message.folderId, markAsRead, message.realId)
- }
-
- fun sendMessage(subject: String, content: String, recipients: List): Single {
- return api.sendMessage(
- subject = subject,
- content = content,
- recipients = recipients.map {
- ApiRecipient(
- id = it.realId,
- name = it.realName,
- loginId = it.loginId,
- reportingUnitId = it.unitId,
- role = it.role,
- hash = it.hash
- )
- }
- )
- }
-}
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
deleted file mode 100644
index d319689e4..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt
+++ /dev/null
@@ -1,92 +0,0 @@
-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.api.messages.SentMessage
-import io.github.wulkanowy.data.ApiHelper
-import io.github.wulkanowy.data.db.entities.Message
-import io.github.wulkanowy.data.db.entities.Recipient
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED
-import io.reactivex.Completable
-import io.reactivex.Single
-import java.net.UnknownHostException
-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,
- private val apiHelper: ApiHelper
-) {
-
- fun getMessages(student: Student, folder: MessageFolder, forceRefresh: Boolean = false, notify: Boolean = false): Single> {
- return Single.just(apiHelper.initApi(student))
- .flatMap { _ ->
- local.getMessages(student, folder).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.getMessages(student.studentId, folder)
- else Single.error(UnknownHostException())
- }.flatMap { new ->
- local.getMessages(student, folder).toSingle(emptyList())
- .doOnSuccess { old ->
- local.deleteMessages(old - new)
- local.saveMessages((new - old)
- .onEach {
- it.isNotified = !notify
- })
- }
- }.flatMap { local.getMessages(student, folder).toSingle(emptyList()) }
- )
- }
- }
-
- fun getMessage(student: Student, messageId: Int, markAsRead: Boolean = false): Single {
- return Single.just(apiHelper.initApi(student))
- .flatMap { _ ->
- local.getMessage(student, messageId)
- .filter { !it.content.isNullOrEmpty() }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) local.getMessage(student, messageId).toSingle()
- else Single.error(UnknownHostException())
- }
- .flatMap { dbMessage ->
- remote.getMessagesContent(dbMessage, markAsRead).doOnSuccess {
- local.updateMessages(listOf(dbMessage.copy(unread = false).apply {
- id = dbMessage.id
- content = it
- }))
- }
- }.flatMap {
- local.getMessage(student, messageId).toSingle()
- }
- )
- }
- }
-
- fun getNotNotifiedMessages(student: Student): Single> {
- return local.getMessages(student, RECEIVED)
- .map { it.filter { message -> !message.isNotified && message.unread } }
- .toSingle(emptyList())
- }
-
- fun updateMessage(message: Message): Completable {
- return Completable.fromCallable { local.updateMessages(listOf(message)) }
- }
-
- fun updateMessages(messages: List): Completable {
- return Completable.fromCallable { local.updateMessages(messages) }
- }
-
- fun sendMessage(subject: String, content: String, recipients: List): Single {
- return ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.sendMessage(subject, content, recipients)
- else Single.error(UnknownHostException())
- }
- }
-}
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
deleted file mode 100644
index 784e61f0f..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteLocal.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-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) {
- noteDb.insertAll(notes)
- }
-
- fun updateNotes(notes: List) {
- noteDb.updateAll(notes)
- }
-
- fun deleteNotes(notes: List) {
- noteDb.deleteAll(notes)
- }
-
- fun getNotes(student: Student): Maybe> {
- return noteDb.loadAll(student.studentId).filter { it.isNotEmpty() }
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt
deleted file mode 100644
index 6b8328ec2..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientLocal.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.github.wulkanowy.data.repositories.recipient
-
-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.isEmpty() }
- }
-
- fun saveRecipients(recipients: List) {
- return recipientDb.insertAll(recipients)
- }
-
- 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
deleted file mode 100644
index b726edda9..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRemote.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-package io.github.wulkanowy.data.repositories.recipient
-
-import io.github.wulkanowy.api.Api
-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.reactivex.Single
-import javax.inject.Inject
-import javax.inject.Singleton
-import io.github.wulkanowy.api.messages.Recipient as ApiRecipient
-
-@Singleton
-class RecipientRemote @Inject constructor(private val api: Api) {
-
- fun getRecipients(role: Int, unit: ReportingUnit): Single> {
- return api.getRecipients(unit.realId, role)
- .map { recipients ->
- recipients.map { it.toRecipient() }
- }
- }
-
- fun getMessageRecipients(message: Message): Single> {
- return api.getMessageRecipients(message.messageId, message.senderId)
- .map { recipients ->
- recipients.map { it.toRecipient() }
- }
- }
-
- private fun ApiRecipient.toRecipient(): Recipient {
- return Recipient(
- studentId = api.studentId,
- realId = id,
- realName = name,
- name = shortName,
- hash = hash,
- loginId = loginId,
- role = role,
- unitId = reportingUnitId ?: 0
- )
- }
-}
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
deleted file mode 100644
index 0b02721f1..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/recipient/RecipientRepository.kt
+++ /dev/null
@@ -1,52 +0,0 @@
-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.ApiHelper
-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.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,
- private val apiHelper: ApiHelper
-) {
-
- fun getRecipients(student: Student, role: Int, unit: ReportingUnit, forceRefresh: Boolean = false): Single> {
- return Single.just(apiHelper.initApi(student))
- .flatMap { _ ->
- local.getRecipients(student, role, unit).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.getRecipients(role, unit)
- else Single.error(UnknownHostException())
- }.flatMap { new ->
- local.getRecipients(student, role, unit).toSingle(emptyList())
- .doOnSuccess { old ->
- local.deleteRecipients(old - new)
- local.saveRecipients(new - old)
- }
- }.flatMap {
- local.getRecipients(student, role, unit).toSingle(emptyList())
- }
- )
- }
- }
-
- fun getMessageRecipients(student: Student, message: Message): Single> {
- return Single.just(apiHelper.initApi(student))
- .flatMap { ReactiveNetwork.checkInternetConnectivity(settings) }
- .flatMap {
- if (it) remote.getMessageRecipients(message)
- else Single.error(UnknownHostException())
- }
- }
-}
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/remote/AttendanceRemote.kt
similarity index 95%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/AttendanceRemote.kt
index b3544c3f5..79047606f 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendance/AttendanceRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/AttendanceRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.attendance
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Attendance
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/remote/AttendanceSummaryRemote.kt
similarity index 95%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/AttendanceSummaryRemote.kt
index d38dd3a4b..079eb4b8e 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/attendancesummary/AttendanceSummaryRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/AttendanceSummaryRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.attendancesummary
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.AttendanceSummary
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/remote/ExamRemote.kt
similarity index 92%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/ExamRemote.kt
index f6d653a61..3937b768d 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/exam/ExamRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/ExamRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.exam
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Exam
@@ -7,9 +7,7 @@ import io.github.wulkanowy.utils.toLocalDate
import io.reactivex.Single
import org.threeten.bp.LocalDate
import javax.inject.Inject
-import javax.inject.Singleton
-@Singleton
class ExamRemote @Inject constructor(private val api: Api) {
fun getExams(semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> {
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/remote/GradeRemote.kt
similarity index 87%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/GradeRemote.kt
index 570ab7a77..df3bf4d28 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/grade/GradeRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/GradeRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.grade
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Grade
@@ -25,8 +25,8 @@ class GradeRemote @Inject constructor(private val api: Api) {
modifier = it.modifier,
comment = it.comment,
color = it.color,
- gradeSymbol = it.symbol.orEmpty(),
- description = it.description.orEmpty(),
+ gradeSymbol = it.symbol ?: "",
+ description = it.description,
weight = it.weight,
weightValue = it.weightValue,
date = it.date.toLocalDate(),
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/GradeSummaryRemote.kt
similarity index 94%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/GradeSummaryRemote.kt
index d395decf8..af45ca737 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/gradessummary/GradeSummaryRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/GradeSummaryRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.gradessummary
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.GradeSummary
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/remote/HomeworkRemote.kt
similarity index 82%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/HomeworkRemote.kt
index 681b66469..0fdc02512 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/homework/HomeworkRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/HomeworkRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.homework
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Homework
@@ -12,9 +12,9 @@ import javax.inject.Singleton
@Singleton
class HomeworkRemote @Inject constructor(private val api: Api) {
- fun getHomework(semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> {
+ fun getHomework(semester: Semester, date: LocalDate): Single> {
return Single.just(api.apply { diaryId = semester.diaryId })
- .flatMap { it.getHomework(startDate, endDate) }
+ .flatMap { it.getHomework(date, date) }
.map { homework ->
homework.map {
Homework(
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/remote/MessagesRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/MessagesRemote.kt
new file mode 100644
index 000000000..bc0f3400a
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/MessagesRemote.kt
@@ -0,0 +1,40 @@
+package io.github.wulkanowy.data.repositories.remote
+
+import io.github.wulkanowy.api.Api
+import io.github.wulkanowy.api.messages.Folder
+import io.github.wulkanowy.data.db.entities.Message
+import io.github.wulkanowy.data.repositories.MessagesRepository
+import io.github.wulkanowy.utils.toLocalDateTime
+import io.reactivex.Single
+import javax.inject.Inject
+import io.github.wulkanowy.api.messages.Message as ApiMessage
+
+class MessagesRemote @Inject constructor(private val api: Api) {
+
+ fun getMessages(studentId: Int, folder: MessagesRepository.MessageFolder): Single> {
+ return api.getMessages(Folder.valueOf(folder.name)).map { messages ->
+ messages.map {
+ Message(
+ studentId = studentId,
+ realId = it.id,
+ messageId = it.messageId,
+ sender = it.sender,
+ senderId = it.senderId,
+ recipient = it.recipient,
+ recipientId = it.recipientId,
+ subject = it.subject.trim(),
+ date = it.date?.toLocalDateTime(),
+ folderId = it.folderId,
+ unread = it.unread,
+ unreadBy = it.unreadBy,
+ readBy = it.readBy,
+ removed = it.removed
+ )
+ }
+ }
+ }
+
+ fun getMessagesContent(message: Message, markAsRead: Boolean = false): Single {
+ return api.getMessageContent(message.messageId ?: 0, message.folderId, markAsRead, message.realId ?: 0)
+ }
+}
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/remote/NoteRemote.kt
similarity index 89%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/NoteRemote.kt
index aebc6230e..31f28e113 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/note/NoteRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/NoteRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.note
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Note
@@ -17,6 +17,7 @@ class NoteRemote @Inject constructor(private val api: Api) {
.map { notes ->
notes.map {
Note(
+ semesterId = semester.semesterId,
studentId = semester.studentId,
date = it.date.toLocalDate(),
teacher = it.teacher,
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/remote/SemesterRemote.kt
similarity index 80%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/SemesterRemote.kt
index b25c8881b..1cf105014 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/semester/SemesterRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/SemesterRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.semester
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Semester
@@ -19,9 +19,7 @@ class SemesterRemote @Inject constructor(private val api: Api) {
diaryName = semester.diaryName,
semesterId = semester.semesterId,
semesterName = semester.semesterNumber,
- isCurrent = semester.current,
- classId = semester.classId,
- unitId = semester.unitId
+ isCurrent = semester.current
)
}
diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/remote/StudentRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/StudentRemote.kt
new file mode 100644
index 000000000..6c6e26a9d
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/StudentRemote.kt
@@ -0,0 +1,29 @@
+package io.github.wulkanowy.data.repositories.remote
+
+import io.github.wulkanowy.api.Api
+import io.github.wulkanowy.data.db.entities.Student
+import io.reactivex.Single
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class StudentRemote @Inject constructor(private val api: Api) {
+
+ fun getStudents(email: String, password: String, endpoint: String): Single> {
+ return api.getPupils().map { students ->
+ students.map { pupil ->
+ Student(
+ email = email,
+ password = password,
+ symbol = pupil.symbol,
+ studentId = pupil.studentId,
+ studentName = pupil.studentName,
+ schoolSymbol = pupil.schoolSymbol,
+ schoolName = pupil.description,
+ endpoint = endpoint,
+ loginType = pupil.loginType.name
+ )
+ }
+ }
+ }
+}
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/remote/SubjectRemote.kt
similarity index 93%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/SubjectRemote.kt
index 88fbb196b..ae565d48c 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/subject/SubjectRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/SubjectRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.subject
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Semester
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/remote/TimetableRemote.kt
similarity index 85%
rename from app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt
rename to app/src/main/java/io/github/wulkanowy/data/repositories/remote/TimetableRemote.kt
index 77742e7b3..aa8949fd8 100644
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRemote.kt
+++ b/app/src/main/java/io/github/wulkanowy/data/repositories/remote/TimetableRemote.kt
@@ -1,4 +1,4 @@
-package io.github.wulkanowy.data.repositories.timetable
+package io.github.wulkanowy.data.repositories.remote
import io.github.wulkanowy.api.Api
import io.github.wulkanowy.data.db.entities.Semester
@@ -8,9 +8,7 @@ import io.github.wulkanowy.utils.toLocalDateTime
import io.reactivex.Single
import org.threeten.bp.LocalDate
import javax.inject.Inject
-import javax.inject.Singleton
-@Singleton
class TimetableRemote @Inject constructor(private val api: Api) {
fun getTimetable(semester: Semester, startDate: LocalDate, endDate: LocalDate): Single> {
@@ -26,12 +24,9 @@ class TimetableRemote @Inject constructor(private val api: Api) {
end = it.end.toLocalDateTime(),
date = it.date.toLocalDate(),
subject = it.subject,
- subjectOld = it.subjectOld,
group = it.group,
room = it.room,
- roomOld = it.roomOld,
teacher = it.teacher,
- teacherOld = it.teacherOld,
info = it.info,
changes = it.changes,
canceled = it.canceled
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
deleted file mode 100644
index b4281cbfd..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitLocal.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-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.isEmpty() }
- }
-
- fun getReportingUnit(student: Student, unitId: Int): Maybe {
- return reportingUnitDb.loadOne(student.studentId, unitId)
- }
-
- fun saveReportingUnits(reportingUnits: List) {
- return reportingUnitDb.insertAll(reportingUnits)
- }
-
- 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
deleted file mode 100644
index feb4b0134..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRemote.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.github.wulkanowy.data.repositories.reportingunit
-
-import io.github.wulkanowy.api.Api
-import io.github.wulkanowy.data.db.entities.ReportingUnit
-import io.reactivex.Single
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class ReportingUnitRemote @Inject constructor(private val api: Api) {
-
- fun getReportingUnits(): Single> {
- return api.getReportingUnits().map {
- it.map { unit ->
- ReportingUnit(
- studentId = api.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
deleted file mode 100644
index 9184b4bb1..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/reportingunit/ReportingUnitRepository.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-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.ApiHelper
-import io.github.wulkanowy.data.db.entities.ReportingUnit
-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 ReportingUnitRepository @Inject constructor(
- private val settings: InternetObservingSettings,
- private val local: ReportingUnitLocal,
- private val remote: ReportingUnitRemote,
- private val apiHelper: ApiHelper
-) {
-
- fun getReportingUnits(student: Student, forceRefresh: Boolean = false): Single> {
- return Single.just(apiHelper.initApi(student))
- .flatMap { _ ->
- local.getReportingUnits(student).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) remote.getReportingUnits()
- else Single.error(UnknownHostException())
- }.flatMap { new ->
- local.getReportingUnits(student).toSingle(emptyList())
- .doOnSuccess { old ->
- local.deleteReportingUnits(old - new)
- local.saveReportingUnits(new - old)
- }
- }.flatMap { local.getReportingUnits(student).toSingle(emptyList()) }
- )
- }
- }
-
- fun getReportingUnit(student: Student, unitId: Int): Maybe {
- return Maybe.just(apiHelper.initApi(student))
- .flatMap { _ ->
- local.getReportingUnit(student, unitId)
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings)
- .flatMap {
- if (it) getReportingUnits(student, true)
- else Single.error(UnknownHostException())
- }.flatMapMaybe {
- local.getReportingUnit(student, unitId)
- }
- )
- }
- }
-}
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
deleted file mode 100644
index 7a504ccad..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/student/StudentRemote.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package io.github.wulkanowy.data.repositories.student
-
-import io.github.wulkanowy.api.Api
-import io.github.wulkanowy.data.db.entities.Student
-import io.reactivex.Single
-import org.threeten.bp.LocalDateTime.now
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class StudentRemote @Inject constructor(private val api: Api) {
-
- fun getStudents(email: String, password: String, endpoint: String): Single> {
- return api.getStudents().map { students ->
- students.map { student ->
- Student(
- email = email,
- password = password,
- symbol = student.symbol,
- studentId = student.studentId,
- studentName = student.studentName,
- schoolSymbol = student.schoolSymbol,
- schoolName = student.schoolName,
- endpoint = endpoint,
- loginType = student.loginType.name,
- isCurrent = false,
- registrationDate = now()
- )
- }
- }
- }
-}
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
deleted file mode 100644
index 460d55fd7..000000000
--- a/app/src/main/java/io/github/wulkanowy/data/repositories/timetable/TimetableRepository.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-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.Timetable
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.monday
-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
-) {
-
- fun getTimetable(semester: Semester, start: LocalDate, end: LocalDate, forceRefresh: Boolean = false): Single> {
- return Single.fromCallable { start.monday to end.friday }.flatMap { (monday, friday) ->
- local.getTimetable(semester, monday, friday).filter { !forceRefresh }
- .switchIfEmpty(ReactiveNetwork.checkInternetConnectivity(settings).flatMap {
- if (it) remote.getTimetable(semester, monday, friday)
- else Single.error(UnknownHostException())
- }.flatMap { newTimetable ->
- local.getTimetable(semester, monday, friday)
- .toSingle(emptyList())
- .doOnSuccess { oldTimetable ->
- local.deleteTimetable(oldTimetable - newTimetable)
- local.saveTimetable((newTimetable - oldTimetable).map { item ->
- item.apply {
- oldTimetable.singleOrNull { this.start == it.start }?.let {
- return@map copy(
- room = if (room.isEmpty()) it.room else room,
- teacher = if (teacher.isEmpty()) it.teacher else teacher
- )
- }
- }
- })
- }
- }.flatMap {
- local.getTimetable(semester, monday, friday).toSingle(emptyList())
- }).map { list -> list.filter { it.date in start..end } }
- }
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt b/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt
index 9e8b24ab8..21c193e5a 100644
--- a/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt
+++ b/app/src/main/java/io/github/wulkanowy/di/AppComponent.kt
@@ -5,7 +5,6 @@ import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
import io.github.wulkanowy.WulkanowyApp
import io.github.wulkanowy.data.RepositoryModule
-import io.github.wulkanowy.services.ServicesModule
import javax.inject.Singleton
@Singleton
@@ -13,7 +12,6 @@ import javax.inject.Singleton
AndroidSupportInjectionModule::class,
AppModule::class,
RepositoryModule::class,
- ServicesModule::class,
BuilderModule::class])
interface AppComponent : AndroidInjector {
diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt
index eb3b18f99..fc2e92972 100644
--- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt
+++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt
@@ -1,17 +1,16 @@
package io.github.wulkanowy.di
-import android.appwidget.AppWidgetManager
import android.content.Context
+import com.firebase.jobdispatcher.FirebaseJobDispatcher
+import com.firebase.jobdispatcher.GooglePlayDriver
import com.google.firebase.analytics.FirebaseAnalytics
import dagger.Module
import dagger.Provides
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
-import io.github.wulkanowy.BuildConfig.DEBUG
import io.github.wulkanowy.WulkanowyApp
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
import io.github.wulkanowy.utils.SchedulersProvider
-import javax.inject.Named
import javax.inject.Singleton
@Module
@@ -28,16 +27,11 @@ internal class AppModule {
@Provides
fun provideFlexibleAdapter() = FlexibleAdapter>(null, null, true)
+ @Singleton
+ @Provides
+ fun provideJobDispatcher(context: Context) = FirebaseJobDispatcher(GooglePlayDriver(context))
+
@Singleton
@Provides
fun provideFirebaseAnalyticsHelper(context: Context) = FirebaseAnalyticsHelper(FirebaseAnalytics.getInstance(context))
-
- @Singleton
- @Provides
- fun provideAppWidgetManager(context: Context) = AppWidgetManager.getInstance(context)
-
- @Singleton
- @Named("isDebug")
- @Provides
- fun provideIsDebug() = DEBUG
}
diff --git a/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt b/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt
index 7f4776304..9f4ecb80f 100644
--- a/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt
+++ b/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt
@@ -3,11 +3,12 @@ package io.github.wulkanowy.di
import dagger.Module
import dagger.android.ContributesAndroidInjector
import io.github.wulkanowy.di.scopes.PerActivity
+import io.github.wulkanowy.services.job.SyncWorker
+import io.github.wulkanowy.services.widgets.TimetableWidgetService
import io.github.wulkanowy.ui.modules.login.LoginActivity
import io.github.wulkanowy.ui.modules.login.LoginModule
import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.ui.modules.main.MainModule
-import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity
import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.ui.widgets.timetable.TimetableWidgetProvider
@@ -15,7 +16,7 @@ import io.github.wulkanowy.ui.widgets.timetable.TimetableWidgetProvider
internal abstract class BuilderModule {
@PerActivity
- @ContributesAndroidInjector
+ @ContributesAndroidInjector()
abstract fun bindSplashActivity(): SplashActivity
@PerActivity
@@ -27,8 +28,11 @@ internal abstract class BuilderModule {
abstract fun bindMainActivity(): MainActivity
@ContributesAndroidInjector
- abstract fun bindMessageSendActivity(): SendMessageActivity
+ abstract fun bindTimetableWidgetService(): TimetableWidgetService
@ContributesAndroidInjector
abstract fun bindTimetableWidgetProvider(): TimetableWidgetProvider
+
+ @ContributesAndroidInjector
+ abstract fun bindSyncJob(): SyncWorker
}
diff --git a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt b/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt
deleted file mode 100644
index 84409a845..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/ServicesModule.kt
+++ /dev/null
@@ -1,107 +0,0 @@
-package io.github.wulkanowy.services
-
-import android.app.NotificationManager
-import android.content.Context
-import android.content.Context.NOTIFICATION_SERVICE
-import androidx.core.app.NotificationManagerCompat
-import androidx.work.WorkManager
-import com.squareup.inject.assisted.dagger2.AssistedModule
-import dagger.Binds
-import dagger.Module
-import dagger.Provides
-import dagger.android.ContributesAndroidInjector
-import dagger.multibindings.IntoSet
-import io.github.wulkanowy.services.sync.works.AttendanceSummaryWork
-import io.github.wulkanowy.services.sync.works.AttendanceWork
-import io.github.wulkanowy.services.sync.works.CompletedLessonWork
-import io.github.wulkanowy.services.sync.works.ExamWork
-import io.github.wulkanowy.services.sync.works.GradeStatisticsWork
-import io.github.wulkanowy.services.sync.works.GradeSummaryWork
-import io.github.wulkanowy.services.sync.works.GradeWork
-import io.github.wulkanowy.services.sync.works.HomeworkWork
-import io.github.wulkanowy.services.sync.works.LuckyNumberWork
-import io.github.wulkanowy.services.sync.works.MessageWork
-import io.github.wulkanowy.services.sync.works.NoteWork
-import io.github.wulkanowy.services.sync.works.RecipientWork
-import io.github.wulkanowy.services.sync.works.TimetableWork
-import io.github.wulkanowy.services.sync.works.Work
-import io.github.wulkanowy.services.widgets.TimetableWidgetService
-import javax.inject.Singleton
-
-@AssistedModule
-@Module(includes = [AssistedInject_ServicesModule::class])
-abstract class ServicesModule {
-
- @Module
- companion object {
-
- @JvmStatic
- @Provides
- fun provideWorkManager() = WorkManager.getInstance()
-
- @JvmStatic
- @Singleton
- @Provides
- fun provideNotificationManagerCompat(context: Context) = NotificationManagerCompat.from(context)
-
- @JvmStatic
- @Singleton
- @Provides
- fun provideNotificationManager(context: Context) = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
- }
-
- @ContributesAndroidInjector
- abstract fun bindTimetableWidgetService(): TimetableWidgetService
-
- @Binds
- @IntoSet
- abstract fun provideGradeWork(work: GradeWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideNoteWork(work: NoteWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideAttendanceWork(work: AttendanceWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideGradeSummaryWork(work: GradeSummaryWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideExamWork(work: ExamWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideAttendanceSummaryWork(work: AttendanceSummaryWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideTimetableWork(work: TimetableWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideLuckyNumberWork(work: LuckyNumberWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideCompletedLessonWork(work: CompletedLessonWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideHomeworkWork(work: HomeworkWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideMessageWork(work: MessageWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideRecipientWork(work: RecipientWork): Work
-
- @Binds
- @IntoSet
- abstract fun provideGradeStatistics(work: GradeStatisticsWork): Work
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/job/ServiceHelper.kt b/app/src/main/java/io/github/wulkanowy/services/job/ServiceHelper.kt
new file mode 100644
index 000000000..d81b4b6d4
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/job/ServiceHelper.kt
@@ -0,0 +1,57 @@
+package io.github.wulkanowy.services.job
+
+import com.firebase.jobdispatcher.Constraint.ON_ANY_NETWORK
+import com.firebase.jobdispatcher.Constraint.ON_UNMETERED_NETWORK
+import com.firebase.jobdispatcher.FirebaseJobDispatcher
+import com.firebase.jobdispatcher.Lifetime.FOREVER
+import com.firebase.jobdispatcher.RetryStrategy.DEFAULT_EXPONENTIAL
+import com.firebase.jobdispatcher.Trigger.executionWindow
+import io.github.wulkanowy.data.repositories.PreferencesRepository
+import io.github.wulkanowy.utils.isHolidays
+import org.threeten.bp.LocalDate
+import timber.log.Timber
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class ServiceHelper @Inject constructor(
+ private val prefRepository: PreferencesRepository,
+ private val dispatcher: FirebaseJobDispatcher
+) {
+
+ fun reloadFullSyncService() {
+ startFullSyncService(true)
+ }
+
+ fun startFullSyncService(replaceCurrent: Boolean = false) {
+ if (LocalDate.now().isHolidays || !prefRepository.isServiceEnabled) {
+ Timber.d("Services disabled or it's holidays")
+ return
+ }
+
+ dispatcher.mustSchedule(
+ dispatcher.newJobBuilder()
+ .setLifetime(FOREVER)
+ .setRecurring(true)
+ .setService(SyncWorker::class.java)
+ .setTag(SyncWorker.WORK_TAG)
+ .setTrigger(
+ executionWindow(
+ prefRepository.servicesInterval * 60,
+ (prefRepository.servicesInterval + 10) * 60
+ )
+ )
+ .setConstraints(if (prefRepository.isServicesOnlyWifi) ON_UNMETERED_NETWORK else ON_ANY_NETWORK)
+ .setReplaceCurrent(replaceCurrent)
+ .setRetryStrategy(DEFAULT_EXPONENTIAL)
+ .build()
+ )
+
+ Timber.d("Services started")
+ }
+
+ fun stopFullSyncService() {
+ dispatcher.cancel(SyncWorker.WORK_TAG)
+ Timber.d("Services stopped")
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/job/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/job/SyncWorker.kt
new file mode 100644
index 000000000..65fb3abcf
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/job/SyncWorker.kt
@@ -0,0 +1,174 @@
+package io.github.wulkanowy.services.job
+
+import com.firebase.jobdispatcher.JobParameters
+import com.firebase.jobdispatcher.SimpleJobService
+import dagger.android.AndroidInjection
+import io.github.wulkanowy.data.repositories.AttendanceRepository
+import io.github.wulkanowy.data.repositories.ExamRepository
+import io.github.wulkanowy.data.repositories.GradeRepository
+import io.github.wulkanowy.data.repositories.GradeSummaryRepository
+import io.github.wulkanowy.data.repositories.HomeworkRepository
+import io.github.wulkanowy.data.repositories.MessagesRepository
+import io.github.wulkanowy.data.repositories.MessagesRepository.MessageFolder.RECEIVED
+import io.github.wulkanowy.data.repositories.NoteRepository
+import io.github.wulkanowy.data.repositories.PreferencesRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
+import io.github.wulkanowy.data.repositories.TimetableRepository
+import io.github.wulkanowy.services.notification.GradeNotification
+import io.github.wulkanowy.services.notification.MessageNotification
+import io.github.wulkanowy.services.notification.NoteNotification
+import io.github.wulkanowy.utils.friday
+import io.github.wulkanowy.utils.isHolidays
+import io.github.wulkanowy.utils.monday
+import io.reactivex.Single
+import io.reactivex.disposables.CompositeDisposable
+import org.threeten.bp.LocalDate
+import timber.log.Timber
+import javax.inject.Inject
+
+class SyncWorker : SimpleJobService() {
+
+ @Inject
+ lateinit var student: StudentRepository
+
+ @Inject
+ lateinit var semester: SemesterRepository
+
+ @Inject
+ lateinit var gradesDetails: GradeRepository
+
+ @Inject
+ lateinit var gradesSummary: GradeSummaryRepository
+
+ @Inject
+ lateinit var attendance: AttendanceRepository
+
+ @Inject
+ lateinit var exam: ExamRepository
+
+ @Inject
+ lateinit var timetable: TimetableRepository
+
+ @Inject
+ lateinit var message: MessagesRepository
+
+ @Inject
+ lateinit var note: NoteRepository
+
+ @Inject
+ lateinit var homework: HomeworkRepository
+
+ @Inject
+ lateinit var prefRepository: PreferencesRepository
+
+ private val disposable = CompositeDisposable()
+
+ companion object {
+ const val WORK_TAG = "FULL_SYNC"
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ AndroidInjection.inject(this)
+ }
+
+ override fun onRunJob(job: JobParameters?): Int {
+ Timber.d("Synchronization started")
+
+ val start = LocalDate.now().monday
+ val end = LocalDate.now().friday
+
+ if (start.isHolidays) return RESULT_FAIL_NORETRY
+
+ var error: Throwable? = null
+
+ disposable.add(student.getCurrentStudent()
+ .flatMap { semester.getCurrentSemester(it, true) }
+ .flatMapPublisher {
+ Single.merge(
+ listOf(
+ gradesDetails.getGrades(it, true, true),
+ gradesSummary.getGradesSummary(it, true),
+ attendance.getAttendance(it, start, end, true),
+ exam.getExams(it, start, end, true),
+ timetable.getTimetable(it, start, end, true),
+ message.getMessages(it.studentId, RECEIVED, true, true),
+ note.getNotes(it, true, true),
+ homework.getHomework(it, LocalDate.now(), true),
+ homework.getHomework(it, LocalDate.now().plusDays(1), true)
+ )
+ )
+ }
+ .subscribe({}, { error = it }))
+
+ return if (null === error) {
+ if (prefRepository.isNotificationsEnable) sendNotifications()
+ Timber.d("Synchronization successful")
+ RESULT_SUCCESS
+ } else {
+ Timber.e(error, "Synchronization failed")
+ RESULT_FAIL_RETRY
+ }
+ }
+
+ private fun sendNotifications() {
+ sendGradeNotifications()
+ sendMessageNotification()
+ sendNoteNotification()
+ }
+
+ private fun sendGradeNotifications() {
+ disposable.add(student.getCurrentStudent()
+ .flatMap { semester.getCurrentSemester(it) }
+ .flatMap { gradesDetails.getNewGrades(it) }
+ .map { it.filter { grade -> !grade.isNotified } }
+ .doOnSuccess {
+ if (it.isNotEmpty()) {
+ Timber.d("Found ${it.size} unread grades")
+ GradeNotification(applicationContext).sendNotification(it)
+ }
+ }
+ .map { it.map { grade -> grade.apply { isNotified = true } } }
+ .flatMapCompletable { gradesDetails.updateGrades(it) }
+ .subscribe({}, { Timber.e(it, "Grade notifications sending failed") }))
+ }
+
+ private fun sendMessageNotification() {
+ disposable.add(student.getCurrentStudent()
+ .flatMap { message.getNewMessages(it) }
+ .map { it.filter { message -> !message.isNotified } }
+ .doOnSuccess{
+ if (it.isNotEmpty()) {
+ Timber.d("Found ${it.size} unread messages")
+ MessageNotification(applicationContext).sendNotification(it)
+ }
+ }
+ .map { it.map { message -> message.apply { isNotified = true } } }
+ .flatMapCompletable { message.updateMessages(it) }
+ .subscribe({}, { Timber.e(it, "Message notifications sending failed") })
+ )
+ }
+
+ private fun sendNoteNotification() {
+ disposable.add(student.getCurrentStudent()
+ .flatMap { semester.getCurrentSemester(it) }
+ .flatMap { note.getNewNotes(it) }
+ .map { it.filter { note -> !note.isNotified } }
+ .doOnSuccess {
+ if (it.isNotEmpty()) {
+ Timber.d("Found ${it.size} unread notes")
+ NoteNotification(applicationContext).sendNotification(it)
+ }
+ }
+ .map { it.map { note -> note.apply { isNotified = true } } }
+ .flatMapCompletable { note.updateNotes(it) }
+ .subscribe({}, { Timber.e("Notifications sending failed") })
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ disposable.clear()
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/BaseNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/BaseNotification.kt
new file mode 100644
index 000000000..945d0b153
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/notification/BaseNotification.kt
@@ -0,0 +1,34 @@
+package io.github.wulkanowy.services.notification
+
+import android.app.Notification
+import android.app.NotificationManager
+import android.content.Context
+import android.content.Context.NOTIFICATION_SERVICE
+import android.os.Build.VERSION.SDK_INT
+import android.os.Build.VERSION_CODES.O
+import androidx.core.app.NotificationCompat
+import timber.log.Timber
+import kotlin.random.Random
+
+abstract class BaseNotification(protected val context: Context) {
+
+ protected val notificationManager: NotificationManager by lazy {
+ context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+ }
+
+ fun notify(notification: Notification) {
+ notificationManager.notify(Random.nextInt(1000), notification)
+ }
+
+ fun notificationBuilder(channelId: String): NotificationCompat.Builder {
+ if (SDK_INT >= O) createChannel(channelId)
+ return NotificationCompat.Builder(context, channelId)
+ }
+
+ fun cancelAll() {
+ notificationManager.cancelAll()
+ Timber.d("Notifications canceled")
+ }
+
+ abstract fun createChannel(channelId: String)
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/GradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/GradeNotification.kt
new file mode 100644
index 000000000..df57ec28c
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/notification/GradeNotification.kt
@@ -0,0 +1,60 @@
+package io.github.wulkanowy.services.notification
+
+import android.annotation.TargetApi
+import android.app.Notification.VISIBILITY_PUBLIC
+import android.app.NotificationChannel
+import android.app.NotificationManager.IMPORTANCE_HIGH
+import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_UPDATE_CURRENT
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.content.ContextCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.Grade
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
+import timber.log.Timber
+
+class GradeNotification(context: Context) : BaseNotification(context) {
+
+ private val channelId = "Grade_Notify"
+
+ @TargetApi(26)
+ override fun createChannel(channelId: String) {
+ notificationManager.createNotificationChannel(NotificationChannel(
+ channelId, context.getString(R.string.notify_grade_channel), IMPORTANCE_HIGH
+ ).apply {
+ enableLights(true)
+ enableVibration(true)
+ lockscreenVisibility = VISIBILITY_PUBLIC
+ })
+ }
+
+ fun sendNotification(items: List) {
+ notify(notificationBuilder(channelId)
+ .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items, items.size, items.size))
+ .setContentText(context.resources.getQuantityString(R.plurals.notify_grade_new_items, items.size, items.size))
+ .setSmallIcon(R.drawable.ic_stat_notify_grade)
+ .setAutoCancel(true)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 0),
+ FLAG_UPDATE_CURRENT
+ )
+ )
+ .setStyle(NotificationCompat.InboxStyle().run {
+ setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, items.size, items.size))
+ items.forEach {
+ addLine("${it.subject}: ${it.entry}")
+ }
+ this
+ })
+ .build()
+ )
+
+ Timber.d("Notification sent")
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/MessageNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/MessageNotification.kt
new file mode 100644
index 000000000..8733cadab
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/notification/MessageNotification.kt
@@ -0,0 +1,58 @@
+package io.github.wulkanowy.services.notification
+
+import android.annotation.TargetApi
+import android.app.Notification
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.content.ContextCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.Message
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import timber.log.Timber
+
+class MessageNotification(context: Context) : BaseNotification(context) {
+
+ private val channelId = "Message_Notify"
+
+ @TargetApi(26)
+ override fun createChannel(channelId: String) {
+ notificationManager.createNotificationChannel(NotificationChannel(
+ channelId, context.getString(R.string.notify_message_channel), NotificationManager.IMPORTANCE_HIGH
+ ).apply {
+ enableLights(true)
+ enableVibration(true)
+ lockscreenVisibility = Notification.VISIBILITY_PUBLIC
+ })
+ }
+
+ fun sendNotification(items: List) {
+ notify(notificationBuilder(channelId)
+ .setContentTitle(context.resources.getQuantityString(R.plurals.message_new_items, items.size, items.size))
+ .setContentText(context.resources.getQuantityString(R.plurals.notify_message_new_items, items.size, items.size))
+ .setSmallIcon(R.drawable.ic_stat_notify_message)
+ .setAutoCancel(true)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(MainActivity.EXTRA_START_MENU_INDEX, 4),
+ PendingIntent.FLAG_UPDATE_CURRENT
+ )
+ )
+ .setStyle(NotificationCompat.InboxStyle().run {
+ setSummaryText(context.resources.getQuantityString(R.plurals.message_number_item, items.size, items.size))
+ items.forEach {
+ addLine("${it.sender}: ${it.subject}")
+ }
+ this
+ })
+ .build()
+ )
+
+ Timber.d("Notification sent")
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/notification/NoteNotification.kt b/app/src/main/java/io/github/wulkanowy/services/notification/NoteNotification.kt
new file mode 100644
index 000000000..33c2fdc71
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/services/notification/NoteNotification.kt
@@ -0,0 +1,58 @@
+package io.github.wulkanowy.services.notification
+
+import android.annotation.TargetApi
+import android.app.Notification
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.Context
+import androidx.core.app.NotificationCompat
+import androidx.core.content.ContextCompat
+import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.Note
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import timber.log.Timber
+
+class NoteNotification(context: Context) : BaseNotification(context) {
+
+ private val channelId = "Note_Notify"
+
+ @TargetApi(26)
+ override fun createChannel(channelId: String) {
+ notificationManager.createNotificationChannel(NotificationChannel(
+ channelId, context.getString(R.string.notify_note_channel), NotificationManager.IMPORTANCE_HIGH
+ ).apply {
+ enableLights(true)
+ enableVibration(true)
+ lockscreenVisibility = Notification.VISIBILITY_PUBLIC
+ })
+ }
+
+ fun sendNotification(items: List) {
+ notify(notificationBuilder(channelId)
+ .setContentTitle(context.resources.getQuantityString(R.plurals.note_new_items, items.size, items.size))
+ .setContentText(context.resources.getQuantityString(R.plurals.notify_note_new_items, items.size, items.size))
+ .setSmallIcon(R.drawable.ic_stat_notify_note)
+ .setAutoCancel(true)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
+ .setContentIntent(
+ PendingIntent.getActivity(context, 0,
+ MainActivity.getStartIntent(context).putExtra(MainActivity.EXTRA_START_MENU_INDEX, 4),
+ PendingIntent.FLAG_UPDATE_CURRENT
+ )
+ )
+ .setStyle(NotificationCompat.InboxStyle().run {
+ setSummaryText(context.resources.getQuantityString(R.plurals.note_number_item, items.size, items.size))
+ items.forEach {
+ addLine("${it.teacher}: ${it.category}")
+ }
+ this
+ })
+ .build()
+ )
+
+ Timber.d("Notification sent")
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt
deleted file mode 100644
index 7a9a99568..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncManager.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package io.github.wulkanowy.services.sync
-
-import android.os.Build.VERSION.SDK_INT
-import android.os.Build.VERSION_CODES.O
-import androidx.work.BackoffPolicy.EXPONENTIAL
-import androidx.work.Constraints
-import androidx.work.ExistingPeriodicWorkPolicy.KEEP
-import androidx.work.ExistingPeriodicWorkPolicy.REPLACE
-import androidx.work.NetworkType.METERED
-import androidx.work.NetworkType.UNMETERED
-import androidx.work.PeriodicWorkRequest
-import androidx.work.WorkManager
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.services.sync.channels.DebugChannel
-import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
-import io.github.wulkanowy.utils.isHolidays
-import org.threeten.bp.LocalDate.now
-import timber.log.Timber
-import java.util.concurrent.TimeUnit.MINUTES
-import javax.inject.Inject
-import javax.inject.Named
-import javax.inject.Singleton
-
-@Singleton
-class SyncManager @Inject constructor(
- private val workManager: WorkManager,
- private val preferencesRepository: PreferencesRepository,
- newEntriesChannel: NewEntriesChannel,
- debugChannel: DebugChannel,
- @Named("isDebug") isDebug: Boolean
-) {
-
- init {
- if (SDK_INT >= O) newEntriesChannel.create()
- if (SDK_INT >= O && isDebug) debugChannel.create()
- if (now().isHolidays) stopSyncWorker()
- Timber.i("SyncManager was initialized")
- }
-
- fun startSyncWorker(restart: Boolean = false) {
- if (preferencesRepository.isServiceEnabled && !now().isHolidays) {
- workManager.enqueueUniquePeriodicWork(SyncWorker::class.java.simpleName, if (restart) REPLACE else KEEP,
- PeriodicWorkRequest.Builder(SyncWorker::class.java, preferencesRepository.servicesInterval, MINUTES)
- .setBackoffCriteria(EXPONENTIAL, 30, MINUTES)
- .setConstraints(Constraints.Builder()
- .setRequiredNetworkType(if (preferencesRepository.isServicesOnlyWifi) METERED else UNMETERED)
- .build())
- .build())
- }
- }
-
- fun stopSyncWorker() {
- workManager.cancelUniqueWork(SyncWorker::class.java.simpleName)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt
deleted file mode 100644
index 134fb0344..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorker.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package io.github.wulkanowy.services.sync
-
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.app.NotificationCompat.BigTextStyle
-import androidx.core.app.NotificationCompat.PRIORITY_DEFAULT
-import androidx.core.app.NotificationManagerCompat
-import androidx.work.ListenableWorker
-import androidx.work.RxWorker
-import androidx.work.WorkerParameters
-import com.squareup.inject.assisted.Assisted
-import com.squareup.inject.assisted.AssistedInject
-import io.github.wulkanowy.R
-import io.github.wulkanowy.api.interceptor.FeatureDisabledException
-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.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 timber.log.Timber
-import kotlin.random.Random
-
-class SyncWorker @AssistedInject constructor(
- @Assisted appContext: Context,
- @Assisted workerParameters: WorkerParameters,
- private val studentRepository: StudentRepository,
- private val semesterRepository: SemesterRepository,
- private val works: Set<@JvmSuppressWildcards Work>,
- private val preferencesRepository: PreferencesRepository,
- private val notificationManager: NotificationManagerCompat
-) : RxWorker(appContext, workerParameters) {
-
- override fun createWork(): Single {
- Timber.i("SyncWorker is starting")
- return studentRepository.isStudentSaved()
- .filter { true }
- .flatMap { studentRepository.getCurrentStudent().toMaybe() }
- .flatMapCompletable { student ->
- semesterRepository.getCurrentSemester(student, true)
- .flatMapCompletable { semester ->
- Completable.mergeDelayError(works.map { work ->
- work.create(student, semester)
- .doOnSubscribe { Timber.i("${work::class.java.simpleName} is starting") }
- .doOnError { Timber.i("${work::class.java.simpleName} result: An exception occurred") }
- .doOnComplete { Timber.i("${work::class.java.simpleName} result: Success") }
- })
- }
- }
- .toSingleDefault(Result.success())
- .onErrorReturn {
- Timber.e(it, "There was an error during synchronization")
- if (it is FeatureDisabledException) Result.success()
- else Result.retry()
- }
- .doOnSuccess {
- if (preferencesRepository.isDebugNotificationEnable) notify(it)
- Timber.i("SyncWorker result: $it")
- }
- }
-
- private fun notify(result: Result) {
- notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(applicationContext, DebugChannel.CHANNEL_ID)
- .setContentTitle("Debug notification")
- .setSmallIcon(R.drawable.ic_more_settings_24dp)
- .setAutoCancel(true)
- .setColor(applicationContext.getCompatColor(R.color.colorPrimary))
- .setStyle(BigTextStyle().bigText("${SyncWorker::class.java.simpleName} result: $result"))
- .setPriority(PRIORITY_DEFAULT)
- .build())
- }
-
- @AssistedInject.Factory
- interface Factory {
-
- fun create(appContext: Context, workerParameters: WorkerParameters): ListenableWorker
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt b/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt
deleted file mode 100644
index aadfc27f4..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/SyncWorkerFactory.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package io.github.wulkanowy.services.sync
-
-import android.content.Context
-import androidx.work.ListenableWorker
-import androidx.work.WorkerFactory
-import androidx.work.WorkerParameters
-import timber.log.Timber
-import javax.inject.Inject
-
-class SyncWorkerFactory @Inject constructor(private val syncWorkerFactory: SyncWorker.Factory) : WorkerFactory() {
-
- override fun createWorker(appContext: Context, workerClassName: String, workerParameters: WorkerParameters): ListenableWorker? {
- return if (workerClassName == SyncWorker::class.java.name) {
- syncWorkerFactory.create(appContext, workerParameters)
- } else {
- Timber.e(IllegalArgumentException("Unknown worker class name: $workerClassName"))
- null
- }
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt
deleted file mode 100644
index 02fff5690..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/DebugChannel.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package io.github.wulkanowy.services.sync.channels
-
-import android.annotation.TargetApi
-import android.app.Notification.VISIBILITY_PUBLIC
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.app.NotificationManager.IMPORTANCE_DEFAULT
-import android.content.Context
-import io.github.wulkanowy.R
-import javax.inject.Inject
-
-@TargetApi(26)
-class DebugChannel @Inject constructor(
- private val notificationManager: NotificationManager,
- private val context: Context
-) {
-
- companion object {
- const val CHANNEL_ID = "debug_channel"
- }
-
- fun create() {
- notificationManager.createNotificationChannel(
- NotificationChannel(CHANNEL_ID, context.getString(R.string.channel_debug), IMPORTANCE_DEFAULT).apply {
- lockscreenVisibility = VISIBILITY_PUBLIC
- })
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewEntriesChannel.kt b/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewEntriesChannel.kt
deleted file mode 100644
index 8e24a2a67..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/channels/NewEntriesChannel.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package io.github.wulkanowy.services.sync.channels
-
-import android.annotation.TargetApi
-import android.app.Notification.VISIBILITY_PUBLIC
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.app.NotificationManager.IMPORTANCE_HIGH
-import android.content.Context
-import io.github.wulkanowy.R
-import javax.inject.Inject
-
-@TargetApi(26)
-class NewEntriesChannel @Inject constructor(
- private val notificationManager: NotificationManager,
- private val context: Context
-) {
-
- companion object {
- const val CHANNEL_ID = "new_entries_channel"
- }
-
- fun create() {
- notificationManager.createNotificationChannel(
- NotificationChannel(CHANNEL_ID, context.getString(R.string.channel_new_entries), IMPORTANCE_HIGH).apply {
- enableLights(true)
- enableVibration(true)
- lockscreenVisibility = VISIBILITY_PUBLIC
- })
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt
deleted file mode 100644
index 01978c5b6..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceSummaryWork.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository
-import io.reactivex.Completable
-import javax.inject.Inject
-
-class AttendanceSummaryWork @Inject constructor(
- private val attendanceSummaryRepository: AttendanceSummaryRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return attendanceSummaryRepository.getAttendanceSummary(semester, -1, true).ignoreElement()
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt
deleted file mode 100644
index e4b55b0ea..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/AttendanceWork.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.monday
-import io.reactivex.Completable
-import org.threeten.bp.LocalDate.now
-import javax.inject.Inject
-
-class AttendanceWork @Inject constructor(private val attendanceRepository: AttendanceRepository) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return attendanceRepository.getAttendance(semester, now().monday, now().friday, true)
- .ignoreElement()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt
deleted file mode 100644
index 29642ad6f..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/CompletedLessonWork.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.monday
-import io.reactivex.Completable
-import org.threeten.bp.LocalDate.now
-import javax.inject.Inject
-
-class CompletedLessonWork @Inject constructor(
- private val completedLessonsRepository: CompletedLessonsRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return completedLessonsRepository.getCompletedLessons(semester, now().monday, now().friday, true)
- .ignoreElement()
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt
deleted file mode 100644
index 8744fcc79..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/ExamWork.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.exam.ExamRepository
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.monday
-import io.reactivex.Completable
-import org.threeten.bp.LocalDate.now
-import javax.inject.Inject
-
-class ExamWork @Inject constructor(private val examRepository: ExamRepository) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return examRepository.getExams(semester, now().monday, now().friday, true).ignoreElement()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt
deleted file mode 100644
index 1de39a95f..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeStatisticsWork.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.gradestatistics.GradeStatisticsRepository
-import io.reactivex.Completable
-import javax.inject.Inject
-
-class GradeStatisticsWork @Inject constructor(private val gradeStatisticsRepository: GradeStatisticsRepository) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return gradeStatisticsRepository.getGradesStatistics(semester, "Wszystkie", false, true)
- .ignoreElement()
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt
deleted file mode 100644
index 6de0bc5b0..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeSummaryWork.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.gradessummary.GradeSummaryRepository
-import io.reactivex.Completable
-import javax.inject.Inject
-
-class GradeSummaryWork @Inject constructor(private val gradeSummaryRepository: GradeSummaryRepository) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return gradeSummaryRepository.getGradesSummary(semester, true).ignoreElement()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt
deleted file mode 100644
index 66316934a..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/GradeWork.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import android.app.PendingIntent
-import android.app.PendingIntent.FLAG_UPDATE_CURRENT
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.app.NotificationCompat.DEFAULT_ALL
-import androidx.core.app.NotificationCompat.PRIORITY_HIGH
-import androidx.core.app.NotificationManagerCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.Grade
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.grade.GradeRepository
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
-import io.github.wulkanowy.utils.getCompatColor
-import io.reactivex.Completable
-import javax.inject.Inject
-import kotlin.random.Random
-
-class GradeWork @Inject constructor(
- private val context: Context,
- private val notificationManager: NotificationManagerCompat,
- private val gradeRepository: GradeRepository,
- private val preferencesRepository: PreferencesRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return gradeRepository.getGrades(student, semester, true, preferencesRepository.isNotificationsEnable)
- .flatMap { gradeRepository.getNotNotifiedGrades(semester) }
- .flatMapCompletable {
- if (it.isNotEmpty()) notify(it)
- gradeRepository.updateGrades(it.onEach { grade -> grade.isNotified = true })
- }
- }
-
- private fun notify(grades: List) {
- notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
- .setContentTitle(context.resources.getQuantityString(R.plurals.grade_new_items, grades.size, grades.size))
- .setContentText(context.resources.getQuantityString(R.plurals.grade_notify_new_items, grades.size, grades.size))
- .setSmallIcon(R.drawable.ic_stat_notify_grade)
- .setAutoCancel(true)
- .setPriority(PRIORITY_HIGH)
- .setDefaults(DEFAULT_ALL)
- .setColor(context.getCompatColor(R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 0), FLAG_UPDATE_CURRENT))
- .setStyle(NotificationCompat.InboxStyle().run {
- setSummaryText(context.resources.getQuantityString(R.plurals.grade_number_item, grades.size, grades.size))
- grades.forEach { addLine("${it.subject}: ${it.entry}") }
- this
- })
- .build()
- )
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt
deleted file mode 100644
index 32b356c68..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/HomeworkWork.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.homework.HomeworkRepository
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.monday
-import io.reactivex.Completable
-import org.threeten.bp.LocalDate.now
-import javax.inject.Inject
-
-class HomeworkWork @Inject constructor(private val homeworkRepository: HomeworkRepository) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return homeworkRepository.getHomework(semester, now().monday, now().friday, true).ignoreElement()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt
deleted file mode 100644
index ca7aaac60..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/LuckyNumberWork.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import android.app.PendingIntent
-import android.app.PendingIntent.FLAG_UPDATE_CURRENT
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.app.NotificationCompat.DEFAULT_ALL
-import androidx.core.app.NotificationCompat.PRIORITY_HIGH
-import androidx.core.app.NotificationManagerCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.LuckyNumber
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.luckynumber.LuckyNumberRepository
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
-import io.github.wulkanowy.utils.getCompatColor
-import io.reactivex.Completable
-import javax.inject.Inject
-import kotlin.random.Random
-
-class LuckyNumberWork @Inject constructor(
- private val context: Context,
- private val notificationManager: NotificationManagerCompat,
- private val luckyNumberRepository: LuckyNumberRepository,
- private val preferencesRepository: PreferencesRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return luckyNumberRepository.getLuckyNumber(semester, true, preferencesRepository.isNotificationsEnable)
- .flatMap { luckyNumberRepository.getNotNotifiedLuckyNumber(semester) }
- .flatMapCompletable {
- notify(it)
- luckyNumberRepository.updateLuckyNumber(it.apply { isNotified = true })
- }
- }
-
- private fun notify(luckyNumber: LuckyNumber) {
- notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
- .setContentTitle(context.getString(R.string.lucky_number_notify_new_item_title))
- .setContentText(context.getString(R.string.lucky_number_notify_new_item, luckyNumber.luckyNumber))
- .setSmallIcon(R.drawable.ic_stat_notify_lucky_number)
- .setAutoCancel(true)
- .setDefaults(DEFAULT_ALL)
- .setPriority(PRIORITY_HIGH)
- .setColor(context.getCompatColor(R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 4), FLAG_UPDATE_CURRENT)
- )
- .build())
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt
deleted file mode 100644
index 7ab2c8d4b..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/MessageWork.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import android.app.PendingIntent
-import android.app.PendingIntent.FLAG_UPDATE_CURRENT
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.app.NotificationCompat.DEFAULT_ALL
-import androidx.core.app.NotificationCompat.PRIORITY_HIGH
-import androidx.core.app.NotificationManagerCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.Message
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.message.MessageFolder.RECEIVED
-import io.github.wulkanowy.data.repositories.message.MessageRepository
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
-import io.github.wulkanowy.utils.getCompatColor
-import io.reactivex.Completable
-import javax.inject.Inject
-import kotlin.random.Random
-
-class MessageWork @Inject constructor(
- private val context: Context,
- private val notificationManager: NotificationManagerCompat,
- private val messageRepository: MessageRepository,
- private val preferencesRepository: PreferencesRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return messageRepository.getMessages(student, RECEIVED, true, preferencesRepository.isNotificationsEnable)
- .flatMap { messageRepository.getNotNotifiedMessages(student) }
- .flatMapCompletable {
- if (it.isNotEmpty()) notify(it)
- messageRepository.updateMessages(it.onEach { message -> message.isNotified = true })
- }
- }
-
- private fun notify(messages: List) {
- notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
- .setContentTitle(context.resources.getQuantityString(R.plurals.message_new_items, messages.size, messages.size))
- .setContentText(context.resources.getQuantityString(R.plurals.message_notify_new_items, messages.size, messages.size))
- .setSmallIcon(R.drawable.ic_stat_notify_message)
- .setAutoCancel(true)
- .setDefaults(DEFAULT_ALL)
- .setPriority(PRIORITY_HIGH)
- .setColor(context.getCompatColor(R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 4), FLAG_UPDATE_CURRENT)
- )
- .setStyle(NotificationCompat.InboxStyle().run {
- setSummaryText(context.resources.getQuantityString(R.plurals.message_number_item, messages.size, messages.size))
- messages.forEach { addLine("${it.sender}: ${it.subject}") }
- this
- })
- .build())
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt
deleted file mode 100644
index d0e8fe21c..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/NoteWork.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import android.app.PendingIntent
-import android.app.PendingIntent.FLAG_UPDATE_CURRENT
-import android.content.Context
-import androidx.core.app.NotificationCompat
-import androidx.core.app.NotificationCompat.DEFAULT_ALL
-import androidx.core.app.NotificationCompat.PRIORITY_HIGH
-import androidx.core.app.NotificationManagerCompat
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.Note
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.note.NoteRepository
-import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
-import io.github.wulkanowy.services.sync.channels.NewEntriesChannel
-import io.github.wulkanowy.ui.modules.main.MainActivity
-import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX
-import io.github.wulkanowy.utils.getCompatColor
-import io.reactivex.Completable
-import javax.inject.Inject
-import kotlin.random.Random
-
-class NoteWork @Inject constructor(
- private val context: Context,
- private val notificationManager: NotificationManagerCompat,
- private val noteRepository: NoteRepository,
- private val preferencesRepository: PreferencesRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return noteRepository.getNotes(student, semester, true, preferencesRepository.isNotificationsEnable)
- .flatMap { noteRepository.getNotNotifiedNotes(student) }
- .flatMapCompletable {
- if (it.isNotEmpty()) notify(it)
- noteRepository.updateNotes(it.onEach { note -> note.isNotified = true })
- }
- }
-
- private fun notify(notes: List) {
- notificationManager.notify(Random.nextInt(Int.MAX_VALUE), NotificationCompat.Builder(context, NewEntriesChannel.CHANNEL_ID)
- .setContentTitle(context.resources.getQuantityString(R.plurals.note_new_items, notes.size, notes.size))
- .setContentText(context.resources.getQuantityString(R.plurals.note_notify_new_items, notes.size, notes.size))
- .setSmallIcon(R.drawable.ic_stat_notify_note)
- .setAutoCancel(true)
- .setDefaults(DEFAULT_ALL)
- .setPriority(PRIORITY_HIGH)
- .setColor(context.getCompatColor(R.color.colorPrimary))
- .setContentIntent(
- PendingIntent.getActivity(context, 0,
- MainActivity.getStartIntent(context).putExtra(EXTRA_START_MENU_INDEX, 4), FLAG_UPDATE_CURRENT)
- )
- .setStyle(NotificationCompat.InboxStyle().run {
- setSummaryText(context.resources.getQuantityString(R.plurals.note_number_item, notes.size, notes.size))
- notes.forEach { addLine("${it.teacher}: ${it.category}") }
- this
- })
- .build())
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt
deleted file mode 100644
index fa610dee4..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/RecipientWork.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.recipient.RecipientRepository
-import io.github.wulkanowy.data.repositories.reportingunit.ReportingUnitRepository
-import io.reactivex.Completable
-import javax.inject.Inject
-
-class RecipientWork @Inject constructor(
- private val reportingUnitRepository: ReportingUnitRepository,
- private val recipientRepository: RecipientRepository
-) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return reportingUnitRepository.getReportingUnits(student, true)
- .flatMapCompletable { units ->
- Completable.mergeDelayError(units.map {
- recipientRepository.getRecipients(student, 2, it, true).ignoreElement()
- })
- }
- }
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt
deleted file mode 100644
index 743ae0e83..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/TimetableWork.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.github.wulkanowy.data.repositories.timetable.TimetableRepository
-import io.github.wulkanowy.utils.friday
-import io.github.wulkanowy.utils.monday
-import io.reactivex.Completable
-import org.threeten.bp.LocalDate.now
-import javax.inject.Inject
-
-class TimetableWork @Inject constructor(private val timetableRepository: TimetableRepository) : Work {
-
- override fun create(student: Student, semester: Semester): Completable {
- return timetableRepository.getTimetable(semester, now().monday, now().friday, true)
- .ignoreElement()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt b/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt
deleted file mode 100644
index 1601a103b..000000000
--- a/app/src/main/java/io/github/wulkanowy/services/sync/works/Work.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package io.github.wulkanowy.services.sync.works
-
-import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.db.entities.Student
-import io.reactivex.Completable
-
-interface Work {
-
- fun create(student: Student, semester: Semester): Completable
-}
-
diff --git a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt
index 0432ee146..d1e275b71 100644
--- a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt
+++ b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt
@@ -4,11 +4,10 @@ import android.content.Intent
import android.widget.RemoteViewsService
import dagger.android.AndroidInjection
import io.github.wulkanowy.data.db.SharedPrefHelper
-import io.github.wulkanowy.data.repositories.semester.SemesterRepository
-import io.github.wulkanowy.data.repositories.student.StudentRepository
-import io.github.wulkanowy.data.repositories.timetable.TimetableRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
+import io.github.wulkanowy.data.repositories.TimetableRepository
import io.github.wulkanowy.ui.widgets.timetable.TimetableWidgetFactory
-import io.github.wulkanowy.utils.SchedulersProvider
import javax.inject.Inject
class TimetableWidgetService : RemoteViewsService() {
@@ -25,11 +24,8 @@ class TimetableWidgetService : RemoteViewsService() {
@Inject
lateinit var sharedPref: SharedPrefHelper
- @Inject
- lateinit var schedulers: SchedulersProvider
-
override fun onGetViewFactory(intent: Intent?): RemoteViewsFactory {
AndroidInjection.inject(this)
- return TimetableWidgetFactory(timetableRepo, studentRepo, semesterRepo, sharedPref, schedulers, applicationContext, intent)
+ return TimetableWidgetFactory(timetableRepo, studentRepo, semesterRepo, sharedPref, applicationContext, intent)
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt
index 6e863c511..667b46ffe 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragment.kt
@@ -13,7 +13,7 @@ abstract class BaseFragment : DaggerFragment(), BaseView {
if (messageContainer == null) (activity as? BaseActivity)?.showError(text, error)
else messageContainer?.also {
Snackbar.make(it, text, Snackbar.LENGTH_LONG).setAction(R.string.all_details) {
- ErrorDialog.newInstance(error).show(childFragmentManager, error.toString())
+ ErrorDialog.newInstance(error).show(fragmentManager, error.toString())
}.show()
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt
deleted file mode 100644
index fcf7e9809..000000000
--- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseFragmentPagerAdapter.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package io.github.wulkanowy.ui.base
-
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentManager
-import androidx.fragment.app.FragmentPagerAdapter
-
-class BaseFragmentPagerAdapter(private val fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) {
-
- private val pages = mutableMapOf()
-
- var containerId = 0
-
- fun getFragmentInstance(position: Int): Fragment? {
- if (containerId == 0) throw IllegalArgumentException("Container id is 0")
- return fragmentManager.findFragmentByTag("android:switcher:$containerId:$position")
- }
-
- fun addFragments(fragments: List) {
- fragments.forEach { pages[it] = null }
- }
-
- fun addFragmentsWithTitle(pages: Map) {
- this.pages.putAll(pages)
- }
-
- override fun getItem(position: Int) = pages.keys.elementAt(position)
-
- override fun getCount() = pages.size
-
- override fun getPageTitle(position: Int) = pages.values.elementAt(position)
-}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePagerAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePagerAdapter.kt
new file mode 100644
index 000000000..000efdcd3
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePagerAdapter.kt
@@ -0,0 +1,32 @@
+package io.github.wulkanowy.ui.base
+
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentStatePagerAdapter
+
+class BasePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {
+
+ val fragments = mutableMapOf()
+
+ val registeredFragments = mutableMapOf()
+
+ override fun getItem(position: Int) = fragments.values.elementAt(position)
+
+ override fun getCount() = fragments.size
+
+ override fun getPageTitle(position: Int): CharSequence? {
+ return fragments.keys.elementAtOrNull(position)
+ }
+
+ override fun instantiateItem(container: ViewGroup, position: Int): Any {
+ return super.instantiateItem(container, position).also {
+ registeredFragments[position] = it as Fragment
+ }
+ }
+
+ override fun destroyItem(container: ViewGroup, position: Int, fragment: Any) {
+ registeredFragments.remove(position)
+ super.destroyItem(container, position, fragment)
+ }
+}
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 83cbf0ef0..e0e32e2c8 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
@@ -1,9 +1,7 @@
package io.github.wulkanowy.ui.base
import android.content.res.Resources
-import com.readystatesoftware.chuck.api.ChuckCollector
import io.github.wulkanowy.R
-import io.github.wulkanowy.api.interceptor.FeatureDisabledException
import io.github.wulkanowy.api.interceptor.ServiceUnavailableException
import io.github.wulkanowy.api.login.NotLoggedInException
import timber.log.Timber
@@ -11,12 +9,11 @@ import java.net.SocketTimeoutException
import java.net.UnknownHostException
import javax.inject.Inject
-open class ErrorHandler @Inject constructor(protected val resources: Resources, private val chuckCollector: ChuckCollector) {
+open class ErrorHandler @Inject constructor(protected val resources: Resources) {
var showErrorMessage: (String, Throwable) -> Unit = { _, _ -> }
fun dispatch(error: Throwable) {
- chuckCollector.onError(error.javaClass.simpleName, error)
Timber.e(error, "An exception occurred while the Wulkanowy was running")
proceed(error)
}
@@ -27,7 +24,6 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources,
is SocketTimeoutException -> resources.getString(R.string.error_timeout)
is NotLoggedInException -> resources.getString(R.string.error_login_failed)
is ServiceUnavailableException -> resources.getString(R.string.error_service_unavailable)
- is FeatureDisabledException -> resources.getString(R.string.error_feature_disabled)
else -> resources.getString(R.string.error_unknown)
}), error)
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt
index 1d81e9327..89654732a 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt
@@ -1,15 +1,11 @@
package io.github.wulkanowy.ui.base.session
import android.content.res.Resources
-import com.readystatesoftware.chuck.api.ChuckCollector
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.security.ScramblerException
import javax.inject.Inject
-open class SessionErrorHandler @Inject constructor(
- resources: Resources,
- chuckCollector: ChuckCollector
-) : ErrorHandler(resources, chuckCollector) {
+class SessionErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) {
var onDecryptionFail: () -> Unit = {}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt
index 52caf731e..ddc4e11fa 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt
@@ -1,14 +1,12 @@
package io.github.wulkanowy.ui.modules.about
import android.content.Intent
-import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.mikepenz.aboutlibraries.LibsBuilder
import com.mikepenz.aboutlibraries.LibsFragmentCompat
-import io.github.wulkanowy.BuildConfig
import io.github.wulkanowy.R
import io.github.wulkanowy.ui.base.BaseFragment
import io.github.wulkanowy.ui.modules.main.MainView
@@ -38,13 +36,12 @@ class AboutFragment : BaseFragment(), AboutView, MainView.TitledView {
.withAboutVersionShown(true)
.withAboutIconShown(true)
.withLicenseShown(true)
- .withAboutSpecial1(getString(R.string.about_discord_invite))
- .withAboutSpecial2(getString(R.string.about_homepage))
- .withAboutSpecial3(getString(R.string.about_feedback))
+ .withAboutSpecial1(getString(R.string.about_source_code))
+ .withAboutSpecial2(getString(R.string.about_feedback))
.withFields(R.string::class.java.fields)
.withCheckCachedDetection(false)
- .withExcludedLibraries("fastadapter", "AndroidIconics", "Jsoup", "Retrofit", "okio",
- "OkHttp", "Butterknife", "CircleImageView")
+ .withExcludedLibraries("fastadapter", "AndroidIconics", "gson",
+ "Jsoup", "Retrofit", "okio", "OkHttp")
.withOnExtraListener { presenter.onExtraSelect(it) })
}.let {
fragmentCompat.onCreateView(inflater.context, inflater, container, savedInstanceState, it)
@@ -56,33 +53,12 @@ class AboutFragment : BaseFragment(), AboutView, MainView.TitledView {
fragmentCompat.onViewCreated(view, savedInstanceState)
}
- override fun openDiscordInviteView() {
- startActivity(Intent.parseUri("https://discord.gg/vccAQBr", 0))
+ override fun openSourceWebView() {
+ startActivity(Intent.parseUri("https://github.com/wulkanowy/wulkanowy", 0))
}
- override fun openHomepageWebView() {
- startActivity(Intent.parseUri("https://wulkanowy.github.io/", 0))
- }
-
- override fun openEmailClientView() {
- val intent = Intent(Intent.ACTION_SENDTO).apply {
- data = Uri.parse("mailto:")
- putExtra(Intent.EXTRA_EMAIL, Array(1) { "wulkanowyinc@gmail.com" })
- putExtra(Intent.EXTRA_SUBJECT, "Zgłoszenie błędu")
- putExtra(Intent.EXTRA_TEXT, "Tu umieść treść zgłoszenia\n\n" + "-".repeat(40) + "\n" + """
- Build: ${BuildConfig.VERSION_CODE}
- SDK: ${android.os.Build.VERSION.SDK_INT}
- Device: ${android.os.Build.MANUFACTURER} ${android.os.Build.MODEL}
- """.trimIndent())
- }
-
- context?.let {
- if (intent.resolveActivity(it.packageManager) != null) {
- startActivity(Intent.createChooser(intent, getString(R.string.about_feedback)))
- } else {
- startActivity(Intent.parseUri("https://github.com/wulkanowy/wulkanowy/issues", 0))
- }
- }
+ override fun openIssuesWebView() {
+ startActivity(Intent.parseUri("https://github.com/wulkanowy/wulkanowy/issues", 0))
}
override fun onDestroyView() {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt
index 116dbef35..9a512f70f 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt
@@ -15,28 +15,21 @@ class AboutPresenter @Inject constructor(
private val analytics: FirebaseAnalyticsHelper
) : BasePresenter(errorHandler) {
- override fun onAttachView(view: AboutView) {
- super.onAttachView(view)
- Timber.i("About view is attached")
- }
-
fun onExtraSelect(type: Libs.SpecialButton?) {
view?.run {
when (type) {
SPECIAL1 -> {
- Timber.i("Opening discord invide page")
- analytics.logEvent("open_page", "name" to "discord")
- openDiscordInviteView()
+ Timber.i("Opening github page")
+ analytics.logEvent("open_page", mapOf("name" to "github"))
+ openSourceWebView()
}
SPECIAL2 -> {
- Timber.i("Opening home page")
- analytics.logEvent("open_page", "name" to "home")
- openHomepageWebView()
+ Timber.i("Opening issues page")
+ analytics.logEvent("open_page", mapOf("name" to "issues"))
+ openIssuesWebView()
}
SPECIAL3 -> {
- Timber.i("Opening email client")
- analytics.logEvent("open_page", "name" to "email")
- openEmailClientView()
+ //empty for now
}
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt
index 5b206ad82..a3ae2ada8 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutView.kt
@@ -4,9 +4,7 @@ import io.github.wulkanowy.ui.base.BaseView
interface AboutView : BaseView {
- fun openDiscordInviteView()
+ fun openSourceWebView()
- fun openEmailClientView()
-
- fun openHomepageWebView()
+ fun openIssuesWebView()
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt
index cb7aabda7..a564306d5 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountItem.kt
@@ -14,12 +14,12 @@ class AccountItem(val student: Student) : AbstractFlexibleItem>): ViewHolder {
+ override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder {
return ViewHolder(view, adapter)
}
- override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) {
- holder.apply {
+ override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder?, position: Int, payloads: MutableList?) {
+ holder?.apply {
accountItemName.text = student.studentName
accountItemSchool.text = student.schoolName
accountItemImage.setBackgroundResource(if (student.isCurrent) R.drawable.ic_account_circular_border else 0)
@@ -38,13 +38,14 @@ class AccountItem(val student: Student) : AbstractFlexibleItem) : FlexibleViewHolder(view, adapter), LayoutContainer {
- override val containerView: View
+ class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : FlexibleViewHolder(view, adapter),
+ LayoutContainer {
+
+ override val containerView: View?
get() = contentView
}
}
+
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 0fc6cc45c..e1459fe7d 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
@@ -1,41 +1,34 @@
package io.github.wulkanowy.ui.modules.account
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
-import io.github.wulkanowy.data.repositories.student.StudentRepository
-import io.github.wulkanowy.services.sync.SyncManager
+import io.github.wulkanowy.data.repositories.StudentRepository
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 timber.log.Timber
import javax.inject.Inject
class AccountPresenter @Inject constructor(
private val errorHandler: ErrorHandler,
private val studentRepository: StudentRepository,
- private val syncManager: SyncManager,
private val schedulers: SchedulersProvider
) : BasePresenter(errorHandler) {
override fun onAttachView(view: AccountView) {
super.onAttachView(view)
- Timber.i("Account dialog is attached")
view.initView()
loadData()
}
fun onAddSelected() {
- Timber.i("Select add account")
view?.openLoginView()
}
fun onRemoveSelected() {
- Timber.i("Select remove account")
view?.showConfirmDialog()
}
fun onLogoutConfirm() {
- Timber.i("Attempt to logout current user ")
disposable.add(studentRepository.getCurrentStudent()
.flatMapCompletable { studentRepository.logoutStudent(it) }
.andThen(studentRepository.getSavedStudents(false))
@@ -48,55 +41,31 @@ class AccountPresenter @Inject constructor(
.doFinally { view?.dismissView() }
.subscribe({
view?.apply {
- if (it.isEmpty()) {
- Timber.i("Logout result: Open login view")
- syncManager.stopSyncWorker()
- openClearLoginView()
- } else {
- Timber.i("Logout result: Switch to another student")
- recreateView()
- }
+ if (it.isEmpty()) openClearLoginView()
+ else recreateView()
}
- }, {
- Timber.i("Logout result: An exception occurred")
- errorHandler.dispatch(it)
- }))
+ }, { errorHandler.dispatch(it) }))
}
fun onItemSelected(item: AbstractFlexibleItem<*>) {
if (item is AccountItem) {
- Timber.i("Select student item ${item.student.id}")
if (item.student.isCurrent) {
view?.dismissView()
} else {
- Timber.i("Attempt to change a student")
disposable.add(studentRepository.switchStudent(item.student)
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
- .subscribe({
- Timber.i("Change a student result: Success")
- view?.recreateView()
- }, {
- Timber.i("Change a student result: An exception occurred")
- errorHandler.dispatch(it)
- }))
+ .subscribe({ view?.recreateView() }, { errorHandler.dispatch(it) }))
}
}
}
private fun loadData() {
- Timber.i("Loading account data started")
disposable.add(studentRepository.getSavedStudents(false)
.map { it.map { item -> AccountItem(item) } }
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
- .subscribe({
- Timber.i("Loading account result: Success")
- view?.updateData(it)
- }, {
- Timber.i("Loading account result: An exception occurred")
- errorHandler.dispatch(it)
- }))
+ .subscribe({ view?.updateData(it) }, { errorHandler.dispatch(it) }))
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt
index f0cab7f11..3b60d8cb7 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt
@@ -8,7 +8,6 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import eu.davidea.flexibleadapter.FlexibleAdapter
-import eu.davidea.flexibleadapter.common.FlexibleItemDecoration
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.R
@@ -67,10 +66,6 @@ class AttendanceFragment : BaseSessionFragment(), AttendanceView, MainView.MainC
attendanceRecycler.run {
layoutManager = SmoothScrollLinearLayoutManager(context)
adapter = attendanceAdapter
- addItemDecoration(FlexibleItemDecoration(context)
- .withDefaultDivider()
- .withDrawDividerOnLastItem(false)
- )
}
attendanceSwipe.setOnRefreshListener { presenter.onSwipeRefresh() }
attendancePreviousButton.setOnClickListener { presenter.onPreviousDay() }
@@ -118,10 +113,6 @@ class AttendanceFragment : BaseSessionFragment(), AttendanceView, MainView.MainC
attendanceProgress.visibility = if (show) View.VISIBLE else View.GONE
}
- override fun enableSwipe(enable: Boolean) {
- attendanceSwipe.isEnabled = enable
- }
-
override fun showContent(show: Boolean) {
attendanceRecycler.visibility = if (show) View.VISIBLE else View.GONE
}
@@ -139,7 +130,7 @@ class AttendanceFragment : BaseSessionFragment(), AttendanceView, MainView.MainC
}
override fun showAttendanceDialog(lesson: Attendance) {
- (activity as? MainActivity)?.showDialogFragment(AttendanceDialog.newInstance(lesson))
+ AttendanceDialog.newInstance(lesson).show(fragmentManager, lesson.toString())
}
override fun openSummaryView() {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt
index 16a140cbf..c2698ebba 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceItem.kt
@@ -14,13 +14,14 @@ import kotlinx.android.synthetic.main.item_attendance.*
class AttendanceItem(val attendance: Attendance) : AbstractFlexibleItem() {
- override fun getLayoutRes() = R.layout.item_attendance
-
override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder {
return ViewHolder(view, adapter)
}
- override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) {
+ override fun getLayoutRes(): Int = R.layout.item_attendance
+
+ override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder,
+ position: Int, payloads: MutableList?) {
holder.apply {
attendanceItemNumber.text = attendance.number.toString()
attendanceItemSubject.text = attendance.subject
@@ -36,17 +37,16 @@ class AttendanceItem(val attendance: Attendance) : AbstractFlexibleItem) : FlexibleViewHolder(view, adapter), LayoutContainer {
+ class ViewHolder(val view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter),
+ LayoutContainer {
+
override val containerView: View
get() = contentView
}
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 ec471c16a..9be87b441 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
@@ -2,10 +2,10 @@ package io.github.wulkanowy.ui.modules.attendance
import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
-import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository
-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.data.repositories.AttendanceRepository
+import io.github.wulkanowy.data.repositories.PreferencesRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
import io.github.wulkanowy.ui.base.session.SessionErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
@@ -18,7 +18,6 @@ import io.github.wulkanowy.utils.toFormattedString
import org.threeten.bp.LocalDate
import org.threeten.bp.LocalDate.now
import org.threeten.bp.LocalDate.ofEpochDay
-import timber.log.Timber
import java.util.concurrent.TimeUnit.MILLISECONDS
import javax.inject.Inject
@@ -37,7 +36,6 @@ class AttendancePresenter @Inject constructor(
fun onAttachView(view: AttendanceView, date: Long?) {
super.onAttachView(view)
- Timber.i("Attendance view is attached")
view.initView()
loadData(ofEpochDay(date ?: now().previousOrSameSchoolDay.toEpochDay()))
reloadView()
@@ -54,12 +52,10 @@ class AttendancePresenter @Inject constructor(
}
fun onSwipeRefresh() {
- Timber.i("Force refreshing the attendance")
loadData(currentDate, true)
}
fun onViewReselected() {
- Timber.i("Attendance view is reselected")
view?.also { view ->
if (view.currentStackSize == 1) {
now().previousOrSameSchoolDay.also {
@@ -73,10 +69,7 @@ class AttendancePresenter @Inject constructor(
}
fun onAttendanceItemSelected(item: AbstractFlexibleItem<*>?) {
- if (item is AttendanceItem) {
- Timber.i("Select attendance item ${item.attendance.id}")
- view?.showAttendanceDialog(item.attendance)
- }
+ if (item is AttendanceItem) view?.showAttendanceDialog(item.attendance)
}
fun onSummarySwitchSelected(): Boolean {
@@ -85,7 +78,6 @@ class AttendancePresenter @Inject constructor(
}
private fun loadData(date: LocalDate, forceRefresh: Boolean = false) {
- Timber.i("Loading attendance data started")
currentDate = date
disposable.apply {
clear()
@@ -105,19 +97,16 @@ class AttendancePresenter @Inject constructor(
view?.run {
hideRefresh()
showProgress(false)
- enableSwipe(true)
}
}
.subscribe({
- Timber.i("Loading attendance result: Success")
view?.apply {
updateData(it)
showEmpty(it.isEmpty())
showContent(it.isNotEmpty())
}
- analytics.logEvent("load_attendance", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd"))
+ analytics.logEvent("load_attendance", mapOf("items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")))
}) {
- Timber.i("Loading attendance result: An exception occurred")
view?.run { showEmpty(isViewEmpty) }
errorHandler.dispatch(it)
}
@@ -126,16 +115,14 @@ class AttendancePresenter @Inject constructor(
}
private fun reloadView() {
- Timber.i("Reload attendance view with the date ${currentDate.toFormattedString()}")
view?.apply {
showProgress(true)
- enableSwipe(false)
showContent(false)
showEmpty(false)
clearData()
showNextButton(!currentDate.plusDays(1).isHolidays)
showPreButton(!currentDate.minusDays(1).isHolidays)
- updateNavigationDay(currentDate.toFormattedString("EEEE\ndd.MM.YYYY").capitalize())
+ updateNavigationDay(currentDate.toFormattedString("EEEE \n dd.MM.YYYY").capitalize())
}
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt
index ef3b874b6..f839e89a9 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceView.kt
@@ -25,8 +25,6 @@ interface AttendanceView : BaseSessionView {
fun showProgress(show: Boolean)
- fun enableSwipe(enable: Boolean)
-
fun showContent(show: Boolean)
fun showPreButton(show: Boolean)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt
index b8d2c9528..1a3fc16f8 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt
@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
-import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.widget.ArrayAdapter
@@ -97,16 +96,12 @@ class AttendanceSummaryFragment : BaseSessionFragment(), AttendanceSummaryView,
attendanceSummaryProgress.visibility = if (show) VISIBLE else GONE
}
- override fun enableSwipe(enable: Boolean) {
- attendanceSummarySwipe.isEnabled = enable
- }
-
override fun showContent(show: Boolean) {
attendanceSummaryRecycler.visibility = if (show) VISIBLE else GONE
}
override fun showSubjects(show: Boolean) {
- attendanceSummarySubjectsContainer.visibility = if (show) VISIBLE else INVISIBLE
+ attendanceSummarySubjects.visibility = if (show) VISIBLE else VISIBLE
}
override fun hideRefresh() {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt
index 265d6ce44..3102ce116 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryItem.kt
@@ -23,12 +23,12 @@ class AttendanceSummaryItem(
override fun getLayoutRes() = R.layout.item_attendance_summary
- override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder {
+ override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder {
return ViewHolder(view, adapter)
}
- override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) {
- holder.apply {
+ override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder?, position: Int, payloads: MutableList?) {
+ holder?.apply {
attendanceSummaryMonth.text = month
attendanceSummaryPercentage.text = percentage
attendanceSummaryPresent.text = present
@@ -73,8 +73,10 @@ class AttendanceSummaryItem(
return result
}
- class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer {
- override val containerView: View
+ class ViewHolder(view: View?, adapter: FlexibleAdapter>?) : FlexibleViewHolder(view, adapter),
+ LayoutContainer {
+
+ override val containerView: View?
get() = contentView
}
}
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 8b17f7437..5086e80cc 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
@@ -2,17 +2,16 @@ package io.github.wulkanowy.ui.modules.attendance.summary
import io.github.wulkanowy.data.db.entities.AttendanceSummary
import io.github.wulkanowy.data.db.entities.Subject
-import io.github.wulkanowy.data.repositories.attendancesummary.AttendanceSummaryRepository
-import io.github.wulkanowy.data.repositories.semester.SemesterRepository
-import io.github.wulkanowy.data.repositories.student.StudentRepository
-import io.github.wulkanowy.data.repositories.subject.SubjectRepository
+import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
+import io.github.wulkanowy.data.repositories.SubjectRepostory
import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
import io.github.wulkanowy.ui.base.session.SessionErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
import io.github.wulkanowy.utils.SchedulersProvider
import io.github.wulkanowy.utils.calculatePercentage
import io.github.wulkanowy.utils.getFormattedName
-import timber.log.Timber
import java.lang.String.format
import java.util.Locale.FRANCE
import java.util.concurrent.TimeUnit.MILLISECONDS
@@ -21,7 +20,7 @@ import javax.inject.Inject
class AttendanceSummaryPresenter @Inject constructor(
private val errorHandler: SessionErrorHandler,
private val attendanceSummaryRepository: AttendanceSummaryRepository,
- private val subjectRepository: SubjectRepository,
+ private val subjectRepository: SubjectRepostory,
private val studentRepository: StudentRepository,
private val semesterRepository: SemesterRepository,
private val schedulers: SchedulersProvider,
@@ -35,32 +34,25 @@ class AttendanceSummaryPresenter @Inject constructor(
fun onAttachView(view: AttendanceSummaryView, subjectId: Int?) {
super.onAttachView(view)
- Timber.i("Attendance summary view is attached with subject id ${subjectId ?: -1}")
view.initView()
loadData(subjectId ?: -1)
loadSubjects()
}
fun onSwipeRefresh() {
- Timber.i("Force refreshing the attendance summary")
loadData(currentSubjectId, true)
}
fun onSubjectSelected(name: String) {
- Timber.i("Select attendance summary subject $name")
view?.run {
showContent(false)
showProgress(true)
- enableSwipe(false)
clearView()
}
- (subjects.singleOrNull { it.name == name }?.realId ?: -1).let {
- if (it != currentSubjectId) loadData(it)
- }
+ loadData(subjects.singleOrNull { it.name == name }?.realId ?: -1)
}
private fun loadData(subjectId: Int, forceRefresh: Boolean = false) {
- Timber.i("Loading attendance summary data started")
currentSubjectId = subjectId
disposable.apply {
clear()
@@ -75,19 +67,16 @@ class AttendanceSummaryPresenter @Inject constructor(
view?.run {
hideRefresh()
showProgress(false)
- enableSwipe(true)
}
}
.subscribe({
- Timber.i("Loading attendance summary result: Success")
view?.apply {
showEmpty(it.first.isEmpty())
showContent(it.first.isNotEmpty())
updateDataSet(it.first, it.second)
}
- analytics.logEvent("load_attendance_summary", "items" to it.first.size, "force_refresh" to forceRefresh, "item_id" to subjectId)
+ analytics.logEvent("load_attendance_summary", mapOf("items" to it.first.size, "force_refresh" to forceRefresh, "item_id" to subjectId))
}) {
- Timber.i("Loading attendance summary result: An exception occurred")
view?.run { showEmpty(isViewEmpty) }
errorHandler.dispatch(it)
}
@@ -96,7 +85,6 @@ class AttendanceSummaryPresenter @Inject constructor(
}
private fun loadSubjects() {
- Timber.i("Loading attendance summary subjects started")
disposable.add(studentRepository.getCurrentStudent()
.flatMap { semesterRepository.getCurrentSemester(it) }
.flatMap { subjectRepository.getSubjects(it) }
@@ -105,15 +93,11 @@ class AttendanceSummaryPresenter @Inject constructor(
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
.subscribe({
- Timber.i("Loading attendance summary subjects result: Success")
view?.run {
view?.updateSubjects(it)
showSubjects(true)
}
- }, {
- Timber.i("Loading attendance summary subjects result: An exception occurred")
- errorHandler.dispatch(it)
- })
+ }, { errorHandler.dispatch(it) })
)
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt
index e4c36db7b..af62a2ded 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryView.kt
@@ -14,8 +14,6 @@ interface AttendanceSummaryView : BaseSessionView {
fun showProgress(show: Boolean)
- fun enableSwipe(enable: Boolean)
-
fun showEmpty(show: Boolean)
fun updateDataSet(data: List, header: AttendanceSummaryScrollableHeader)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt
index 97e97727f..d39688d4f 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt
@@ -8,13 +8,11 @@ import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.view.ViewGroup
import eu.davidea.flexibleadapter.FlexibleAdapter
-import eu.davidea.flexibleadapter.common.FlexibleItemDecoration
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Exam
import io.github.wulkanowy.ui.base.session.BaseSessionFragment
-import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.ui.modules.main.MainView
import io.github.wulkanowy.utils.setOnItemClickListener
import kotlinx.android.synthetic.main.fragment_exam.*
@@ -57,10 +55,6 @@ class ExamFragment : BaseSessionFragment(), ExamView, MainView.MainChildView, Ma
examRecycler.run {
layoutManager = SmoothScrollLinearLayoutManager(context)
adapter = examAdapter
- addItemDecoration(FlexibleItemDecoration(context)
- .withDefaultDivider(R.layout.item_exam)
- .withDrawDividerOnLastItem(false)
- )
}
examSwipe.setOnRefreshListener { presenter.onSwipeRefresh() }
examPreviousButton.setOnClickListener { presenter.onPreviousWeek() }
@@ -99,10 +93,6 @@ class ExamFragment : BaseSessionFragment(), ExamView, MainView.MainChildView, Ma
examProgress.visibility = if (show) VISIBLE else GONE
}
- override fun enableSwipe(enable: Boolean) {
- examSwipe.isEnabled = enable
- }
-
override fun showContent(show: Boolean) {
examRecycler.visibility = if (show) VISIBLE else GONE
}
@@ -116,7 +106,7 @@ class ExamFragment : BaseSessionFragment(), ExamView, MainView.MainChildView, Ma
}
override fun showExamDialog(exam: Exam) {
- (activity as? MainActivity)?.showDialogFragment(ExamDialog.newInstance(exam))
+ ExamDialog.newInstance(exam).show(fragmentManager, exam.toString())
}
override fun onSaveInstanceState(outState: Bundle) {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt
index 8971b4df3..318685e93 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamItem.kt
@@ -18,7 +18,8 @@ class ExamItem(header: ExamHeader, val exam: Exam) : AbstractSectionableItem>, holder: ViewHolder, position: Int, payloads: MutableList?) {
+ override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder,
+ position: Int, payloads: MutableList?) {
holder.run {
examItemSubject.text = exam.subject
examItemTeacher.text = exam.teacher
@@ -38,12 +39,12 @@ class ExamItem(header: ExamHeader, val exam: Exam) : AbstractSectionableItem) : FlexibleViewHolder(view, adapter), LayoutContainer {
+ class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter),
+ LayoutContainer {
+
override val containerView: View
get() = contentView
}
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 4b6ef298b..88a0eaa53 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
@@ -3,9 +3,9 @@ package io.github.wulkanowy.ui.modules.exam
import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.data.db.entities.Exam
-import io.github.wulkanowy.data.repositories.exam.ExamRepository
-import io.github.wulkanowy.data.repositories.semester.SemesterRepository
-import io.github.wulkanowy.data.repositories.student.StudentRepository
+import io.github.wulkanowy.data.repositories.ExamRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
import io.github.wulkanowy.ui.base.session.SessionErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
@@ -18,7 +18,6 @@ import io.github.wulkanowy.utils.toFormattedString
import org.threeten.bp.LocalDate
import org.threeten.bp.LocalDate.now
import org.threeten.bp.LocalDate.ofEpochDay
-import timber.log.Timber
import java.util.concurrent.TimeUnit.MILLISECONDS
import javax.inject.Inject
@@ -36,7 +35,6 @@ class ExamPresenter @Inject constructor(
fun onAttachView(view: ExamView, date: Long?) {
super.onAttachView(view)
- Timber.i("Exam view is attached")
view.initView()
loadData(ofEpochDay(date ?: now().nextOrSameSchoolDay.toEpochDay()))
reloadView()
@@ -53,19 +51,14 @@ class ExamPresenter @Inject constructor(
}
fun onSwipeRefresh() {
- Timber.i("Force refreshing the exam")
loadData(currentDate, true)
}
fun onExamItemSelected(item: AbstractFlexibleItem<*>?) {
- if (item is ExamItem) {
- Timber.i("Select exam item ${item.exam.id}")
- view?.showExamDialog(item.exam)
- }
+ if (item is ExamItem) view?.showExamDialog(item.exam)
}
fun onViewReselected() {
- Timber.i("Exam view is reselected")
now().nextOrSameSchoolDay.also {
if (currentDate != it) {
loadData(it)
@@ -75,7 +68,6 @@ class ExamPresenter @Inject constructor(
}
private fun loadData(date: LocalDate, forceRefresh: Boolean = false) {
- Timber.i("Loading exam data started")
currentDate = date
disposable.apply {
clear()
@@ -92,19 +84,16 @@ class ExamPresenter @Inject constructor(
view?.run {
hideRefresh()
showProgress(false)
- enableSwipe(true)
}
}
.subscribe({
- Timber.i("Loading exam result: Success")
view?.apply {
updateData(it)
showEmpty(it.isEmpty())
showContent(it.isNotEmpty())
}
- analytics.logEvent("load_exam", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd"))
+ analytics.logEvent("load_exam", mapOf("items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")))
}) {
- Timber.i("Loading exam result: An exception occurred")
view?.run { showEmpty(isViewEmpty) }
errorHandler.dispatch(it)
})
@@ -120,10 +109,8 @@ class ExamPresenter @Inject constructor(
}
private fun reloadView() {
- Timber.i("Reload exam view with the date ${currentDate.toFormattedString()}")
view?.apply {
showProgress(true)
- enableSwipe(false)
showContent(false)
showEmpty(false)
clearData()
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt
index 2ced3f2d4..b6a926f3a 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamView.kt
@@ -23,8 +23,6 @@ interface ExamView : BaseSessionView {
fun showProgress(show: Boolean)
- fun enableSwipe(enable: Boolean)
-
fun showContent(show: Boolean)
fun showNextButton(show: Boolean)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/CustomTabLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/CustomTabLayout.kt
deleted file mode 100644
index e6f01497c..000000000
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/CustomTabLayout.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.github.wulkanowy.ui.modules.grade
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.ViewGroup
-import com.google.android.material.tabs.TabLayout
-
-/**
- * @see Tabs don't fit to screen with tabmode=scrollable, Even with a Custom Tab Layout
- */
-class CustomTabLayout : TabLayout {
-
- constructor(context: Context) : super(context)
-
- constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
-
- constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
-
- override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
- setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)
- val tabLayout = getChildAt(0) as ViewGroup
- val childCount = tabLayout.childCount
-
- if (childCount == 0) return
-
- val tabMinWidth = context.resources.displayMetrics.widthPixels / childCount
-
- for (i in 0 until childCount) {
- tabLayout.getChildAt(i).minimumWidth = tabMinWidth
- }
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec)
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt
index 20d3fad70..a4d948a92 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt
@@ -11,10 +11,9 @@ import android.view.View.VISIBLE
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import io.github.wulkanowy.R
-import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter
+import io.github.wulkanowy.ui.base.BasePagerAdapter
import io.github.wulkanowy.ui.base.session.BaseSessionFragment
import io.github.wulkanowy.ui.modules.grade.details.GradeDetailsFragment
-import io.github.wulkanowy.ui.modules.grade.statistics.GradeStatisticsFragment
import io.github.wulkanowy.ui.modules.grade.summary.GradeSummaryFragment
import io.github.wulkanowy.ui.modules.main.MainView
import io.github.wulkanowy.utils.setOnSelectPageListener
@@ -27,9 +26,7 @@ class GradeFragment : BaseSessionFragment(), GradeView, MainView.MainChildView,
lateinit var presenter: GradePresenter
@Inject
- lateinit var pagerAdapter: BaseFragmentPagerAdapter
-
- private var semesterSwitchMenu: MenuItem? = null
+ lateinit var pagerAdapter: BasePagerAdapter
companion object {
private const val SAVED_SEMESTER_KEY = "CURRENT_SEMESTER"
@@ -59,27 +56,18 @@ class GradeFragment : BaseSessionFragment(), GradeView, MainView.MainChildView,
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
inflater?.inflate(R.menu.action_menu_grade, menu)
- semesterSwitchMenu = menu?.findItem(R.id.gradeMenuSemester)
- presenter.onCreateMenu()
}
override fun initView() {
- pagerAdapter.apply {
- containerId = gradeViewPager.id
- addFragmentsWithTitle(mapOf(
- GradeDetailsFragment.newInstance() to getString(R.string.all_details),
- GradeSummaryFragment.newInstance() to getString(R.string.grade_menu_summary),
- GradeStatisticsFragment.newInstance() to getString(R.string.grade_menu_statistics)
- ))
- }
-
+ pagerAdapter.fragments.putAll(mapOf(
+ getString(R.string.all_details) to GradeDetailsFragment.newInstance(),
+ getString(R.string.grade_menu_summary) to GradeSummaryFragment.newInstance()
+ ))
gradeViewPager.run {
adapter = pagerAdapter
- offscreenPageLimit = 3
setOnSelectPageListener { presenter.onPageSelected(it) }
}
gradeTabLayout.setupWithViewPager(gradeViewPager)
- gradeSwipe.setOnRefreshListener { presenter.onSwipeRefresh() }
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
@@ -100,20 +88,8 @@ class GradeFragment : BaseSessionFragment(), GradeView, MainView.MainChildView,
gradeProgress.visibility = if (show) VISIBLE else INVISIBLE
}
- override fun showEmpty(show: Boolean) {
- gradeEmpty.visibility = if (show) VISIBLE else INVISIBLE
- }
-
- override fun showRefresh(show: Boolean) {
- gradeSwipe.isRefreshing = show
- }
-
- override fun showSemesterSwitch(show: Boolean) {
- semesterSwitchMenu?.isVisible = show
- }
-
- override fun enableSwipe(enable: Boolean) {
- gradeSwipe.isEnabled = enable
+ override fun showEmpty() {
+ gradeEmpty.visibility = VISIBLE
}
override fun showSemesterDialog(selectedIndex: Int) {
@@ -141,15 +117,15 @@ class GradeFragment : BaseSessionFragment(), GradeView, MainView.MainChildView,
}
override fun notifyChildLoadData(index: Int, semesterId: Int, forceRefresh: Boolean) {
- (pagerAdapter.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentLoadData(semesterId, forceRefresh)
+ (childFragmentManager.fragments[index] as GradeView.GradeChildView).onParentLoadData(semesterId, forceRefresh)
}
override fun notifyChildParentReselected(index: Int) {
- (pagerAdapter.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentReselected()
+ (pagerAdapter.registeredFragments[index] as? GradeView.GradeChildView)?.onParentReselected()
}
override fun notifyChildSemesterChange(index: Int) {
- (pagerAdapter.getFragmentInstance(index) as? GradeView.GradeChildView)?.onParentChangeSemester()
+ (pagerAdapter.registeredFragments[index] as? GradeView.GradeChildView)?.onParentChangeSemester()
}
override fun onSaveInstanceState(outState: Bundle) {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt
index 46a923d9a..c47ddc574 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeModule.kt
@@ -5,9 +5,8 @@ import dagger.Provides
import dagger.android.ContributesAndroidInjector
import io.github.wulkanowy.di.scopes.PerChildFragment
import io.github.wulkanowy.di.scopes.PerFragment
-import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter
+import io.github.wulkanowy.ui.base.BasePagerAdapter
import io.github.wulkanowy.ui.modules.grade.details.GradeDetailsFragment
-import io.github.wulkanowy.ui.modules.grade.statistics.GradeStatisticsFragment
import io.github.wulkanowy.ui.modules.grade.summary.GradeSummaryFragment
@Module
@@ -19,7 +18,7 @@ abstract class GradeModule {
@JvmStatic
@PerFragment
@Provides
- fun provideGradeAdapter(fragment: GradeFragment) = BaseFragmentPagerAdapter(fragment.childFragmentManager)
+ fun provideGradePagerAdapter(fragment: GradeFragment) = BasePagerAdapter(fragment.childFragmentManager)
}
@PerChildFragment
@@ -29,8 +28,4 @@ abstract class GradeModule {
@PerChildFragment
@ContributesAndroidInjector
abstract fun binGradeSummaryFragment(): GradeSummaryFragment
-
- @PerChildFragment
- @ContributesAndroidInjector
- abstract fun binGradeStatisticsFragment(): GradeStatisticsFragment
}
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 2357e0637..d2dd8031e 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
@@ -1,13 +1,14 @@
package io.github.wulkanowy.ui.modules.grade
import io.github.wulkanowy.data.db.entities.Semester
-import io.github.wulkanowy.data.repositories.semester.SemesterRepository
-import io.github.wulkanowy.data.repositories.student.StudentRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
import io.github.wulkanowy.ui.base.session.SessionErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
import io.github.wulkanowy.utils.SchedulersProvider
-import timber.log.Timber
+import io.reactivex.Completable
+import java.util.concurrent.TimeUnit.MILLISECONDS
import javax.inject.Inject
class GradePresenter @Inject constructor(
@@ -27,21 +28,15 @@ class GradePresenter @Inject constructor(
fun onAttachView(view: GradeView, savedIndex: Int?) {
super.onAttachView(view)
- Timber.i("Grade view is attached")
- selectedIndex = savedIndex ?: 0
- view.run {
- initView()
- enableSwipe(false)
- }
- loadData()
- }
-
- fun onCreateMenu() {
- if (semesters.isEmpty()) view?.showSemesterSwitch(false)
+ disposable.add(Completable.timer(150, MILLISECONDS, schedulers.mainThread)
+ .subscribe {
+ selectedIndex = savedIndex ?: 0
+ view.initView()
+ loadData()
+ })
}
fun onViewReselected() {
- Timber.i("Grade view is reselected")
view?.run { notifyChildParentReselected(currentPageIndex) }
}
@@ -52,14 +47,13 @@ class GradePresenter @Inject constructor(
fun onSemesterSelected(index: Int) {
if (selectedIndex != index - 1) {
- Timber.i("Change semester in grade view to ${index + 1}")
selectedIndex = index + 1
loadedSemesterId.clear()
view?.let {
notifyChildrenSemesterChange()
loadChild(it.currentPageIndex)
}
- analytics.logEvent("changed_semester", "number" to index + 1)
+ analytics.logEvent("changed_semester", mapOf("number" to index + 1))
}
}
@@ -71,21 +65,15 @@ class GradePresenter @Inject constructor(
view?.apply {
showContent(true)
showProgress(false)
- showEmpty(false)
loadedSemesterId[currentPageIndex] = semesterId
}
}
fun onPageSelected(index: Int) {
- if (semesters.isNotEmpty()) loadChild(index)
- }
-
- fun onSwipeRefresh() {
- loadData()
+ loadChild(index)
}
private fun loadData() {
- Timber.i("Loading grade data started")
disposable.add(studentRepository.getCurrentStudent()
.flatMap { semesterRepository.getSemesters(it) }
.doOnSuccess {
@@ -96,21 +84,11 @@ class GradePresenter @Inject constructor(
}
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
- .doFinally { view?.showRefresh(false) }
- .subscribe({
- view?.run {
- Timber.i("Loading grade result: Attempt load index $currentPageIndex")
- loadChild(currentPageIndex)
- enableSwipe(false)
- showSemesterSwitch(true)
- }
- }) {
- Timber.i("Loading grade result: An exception occurred")
+ .subscribe({ view?.run { loadChild(currentPageIndex) } }) {
errorHandler.dispatch(it)
view?.run {
showProgress(false)
- showEmpty(true)
- enableSwipe(true)
+ showEmpty()
}
})
}
@@ -118,13 +96,12 @@ class GradePresenter @Inject constructor(
private fun loadChild(index: Int, forceRefresh: Boolean = false) {
semesters.first { it.semesterName == selectedIndex }.semesterId.also {
if (forceRefresh || loadedSemesterId[index] != it) {
- Timber.i("Load grade child view index: $index")
view?.notifyChildLoadData(index, it, forceRefresh)
}
}
}
private fun notifyChildrenSemesterChange() {
- for (i in 0..2) view?.notifyChildSemesterChange(i)
+ for (i in 0..1) view?.notifyChildSemesterChange(i)
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt
index 9fdd46b16..3f1a197c4 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt
@@ -12,16 +12,10 @@ interface GradeView : BaseSessionView {
fun showProgress(show: Boolean)
- fun showEmpty(show: Boolean)
-
- fun showRefresh(show: Boolean)
-
- fun showSemesterSwitch(show: Boolean)
+ fun showEmpty()
fun showSemesterDialog(selectedIndex: Int)
- fun enableSwipe(enable: Boolean)
-
fun notifyChildLoadData(index: Int, semesterId: Int, forceRefresh: Boolean)
fun notifyChildParentReselected(index: Int)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt
index 0abeaeea0..19b462b1b 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt
@@ -9,26 +9,21 @@ import androidx.fragment.app.DialogFragment
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Grade
import io.github.wulkanowy.utils.colorStringId
-import io.github.wulkanowy.utils.getBackgroundColor
import io.github.wulkanowy.utils.toFormattedString
+import io.github.wulkanowy.utils.valueColor
import kotlinx.android.synthetic.main.dialog_grade.*
+
class GradeDetailsDialog : DialogFragment() {
private lateinit var grade: Grade
- private lateinit var colorScheme: String
-
companion object {
private const val ARGUMENT_KEY = "Item"
- private const val COLOR_SCHEME_KEY = "Scheme"
- fun newInstance(grade: Grade, colorScheme: String): GradeDetailsDialog {
+ fun newInstance(grade: Grade): GradeDetailsDialog {
return GradeDetailsDialog().apply {
- arguments = Bundle().apply {
- putSerializable(ARGUMENT_KEY, grade)
- putString(COLOR_SCHEME_KEY, colorScheme)
- }
+ arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, grade) }
}
}
}
@@ -38,7 +33,6 @@ class GradeDetailsDialog : DialogFragment() {
setStyle(STYLE_NO_TITLE, 0)
arguments?.run {
grade = getSerializable(ARGUMENT_KEY) as Grade
- colorScheme = getString(COLOR_SCHEME_KEY) ?: "default"
}
}
@@ -63,7 +57,7 @@ class GradeDetailsDialog : DialogFragment() {
gradeDialogValue.run {
text = grade.entry
- setBackgroundResource(grade.getBackgroundColor(colorScheme))
+ setBackgroundResource(grade.valueColor)
}
gradeDialogTeacherValue.text = if (grade.teacher.isBlank()) {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt
index 205cde771..a9ee9ce2b 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsFragment.kt
@@ -20,7 +20,6 @@ import io.github.wulkanowy.data.db.entities.Grade
import io.github.wulkanowy.ui.base.session.BaseSessionFragment
import io.github.wulkanowy.ui.modules.grade.GradeFragment
import io.github.wulkanowy.ui.modules.grade.GradeView
-import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.utils.setOnItemClickListener
import kotlinx.android.synthetic.main.fragment_grade_details.*
import javax.inject.Inject
@@ -46,9 +45,6 @@ class GradeDetailsFragment : BaseSessionFragment(), GradeDetailsView, GradeView.
override val weightString: String
get() = getString(R.string.grade_weight)
- override val noDescriptionString: String
- get() = getString(R.string.all_no_description)
-
override val isViewEmpty
get() = gradeDetailsAdapter.isEmpty
@@ -81,9 +77,6 @@ class GradeDetailsFragment : BaseSessionFragment(), GradeDetailsView, GradeView.
gradeDetailsRecycler.run {
layoutManager = SmoothScrollLinearLayoutManager(context)
adapter = gradeDetailsAdapter
- addItemDecoration(GradeDetailsHeaderItemDecoration(context)
- .withDefaultDivider(R.layout.header_grade_details)
- )
}
gradeDetailsSwipe.setOnRefreshListener { presenter.onSwipeRefresh() }
}
@@ -110,7 +103,7 @@ class GradeDetailsFragment : BaseSessionFragment(), GradeDetailsView, GradeView.
}
override fun scrollToStart() {
- gradeDetailsRecycler.scrollToPosition(0)
+ gradeDetailsAdapter.smoothScrollToPosition(0)
}
override fun getHeaderOfItem(item: AbstractFlexibleItem<*>): IExpandable<*, out IFlexible<*>>? {
@@ -125,10 +118,6 @@ class GradeDetailsFragment : BaseSessionFragment(), GradeDetailsView, GradeView.
gradeDetailsProgress.visibility = if (show) VISIBLE else GONE
}
- override fun enableSwipe(enable: Boolean) {
- gradeDetailsSwipe.isEnabled = enable
- }
-
override fun showContent(show: Boolean) {
gradeDetailsRecycler.visibility = if (show) VISIBLE else INVISIBLE
}
@@ -141,8 +130,8 @@ class GradeDetailsFragment : BaseSessionFragment(), GradeDetailsView, GradeView.
gradeDetailsSwipe.isRefreshing = show
}
- override fun showGradeDialog(grade: Grade, colorScheme: String) {
- (activity as? MainActivity)?.showDialogFragment(GradeDetailsDialog.newInstance(grade, colorScheme))
+ override fun showGradeDialog(grade: Grade) {
+ GradeDetailsDialog.newInstance(grade).show(fragmentManager, grade.toString())
}
override fun onParentLoadData(semesterId: Int, forceRefresh: Boolean) {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt
index e5f6e8249..5dec00a9f 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeader.kt
@@ -38,7 +38,6 @@ class GradeDetailsHeader(
gradeHeaderAverage.text = average
gradeHeaderNumber.text = number
gradeHeaderNote.visibility = if (newGrades > 0) VISIBLE else GONE
- gradeHeaderContainer.isEnabled = isExpandable
isViewExpandable = isExpandable
}
@@ -53,7 +52,6 @@ class GradeDetailsHeader(
if (subject != other.subject) return false
if (number != other.number) return false
if (average != other.average) return false
- if (isExpandable != other.isExpandable) return false
return true
}
@@ -62,7 +60,6 @@ class GradeDetailsHeader(
var result = subject.hashCode()
result = 31 * result + number.hashCode()
result = 31 * result + average.hashCode()
- result = 31 * result + isExpandable.hashCode()
return result
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt
deleted file mode 100644
index 39a911e62..000000000
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsHeaderItemDecoration.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.github.wulkanowy.ui.modules.grade.details
-
-import android.content.Context
-import android.graphics.Canvas
-import androidx.recyclerview.widget.RecyclerView
-import eu.davidea.flexibleadapter.common.FlexibleItemDecoration
-
-class GradeDetailsHeaderItemDecoration(context: Context) : FlexibleItemDecoration(context) {
-
- override fun drawVertical(canvas: Canvas, parent: RecyclerView) {
- canvas.save()
- val left: Int
- val right: Int
- if (parent.clipToPadding) {
- left = parent.paddingLeft
- right = parent.width - parent.paddingRight
- canvas.clipRect(left, parent.paddingTop, right,
- parent.height - parent.paddingBottom)
- } else {
- left = 0
- right = parent.width
- }
-
- val itemCount = parent.childCount
- for (i in 1 until itemCount) {
- val child = parent.getChildAt(i)
- val viewHolder = parent.getChildViewHolder(child)
- if (shouldDrawDivider(viewHolder)) {
- parent.getDecoratedBoundsWithMargins(child, mBounds)
- val bottom = mBounds.top + Math.round(child.translationY)
- val top = bottom - mDivider.intrinsicHeight
- mDivider.setBounds(left, top, right, bottom)
- mDivider.draw(canvas)
- }
- }
- canvas.restore()
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt
index 1e47eca5d..18c2656d6 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsItem.kt
@@ -14,12 +14,8 @@ import io.github.wulkanowy.utils.toFormattedString
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_grade_details.*
-class GradeDetailsItem(
- val grade: Grade,
- private val valueBgColor: Int,
- private val weightString: String,
- private val noDescriptionString: String
-) : AbstractFlexibleItem() {
+class GradeDetailsItem(val grade: Grade, private val weightString: String, private val valueColor: Int)
+ : AbstractFlexibleItem() {
override fun getLayoutRes() = R.layout.item_grade_details
@@ -28,17 +24,14 @@ class GradeDetailsItem(
}
@SuppressLint("SetTextI18n")
- override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) {
+ override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder,
+ position: Int, payloads: MutableList?) {
holder.run {
gradeItemValue.run {
text = grade.entry
- setBackgroundResource(valueBgColor)
- }
- gradeItemDescription.text = when {
- grade.description.isNotBlank() -> grade.description
- grade.gradeSymbol.isNotBlank() -> grade.gradeSymbol
- else -> noDescriptionString
+ setBackgroundResource(valueColor)
}
+ gradeItemDescription.text = if (grade.description.isNotBlank()) grade.description else grade.gradeSymbol
gradeItemDate.text = grade.date.toFormattedString()
gradeItemWeight.text = "$weightString: ${grade.weight}"
gradeItemNote.visibility = if (!grade.isRead) VISIBLE else GONE
@@ -52,22 +45,23 @@ class GradeDetailsItem(
other as GradeDetailsItem
if (grade != other.grade) return false
- if (grade.id != other.grade.id) return false
if (weightString != other.weightString) return false
- if (valueBgColor != other.valueBgColor) return false
+ if (valueColor != other.valueColor) return false
return true
}
override fun hashCode(): Int {
var result = grade.hashCode()
- result = 31 * result + grade.id.toInt()
result = 31 * result + weightString.hashCode()
- result = 31 * result + valueBgColor
+ result = 31 * result + valueColor
return result
}
- class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer {
+
+ class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter),
+ LayoutContainer {
+
override val containerView: View
get() = contentView
}
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 1be0b36f9..b80a71089 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
@@ -2,17 +2,17 @@ package io.github.wulkanowy.ui.modules.grade.details
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.data.db.entities.Grade
-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.data.repositories.student.StudentRepository
+import io.github.wulkanowy.data.repositories.GradeRepository
+import io.github.wulkanowy.data.repositories.PreferencesRepository
+import io.github.wulkanowy.data.repositories.SemesterRepository
+import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
import io.github.wulkanowy.ui.base.session.SessionErrorHandler
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
import io.github.wulkanowy.utils.SchedulersProvider
import io.github.wulkanowy.utils.calcAverage
import io.github.wulkanowy.utils.changeModifier
-import io.github.wulkanowy.utils.getBackgroundColor
+import io.github.wulkanowy.utils.valueColor
import timber.log.Timber
import javax.inject.Inject
@@ -40,9 +40,8 @@ class GradeDetailsPresenter @Inject constructor(
fun onGradeItemSelected(item: AbstractFlexibleItem<*>?) {
if (item is GradeDetailsItem) {
- Timber.i("Select grade item ${item.grade.id}")
view?.apply {
- showGradeDialog(item.grade, preferencesRepository.gradeColorTheme)
+ showGradeDialog(item.grade)
if (!item.grade.isRead) {
item.grade.isRead = true
updateItem(item)
@@ -59,29 +58,18 @@ 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 }) }
+ .flatMap { gradeRepository.getNewGrades(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)
- }
+ .flatMapCompletable { gradeRepository.updateGrades(it) }
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
- .subscribe({
- Timber.i("Mark as read result: Success")
- loadData(currentSemesterId, false)
- }, {
- Timber.i("Mark as read result: An exception occurred")
- errorHandler.dispatch(it)
- }))
+ .subscribe({ loadData(currentSemesterId, false) }, { errorHandler.dispatch(it) }))
return true
}
fun onSwipeRefresh() {
- Timber.i("Force refreshing the grade details")
view?.notifyParentRefresh()
}
@@ -97,7 +85,6 @@ class GradeDetailsPresenter @Inject constructor(
fun onParentViewChangeSemester() {
view?.run {
showProgress(true)
- enableSwipe(false)
showRefresh(false)
showContent(false)
showEmpty(false)
@@ -107,11 +94,9 @@ class GradeDetailsPresenter @Inject constructor(
}
private fun loadData(semesterId: Int, forceRefresh: Boolean) {
- Timber.i("Loading grade details data started")
disposable.add(studentRepository.getCurrentStudent()
- .flatMap { semesterRepository.getSemesters(it).map { semester -> semester to it } }
- .flatMap { gradeRepository.getGrades(it.second, it.first.first { item -> item.semesterId == semesterId }, forceRefresh) }
- .map { it.sortedByDescending { grade -> grade.date } }
+ .flatMap { semesterRepository.getSemesters(it) }
+ .flatMap { gradeRepository.getGrades(it.first { item -> item.semesterId == semesterId }, forceRefresh) }
.map { it.map { item -> item.changeModifier(preferencesRepository.gradePlusModifier, preferencesRepository.gradeMinusModifier) } }
.map { createGradeItems(it.groupBy { grade -> grade.subject }.toSortedMap()) }
.subscribeOn(schedulers.backgroundThread)
@@ -120,20 +105,17 @@ class GradeDetailsPresenter @Inject constructor(
view?.run {
showRefresh(false)
showProgress(false)
- enableSwipe(true)
notifyParentDataLoaded(semesterId)
}
}
.subscribe({
- Timber.i("Loading grade details result: Success")
view?.run {
showEmpty(it.isEmpty())
showContent(it.isNotEmpty())
updateData(it)
}
- analytics.logEvent("load_grade_details", "items" to it.size, "force_refresh" to forceRefresh)
+ analytics.logEvent("load_grade_details", mapOf("items" to it.size, "force_refresh" to forceRefresh))
}) {
- Timber.i("Loading grade details result: An exception occurred")
view?.run { showEmpty(isViewEmpty) }
errorHandler.dispatch(it)
})
@@ -152,9 +134,8 @@ class GradeDetailsPresenter @Inject constructor(
subItems = it.value.map { item ->
GradeDetailsItem(
grade = item,
- valueBgColor = item.getBackgroundColor(preferencesRepository.gradeColorTheme),
weightString = view?.weightString.orEmpty(),
- noDescriptionString = view?.noDescriptionString.orEmpty()
+ valueColor = item.valueColor
)
}
}
@@ -170,14 +151,10 @@ class GradeDetailsPresenter @Inject constructor(
}
private fun updateGrade(grade: Grade) {
- Timber.i("Attempt to update grade ${grade.id}")
disposable.add(gradeRepository.updateGrade(grade)
.subscribeOn(schedulers.backgroundThread)
.observeOn(schedulers.mainThread)
- .subscribe({ Timber.i("Update grade result: Success") })
- { error ->
- Timber.i("Update grade result: An exception occurred")
- errorHandler.dispatch(error)
- })
+ .subscribe({}) { error -> errorHandler.dispatch(error) })
+ Timber.d("Grade ${grade.id} updated")
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt
index 1fb98216b..242542600 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsView.kt
@@ -16,8 +16,6 @@ interface GradeDetailsView : BaseSessionView {
val weightString: String
- val noDescriptionString: String
-
fun initView()
fun updateData(data: List)
@@ -30,7 +28,7 @@ interface GradeDetailsView : BaseSessionView {
fun collapseAllItems()
- fun showGradeDialog(grade: Grade, colorScheme: String)
+ fun showGradeDialog(grade: Grade)
fun showContent(show: Boolean)
@@ -38,8 +36,6 @@ interface GradeDetailsView : BaseSessionView {
fun showProgress(show: Boolean)
- fun enableSwipe(enable: Boolean)
-
fun showRefresh(show: Boolean)
fun notifyParentDataLoaded(semesterId: Int)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt
deleted file mode 100644
index f27a13c83..000000000
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt
+++ /dev/null
@@ -1,214 +0,0 @@
-package io.github.wulkanowy.ui.modules.grade.statistics
-
-import android.graphics.Color.WHITE
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ArrayAdapter
-import android.widget.TextView
-import androidx.core.content.ContextCompat
-import com.github.mikephil.charting.components.Legend
-import com.github.mikephil.charting.components.LegendEntry
-import com.github.mikephil.charting.data.PieData
-import com.github.mikephil.charting.data.PieDataSet
-import com.github.mikephil.charting.data.PieEntry
-import com.github.mikephil.charting.formatter.ValueFormatter
-import io.github.wulkanowy.R
-import io.github.wulkanowy.data.db.entities.GradeStatistics
-import io.github.wulkanowy.ui.base.session.BaseSessionFragment
-import io.github.wulkanowy.ui.modules.grade.GradeFragment
-import io.github.wulkanowy.ui.modules.grade.GradeView
-import io.github.wulkanowy.utils.getThemeAttrColor
-import io.github.wulkanowy.utils.setOnItemSelectedListener
-import kotlinx.android.synthetic.main.fragment_grade_statistics.*
-import javax.inject.Inject
-
-class GradeStatisticsFragment : BaseSessionFragment(), GradeStatisticsView, GradeView.GradeChildView {
-
- @Inject
- lateinit var presenter: GradeStatisticsPresenter
-
- private lateinit var subjectsAdapter: ArrayAdapter
-
- companion object {
- private const val SAVED_CHART_TYPE = "CURRENT_TYPE"
-
- fun newInstance() = GradeStatisticsFragment()
- }
-
- override val isViewEmpty
- get() = gradeStatisticsChart.isEmpty
-
- private lateinit var gradeColors: List>
-
- private val vulcanGradeColors = listOf(
- 6 to R.color.grade_vulcan_six,
- 5 to R.color.grade_vulcan_five,
- 4 to R.color.grade_vulcan_four,
- 3 to R.color.grade_vulcan_three,
- 2 to R.color.grade_vulcan_two,
- 1 to R.color.grade_vulcan_one
- )
-
- private val materialGradeColors = listOf(
- 6 to R.color.grade_material_six,
- 5 to R.color.grade_material_five,
- 4 to R.color.grade_material_four,
- 3 to R.color.grade_material_three,
- 2 to R.color.grade_material_two,
- 1 to R.color.grade_material_one
- )
-
- private val gradeLabels = listOf(
- "6, 6-", "5, 5-, 5+", "4, 4-, 4+", "3, 3-, 3+", "2, 2-, 2+", "1, 1+"
- )
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- return inflater.inflate(R.layout.fragment_grade_statistics, container, false)
- }
-
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- super.onActivityCreated(savedInstanceState)
- messageContainer = gradeStatisticsChart
- presenter.onAttachView(this, savedInstanceState?.getBoolean(SAVED_CHART_TYPE))
- }
-
- override fun initView() {
- gradeStatisticsChart.run {
- description.isEnabled = false
- setHoleColor(context.getThemeAttrColor(android.R.attr.windowBackground))
- setCenterTextColor(context.getThemeAttrColor(android.R.attr.textColorPrimary))
- animateXY(1000, 1000)
- minAngleForSlices = 25f
- legend.apply {
- textColor = context.getThemeAttrColor(android.R.attr.textColorPrimary)
- }
- }
-
- context?.let {
- subjectsAdapter = ArrayAdapter(it, android.R.layout.simple_spinner_item, ArrayList())
- subjectsAdapter.setDropDownViewResource(R.layout.item_attendance_summary_subject)
- }
-
- gradeStatisticsSubjects.run {
- adapter = subjectsAdapter
- setOnItemSelectedListener { presenter.onSubjectSelected((it as TextView).text.toString()) }
- }
-
- gradeStatisticsSwipe.setOnRefreshListener { presenter.onSwipeRefresh() }
- }
-
- override fun updateSubjects(data: ArrayList) {
- subjectsAdapter.run {
- clear()
- addAll(data)
- notifyDataSetChanged()
- }
- }
-
- override fun updateData(items: List, theme: String) {
- gradeColors = when (theme) {
- "vulcan" -> vulcanGradeColors
- else -> materialGradeColors
- }
-
- gradeStatisticsChart.run {
- data = PieData(PieDataSet(items.map {
- PieEntry(it.amount.toFloat(), it.grade.toString())
- }, "Legenda").apply {
- valueTextSize = 12f
- sliceSpace = 1f
- valueTextColor = WHITE
- setColors(items.map {
- gradeColors.single { color -> color.first == it.grade }.second
- }.toIntArray(), context)
- }).apply {
- setTouchEnabled(false)
- setValueFormatter(object : ValueFormatter() {
- override fun getPieLabel(value: Float, pieEntry: PieEntry): String {
- return resources.getQuantityString(R.plurals.grade_number_item, value.toInt(), value.toInt())
- }
- })
- centerText = items.fold(0) { acc, it -> acc + it.amount }
- .let { resources.getQuantityString(R.plurals.grade_number_item, it, it) }
- }
- legend.apply {
- setCustom(gradeLabels.mapIndexed { i, it ->
- LegendEntry().apply {
- label = it
- formColor = ContextCompat.getColor(context, gradeColors[i].second)
- form = Legend.LegendForm.SQUARE
- }
- })
- }
- invalidate()
- }
- }
-
- override fun showSubjects(show: Boolean) {
- gradeStatisticsSubjectsContainer.visibility = if (show) View.VISIBLE else View.INVISIBLE
- gradeStatisticsTypeSwitch.visibility = if (show) View.VISIBLE else View.INVISIBLE
- }
-
- override fun clearView() {
- gradeStatisticsChart.clear()
- }
-
- override fun showContent(show: Boolean) {
- gradeStatisticsChart.visibility = if (show) View.VISIBLE else View.GONE
- }
-
- override fun showEmpty(show: Boolean) {
- gradeStatisticsEmpty.visibility = if (show) View.VISIBLE else View.INVISIBLE
- }
-
- override fun showProgress(show: Boolean) {
- gradeStatisticsProgress.visibility = if (show) View.VISIBLE else View.GONE
- }
-
- override fun enableSwipe(enable: Boolean) {
- gradeStatisticsSwipe.isEnabled = enable
- }
-
- override fun showRefresh(show: Boolean) {
- gradeStatisticsSwipe.isRefreshing = show
- }
-
- override fun onParentLoadData(semesterId: Int, forceRefresh: Boolean) {
- presenter.onParentViewLoadData(semesterId, forceRefresh)
- }
-
- override fun onParentReselected() {
- //
- }
-
- override fun onParentChangeSemester() {
- presenter.onParentViewChangeSemester()
- }
-
- override fun notifyParentDataLoaded(semesterId: Int) {
- (parentFragment as? GradeFragment)?.onChildFragmentLoaded(semesterId)
- }
-
- override fun notifyParentRefresh() {
- (parentFragment as? GradeFragment)?.onChildRefresh()
- }
-
- override fun onResume() {
- super.onResume()
- gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, checkedId ->
- presenter.onTypeChange(checkedId == R.id.gradeStatisticsTypeSemester)
- }
- }
-
- override fun onSaveInstanceState(outState: Bundle) {
- super.onSaveInstanceState(outState)
- outState.putBoolean(GradeStatisticsFragment.SAVED_CHART_TYPE, presenter.currentIsSemester)
- }
-
- override fun onDestroyView() {
- super.onDestroyView()
- presenter.onDetachView()
- }
-}
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
deleted file mode 100644
index 5dd485cd5..000000000
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsPresenter.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-package io.github.wulkanowy.ui.modules.grade.statistics
-
-import io.github.wulkanowy.data.db.entities.Subject
-import io.github.wulkanowy.data.repositories.gradestatistics.GradeStatisticsRepository
-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.data.repositories.subject.SubjectRepository
-import io.github.wulkanowy.ui.base.session.BaseSessionPresenter
-import io.github.wulkanowy.ui.base.session.SessionErrorHandler
-import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
-import io.github.wulkanowy.utils.SchedulersProvider
-import timber.log.Timber
-import javax.inject.Inject
-
-class GradeStatisticsPresenter @Inject constructor(
- private val errorHandler: SessionErrorHandler,
- private val gradeStatisticsRepository: GradeStatisticsRepository,
- private val subjectRepository: SubjectRepository,
- private val studentRepository: StudentRepository,
- private val semesterRepository: SemesterRepository,
- private val preferencesRepository: PreferencesRepository,
- private val schedulers: SchedulersProvider,
- private val analytics: FirebaseAnalyticsHelper
-) : BaseSessionPresenter(errorHandler) {
-
- private var subjects = emptyList()
-
- private var currentSemesterId = 0
-
- private var currentSubjectName: String = "Wszystkie"
-
- var currentIsSemester = false
- private set
-
- fun onAttachView(view: GradeStatisticsView, isSemester: Boolean?) {
- super.onAttachView(view)
- currentIsSemester = isSemester ?: false
- view.initView()
- }
-
- fun onParentViewLoadData(semesterId: Int, forceRefresh: Boolean) {
- currentSemesterId = semesterId
- loadSubjects()
- loadData(semesterId, currentSubjectName, currentIsSemester, forceRefresh)
- }
-
- fun onParentViewChangeSemester() {
- view?.run {
- showProgress(true)
- enableSwipe(false)
- showRefresh(false)
- showContent(false)
- showEmpty(false)
- clearView()
- }
- disposable.clear()
- }
-
- fun onSwipeRefresh() {
- Timber.i("Force refreshing the grade stats")
- view?.notifyParentRefresh()
- }
-
- fun onSubjectSelected(name: String) {
- Timber.i("Select grade stats subject $name")
- view?.run {
- showContent(false)
- showProgress(true)
- enableSwipe(false)
- showEmpty(false)
- clearView()
- }
- (subjects.singleOrNull { it.name == name }?.name).let {
- if (it != currentSubjectName) loadData(currentSemesterId, name, currentIsSemester)
- }
- }
-
- fun onTypeChange(isSemester: Boolean) {
- Timber.i("Select grade stats semester: $isSemester")
- disposable.clear()
- view?.run {
- showContent(false)
- showProgress(true)
- enableSwipe(false)
- showEmpty(false)
- clearView()
- }
- loadData(currentSemesterId, currentSubjectName, isSemester)
- }
-
- private fun loadSubjects() {
- Timber.i("Loading grade stats subjects started")
- disposable.add(studentRepository.getCurrentStudent()
- .flatMap { semesterRepository.getCurrentSemester(it) }
- .flatMap { subjectRepository.getSubjects(it) }
- .doOnSuccess { subjects = it }
- .map { ArrayList(it.map { subject -> subject.name }) }
- .subscribeOn(schedulers.backgroundThread)
- .observeOn(schedulers.mainThread)
- .subscribe({
- Timber.i("Loading grade stats subjects result: Success")
- view?.run {
- updateSubjects(it)
- showSubjects(true)
- }
- }, {
- Timber.e("Loading grade stats subjects result: An exception occurred")
- errorHandler.dispatch(it)
- })
- )
- }
-
- private fun loadData(semesterId: Int, subjectName: String, isSemester: Boolean, forceRefresh: Boolean = false) {
- Timber.i("Loading grade stats data started")
- currentSubjectName = subjectName
- currentIsSemester = isSemester
- disposable.add(studentRepository.getCurrentStudent()
- .flatMap { semesterRepository.getSemesters(it) }
- .flatMap { gradeStatisticsRepository.getGradesStatistics(it.first { item -> item.semesterId == semesterId }, subjectName, isSemester, forceRefresh) }
- .map { list -> list.sortedByDescending { it.grade } }
- .map { list -> list.filter { it.amount != 0 } }
- .subscribeOn(schedulers.backgroundThread)
- .observeOn(schedulers.mainThread)
- .doFinally {
- view?.run {
- showRefresh(false)
- showProgress(false)
- enableSwipe(true)
- notifyParentDataLoaded(semesterId)
- }
- }
- .subscribe({
- Timber.i("Loading grade stats result: Success")
- view?.run {
- showEmpty(it.isEmpty())
- showContent(it.isNotEmpty())
- updateData(it, preferencesRepository.gradeColorTheme)
- }
- analytics.logEvent("load_grade_statistics", "items" to it.size, "force_refresh" to forceRefresh)
- }) {
- Timber.e("Loading grade stats result: An exception occurred")
- view?.run { showEmpty(isViewEmpty) }
- errorHandler.dispatch(it)
- })
- }
-}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt
deleted file mode 100644
index dbdde459e..000000000
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsView.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package io.github.wulkanowy.ui.modules.grade.statistics
-
-import io.github.wulkanowy.data.db.entities.GradeStatistics
-import io.github.wulkanowy.ui.base.session.BaseSessionView
-
-interface GradeStatisticsView : BaseSessionView {
-
- val isViewEmpty: Boolean
-
- fun initView()
-
- fun updateSubjects(data: ArrayList)
-
- fun updateData(items: List, theme: String)
-
- fun showSubjects(show: Boolean)
-
- fun notifyParentDataLoaded(semesterId: Int)
-
- fun notifyParentRefresh()
-
- fun clearView()
-
- fun showContent(show: Boolean)
-
- fun showEmpty(show: Boolean)
-
- fun showProgress(show: Boolean)
-
- fun enableSwipe(enable: Boolean)
-
- fun showRefresh(show: Boolean)
-}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt
index f174f96c2..13833b74a 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryFragment.kt
@@ -71,7 +71,7 @@ class GradeSummaryFragment : BaseSessionFragment(), GradeSummaryView, GradeView.
}
override fun resetView() {
- gradeSummaryRecycler.scrollToPosition(0)
+ gradeSummaryAdapter.smoothScrollToPosition(0)
}
override fun showContent(show: Boolean) {
@@ -86,10 +86,6 @@ class GradeSummaryFragment : BaseSessionFragment(), GradeSummaryView, GradeView.
gradeSummaryProgress.visibility = if (show) VISIBLE else GONE
}
- override fun enableSwipe(enable: Boolean) {
- gradeSummarySwipe.isEnabled = enable
- }
-
override fun showRefresh(show: Boolean) {
gradeSummarySwipe.isRefreshing = show
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryHeader.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryHeader.kt
new file mode 100644
index 000000000..fba3fde62
--- /dev/null
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryHeader.kt
@@ -0,0 +1,52 @@
+package io.github.wulkanowy.ui.modules.grade.summary
+
+import android.view.View
+import eu.davidea.flexibleadapter.FlexibleAdapter
+import eu.davidea.flexibleadapter.items.AbstractHeaderItem
+import eu.davidea.flexibleadapter.items.IFlexible
+import eu.davidea.viewholders.FlexibleViewHolder
+import io.github.wulkanowy.R
+import kotlinx.android.extensions.LayoutContainer
+import kotlinx.android.synthetic.main.header_grade_summary.*
+
+class GradeSummaryHeader(private val name: String, private val average: String) : AbstractHeaderItem() {
+
+ override fun getLayoutRes() = R.layout.header_grade_summary
+
+ override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder {
+ return ViewHolder(view, adapter)
+ }
+
+ override fun bindViewHolder(adapter: FlexibleAdapter>?, holder: ViewHolder?,
+ position: Int, payloads: MutableList?) {
+ holder?.run {
+ gradeSummaryHeaderName.text = name
+ gradeSummaryHeaderAverage.text = average
+ }
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as GradeSummaryHeader
+
+ if (name != other.name) return false
+ if (average != other.average) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = name.hashCode()
+ result = 31 * result + average.hashCode()
+ return result
+ }
+
+ class ViewHolder(view: View?, adapter: FlexibleAdapter>?) :
+ FlexibleViewHolder(view, adapter), LayoutContainer {
+
+ override val containerView: View?
+ get() = contentView
+ }
+}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt
index 5737a832f..54302fa60 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/summary/GradeSummaryItem.kt
@@ -2,32 +2,30 @@ package io.github.wulkanowy.ui.modules.grade.summary
import android.view.View
import eu.davidea.flexibleadapter.FlexibleAdapter
-import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
+import eu.davidea.flexibleadapter.items.AbstractSectionableItem
import eu.davidea.flexibleadapter.items.IFlexible
import eu.davidea.viewholders.FlexibleViewHolder
import io.github.wulkanowy.R
+import io.github.wulkanowy.data.db.entities.GradeSummary
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_grade_summary.*
-class GradeSummaryItem(
- private val title: String,
- private val average: String,
- private val predictedGrade: String,
- private val finalGrade: String
-) : AbstractFlexibleItem() {
+class GradeSummaryItem(header: GradeSummaryHeader, private val grade: String, private val title: String) :
+ AbstractSectionableItem(header) {
override fun getLayoutRes() = R.layout.item_grade_summary
- override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder {
+ override fun createViewHolder(view: View?, adapter: FlexibleAdapter>?): ViewHolder {
return ViewHolder(view, adapter)
}
- override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList?) {
- holder.run {
+ override fun bindViewHolder(
+ adapter: FlexibleAdapter