Compare commits
No commits in common. "0.25.0" and "0.19.0" have entirely different histories.
606 changed files with 8732 additions and 26890 deletions
142
.github/workflows/test.yml
vendored
142
.github/workflows/test.yml
vendored
|
@ -1,142 +0,0 @@
|
||||||
name: Test and deploy
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ develop ]
|
|
||||||
tags: [ '*' ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ develop ]
|
|
||||||
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Pre-build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
steps:
|
|
||||||
- uses: fkirc/skip-duplicate-actions@master
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
|
||||||
- uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 11
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}
|
|
||||||
- name: Build
|
|
||||||
run: ./gradlew --build-cache compileFdroidDebugUnitTestKotlin preFdroidDebugAndroidTestBuild dexBuilderFdroidDebugAndroidTest packageFdroidDebug packageFdroidDebugAndroidTest
|
|
||||||
- name: Prepare build cache
|
|
||||||
run: tar -cf prebuild.tar .build-cache .gradle app/build
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: prebuild.tar
|
|
||||||
path: prebuild.tar
|
|
||||||
|
|
||||||
unit-tests:
|
|
||||||
name: Unit tests
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
needs: [ build ]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 11
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}
|
|
||||||
- uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
name: prebuild.tar
|
|
||||||
- name: Extract build cache
|
|
||||||
run: tar -xf prebuild.tar
|
|
||||||
- name: Unit tests
|
|
||||||
run: |
|
|
||||||
./gradlew --build-cache -Pcoverage testFdroidDebugUnitTest --stacktrace
|
|
||||||
./gradlew --build-cache -Pcoverage jacocoTestReport --stacktrace
|
|
||||||
- uses: codecov/codecov-action@v1
|
|
||||||
with:
|
|
||||||
flags: unit
|
|
||||||
|
|
||||||
instrumentation-tests:
|
|
||||||
name: Instrumentation tests
|
|
||||||
runs-on: macOS-latest
|
|
||||||
timeout-minutes: 15
|
|
||||||
needs: [ build ]
|
|
||||||
strategy:
|
|
||||||
fail-fast: true
|
|
||||||
matrix:
|
|
||||||
api-level: [21, 29]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 11
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}
|
|
||||||
- uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
name: prebuild.tar
|
|
||||||
- name: Extract build cache
|
|
||||||
run: tar -xf prebuild.tar
|
|
||||||
- name: Instrumentation tests
|
|
||||||
uses: reactivecircus/android-emulator-runner@v2
|
|
||||||
with:
|
|
||||||
api-level: ${{ matrix.api-level }}
|
|
||||||
arch: x86
|
|
||||||
script: |
|
|
||||||
./gradlew --build-cache -Pcoverage connectedFdroidDebugAndroidTest --stacktrace
|
|
||||||
./gradlew --build-cache -Pcoverage jacocoTestReport --stacktrace
|
|
||||||
- uses: codecov/codecov-action@v1
|
|
||||||
with:
|
|
||||||
flags: instrumented,api-${{ matrix.api-level }}
|
|
||||||
|
|
||||||
deploy-google-play:
|
|
||||||
name: Deploy to google play
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
environment: google-play
|
|
||||||
needs: [ build, unit-tests, instrumentation-tests ]
|
|
||||||
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 11
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}
|
|
||||||
- uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
name: prebuild.tar
|
|
||||||
- name: Extract build cache
|
|
||||||
run: tar -xf prebuild.tar
|
|
||||||
- name: Decrypt keys
|
|
||||||
env:
|
|
||||||
ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }}
|
|
||||||
SERVICES_ENCRYPT_KEY: ${{ secrets.SERVICES_ENCRYPT_KEY }}
|
|
||||||
run: |
|
|
||||||
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
|
|
||||||
- name: Upload apk to google play
|
|
||||||
env:
|
|
||||||
PLAY_KEY_ALIAS: ${{ secrets.PLAY_KEY_ALIAS }}
|
|
||||||
PLAY_KEY_PASSWORD: ${{ secrets.PLAY_KEY_PASSWORD }}
|
|
||||||
PLAY_SERVICE_ACCOUNT_EMAIL: ${{ secrets.PLAY_SERVICE_ACCOUNT_EMAIL }}
|
|
||||||
PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }}
|
|
||||||
run: ./gradlew publishPlayRelease -PenableFirebase --stacktrace;
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -19,7 +19,6 @@ out/
|
||||||
# Gradle files
|
# Gradle files
|
||||||
.gradle/
|
.gradle/
|
||||||
build/
|
build/
|
||||||
.build-cache
|
|
||||||
|
|
||||||
# Local configuration file (sdk path, etc)
|
# Local configuration file (sdk path, etc)
|
||||||
local.properties
|
local.properties
|
||||||
|
@ -114,6 +113,3 @@ Thumbs.db
|
||||||
|
|
||||||
!/gradle/wrapper/gradle-wrapper.jar
|
!/gradle/wrapper/gradle-wrapper.jar
|
||||||
.idea/jarRepositories.xml
|
.idea/jarRepositories.xml
|
||||||
|
|
||||||
|
|
||||||
app/src/release/agconnect-services.json
|
|
||||||
|
|
26
.idea/codeStyles/Project.xml
generated
26
.idea/codeStyles/Project.xml
generated
|
@ -4,23 +4,23 @@
|
||||||
<JetCodeStyleSettings>
|
<JetCodeStyleSettings>
|
||||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
||||||
<value>
|
<value>
|
||||||
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
|
<package name="kotlinx.android.synthetic" withSubpackages="true" static="false" />
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="PACKAGES_IMPORT_LAYOUT">
|
|
||||||
<value>
|
|
||||||
<package name="" alias="false" withSubpackages="true" />
|
|
||||||
<package name="java" alias="false" withSubpackages="true" />
|
|
||||||
<package name="javax" alias="false" withSubpackages="true" />
|
|
||||||
<package name="kotlin" alias="false" withSubpackages="true" />
|
|
||||||
<package name="" alias="true" withSubpackages="true" />
|
|
||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
||||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_PARAMETER_LISTS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_ARGUMENT_LISTS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_FOR_EXPRESSION_BODIES" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_FOR_CHAINED_CALLS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_SUPERTYPE_LISTS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_IF_CONDITIONS" value="false" />
|
||||||
|
<option name="CONTINUATION_INDENT_IN_ELVIS" value="false" />
|
||||||
<option name="WRAP_ELVIS_EXPRESSIONS" value="0" />
|
<option name="WRAP_ELVIS_EXPRESSIONS" value="0" />
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
|
||||||
</JetCodeStyleSettings>
|
</JetCodeStyleSettings>
|
||||||
|
<MarkdownNavigatorCodeStyleSettings>
|
||||||
|
<option name="RIGHT_MARGIN" value="72" />
|
||||||
|
</MarkdownNavigatorCodeStyleSettings>
|
||||||
<codeStyleSettings language="XML">
|
<codeStyleSettings language="XML">
|
||||||
<indentOptions>
|
<indentOptions>
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
|
@ -134,11 +134,13 @@
|
||||||
</arrangement>
|
</arrangement>
|
||||||
</codeStyleSettings>
|
</codeStyleSettings>
|
||||||
<codeStyleSettings language="kotlin">
|
<codeStyleSettings language="kotlin">
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
|
||||||
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
|
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
|
||||||
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
|
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
|
||||||
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
|
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
|
||||||
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
||||||
|
<option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />
|
||||||
|
<option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
|
||||||
|
<option name="EXTENDS_LIST_WRAP" value="1" />
|
||||||
<indentOptions>
|
<indentOptions>
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
</indentOptions>
|
</indentOptions>
|
||||||
|
|
31
.travis.yml
31
.travis.yml
|
@ -3,8 +3,8 @@ jdk: oraclejdk8
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- ANDROID_API_LEVEL=30
|
- ANDROID_API_LEVEL=29
|
||||||
- ANDROID_BUILD_TOOLS_VERSION=30.0.2
|
- ANDROID_BUILD_TOOLS_VERSION=29.0.3
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
|
@ -14,7 +14,7 @@ cache:
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
- 0.24.0
|
- 0.19.0
|
||||||
|
|
||||||
android:
|
android:
|
||||||
licenses:
|
licenses:
|
||||||
|
@ -28,37 +28,32 @@ android:
|
||||||
- build-tools-$ANDROID_BUILD_TOOLS_VERSION
|
- build-tools-$ANDROID_BUILD_TOOLS_VERSION
|
||||||
# The SDK version used to compile your project
|
# The SDK version used to compile your project
|
||||||
- android-$ANDROID_API_LEVEL
|
- android-$ANDROID_API_LEVEL
|
||||||
# Additional components
|
# Additional components
|
||||||
- extra-google-google_play_services
|
- extra-google-google_play_services
|
||||||
- extra-google-m2repository
|
- extra-google-m2repository
|
||||||
- extra-android-m2repository
|
- extra-android-m2repository
|
||||||
- addon-google_apis-google-$ANDROID_API_LEVEL
|
- addon-google_apis-google-$ANDROID_API_LEVEL
|
||||||
# Android emulator
|
# Android emulator
|
||||||
- android-22
|
- android-22
|
||||||
- sys-img-armeabi-v7a-android-22
|
- sys-img-armeabi-v7a-android-22
|
||||||
|
|
||||||
before_install:
|
|
||||||
- yes | sdkmanager "platforms;android-30"
|
|
||||||
- yes | sdkmanager "build-tools;30.0.2"
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
# Launch emulator before the execution
|
# Launch emulator before the execution
|
||||||
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
|
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
|
||||||
- emulator -avd test -no-audio -no-window &
|
- emulator -avd test -no-audio -no-window &
|
||||||
- android-wait-for-emulator
|
- android-wait-for-emulator
|
||||||
- adb shell input keyevent 82 &
|
- adb shell input keyevent 82 &
|
||||||
- "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash"
|
- "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash"
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- ./gradlew dependencies --stacktrace --daemon
|
- ./gradlew dependencies --stacktrace --daemon
|
||||||
- fossa --no-ansi || true
|
- fossa --no-ansi || true
|
||||||
- ./gradlew -Pcoverage testFdroidDebugUnitTest --stacktrace --daemon
|
- ./gradlew -Pcoverage testPlayDebugUnitTest --stacktrace --daemon
|
||||||
- ./gradlew -Pcoverage connectedFdroidDebugAndroidTest --stacktrace --daemon
|
- ./gradlew -Pcoverage createFdroidDebugCoverageReport --stacktrace --daemon
|
||||||
- ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon
|
- ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon
|
||||||
- |
|
- |
|
||||||
if [ $TRAVIS_TAG ]; then
|
if [ $TRAVIS_TAG ]; then
|
||||||
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg;
|
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg;
|
||||||
gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/agconnect-services.json.gpg;
|
|
||||||
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg;
|
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg;
|
||||||
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg;
|
gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg;
|
||||||
./gradlew publishPlayRelease -PenableFirebase --stacktrace;
|
./gradlew publishPlayRelease -PenableFirebase --stacktrace;
|
||||||
|
|
16
README.en.md
16
README.en.md
|
@ -1,8 +1,7 @@
|
||||||
[Polska wersja README](README.md)
|
[Polska wersja README](README.md)
|
||||||
|
|
||||||
# Wulkanowy
|
# Wulkanowy
|
||||||
|
[](https://travis-ci.com/wulkanowy/wulkanowy)
|
||||||
[](https://github.com/wulkanowy/wulkanowy/actions)
|
|
||||||
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
[](https://discord.gg/vccAQBr)
|
[](https://discord.gg/vccAQBr)
|
||||||
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
@ -33,17 +32,14 @@ Unofficial android VULCAN UONET+ register client for both students and their par
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
You can download the current beta version from the Google Play, F-Droid or Huawei AppGallery store
|
You can download the current beta version from the Google Play or the F-Droid store
|
||||||
|
|
||||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
alt="Get it on Google Play"
|
alt="Get it on Google Play"
|
||||||
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
alt="Get it on F-Droid"
|
alt="Get it on F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
[<img src="appgallery_badge.png"
|
|
||||||
alt="Explore it on AppGallery"
|
|
||||||
height="80">](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=)
|
|
||||||
|
|
||||||
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release
|
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release
|
||||||
|
|
||||||
|
@ -51,8 +47,8 @@ You can also download a [development version](https://wulkanowy.github.io/#downl
|
||||||
|
|
||||||
|
|
||||||
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
||||||
* [Kotlin Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)
|
* [RxJava 2](https://github.com/ReactiveX/RxJava)
|
||||||
* [Hilt](https://dagger.dev/hilt/)
|
* [Dagger 2](https://github.com/google/dagger)
|
||||||
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
|
18
README.md
18
README.md
|
@ -1,8 +1,7 @@
|
||||||
[English version of README](README.en.md)
|
[English version of README](README.en.md)
|
||||||
|
|
||||||
# Wulkanowy
|
# Wulkanowy
|
||||||
|
[](https://travis-ci.com/wulkanowy/wulkanowy)
|
||||||
[](https://github.com/wulkanowy/wulkanowy/actions)
|
|
||||||
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
[](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
[](https://discord.gg/vccAQBr)
|
[](https://discord.gg/vccAQBr)
|
||||||
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
[](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
@ -33,17 +32,14 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
|
||||||
|
|
||||||
## Pobierz
|
## Pobierz
|
||||||
|
|
||||||
Aktualną wersję beta możesz pobrać ze sklepu Google Play, F-Droid lub Huawei AppGallery
|
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub F-Droid
|
||||||
|
|
||||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
alt="Pobierz z Google Play"
|
alt="Pobierz z Google Play"
|
||||||
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
alt="Pobierz z F-Droid"
|
alt="Pobierz z F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
[<img src="appgallery_badge.png"
|
|
||||||
alt="Odkrywaj w AppGallery"
|
|
||||||
height="80">](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=)
|
|
||||||
|
|
||||||
|
|
||||||
Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#download), która zawiera nowe funkcje przygotowywane do następnego wydania
|
Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#download), która zawiera nowe funkcje przygotowywane do następnego wydania
|
||||||
|
@ -51,9 +47,9 @@ Możesz także pobrać [wersję rozwojową](https://wulkanowy.github.io/#downloa
|
||||||
|
|
||||||
## Zbudowana za pomocą
|
## Zbudowana za pomocą
|
||||||
|
|
||||||
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
* [Wulkanowy SDK](https://github.com/wulkanowy/SDK)
|
||||||
* [Kotlin Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)
|
* [RxJava 2](https://github.com/ReactiveX/RxJava)
|
||||||
* [Hilt](https://dagger.dev/hilt/)
|
* [Dagger 2](https://github.com/google/dagger)
|
||||||
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
|
126
app/build.gradle
126
app/build.gradle
|
@ -1,7 +1,6 @@
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlin-kapt'
|
apply plugin: 'kotlin-kapt'
|
||||||
apply plugin: 'dagger.hilt.android.plugin'
|
|
||||||
apply plugin: 'com.google.firebase.crashlytics'
|
apply plugin: 'com.google.firebase.crashlytics'
|
||||||
apply plugin: 'com.github.triplet.play'
|
apply plugin: 'com.github.triplet.play'
|
||||||
apply plugin: 'com.mikepenz.aboutlibraries.plugin'
|
apply plugin: 'com.mikepenz.aboutlibraries.plugin'
|
||||||
|
@ -10,29 +9,26 @@ apply from: 'sonarqube.gradle'
|
||||||
apply from: 'hooks.gradle'
|
apply from: 'hooks.gradle'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 30
|
compileSdkVersion 29
|
||||||
buildToolsVersion '30.0.3'
|
buildToolsVersion '29.0.3'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "io.github.wulkanowy"
|
applicationId "io.github.wulkanowy"
|
||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 17
|
minSdkVersion 17
|
||||||
targetSdkVersion 30
|
targetSdkVersion 29
|
||||||
versionCode 82
|
versionCode 63
|
||||||
versionName "0.25.0"
|
versionName "0.19.0"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
resValue "string", "app_name", "Wulkanowy"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
|
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
|
||||||
buildConfigField "long", "BUILD_TIMESTAMP", String.valueOf(System.currentTimeMillis())
|
|
||||||
|
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
firebase_enabled: project.hasProperty("enableFirebase")
|
firebase_enabled: project.hasProperty("enableFirebase")
|
||||||
]
|
]
|
||||||
javaCompileOptions {
|
javaCompileOptions {
|
||||||
annotationProcessorOptions {
|
annotationProcessorOptions {
|
||||||
arguments += [
|
arguments = [
|
||||||
"room.schemaLocation": "$projectDir/schemas".toString(),
|
"room.schemaLocation": "$projectDir/schemas".toString(),
|
||||||
"room.incremental" : "true"
|
"room.incremental" : "true"
|
||||||
]
|
]
|
||||||
|
@ -72,26 +68,12 @@ android {
|
||||||
flavorDimensions "platform"
|
flavorDimensions "platform"
|
||||||
|
|
||||||
productFlavors {
|
productFlavors {
|
||||||
hms {
|
|
||||||
dimension "platform"
|
|
||||||
minSdkVersion 19
|
|
||||||
manifestPlaceholders = [
|
|
||||||
install_channel: "AppGallery"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
play {
|
play {
|
||||||
dimension "platform"
|
dimension "platform"
|
||||||
manifestPlaceholders = [
|
|
||||||
install_channel: "Google Play"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fdroid {
|
fdroid {
|
||||||
dimension "platform"
|
dimension "platform"
|
||||||
manifestPlaceholders = [
|
|
||||||
install_channel: "F-Droid"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,14 +86,12 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
coreLibraryDesugaringEnabled true
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "1.8"
|
||||||
freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
|
@ -129,30 +109,28 @@ play {
|
||||||
serviceAccountCredentials = file('key.p12')
|
serviceAccountCredentials = file('key.p12')
|
||||||
defaultToAppBundles = false
|
defaultToAppBundles = false
|
||||||
track = 'alpha'
|
track = 'alpha'
|
||||||
updatePriority = 3
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
work_manager = "2.5.0"
|
work_manager = "2.3.4"
|
||||||
work_hilt = "1.0.0-alpha03"
|
room = "2.2.5"
|
||||||
room = "2.3.0-beta01"
|
dagger = "2.28"
|
||||||
chucker = "3.4.0"
|
chucker = "3.2.0"
|
||||||
mockk = "1.10.5"
|
mockk = "1.9.2"
|
||||||
moshi = "1.11.0"
|
}
|
||||||
|
|
||||||
|
configurations.all {
|
||||||
|
resolutionStrategy.force "androidx.constraintlayout:constraintlayout:1.1.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "io.github.wulkanowy:sdk:0.25.0"
|
implementation "io.github.wulkanowy:sdk:0.19.0"
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'
|
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
|
implementation "androidx.core:core-ktx:1.2.0"
|
||||||
|
|
||||||
implementation "androidx.core:core-ktx:1.3.2"
|
|
||||||
implementation "androidx.activity:activity-ktx:1.1.0"
|
implementation "androidx.activity:activity-ktx:1.1.0"
|
||||||
implementation "androidx.appcompat:appcompat:1.2.0"
|
implementation "androidx.appcompat:appcompat:1.2.0-rc01"
|
||||||
implementation "androidx.appcompat:appcompat-resources:1.2.0"
|
implementation "androidx.appcompat:appcompat-resources:1.1.0"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.2.5"
|
implementation "androidx.fragment:fragment-ktx:1.2.5"
|
||||||
implementation "androidx.annotation:annotation:1.1.0"
|
implementation "androidx.annotation:annotation:1.1.0"
|
||||||
implementation "androidx.multidex:multidex:2.0.1"
|
implementation "androidx.multidex:multidex:2.0.1"
|
||||||
|
@ -160,72 +138,74 @@ dependencies {
|
||||||
implementation "androidx.preference:preference-ktx:1.1.1"
|
implementation "androidx.preference:preference-ktx:1.1.1"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
||||||
implementation "androidx.viewpager:viewpager:1.0.0"
|
implementation "androidx.viewpager:viewpager:1.0.0"
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-rc01"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
|
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
|
||||||
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
||||||
implementation "com.google.android.material:material:1.3.0-rc01"
|
implementation "com.google.android.material:material:1.1.0"
|
||||||
implementation "com.github.wulkanowy:material-chips-input:2.1.1"
|
implementation "com.github.wulkanowy:material-chips-input:2.1.1"
|
||||||
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
||||||
|
implementation "me.zhanghai.android.materialprogressbar:library:1.6.1"
|
||||||
|
|
||||||
implementation "androidx.work:work-runtime-ktx:$work_manager"
|
implementation "androidx.work:work-runtime-ktx:$work_manager"
|
||||||
playImplementation "androidx.work:work-gcm:$work_manager"
|
implementation "androidx.work:work-rxjava2:$work_manager"
|
||||||
|
implementation "androidx.work:work-gcm:$work_manager"
|
||||||
|
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
|
implementation 'com.github.PaulinaSadowska:RxWorkManagerObservers:1.0.0'
|
||||||
|
|
||||||
implementation "androidx.room:room-runtime:$room"
|
implementation "androidx.room:room-runtime:$room"
|
||||||
|
implementation "androidx.room:room-rxjava2:$room"
|
||||||
implementation "androidx.room:room-ktx:$room"
|
implementation "androidx.room:room-ktx:$room"
|
||||||
kapt "androidx.room:room-compiler:$room"
|
kapt "androidx.room:room-compiler:$room"
|
||||||
|
|
||||||
implementation "com.google.dagger:hilt-android:$hilt_version"
|
implementation "com.google.dagger:dagger-android-support:$dagger"
|
||||||
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
|
kapt "com.google.dagger:dagger-compiler:$dagger"
|
||||||
implementation "androidx.hilt:hilt-work:$work_hilt"
|
kapt "com.google.dagger:dagger-android-processor:$dagger"
|
||||||
kapt "androidx.hilt:hilt-compiler:$work_hilt"
|
implementation "com.squareup.inject:assisted-inject-annotations-dagger2:0.5.2"
|
||||||
|
kapt "com.squareup.inject:assisted-inject-processor-dagger2:0.5.2"
|
||||||
|
|
||||||
implementation "com.aurelhubert:ahbottomnavigation:2.3.4"
|
implementation "com.aurelhubert:ahbottomnavigation:2.3.4"
|
||||||
implementation "com.ncapdevi:frag-nav:3.3.0"
|
implementation "com.ncapdevi:frag-nav:3.3.0"
|
||||||
implementation "com.github.YarikSOffice:lingver:1.3.0"
|
implementation "com.github.YarikSOffice:lingver:1.2.2"
|
||||||
|
|
||||||
implementation "com.squareup.moshi:moshi:$moshi"
|
implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.8"
|
||||||
implementation "com.squareup.moshi:moshi-adapters:$moshi"
|
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
|
||||||
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi"
|
implementation "io.reactivex.rxjava2:rxjava:2.2.19"
|
||||||
|
|
||||||
|
implementation "com.google.code.gson:gson:2.8.6"
|
||||||
|
implementation "com.jakewharton.threetenabp:threetenabp:1.2.4"
|
||||||
implementation "com.jakewharton.timber:timber:4.7.1"
|
implementation "com.jakewharton.timber:timber:4.7.1"
|
||||||
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
||||||
implementation "fr.bipi.treessence:treessence:0.3.2"
|
implementation "fr.bipi.treessence:treessence:0.3.2"
|
||||||
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
||||||
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
|
||||||
implementation "io.coil-kt:coil:1.1.1"
|
implementation "io.coil-kt:coil:0.11.0"
|
||||||
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
|
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
|
||||||
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
||||||
|
|
||||||
playImplementation platform('com.google.firebase:firebase-bom:26.4.0')
|
playImplementation 'com.google.firebase:firebase-analytics:17.4.3'
|
||||||
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx:19.0.7'
|
||||||
playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx'
|
playImplementation "com.google.firebase:firebase-inappmessaging-ktx:19.0.7"
|
||||||
playImplementation "com.google.firebase:firebase-inappmessaging-ktx"
|
playImplementation 'com.google.firebase:firebase-messaging:20.2.0'
|
||||||
playImplementation 'com.google.firebase:firebase-messaging:'
|
playImplementation 'com.google.firebase:firebase-crashlytics:17.0.1'
|
||||||
playImplementation 'com.google.firebase:firebase-crashlytics:'
|
|
||||||
playImplementation 'com.google.android.play:core-ktx:1.8.1'
|
|
||||||
playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
|
playImplementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
|
||||||
|
|
||||||
hmsImplementation 'com.huawei.hms:hianalytics:5.1.0.301'
|
|
||||||
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.5.0.200'
|
|
||||||
|
|
||||||
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
||||||
|
|
||||||
debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker"
|
debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker"
|
||||||
debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
|
debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
|
||||||
|
|
||||||
testImplementation "junit:junit:4.13.1"
|
testImplementation "junit:junit:4.13"
|
||||||
testImplementation "io.mockk:mockk:$mockk"
|
testImplementation "io.mockk:mockk:$mockk"
|
||||||
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'
|
testImplementation "org.threeten:threetenbp:1.4.4"
|
||||||
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
testImplementation "org.mockito:mockito-inline:3.3.3"
|
||||||
|
|
||||||
androidTestImplementation "androidx.test:core:1.3.0"
|
androidTestImplementation "androidx.test:core:1.2.0"
|
||||||
androidTestImplementation "androidx.test:runner:1.3.0"
|
androidTestImplementation "androidx.test:runner:1.2.0"
|
||||||
androidTestImplementation "androidx.test.ext:junit:1.1.2"
|
androidTestImplementation "androidx.test.ext:junit:1.1.1"
|
||||||
androidTestImplementation "io.mockk:mockk-android:$mockk"
|
androidTestImplementation "io.mockk:mockk-android:$mockk"
|
||||||
androidTestImplementation "androidx.room:room-testing:$room"
|
androidTestImplementation "androidx.room:room-testing:$room"
|
||||||
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
||||||
|
androidTestImplementation "org.mockito:mockito-android:3.3.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
apply plugin: 'com.huawei.agconnect'
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ jacoco {
|
||||||
|
|
||||||
tasks.withType(Test) {
|
tasks.withType(Test) {
|
||||||
jacoco.includeNoLocationClasses = true
|
jacoco.includeNoLocationClasses = true
|
||||||
jacoco.excludes = ['jdk.internal.*']
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task jacocoTestReport(type: JacocoReport) {
|
task jacocoTestReport(type: JacocoReport) {
|
||||||
|
@ -36,13 +35,13 @@ task jacocoTestReport(type: JacocoReport) {
|
||||||
dir: "$buildDir/intermediates/classes/debug",
|
dir: "$buildDir/intermediates/classes/debug",
|
||||||
excludes: excludes
|
excludes: excludes
|
||||||
) + fileTree(
|
) + fileTree(
|
||||||
dir: "$buildDir/tmp/kotlin-classes/fdroidDebug",
|
dir: "$buildDir/tmp/kotlin-classes/playDebug",
|
||||||
excludes: excludes
|
excludes: excludes
|
||||||
))
|
))
|
||||||
|
|
||||||
sourceDirectories.setFrom(files([
|
sourceDirectories.setFrom(files([
|
||||||
"src/main/java",
|
"src/main/java",
|
||||||
"src/fdroid/java"
|
"src/play/java"
|
||||||
]))
|
]))
|
||||||
executionData.setFrom(fileTree(
|
executionData.setFrom(fileTree(
|
||||||
dir: project.projectDir,
|
dir: project.projectDir,
|
||||||
|
|
7
app/proguard-rules.pro
vendored
7
app/proguard-rules.pro
vendored
|
@ -30,6 +30,13 @@
|
||||||
-dontwarn javax.annotation.**
|
-dontwarn javax.annotation.**
|
||||||
|
|
||||||
|
|
||||||
|
#Config for ReactiveNetwork
|
||||||
|
-dontwarn com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
|
||||||
|
-dontwarn io.reactivex.functions.Function
|
||||||
|
-dontwarn rx.internal.util.**
|
||||||
|
-dontwarn sun.misc.Unsafe
|
||||||
|
|
||||||
|
|
||||||
#Config for MPAndroidChart
|
#Config for MPAndroidChart
|
||||||
-keep class com.github.mikephil.charting.** { *; }
|
-keep class com.github.mikephil.charting.** { *; }
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,5 @@
|
||||||
package io.github.wulkanowy.data.db.migrations
|
package io.github.wulkanowy.data.db.migrations
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import androidx.room.Room
|
import androidx.room.Room
|
||||||
import androidx.room.testing.MigrationTestHelper
|
import androidx.room.testing.MigrationTestHelper
|
||||||
|
@ -23,11 +22,10 @@ abstract class AbstractMigrationTest {
|
||||||
)
|
)
|
||||||
|
|
||||||
fun getMigratedRoomDatabase(): AppDatabase {
|
fun getMigratedRoomDatabase(): AppDatabase {
|
||||||
val context = ApplicationProvider.getApplicationContext<Context>()
|
|
||||||
val database = Room.databaseBuilder(ApplicationProvider.getApplicationContext(),
|
val database = Room.databaseBuilder(ApplicationProvider.getApplicationContext(),
|
||||||
AppDatabase::class.java, dbName)
|
AppDatabase::class.java, dbName)
|
||||||
.addMigrations(*AppDatabase.getMigrations(SharedPrefProvider(PreferenceManager
|
.addMigrations(*AppDatabase.getMigrations(SharedPrefProvider(PreferenceManager
|
||||||
.getDefaultSharedPreferences(context)))
|
.getDefaultSharedPreferences(ApplicationProvider.getApplicationContext())))
|
||||||
)
|
)
|
||||||
.build()
|
.build()
|
||||||
// close the database and release any stream resources when the test finishes
|
// close the database and release any stream resources when the test finishes
|
||||||
|
|
|
@ -4,7 +4,6 @@ import android.content.ContentValues
|
||||||
import android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL
|
import android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL
|
||||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
@ -30,7 +29,7 @@ class Migration12Test : AbstractMigrationTest() {
|
||||||
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(2, students.size)
|
assertEquals(2, students.size)
|
||||||
|
|
||||||
|
@ -59,7 +58,7 @@ class Migration12Test : AbstractMigrationTest() {
|
||||||
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(1, students.size)
|
assertEquals(1, students.size)
|
||||||
|
|
||||||
|
@ -85,7 +84,7 @@ class Migration12Test : AbstractMigrationTest() {
|
||||||
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
helper.runMigrationsAndValidate(dbName, 12, true, Migration12())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(3, students.size)
|
assertEquals(3, students.size)
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,10 @@ import android.database.sqlite.SQLiteDatabase
|
||||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
import io.github.wulkanowy.data.db.Converters
|
import io.github.wulkanowy.data.db.Converters
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import java.time.LocalDate.of
|
import org.threeten.bp.LocalDate.of
|
||||||
import kotlin.test.assertFalse
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@ -27,7 +26,7 @@ class Migration13Test : AbstractMigrationTest() {
|
||||||
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(3, students.size)
|
assertEquals(3, students.size)
|
||||||
|
|
||||||
|
@ -61,7 +60,7 @@ class Migration13Test : AbstractMigrationTest() {
|
||||||
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
val db = getMigratedRoomDatabase()
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
val students = db.studentDao.loadAll().blockingGet()
|
||||||
|
|
||||||
assertEquals(2, students.size)
|
assertEquals(2, students.size)
|
||||||
|
|
||||||
|
|
|
@ -1,124 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.migrations
|
|
||||||
|
|
||||||
import android.content.ContentValues
|
|
||||||
import android.database.sqlite.SQLiteDatabase
|
|
||||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.junit.Assert.assertEquals
|
|
||||||
import org.junit.Test
|
|
||||||
import kotlin.random.Random
|
|
||||||
|
|
||||||
class Migration27Test : AbstractMigrationTest() {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun userWithoutCorrespondingUnit() {
|
|
||||||
with(helper.createDatabase(dbName, 26)) {
|
|
||||||
createStudent(this, 321, 123, "Jan Student")
|
|
||||||
createUnit(this, 9999, "Unit Jan")
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
|
|
||||||
helper.runMigrationsAndValidate(dbName, 27, true, Migration27())
|
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
|
||||||
|
|
||||||
assertEquals(1, students.size)
|
|
||||||
|
|
||||||
with(students[0]) {
|
|
||||||
assertEquals(321, id)
|
|
||||||
assertEquals(123, userLoginId)
|
|
||||||
assertEquals("Student Jan", userName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun userWithCorrespondingUnit() {
|
|
||||||
with(helper.createDatabase(dbName, 26)) {
|
|
||||||
createStudent(this, 1, 2, "Jan Kowalski Student")
|
|
||||||
createUnit(this, 2, "Unit Jan")
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
|
|
||||||
helper.runMigrationsAndValidate(dbName, 27, true, Migration27())
|
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
|
||||||
|
|
||||||
assertEquals(1, students.size)
|
|
||||||
|
|
||||||
with(students[0]) {
|
|
||||||
assertEquals(1, id)
|
|
||||||
assertEquals(2, userLoginId)
|
|
||||||
assertEquals("Unit Jan", userName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun studentAccountAndParentAccountWithCorrespondingUnits() {
|
|
||||||
with(helper.createDatabase(dbName, 26)) {
|
|
||||||
createStudent(this, 1, 222, "Jan Student")
|
|
||||||
createStudent(this, 2, 333, "Jan Parent")
|
|
||||||
createUnit(this, 222, "Unit Jan")
|
|
||||||
createUnit(this, 333, "Unit Tomasz")
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
|
|
||||||
helper.runMigrationsAndValidate(dbName, 27, true, Migration27())
|
|
||||||
|
|
||||||
val db = getMigratedRoomDatabase()
|
|
||||||
val students = runBlocking { db.studentDao.loadAll() }
|
|
||||||
|
|
||||||
assertEquals(2, students.size)
|
|
||||||
|
|
||||||
with(students[0]) {
|
|
||||||
assertEquals(1, id)
|
|
||||||
assertEquals(222, userLoginId)
|
|
||||||
assertEquals("Unit Jan", userName)
|
|
||||||
}
|
|
||||||
with(students[1]) {
|
|
||||||
assertEquals(2, id)
|
|
||||||
assertEquals(333, userLoginId)
|
|
||||||
assertEquals("Unit Tomasz", userName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createStudent(db: SupportSQLiteDatabase, id: Long, userLoginId: Int, studentName: String) {
|
|
||||||
db.insert("Students", SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply {
|
|
||||||
put("id", id)
|
|
||||||
put("scrapper_base_url", "https://fakelog.cf")
|
|
||||||
put("mobile_base_url", "")
|
|
||||||
put("login_mode", "SCRAPPER")
|
|
||||||
put("login_type", "STANDARD")
|
|
||||||
put("certificate_key", "")
|
|
||||||
put("private_key", "")
|
|
||||||
put("is_parent", false)
|
|
||||||
put("email", "jan@fakelog.cf")
|
|
||||||
put("password", "******")
|
|
||||||
put("symbol", "Default")
|
|
||||||
put("school_short", "")
|
|
||||||
put("class_name", "")
|
|
||||||
put("student_id", Random.nextInt())
|
|
||||||
put("class_id", Random.nextInt())
|
|
||||||
put("school_id", "123")
|
|
||||||
put("school_name", "Wulkan first class school")
|
|
||||||
put("is_current", false)
|
|
||||||
put("registration_date", "0")
|
|
||||||
|
|
||||||
put("user_login_id", userLoginId)
|
|
||||||
put("student_name", studentName)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createUnit(db: SupportSQLiteDatabase, senderId: Int, senderName: String) {
|
|
||||||
db.insert("ReportingUnits", SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply {
|
|
||||||
put("student_id", Random.nextInt())
|
|
||||||
put("real_id", Random.nextInt())
|
|
||||||
put("short", "SHORT")
|
|
||||||
put("roles", "[0]")
|
|
||||||
|
|
||||||
put("sender_id", senderId)
|
|
||||||
put("sender_name", senderName)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package io.github.wulkanowy.data.repositories
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
|
||||||
|
fun getStudent(): Student {
|
||||||
|
return Student(
|
||||||
|
email = "test",
|
||||||
|
password = "test123",
|
||||||
|
schoolSymbol = "23",
|
||||||
|
scrapperBaseUrl = "fakelog.cf",
|
||||||
|
loginType = "AUTO",
|
||||||
|
isCurrent = true,
|
||||||
|
studentName = "",
|
||||||
|
schoolShortName = "",
|
||||||
|
schoolName = "",
|
||||||
|
studentId = 0,
|
||||||
|
classId = 1,
|
||||||
|
symbol = "",
|
||||||
|
registrationDate = LocalDateTime.now(),
|
||||||
|
className = "",
|
||||||
|
loginMode = "API",
|
||||||
|
certificateKey = "",
|
||||||
|
privateKey = "",
|
||||||
|
mobileBaseUrl = "",
|
||||||
|
userLoginId = 0,
|
||||||
|
isParent = false
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
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<Boolean> {
|
||||||
|
return Single.just(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun observeInternetConnectivity(initialIntervalInMs: Int, intervalInMs: Int, host: String?, port: Int, timeoutInMs: Int, httpResponse: Int, errorHandler: ErrorHandler?): Observable<Boolean> {
|
||||||
|
return Observable.just(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDefaultPingHost() = "localhost"
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.attendance
|
||||||
|
|
||||||
|
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.Attendance
|
||||||
|
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 org.threeten.bp.LocalDate.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class AttendanceLocalTest {
|
||||||
|
|
||||||
|
private lateinit var attendanceLocal: AttendanceLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
attendanceLocal = AttendanceLocal(testDb.attendanceDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
attendanceLocal.saveAttendance(listOf(
|
||||||
|
getAttendanceEntity(
|
||||||
|
of(2018, 9, 10),
|
||||||
|
SentExcuseStatus.ACCEPTED
|
||||||
|
),
|
||||||
|
getAttendanceEntity(
|
||||||
|
of(2018, 9, 14),
|
||||||
|
SentExcuseStatus.WAITING
|
||||||
|
),
|
||||||
|
getAttendanceEntity(
|
||||||
|
of(2018, 9, 17),
|
||||||
|
SentExcuseStatus.ACCEPTED
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
val attendance = attendanceLocal
|
||||||
|
.getAttendance(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1),
|
||||||
|
of(2018, 9, 10),
|
||||||
|
of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, attendance.size)
|
||||||
|
assertEquals(attendance[0].date, of(2018, 9, 10))
|
||||||
|
assertEquals(attendance[1].date, of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getAttendanceEntity(
|
||||||
|
date: LocalDate,
|
||||||
|
excuseStatus: SentExcuseStatus
|
||||||
|
) = Attendance(
|
||||||
|
studentId = 1,
|
||||||
|
diaryId = 2,
|
||||||
|
timeId = 3,
|
||||||
|
date = date,
|
||||||
|
number = 0,
|
||||||
|
subject = "",
|
||||||
|
name = "",
|
||||||
|
presence = false,
|
||||||
|
absence = false,
|
||||||
|
exemption = false,
|
||||||
|
lateness = false,
|
||||||
|
excused = false,
|
||||||
|
deleted = false,
|
||||||
|
excusable = false,
|
||||||
|
excuseStatus = excuseStatus.name
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
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 org.threeten.bp.LocalDate.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
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(of(2018, 9, 10), 1),
|
||||||
|
getCompletedLesson(of(2018, 9, 14), 2),
|
||||||
|
getCompletedLesson(of(2018, 9, 17), 3)
|
||||||
|
))
|
||||||
|
|
||||||
|
val completed = completedLessonsLocal
|
||||||
|
.getCompletedLessons(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1),
|
||||||
|
of(2018, 9, 10),
|
||||||
|
of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, completed.size)
|
||||||
|
assertEquals(completed[0].date, of(2018, 9, 10))
|
||||||
|
assertEquals(completed[1].date, of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getCompletedLesson(date: LocalDate, number: Int): CompletedLesson {
|
||||||
|
return CompletedLesson(1, 2, date, number, "", "", "", "", "", "", "")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.exam
|
||||||
|
|
||||||
|
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.Exam
|
||||||
|
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.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class ExamLocalTest {
|
||||||
|
|
||||||
|
private lateinit var examLocal: ExamLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
examLocal = ExamLocal(testDb.examsDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
examLocal.saveExams(listOf(
|
||||||
|
Exam(1, 2, of(2018, 9, 10), now(), "", "", "", "", "", ""),
|
||||||
|
Exam(1, 2, of(2018, 9, 14), now(), "", "", "", "", "", ""),
|
||||||
|
Exam(1, 2, of(2018, 9, 17), now(), "", "", "", "", "", "")
|
||||||
|
))
|
||||||
|
|
||||||
|
val exams = examLocal
|
||||||
|
.getExams(Semester(1, 2, "", 1, 3, 2019, now(), now(), 1, 1),
|
||||||
|
of(2018, 9, 10),
|
||||||
|
of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, exams.size)
|
||||||
|
assertEquals(exams[0].date, of(2018, 9, 10))
|
||||||
|
assertEquals(exams[1].date, of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
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 org.threeten.bp.LocalDate.now
|
||||||
|
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, testDb.gradeSummaryDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 semester = Semester(1, 2, "", 2019, 2, 1, now(), now(), 1, 1)
|
||||||
|
|
||||||
|
val grades = gradeLocal
|
||||||
|
.getGradesDetails(semester)
|
||||||
|
.blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, grades.size)
|
||||||
|
assertEquals(grades[0].date, LocalDate.of(2019, 2, 27))
|
||||||
|
assertEquals(grades[1].date, LocalDate.of(2019, 2, 28))
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,182 @@
|
||||||
|
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.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import io.github.wulkanowy.sdk.pojo.Grade
|
||||||
|
import io.mockk.MockKAnnotations
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
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.assertEquals
|
||||||
|
import kotlin.test.assertFalse
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@SdkSuppress(minSdkVersion = P)
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class GradeRepositoryTest {
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var mockSdk: Sdk
|
||||||
|
|
||||||
|
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, testDb.gradeSummaryDao)
|
||||||
|
gradeRemote = GradeRemote(mockSdk)
|
||||||
|
|
||||||
|
every { studentMock.registrationDate } returns LocalDateTime.of(2019, 2, 27, 12, 0)
|
||||||
|
every { semesterMock.studentId } returns 1
|
||||||
|
every { semesterMock.diaryId } returns 1
|
||||||
|
every { semesterMock.schoolYear } returns 2019
|
||||||
|
every { semesterMock.semesterId } returns 1
|
||||||
|
every { mockSdk.switchDiary(any(), any()) } returns mockSdk
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun markOlderThanRegisterDateAsRead() {
|
||||||
|
every { mockSdk.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")
|
||||||
|
) to emptyList())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet().first.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 { mockSdk.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")
|
||||||
|
) to emptyList())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet().first.sortedByDescending { it.date }
|
||||||
|
|
||||||
|
assertFalse { grades[0].isRead }
|
||||||
|
assertFalse { grades[1].isRead }
|
||||||
|
assertTrue { grades[2].isRead }
|
||||||
|
assertTrue { grades[3].isRead }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun subtractLocaleDuplicateGrades() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
) to emptyList())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, grades.first.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun subtractRemoteDuplicateGrades() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
) to emptyList())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(3, grades.first.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun emptyLocal() {
|
||||||
|
gradeLocal.saveGrades(listOf())
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(listOf(
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeApi(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
) to emptyList())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(3, grades.first.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun emptyRemote() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Taka sama ocena"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 26), "Jakaś inna ocena")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getGrades(1) } returns Single.just(emptyList<Grade>() to emptyList())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(0, grades.first.size)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.grade
|
||||||
|
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import io.github.wulkanowy.sdk.pojo.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.toDouble(),
|
||||||
|
weight = "",
|
||||||
|
weightValue = weight
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createGradeApi(value: Int, weight: Double, date: LocalDate, desc: String): GradeRemote {
|
||||||
|
return GradeRemote(
|
||||||
|
subject = "",
|
||||||
|
color = "",
|
||||||
|
comment = "",
|
||||||
|
date = date,
|
||||||
|
description = desc,
|
||||||
|
entry = "",
|
||||||
|
modifier = .0,
|
||||||
|
symbol = "",
|
||||||
|
teacher = "",
|
||||||
|
value = value.toDouble(),
|
||||||
|
weight = weight.toString(),
|
||||||
|
weightValue = weight
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
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.GradePointsStatistics
|
||||||
|
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 org.threeten.bp.LocalDate.now
|
||||||
|
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, testDb.gradePointsStatistics)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_subject() {
|
||||||
|
gradeStatisticsLocal.saveGradesStatistics(listOf(
|
||||||
|
getGradeStatistics("Matematyka", 2, 1),
|
||||||
|
getGradeStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesStatistics(getSemester(), 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(getSemester(), false, "Wszystkie").blockingGet()
|
||||||
|
assertEquals(3, stats.size)
|
||||||
|
assertEquals(stats[0].subject, "Wszystkie")
|
||||||
|
assertEquals(stats[1].subject, "Matematyka")
|
||||||
|
assertEquals(stats[2].subject, "Chemia")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_points() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf(
|
||||||
|
getGradePointsStatistics("Matematyka", 2, 1),
|
||||||
|
getGradePointsStatistics("Chemia", 2, 1),
|
||||||
|
getGradePointsStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet()
|
||||||
|
with(stats[0]) {
|
||||||
|
assertEquals(subject, "Matematyka")
|
||||||
|
assertEquals(others, 5.0)
|
||||||
|
assertEquals(student, 5.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_subjectEmpty() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf())
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Matematyka").blockingGet()
|
||||||
|
assertEquals(null, stats)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_allEmpty() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf())
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(getSemester(), "Wszystkie").blockingGet()
|
||||||
|
assertEquals(null, stats)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSemester(): Semester {
|
||||||
|
return Semester(2, 2, "", 2019, 1, 2, now(), now(), 1, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getGradeStatistics(subject: String, studentId: Int, semesterId: Int): GradeStatistics {
|
||||||
|
return GradeStatistics(studentId, semesterId, subject, 5, 5, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getGradePointsStatistics(subject: String, studentId: Int, semesterId: Int): GradePointsStatistics {
|
||||||
|
return GradePointsStatistics(studentId, semesterId, subject, 5.0, 5.0)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
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.Student
|
||||||
|
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.now
|
||||||
|
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(Student("", "", "", "", "", "", false, "", "", "", 1, 1, "", "", "", "", "", 1, false, now()),
|
||||||
|
LocalDate.of(2019, 1, 20)
|
||||||
|
).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(1, luckyNumber.studentId)
|
||||||
|
assertEquals(LocalDate.of(2019, 1, 20), luckyNumber.date)
|
||||||
|
assertEquals(14, luckyNumber.luckyNumber)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
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", "", "", "", "", false, "", "", "", 1, 0, "", "", "", "", "", 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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.student
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
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.repositories.getStudent
|
||||||
|
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 StudentLocalTest {
|
||||||
|
|
||||||
|
private lateinit var studentLocal: StudentLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
private val student = getStudent()
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
studentLocal = StudentLocal(testDb.studentDao, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
studentLocal.saveStudents(listOf(student)).blockingGet()
|
||||||
|
|
||||||
|
val student = studentLocal.getCurrentStudent(true).blockingGet()
|
||||||
|
assertEquals("23", student.schoolSymbol)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.timetable
|
||||||
|
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import org.threeten.bp.LocalDateTime.now
|
||||||
|
import io.github.wulkanowy.data.db.entities.Timetable as TimetableLocal
|
||||||
|
import io.github.wulkanowy.sdk.pojo.Timetable as TimetableRemote
|
||||||
|
|
||||||
|
fun createTimetableLocal(start: LocalDateTime, number: Int, room: String = "", subject: String = "", teacher: String = "", changes: Boolean = false): TimetableLocal {
|
||||||
|
return TimetableLocal(
|
||||||
|
studentId = 1,
|
||||||
|
diaryId = 2,
|
||||||
|
number = number,
|
||||||
|
start = start,
|
||||||
|
end = now(),
|
||||||
|
date = start.toLocalDate(),
|
||||||
|
subject = subject,
|
||||||
|
subjectOld = "",
|
||||||
|
group = "",
|
||||||
|
room = room,
|
||||||
|
roomOld = "",
|
||||||
|
teacher = teacher,
|
||||||
|
teacherOld = "",
|
||||||
|
info = "",
|
||||||
|
isStudentPlan = true,
|
||||||
|
changes = changes,
|
||||||
|
canceled = false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createTimetableRemote(start: LocalDateTime, number: Int = 1, room: String = "", subject: String = "", teacher: String = "", changes: Boolean = false): TimetableRemote {
|
||||||
|
return TimetableRemote(
|
||||||
|
number = number,
|
||||||
|
start = start,
|
||||||
|
end = start.plusMinutes(45),
|
||||||
|
date = start.toLocalDate(),
|
||||||
|
subject = subject,
|
||||||
|
group = "",
|
||||||
|
room = room,
|
||||||
|
teacher = teacher,
|
||||||
|
info = "",
|
||||||
|
changes = changes,
|
||||||
|
canceled = false,
|
||||||
|
roomOld = "",
|
||||||
|
subjectOld = "",
|
||||||
|
teacherOld = "",
|
||||||
|
studentPlan = true
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.timetable
|
||||||
|
|
||||||
|
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 org.threeten.bp.LocalDateTime.of
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class TimetableLocalTest {
|
||||||
|
|
||||||
|
private lateinit var timetableDb: TimetableLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
timetableDb = TimetableLocal(testDb.timetableDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
timetableDb.saveTimetable(listOf(
|
||||||
|
createTimetableLocal(of(2018, 9, 10, 0, 0, 0), 1),
|
||||||
|
createTimetableLocal(of(2018, 9, 14, 0, 0, 0), 1),
|
||||||
|
createTimetableLocal(of(2018, 9, 17, 0, 0, 0), 1)
|
||||||
|
))
|
||||||
|
|
||||||
|
val exams = timetableDb.getTimetable(
|
||||||
|
Semester(1, 2, "", 1, 1, 2019, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
LocalDate.of(2018, 9, 10),
|
||||||
|
LocalDate.of(2018, 9, 14)
|
||||||
|
).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, exams.size)
|
||||||
|
assertEquals(exams[0].date, LocalDate.of(2018, 9, 10))
|
||||||
|
assertEquals(exams[1].date, LocalDate.of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,166 @@
|
||||||
|
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.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.data.repositories.TestInternetObservingStrategy
|
||||||
|
import io.github.wulkanowy.data.repositories.getStudent
|
||||||
|
import io.github.wulkanowy.services.alarm.TimetableNotificationSchedulerHelper
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import io.mockk.MockKAnnotations
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
import io.mockk.mockk
|
||||||
|
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 {
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var mockSdk: Sdk
|
||||||
|
|
||||||
|
private val settings = InternetObservingSettings.builder()
|
||||||
|
.strategy(TestInternetObservingStrategy())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var studentMock: Student
|
||||||
|
|
||||||
|
private val student = getStudent()
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var semesterMock: Semester
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var timetableNotificationSchedulerHelper: TimetableNotificationSchedulerHelper
|
||||||
|
|
||||||
|
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(mockSdk)
|
||||||
|
|
||||||
|
every { timetableNotificationSchedulerHelper.scheduleNotifications(any(), any()) } returns mockk()
|
||||||
|
every { timetableNotificationSchedulerHelper.cancelScheduled(any(), any()) } returns mockk()
|
||||||
|
|
||||||
|
every { studentMock.studentId } returns 1
|
||||||
|
every { studentMock.studentName } returns "Jan Kowalski"
|
||||||
|
|
||||||
|
every { semesterMock.studentId } returns 1
|
||||||
|
every { semesterMock.diaryId } returns 2
|
||||||
|
every { semesterMock.schoolYear } returns 2019
|
||||||
|
every { semesterMock.semesterId } returns 1
|
||||||
|
|
||||||
|
every { mockSdk.switchDiary(any(), any()) } returns mockSdk
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun copyRoomToCompletedFromPrevious() {
|
||||||
|
timetableLocal.saveTimetable(listOf(
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 8, 0), 1, "123", "Przyroda"),
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 8, 50), 2, "321", "Religia"),
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 9, 40), 3, "213", "W-F"),
|
||||||
|
createTimetableLocal(of(2019, 3, 5, 10, 30),3, "213", "W-F", "Jan Kowalski")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf(
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 8, 0), 1, "", "Przyroda"),
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 8, 50), 2, "", "Religia"),
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 9, 40), 3, "", "W-F"),
|
||||||
|
createTimetableRemote(of(2019, 3, 5, 10, 30), 4, "", "W-F")
|
||||||
|
))
|
||||||
|
|
||||||
|
val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper)
|
||||||
|
.getTimetable(student, semesterMock, LocalDate.of(2019, 3, 5), LocalDate.of(2019, 3, 5), true)
|
||||||
|
.blockingGet()
|
||||||
|
|
||||||
|
assertEquals(4, lessons.size)
|
||||||
|
assertEquals("123", lessons[0].room)
|
||||||
|
assertEquals("321", lessons[1].room)
|
||||||
|
assertEquals("213", lessons[2].room)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun copyTeacherToCompletedFromPrevious() {
|
||||||
|
timetableLocal.saveTimetable(listOf(
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Paweł Poniedziałkowski", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Wtorkowska", true),
|
||||||
|
createTimetableLocal(of(2019, 12, 23, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true),
|
||||||
|
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 8, 0), 1, "123", "Język polski", "Joanna Wtorkowska", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 8, 50), 2, "124", "Język polski", "Joanna Wtorkowska", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 9, 40), 3, "125", "Język polski", "Joanna Środowska", true),
|
||||||
|
createTimetableLocal(of(2019, 12, 24, 10, 40), 4, "126", "Język polski", "Joanna Środowska", true),
|
||||||
|
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 8, 0), 1, "123", "Matematyka", "", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "", false),
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "", true),
|
||||||
|
createTimetableLocal(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "", true)
|
||||||
|
))
|
||||||
|
|
||||||
|
every { mockSdk.getTimetable(any(), any()) } returns Single.just(listOf(
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 8, 0), 1, "123", "Matematyka", "Paweł Poniedziałkowski", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 8, 50), 2, "124", "Matematyka", "Jakub Wtorkowski", true),
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 9, 40), 3, "125", "Język polski", "Joanna Poniedziałkowska", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 23, 10, 40), 4, "126", "Język polski", "Joanna Wtorkowska", true),
|
||||||
|
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 8, 0), 1, "123", "Język polski", "", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 8, 50), 2, "124", "Język polski", "", true),
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 9, 40), 3, "125", "Język polski", "", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 24, 10, 40), 4, "126", "Język polski", "", true),
|
||||||
|
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 8, 0), 1, "123", "Matematyka", "Paweł Środowski", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 8, 50), 2, "124", "Matematyka", "Paweł Czwartkowski", true),
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 9, 40), 3, "125", "Matematyka", "Paweł Środowski", false),
|
||||||
|
createTimetableRemote(of(2019, 12, 25, 10, 40), 4, "126", "Matematyka", "Paweł Czwartkowski", true)
|
||||||
|
))
|
||||||
|
|
||||||
|
val lessons = TimetableRepository(settings, timetableLocal, timetableRemote, timetableNotificationSchedulerHelper)
|
||||||
|
.getTimetable(student, semesterMock, LocalDate.of(2019, 12, 23), LocalDate.of(2019, 12, 25), true)
|
||||||
|
.blockingGet()
|
||||||
|
|
||||||
|
assertEquals(12, lessons.size)
|
||||||
|
|
||||||
|
assertEquals("Paweł Poniedziałkowski", lessons[0].teacher)
|
||||||
|
assertEquals("Jakub Wtorkowski", lessons[1].teacher)
|
||||||
|
assertEquals("Joanna Poniedziałkowska", lessons[2].teacher)
|
||||||
|
assertEquals("Joanna Wtorkowska", lessons[3].teacher)
|
||||||
|
|
||||||
|
assertEquals("Joanna Wtorkowska", lessons[4].teacher)
|
||||||
|
assertEquals("", lessons[5].teacher)
|
||||||
|
assertEquals("", lessons[6].teacher)
|
||||||
|
assertEquals("", lessons[7].teacher)
|
||||||
|
|
||||||
|
assertEquals("Paweł Środowski", lessons[8].teacher)
|
||||||
|
assertEquals("Paweł Czwartkowski", lessons[9].teacher)
|
||||||
|
assertEquals("Paweł Środowski", lessons[10].teacher)
|
||||||
|
assertEquals("Paweł Czwartkowski", lessons[11].teacher)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,33 +0,0 @@
|
||||||
{
|
|
||||||
"agcgw":{
|
|
||||||
"backurl":"connect-dre.dbankcloud.cn",
|
|
||||||
"url":"connect-dre.hispace.hicloud.com"
|
|
||||||
},
|
|
||||||
"client":{
|
|
||||||
"cp_id":"890048000024105546",
|
|
||||||
"product_id":"",
|
|
||||||
"client_id":"",
|
|
||||||
"client_secret":"",
|
|
||||||
"app_id":"101440411",
|
|
||||||
"package_name":"io.github.wulkanowy.dev",
|
|
||||||
"api_key":""
|
|
||||||
},
|
|
||||||
"service":{
|
|
||||||
"analytics":{
|
|
||||||
"collector_url":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn",
|
|
||||||
"resource_id":"p1",
|
|
||||||
"channel_id":""
|
|
||||||
},
|
|
||||||
"search":{
|
|
||||||
"url":"https://search-dre.cloud.huawei.com"
|
|
||||||
},
|
|
||||||
"cloudstorage":{
|
|
||||||
"storage_url":"https://ops-dre.agcstorage.link"
|
|
||||||
},
|
|
||||||
"ml":{
|
|
||||||
"mlservice_url":"ml-api-dre.ai.dbankcloud.com,ml-api-dre.ai.dbankcloud.cn"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"region":"DE",
|
|
||||||
"configuration_version":"1.0"
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:tint="#FFFFFF"
|
|
||||||
android:viewportWidth="24"
|
|
||||||
android:viewportHeight="24">
|
|
||||||
<group
|
|
||||||
android:scaleX="0.92"
|
|
||||||
android:scaleY="0.92"
|
|
||||||
android:translateX="0.96"
|
|
||||||
android:translateY="0.96">
|
|
||||||
<path
|
|
||||||
android:fillColor="#FFF"
|
|
||||||
android:pathData="M3.9512,2A2,2 0,0 0,2 4L2,18A2,2 0,0 0,4 20L10.0996,20C11.3596,21.24 13.09,22 15,22A7,7 0,0 0,15.7988 21.9551L15.7988,19.7832A4.85,4.85 0,0 1,15 19.8496C12.32,19.8496 10.1504,17.68 10.1504,15A4.85,4.85 0,0 1,15 10.1504C17.4677,10.1504 19.4978,11.9912 19.8047,14.375C20.566,14.3758 21.3108,14.5325 21.9922,14.834C21.9491,12.9905 21.2036,11.3226 20,10.0996L20,4A2,2 0,0 0,18 2L4,2A2,2 0,0 0,3.9512 2zM4,5L10,5L10,8L4,8L4,5zM12,5L18,5L18,8L12,8L12,5zM4,10L10.0996,10C9.2596,10.82 8.6291,11.85 8.2891,13L4,13L4,10zM14,12L14,15.6895L15.7988,16.7266L15.7988,14.9922L15.5,14.8203L15.5,12L14,12zM4,15L8,15C8,16.07 8.2399,17.09 8.6699,18L4,18L4,15z" />
|
|
||||||
<path
|
|
||||||
android:fillColor="#FFF"
|
|
||||||
android:pathData="m17.298,24v-8.1249h2.5c0.7143,0 1.3523,0.1618 1.9141,0.4855 0.5655,0.3199 1.0063,0.7775 1.3225,1.3728 0.3162,0.5915 0.4743,1.2649 0.4743,2.0201v0.3739c0,0.7552 -0.1562,1.4267 -0.4687,2.0145 -0.3088,0.5878 -0.7459,1.0435 -1.3114,1.3672C21.1633,23.8326 20.5253,23.9963 19.8148,24ZM18.9721,17.2311v5.4241h0.8091c0.6548,0 1.1551,-0.2139 1.5011,-0.6417 0.346,-0.4278 0.5227,-1.0398 0.5301,-1.8359v-0.4297c0,-0.8259 -0.1711,-1.4509 -0.5134,-1.875 -0.3423,-0.4278 -0.8426,-0.6417 -1.5011,-0.6417z" />
|
|
||||||
</group>
|
|
||||||
</vector>
|
|
Binary file not shown.
Before Width: | Height: | Size: 426 B |
Binary file not shown.
Before Width: | Height: | Size: 335 B |
Binary file not shown.
Before Width: | Height: | Size: 519 B |
Binary file not shown.
Before Width: | Height: | Size: 700 B |
|
@ -8,6 +8,6 @@ open class TimberTreeNoOp : Timber.Tree() {
|
||||||
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {}
|
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CrashLogTree : TimberTreeNoOp()
|
class CrashlyticsTree : TimberTreeNoOp()
|
||||||
|
|
||||||
class CrashLogExceptionTree : TimberTreeNoOp()
|
class CrashlyticsExceptionTree : TimberTreeNoOp()
|
|
@ -6,7 +6,7 @@ import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Suppress("UNUSED_PARAMETER")
|
@Suppress("UNUSED_PARAMETER")
|
||||||
class AnalyticsHelper @Inject constructor() {
|
class FirebaseAnalyticsHelper @Inject constructor() {
|
||||||
|
|
||||||
fun logEvent(name: String, vararg params: Pair<String, Any?>) {
|
fun logEvent(name: String, vararg params: Pair<String, Any?>) {
|
||||||
// do nothing
|
// do nothing
|
||||||
|
@ -15,8 +15,4 @@ class AnalyticsHelper @Inject constructor() {
|
||||||
fun setCurrentScreen(activity: Activity, name: String?) {
|
fun setCurrentScreen(activity: Activity, name: String?) {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
fun popCurrentScreen(name: String?) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,17 +0,0 @@
|
||||||
package io.github.wulkanowy.utils
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.view.View
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
@Suppress("UNUSED_PARAMETER")
|
|
||||||
class UpdateHelper @Inject constructor() {
|
|
||||||
|
|
||||||
lateinit var messageContainer: View
|
|
||||||
|
|
||||||
fun checkAndInstallUpdates(activity: Activity) {}
|
|
||||||
|
|
||||||
fun onActivityResult(requestCode: Int, resultCode: Int) {}
|
|
||||||
|
|
||||||
fun onResume(activity: Activity) {}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package io.github.wulkanowy.utils
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Context
|
|
||||||
import android.os.Bundle
|
|
||||||
import com.huawei.hms.analytics.HiAnalytics
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import javax.inject.Inject
|
|
||||||
import javax.inject.Singleton
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
class AnalyticsHelper @Inject constructor(
|
|
||||||
@ApplicationContext private val context: Context
|
|
||||||
) {
|
|
||||||
|
|
||||||
private val analytics by lazy { HiAnalytics.getInstance(context) }
|
|
||||||
|
|
||||||
fun logEvent(name: String, vararg params: Pair<String, Any?>) {
|
|
||||||
Bundle().apply {
|
|
||||||
params.forEach {
|
|
||||||
if (it.second == null) return@forEach
|
|
||||||
when (it.second) {
|
|
||||||
is String, is String? -> putString(it.first, it.second as String)
|
|
||||||
is Int, is Int? -> putInt(it.first, it.second as Int)
|
|
||||||
is Boolean, is Boolean? -> putBoolean(it.first, it.second as Boolean)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
analytics.onEvent(name, this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setCurrentScreen(activity: Activity, name: String?) {
|
|
||||||
analytics.pageStart(name, activity::class.simpleName)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun popCurrentScreen(name: String?) {
|
|
||||||
analytics.pageEnd(name)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
package io.github.wulkanowy.utils
|
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import com.huawei.agconnect.crash.AGConnectCrash
|
|
||||||
import fr.bipi.tressence.base.FormatterPriorityTree
|
|
||||||
import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException
|
|
||||||
import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException
|
|
||||||
import java.io.InterruptedIOException
|
|
||||||
import java.net.SocketTimeoutException
|
|
||||||
import java.net.UnknownHostException
|
|
||||||
|
|
||||||
class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) {
|
|
||||||
|
|
||||||
private val connectCrash by lazy { AGConnectCrash.getInstance() }
|
|
||||||
|
|
||||||
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
|
|
||||||
if (skipLog(priority, tag, message, t)) return
|
|
||||||
|
|
||||||
connectCrash.log(format(priority, tag, message))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CrashLogExceptionTree : FormatterPriorityTree(Log.ERROR) {
|
|
||||||
|
|
||||||
private val connectCrash by lazy { AGConnectCrash.getInstance() }
|
|
||||||
|
|
||||||
override fun skipLog(priority: Int, tag: String?, message: String, t: Throwable?): Boolean {
|
|
||||||
return when (t) {
|
|
||||||
is FeatureDisabledException,
|
|
||||||
is FeatureNotAvailableException,
|
|
||||||
is UnknownHostException,
|
|
||||||
is SocketTimeoutException,
|
|
||||||
is InterruptedIOException -> true
|
|
||||||
else -> super.skipLog(priority, tag, message, t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
|
|
||||||
if (skipLog(priority, tag, message, t)) return
|
|
||||||
|
|
||||||
// Disabled due to a bug in the Huawei library
|
|
||||||
|
|
||||||
/*connectCrash.setCustomKey("priority", priority)
|
|
||||||
connectCrash.setCustomKey("tag", tag.orEmpty())
|
|
||||||
connectCrash.setCustomKey("message", message)
|
|
||||||
|
|
||||||
if (t != null) {
|
|
||||||
connectCrash.recordException(t)
|
|
||||||
} else {
|
|
||||||
connectCrash.recordException(StackTraceRecorder(format(priority, tag, message)))
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
package io.github.wulkanowy.utils
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.view.View
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
@Suppress("UNUSED_PARAMETER")
|
|
||||||
class UpdateHelper @Inject constructor() {
|
|
||||||
|
|
||||||
lateinit var messageContainer: View
|
|
||||||
|
|
||||||
fun checkAndInstallUpdates(activity: Activity) {}
|
|
||||||
|
|
||||||
fun onActivityResult(requestCode: Int, resultCode: Int) {}
|
|
||||||
|
|
||||||
fun onResume(activity: Activity) {}
|
|
||||||
}
|
|
|
@ -9,29 +9,6 @@
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
|
||||||
<queries>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="http" />
|
|
||||||
</intent>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="https" />
|
|
||||||
</intent>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="mailto" />
|
|
||||||
</intent>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="tel" />
|
|
||||||
</intent>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="geo" />
|
|
||||||
</intent>
|
|
||||||
</queries>
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".WulkanowyApp"
|
android:name=".WulkanowyApp"
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
|
@ -41,7 +18,8 @@
|
||||||
android:supportsRtl="false"
|
android:supportsRtl="false"
|
||||||
android:theme="@style/WulkanowyTheme"
|
android:theme="@style/WulkanowyTheme"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
|
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"
|
||||||
|
tools:replace="android:supportsRtl,android:allowBackup">
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.splash.SplashActivity"
|
android:name=".ui.modules.splash.SplashActivity"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
|
@ -133,10 +111,6 @@
|
||||||
android:resource="@xml/provider_paths" />
|
android:resource="@xml/provider_paths" />
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="install_channel"
|
|
||||||
android:value="${install_channel}" />
|
|
||||||
|
|
||||||
<!-- workaround for https://github.com/firebase/firebase-android-sdk/issues/473 enabled:false -->
|
<!-- workaround for https://github.com/firebase/firebase-android-sdk/issues/473 enabled:false -->
|
||||||
<!-- https://firebase.googleblog.com/2017/03/take-control-of-your-firebase-init-on.html -->
|
<!-- https://firebase.googleblog.com/2017/03/take-control-of-your-firebase-init-on.html -->
|
||||||
<provider
|
<provider
|
||||||
|
|
|
@ -33,6 +33,6 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayName": "Mateusz Idziejczak",
|
"displayName": "Mateusz Idziejczak",
|
||||||
"githubUsername": "Luncenok"
|
"githubUsername": "PanTajemnic"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,33 +1,34 @@
|
||||||
package io.github.wulkanowy
|
package io.github.wulkanowy
|
||||||
|
|
||||||
import android.app.Application
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log.DEBUG
|
import android.util.Log.DEBUG
|
||||||
import android.util.Log.INFO
|
import android.util.Log.INFO
|
||||||
import android.util.Log.VERBOSE
|
import android.util.Log.VERBOSE
|
||||||
import android.webkit.WebView
|
|
||||||
import androidx.hilt.work.HiltWorkerFactory
|
|
||||||
import androidx.multidex.MultiDex
|
import androidx.multidex.MultiDex
|
||||||
import androidx.work.Configuration
|
import androidx.work.Configuration
|
||||||
|
import com.jakewharton.threetenabp.AndroidThreeTen
|
||||||
import com.yariksoffice.lingver.Lingver
|
import com.yariksoffice.lingver.Lingver
|
||||||
import dagger.hilt.android.HiltAndroidApp
|
import dagger.android.AndroidInjector
|
||||||
|
import dagger.android.support.DaggerApplication
|
||||||
import fr.bipi.tressence.file.FileLoggerTree
|
import fr.bipi.tressence.file.FileLoggerTree
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.di.DaggerAppComponent
|
||||||
|
import io.github.wulkanowy.services.sync.SyncWorkerFactory
|
||||||
import io.github.wulkanowy.ui.base.ThemeManager
|
import io.github.wulkanowy.ui.base.ThemeManager
|
||||||
import io.github.wulkanowy.utils.ActivityLifecycleLogger
|
import io.github.wulkanowy.utils.ActivityLifecycleLogger
|
||||||
import io.github.wulkanowy.utils.AnalyticsHelper
|
|
||||||
import io.github.wulkanowy.utils.AppInfo
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
import io.github.wulkanowy.utils.CrashLogExceptionTree
|
import io.github.wulkanowy.utils.CrashlyticsExceptionTree
|
||||||
import io.github.wulkanowy.utils.CrashLogTree
|
import io.github.wulkanowy.utils.CrashlyticsTree
|
||||||
import io.github.wulkanowy.utils.DebugLogTree
|
import io.github.wulkanowy.utils.DebugLogTree
|
||||||
|
import io.reactivex.exceptions.UndeliverableException
|
||||||
|
import io.reactivex.plugins.RxJavaPlugins
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import java.io.IOException
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltAndroidApp
|
class WulkanowyApp : DaggerApplication(), Configuration.Provider {
|
||||||
class WulkanowyApp : Application(), Configuration.Provider {
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var workerFactory: HiltWorkerFactory
|
lateinit var workerFactory: SyncWorkerFactory
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var themeManager: ThemeManager
|
lateinit var themeManager: ThemeManager
|
||||||
|
@ -35,12 +36,6 @@ class WulkanowyApp : Application(), Configuration.Provider {
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var appInfo: AppInfo
|
lateinit var appInfo: AppInfo
|
||||||
|
|
||||||
@Inject
|
|
||||||
lateinit var preferencesRepository: PreferencesRepository
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
lateinit var analyticsHelper: AnalyticsHelper
|
|
||||||
|
|
||||||
override fun attachBaseContext(base: Context?) {
|
override fun attachBaseContext(base: Context?) {
|
||||||
super.attachBaseContext(base)
|
super.attachBaseContext(base)
|
||||||
MultiDex.install(this)
|
MultiDex.install(this)
|
||||||
|
@ -48,45 +43,41 @@ class WulkanowyApp : Application(), Configuration.Provider {
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
AndroidThreeTen.init(this)
|
||||||
initializeAppLanguage()
|
RxJavaPlugins.setErrorHandler(::onError)
|
||||||
|
Lingver.init(this)
|
||||||
themeManager.applyDefaultTheme()
|
themeManager.applyDefaultTheme()
|
||||||
|
|
||||||
initLogging()
|
initLogging()
|
||||||
fixWebViewLocale()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initLogging() {
|
private fun initLogging() {
|
||||||
if (appInfo.isDebug) {
|
if (appInfo.isDebug) {
|
||||||
Timber.plant(DebugLogTree())
|
Timber.plant(DebugLogTree())
|
||||||
Timber.plant(
|
Timber.plant(FileLoggerTree.Builder()
|
||||||
FileLoggerTree.Builder()
|
.withFileName("wulkanowy.%g.log")
|
||||||
.withFileName("wulkanowy.%g.log")
|
.withDirName(applicationContext.filesDir.absolutePath)
|
||||||
.withDirName(applicationContext.filesDir.absolutePath)
|
.withFileLimit(10)
|
||||||
.withFileLimit(10)
|
.withMinPriority(DEBUG)
|
||||||
.withMinPriority(DEBUG)
|
.build()
|
||||||
.build()
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
Timber.plant(CrashLogExceptionTree())
|
Timber.plant(CrashlyticsExceptionTree())
|
||||||
Timber.plant(CrashLogTree())
|
Timber.plant(CrashlyticsTree())
|
||||||
}
|
}
|
||||||
registerActivityLifecycleCallbacks(ActivityLifecycleLogger())
|
registerActivityLifecycleCallbacks(ActivityLifecycleLogger())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initializeAppLanguage() {
|
private fun onError(error: Throwable) {
|
||||||
Lingver.init(this)
|
//RxJava's too deep stack traces may cause SOE on older android devices
|
||||||
|
val cause = error.cause
|
||||||
if (preferencesRepository.appLanguage == "system") {
|
if (error is UndeliverableException && cause is IOException || cause is InterruptedException || cause is StackOverflowError) {
|
||||||
Lingver.getInstance().setFollowSystemLocale(this)
|
Timber.e(cause, "An undeliverable error occurred")
|
||||||
analyticsHelper.logEvent("language", "startup" to appInfo.systemLanguage)
|
} else throw error
|
||||||
} else {
|
|
||||||
analyticsHelper.logEvent("language", "startup" to preferencesRepository.appLanguage)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fixWebViewLocale() {
|
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
|
||||||
//https://stackoverflow.com/questions/40398528/android-webview-language-changes-abruptly-on-android-7-0-and-above
|
return DaggerAppComponent.factory().create(this)
|
||||||
WebView(this).destroy()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getWorkManagerConfiguration() = Configuration.Builder()
|
override fun getWorkManagerConfiguration() = Configuration.Builder()
|
||||||
|
|
|
@ -8,46 +8,44 @@ import androidx.preference.PreferenceManager
|
||||||
import com.chuckerteam.chucker.api.ChuckerCollector
|
import com.chuckerteam.chucker.api.ChuckerCollector
|
||||||
import com.chuckerteam.chucker.api.ChuckerInterceptor
|
import com.chuckerteam.chucker.api.ChuckerInterceptor
|
||||||
import com.chuckerteam.chucker.api.RetentionManager
|
import com.chuckerteam.chucker.api.RetentionManager
|
||||||
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
|
||||||
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import dagger.hilt.InstallIn
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import dagger.hilt.components.SingletonComponent
|
|
||||||
import io.github.wulkanowy.data.db.AppDatabase
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
import io.github.wulkanowy.data.db.SharedPrefProvider
|
import io.github.wulkanowy.data.db.SharedPrefProvider
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository
|
||||||
import io.github.wulkanowy.sdk.Sdk
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@InstallIn(SingletonComponent::class)
|
|
||||||
internal class RepositoryModule {
|
internal class RepositoryModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideSdk(chuckerCollector: ChuckerCollector, @ApplicationContext context: Context): Sdk {
|
fun provideInternetObservingSettings(): InternetObservingSettings {
|
||||||
|
return InternetObservingSettings.builder()
|
||||||
|
.strategy(WalledGardenInternetObservingStrategy())
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Provides
|
||||||
|
fun provideSdk(chuckerCollector: ChuckerCollector, context: Context): Sdk {
|
||||||
return Sdk().apply {
|
return Sdk().apply {
|
||||||
androidVersion = android.os.Build.VERSION.RELEASE
|
androidVersion = android.os.Build.VERSION.RELEASE
|
||||||
buildTag = android.os.Build.MODEL
|
buildTag = android.os.Build.MODEL
|
||||||
setSimpleHttpLogger { Timber.d(it) }
|
setSimpleHttpLogger { Timber.d(it) }
|
||||||
|
|
||||||
// for debug only
|
// for debug only
|
||||||
addInterceptor(
|
addInterceptor(ChuckerInterceptor(context, chuckerCollector), true)
|
||||||
ChuckerInterceptor.Builder(context)
|
|
||||||
.collector(chuckerCollector)
|
|
||||||
.alwaysReadResponseBody(true)
|
|
||||||
.build(), network = true
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideChuckerCollector(
|
fun provideChuckerCollector(context: Context, prefRepository: PreferencesRepository): ChuckerCollector {
|
||||||
@ApplicationContext context: Context,
|
|
||||||
prefRepository: PreferencesRepository
|
|
||||||
): ChuckerCollector {
|
|
||||||
return ChuckerCollector(
|
return ChuckerCollector(
|
||||||
context = context,
|
context = context,
|
||||||
showNotification = prefRepository.isDebugNotificationEnable,
|
showNotification = prefRepository.isDebugNotificationEnable,
|
||||||
|
@ -57,23 +55,19 @@ internal class RepositoryModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideDatabase(
|
fun provideDatabase(context: Context, sharedPrefProvider: SharedPrefProvider) = AppDatabase.newInstance(context, sharedPrefProvider)
|
||||||
@ApplicationContext context: Context,
|
|
||||||
sharedPrefProvider: SharedPrefProvider,
|
|
||||||
) = AppDatabase.newInstance(context, sharedPrefProvider)
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideResources(@ApplicationContext context: Context): Resources = context.resources
|
fun provideResources(context: Context): Resources = context.resources
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideAssets(@ApplicationContext context: Context): AssetManager = context.assets
|
fun provideAssets(context: Context): AssetManager = context.assets
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideSharedPref(@ApplicationContext context: Context): SharedPreferences =
|
fun provideSharedPref(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
PreferenceManager.getDefaultSharedPreferences(context)
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
|
@ -93,16 +87,11 @@ internal class RepositoryModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideGradePartialStatisticsDao(database: AppDatabase) = database.gradePartialStatisticsDao
|
fun provideGradeStatisticsDao(database: AppDatabase) = database.gradeStatistics
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideGradeSemesterStatisticsDao(database: AppDatabase) =
|
fun provideGradePointsStatisticsDao(database: AppDatabase) = database.gradePointsStatistics
|
||||||
database.gradeSemesterStatisticsDao
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Provides
|
|
||||||
fun provideGradePointsStatisticsDao(database: AppDatabase) = database.gradePointsStatisticsDao
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
|
@ -167,16 +156,4 @@ internal class RepositoryModule {
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideSchoolInfoDao(database: AppDatabase) = database.schoolDao
|
fun provideSchoolInfoDao(database: AppDatabase) = database.schoolDao
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Provides
|
|
||||||
fun provideConferenceDao(database: AppDatabase) = database.conferenceDao
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Provides
|
|
||||||
fun provideTimetableAdditionalDao(database: AppDatabase) = database.timetableAdditionalDao
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Provides
|
|
||||||
fun provideStudentInfoDao(database: AppDatabase) = database.studentInfoDao
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
package io.github.wulkanowy.data
|
|
||||||
|
|
||||||
data class Resource<T>(val status: Status, val data: T?, val error: Throwable?) {
|
|
||||||
companion object {
|
|
||||||
fun <T> success(data: T?): Resource<T> {
|
|
||||||
return Resource(Status.SUCCESS, data, null)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> error(error: Throwable?, data: T? = null): Resource<T> {
|
|
||||||
return Resource(Status.ERROR, data, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> loading(data: T? = null): Resource<T> {
|
|
||||||
return Resource(Status.LOADING, data, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class Status {
|
|
||||||
LOADING,
|
|
||||||
SUCCESS,
|
|
||||||
ERROR
|
|
||||||
}
|
|
|
@ -10,12 +10,10 @@ import androidx.room.migration.Migration
|
||||||
import io.github.wulkanowy.data.db.dao.AttendanceDao
|
import io.github.wulkanowy.data.db.dao.AttendanceDao
|
||||||
import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao
|
import io.github.wulkanowy.data.db.dao.AttendanceSummaryDao
|
||||||
import io.github.wulkanowy.data.db.dao.CompletedLessonsDao
|
import io.github.wulkanowy.data.db.dao.CompletedLessonsDao
|
||||||
import io.github.wulkanowy.data.db.dao.ConferenceDao
|
|
||||||
import io.github.wulkanowy.data.db.dao.ExamDao
|
import io.github.wulkanowy.data.db.dao.ExamDao
|
||||||
import io.github.wulkanowy.data.db.dao.GradeDao
|
import io.github.wulkanowy.data.db.dao.GradeDao
|
||||||
import io.github.wulkanowy.data.db.dao.GradePartialStatisticsDao
|
|
||||||
import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao
|
import io.github.wulkanowy.data.db.dao.GradePointsStatisticsDao
|
||||||
import io.github.wulkanowy.data.db.dao.GradeSemesterStatisticsDao
|
import io.github.wulkanowy.data.db.dao.GradeStatisticsDao
|
||||||
import io.github.wulkanowy.data.db.dao.GradeSummaryDao
|
import io.github.wulkanowy.data.db.dao.GradeSummaryDao
|
||||||
import io.github.wulkanowy.data.db.dao.HomeworkDao
|
import io.github.wulkanowy.data.db.dao.HomeworkDao
|
||||||
import io.github.wulkanowy.data.db.dao.LuckyNumberDao
|
import io.github.wulkanowy.data.db.dao.LuckyNumberDao
|
||||||
|
@ -28,20 +26,16 @@ import io.github.wulkanowy.data.db.dao.ReportingUnitDao
|
||||||
import io.github.wulkanowy.data.db.dao.SchoolDao
|
import io.github.wulkanowy.data.db.dao.SchoolDao
|
||||||
import io.github.wulkanowy.data.db.dao.SemesterDao
|
import io.github.wulkanowy.data.db.dao.SemesterDao
|
||||||
import io.github.wulkanowy.data.db.dao.StudentDao
|
import io.github.wulkanowy.data.db.dao.StudentDao
|
||||||
import io.github.wulkanowy.data.db.dao.StudentInfoDao
|
|
||||||
import io.github.wulkanowy.data.db.dao.SubjectDao
|
import io.github.wulkanowy.data.db.dao.SubjectDao
|
||||||
import io.github.wulkanowy.data.db.dao.TeacherDao
|
import io.github.wulkanowy.data.db.dao.TeacherDao
|
||||||
import io.github.wulkanowy.data.db.dao.TimetableAdditionalDao
|
|
||||||
import io.github.wulkanowy.data.db.dao.TimetableDao
|
import io.github.wulkanowy.data.db.dao.TimetableDao
|
||||||
import io.github.wulkanowy.data.db.entities.Attendance
|
import io.github.wulkanowy.data.db.entities.Attendance
|
||||||
import io.github.wulkanowy.data.db.entities.AttendanceSummary
|
import io.github.wulkanowy.data.db.entities.AttendanceSummary
|
||||||
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
||||||
import io.github.wulkanowy.data.db.entities.Conference
|
|
||||||
import io.github.wulkanowy.data.db.entities.Exam
|
import io.github.wulkanowy.data.db.entities.Exam
|
||||||
import io.github.wulkanowy.data.db.entities.Grade
|
import io.github.wulkanowy.data.db.entities.Grade
|
||||||
import io.github.wulkanowy.data.db.entities.GradePartialStatistics
|
|
||||||
import io.github.wulkanowy.data.db.entities.GradePointsStatistics
|
import io.github.wulkanowy.data.db.entities.GradePointsStatistics
|
||||||
import io.github.wulkanowy.data.db.entities.GradeSemesterStatistics
|
import io.github.wulkanowy.data.db.entities.GradeStatistics
|
||||||
import io.github.wulkanowy.data.db.entities.GradeSummary
|
import io.github.wulkanowy.data.db.entities.GradeSummary
|
||||||
import io.github.wulkanowy.data.db.entities.Homework
|
import io.github.wulkanowy.data.db.entities.Homework
|
||||||
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||||
|
@ -54,11 +48,9 @@ import io.github.wulkanowy.data.db.entities.ReportingUnit
|
||||||
import io.github.wulkanowy.data.db.entities.School
|
import io.github.wulkanowy.data.db.entities.School
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
import io.github.wulkanowy.data.db.entities.StudentInfo
|
|
||||||
import io.github.wulkanowy.data.db.entities.Subject
|
import io.github.wulkanowy.data.db.entities.Subject
|
||||||
import io.github.wulkanowy.data.db.entities.Teacher
|
import io.github.wulkanowy.data.db.entities.Teacher
|
||||||
import io.github.wulkanowy.data.db.entities.Timetable
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
import io.github.wulkanowy.data.db.entities.TimetableAdditional
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration10
|
import io.github.wulkanowy.data.db.migrations.Migration10
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration11
|
import io.github.wulkanowy.data.db.migrations.Migration11
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration12
|
import io.github.wulkanowy.data.db.migrations.Migration12
|
||||||
|
@ -77,13 +69,7 @@ import io.github.wulkanowy.data.db.migrations.Migration23
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration24
|
import io.github.wulkanowy.data.db.migrations.Migration24
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration25
|
import io.github.wulkanowy.data.db.migrations.Migration25
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration26
|
import io.github.wulkanowy.data.db.migrations.Migration26
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration27
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration28
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration29
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration3
|
import io.github.wulkanowy.data.db.migrations.Migration3
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration30
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration31
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration32
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration4
|
import io.github.wulkanowy.data.db.migrations.Migration4
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration5
|
import io.github.wulkanowy.data.db.migrations.Migration5
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration6
|
import io.github.wulkanowy.data.db.migrations.Migration6
|
||||||
|
@ -103,9 +89,8 @@ import javax.inject.Singleton
|
||||||
AttendanceSummary::class,
|
AttendanceSummary::class,
|
||||||
Grade::class,
|
Grade::class,
|
||||||
GradeSummary::class,
|
GradeSummary::class,
|
||||||
GradePartialStatistics::class,
|
GradeStatistics::class,
|
||||||
GradePointsStatistics::class,
|
GradePointsStatistics::class,
|
||||||
GradeSemesterStatistics::class,
|
|
||||||
Message::class,
|
Message::class,
|
||||||
MessageAttachment::class,
|
MessageAttachment::class,
|
||||||
Note::class,
|
Note::class,
|
||||||
|
@ -117,10 +102,7 @@ import javax.inject.Singleton
|
||||||
Recipient::class,
|
Recipient::class,
|
||||||
MobileDevice::class,
|
MobileDevice::class,
|
||||||
Teacher::class,
|
Teacher::class,
|
||||||
School::class,
|
School::class
|
||||||
Conference::class,
|
|
||||||
TimetableAdditional::class,
|
|
||||||
StudentInfo::class,
|
|
||||||
],
|
],
|
||||||
version = AppDatabase.VERSION_SCHEMA,
|
version = AppDatabase.VERSION_SCHEMA,
|
||||||
exportSchema = true
|
exportSchema = true
|
||||||
|
@ -129,7 +111,7 @@ import javax.inject.Singleton
|
||||||
abstract class AppDatabase : RoomDatabase() {
|
abstract class AppDatabase : RoomDatabase() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val VERSION_SCHEMA = 32
|
const val VERSION_SCHEMA = 26
|
||||||
|
|
||||||
fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array<Migration> {
|
fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array<Migration> {
|
||||||
return arrayOf(
|
return arrayOf(
|
||||||
|
@ -157,13 +139,7 @@ abstract class AppDatabase : RoomDatabase() {
|
||||||
Migration23(),
|
Migration23(),
|
||||||
Migration24(),
|
Migration24(),
|
||||||
Migration25(),
|
Migration25(),
|
||||||
Migration26(),
|
Migration26()
|
||||||
Migration27(),
|
|
||||||
Migration28(),
|
|
||||||
Migration29(),
|
|
||||||
Migration30(),
|
|
||||||
Migration31(),
|
|
||||||
Migration32()
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,11 +169,9 @@ abstract class AppDatabase : RoomDatabase() {
|
||||||
|
|
||||||
abstract val gradeSummaryDao: GradeSummaryDao
|
abstract val gradeSummaryDao: GradeSummaryDao
|
||||||
|
|
||||||
abstract val gradePartialStatisticsDao: GradePartialStatisticsDao
|
abstract val gradeStatistics: GradeStatisticsDao
|
||||||
|
|
||||||
abstract val gradePointsStatisticsDao: GradePointsStatisticsDao
|
abstract val gradePointsStatistics: GradePointsStatisticsDao
|
||||||
|
|
||||||
abstract val gradeSemesterStatisticsDao: GradeSemesterStatisticsDao
|
|
||||||
|
|
||||||
abstract val messagesDao: MessagesDao
|
abstract val messagesDao: MessagesDao
|
||||||
|
|
||||||
|
@ -222,10 +196,4 @@ abstract class AppDatabase : RoomDatabase() {
|
||||||
abstract val teacherDao: TeacherDao
|
abstract val teacherDao: TeacherDao
|
||||||
|
|
||||||
abstract val schoolDao: SchoolDao
|
abstract val schoolDao: SchoolDao
|
||||||
|
|
||||||
abstract val conferenceDao: ConferenceDao
|
|
||||||
|
|
||||||
abstract val timetableAdditionalDao: TimetableAdditionalDao
|
|
||||||
|
|
||||||
abstract val studentInfoDao: StudentInfoDao
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,31 +1,21 @@
|
||||||
package io.github.wulkanowy.data.db
|
package io.github.wulkanowy.data.db
|
||||||
|
|
||||||
import androidx.room.TypeConverter
|
import androidx.room.TypeConverter
|
||||||
import com.squareup.moshi.Moshi
|
import com.google.gson.Gson
|
||||||
import com.squareup.moshi.Types
|
import com.google.gson.reflect.TypeToken
|
||||||
import io.github.wulkanowy.data.db.adapters.PairAdapterFactory
|
import org.threeten.bp.DateTimeUtils
|
||||||
import java.time.Instant
|
import org.threeten.bp.Instant
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import java.time.LocalDateTime
|
import org.threeten.bp.LocalDateTime
|
||||||
import java.time.Month
|
import org.threeten.bp.Month
|
||||||
import java.time.ZoneOffset
|
import org.threeten.bp.ZoneOffset
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
class Converters {
|
class Converters {
|
||||||
|
|
||||||
private val moshi by lazy { Moshi.Builder().add(PairAdapterFactory).build() }
|
|
||||||
|
|
||||||
private val integerListAdapter by lazy {
|
|
||||||
moshi.adapter<List<Int>>(Types.newParameterizedType(List::class.java, Integer::class.java))
|
|
||||||
}
|
|
||||||
|
|
||||||
private val stringListPairAdapter by lazy {
|
|
||||||
moshi.adapter<List<Pair<String, String>>>(Types.newParameterizedType(List::class.java, Pair::class.java, String::class.java, String::class.java))
|
|
||||||
}
|
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun timestampToDate(value: Long?): LocalDate? = value?.run {
|
fun timestampToDate(value: Long?): LocalDate? = value?.run {
|
||||||
Date(value).toInstant().atZone(ZoneOffset.UTC).toLocalDate()
|
DateTimeUtils.toInstant(Date(value)).atZone(ZoneOffset.UTC).toLocalDate()
|
||||||
}
|
}
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
|
@ -50,22 +40,22 @@ class Converters {
|
||||||
fun intToMonth(value: Int?) = value?.let { Month.of(it) }
|
fun intToMonth(value: Int?) = value?.let { Month.of(it) }
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun intListToJson(list: List<Int>): String {
|
fun intListToGson(list: List<Int>): String {
|
||||||
return integerListAdapter.toJson(list)
|
return Gson().toJson(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun jsonToIntList(value: String): List<Int> {
|
fun gsonToIntList(value: String): List<Int> {
|
||||||
return integerListAdapter.fromJson(value).orEmpty()
|
return Gson().fromJson(value, object : TypeToken<List<Int>>() {}.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun stringPairListToJson(list: List<Pair<String, String>>): String {
|
fun stringPairListToGson(list: List<Pair<String, String>>): String {
|
||||||
return stringListPairAdapter.toJson(list)
|
return Gson().toJson(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun jsonToStringPairList(value: String): List<Pair<String, String>> {
|
fun gsonToStringPairList(value: String): List<Pair<String, String>> {
|
||||||
return stringListPairAdapter.fromJson(value).orEmpty()
|
return Gson().fromJson(value, object : TypeToken<List<Pair<String, String>>>() {}.type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,7 @@ import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class SharedPrefProvider @Inject constructor(
|
class SharedPrefProvider @Inject constructor(private val sharedPref: SharedPreferences) {
|
||||||
private val sharedPref: SharedPreferences
|
|
||||||
) {
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val APP_VERSION_CODE_KEY = "app_version_code"
|
const val APP_VERSION_CODE_KEY = "app_version_code"
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.adapters
|
|
||||||
|
|
||||||
import com.squareup.moshi.JsonAdapter
|
|
||||||
import com.squareup.moshi.JsonReader
|
|
||||||
import com.squareup.moshi.JsonWriter
|
|
||||||
import com.squareup.moshi.Moshi
|
|
||||||
import com.squareup.moshi.Types
|
|
||||||
import java.lang.reflect.ParameterizedType
|
|
||||||
import java.lang.reflect.Type
|
|
||||||
|
|
||||||
object PairAdapterFactory : JsonAdapter.Factory {
|
|
||||||
|
|
||||||
override fun create(type: Type, annotations: MutableSet<out Annotation>, moshi: Moshi): JsonAdapter<*>? {
|
|
||||||
if (type !is ParameterizedType || List::class.java != type.rawType) return null
|
|
||||||
if (type.actualTypeArguments[0] != Pair::class.java) return null
|
|
||||||
|
|
||||||
val listType = Types.newParameterizedType(List::class.java, Map::class.java, String::class.java)
|
|
||||||
val listAdapter = moshi.adapter<List<Map<String, String>>>(listType)
|
|
||||||
|
|
||||||
val mapType = Types.newParameterizedType(MutableMap::class.java, String::class.java, String::class.java)
|
|
||||||
val mapAdapter = moshi.adapter<Map<String, String>>(mapType)
|
|
||||||
|
|
||||||
return PairAdapter(listAdapter, mapAdapter)
|
|
||||||
}
|
|
||||||
|
|
||||||
private class PairAdapter(
|
|
||||||
private val listAdapter: JsonAdapter<List<Map<String, String>>>,
|
|
||||||
private val mapAdapter: JsonAdapter<Map<String, String>>,
|
|
||||||
) : JsonAdapter<List<Pair<String, String>>>() {
|
|
||||||
|
|
||||||
override fun toJson(writer: JsonWriter, value: List<Pair<String, String>>?) {
|
|
||||||
writer.beginArray()
|
|
||||||
value?.forEach {
|
|
||||||
writer.beginObject()
|
|
||||||
writer.name("first").value(it.first)
|
|
||||||
writer.name("second").value(it.second)
|
|
||||||
writer.endObject()
|
|
||||||
}
|
|
||||||
writer.endArray()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(reader: JsonReader): List<Pair<String, String>>? {
|
|
||||||
return if (reader.peek() == JsonReader.Token.BEGIN_OBJECT) deserializeMoshiMap(reader)
|
|
||||||
else deserializeGsonPair(reader)
|
|
||||||
}
|
|
||||||
|
|
||||||
// for compatibility with 0.21.0
|
|
||||||
private fun deserializeMoshiMap(reader: JsonReader): List<Pair<String, String>>? {
|
|
||||||
val map = mapAdapter.fromJson(reader) ?: return null
|
|
||||||
|
|
||||||
return map.entries.map {
|
|
||||||
it.key to it.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun deserializeGsonPair(reader: JsonReader): List<Pair<String, String>>? {
|
|
||||||
val list = listAdapter.fromJson(reader) ?: return null
|
|
||||||
|
|
||||||
return list.map {
|
|
||||||
require(it.size == 2) {
|
|
||||||
"pair with more or less than two elements: $list"
|
|
||||||
}
|
|
||||||
|
|
||||||
it["first"].orEmpty() to it["second"].orEmpty()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Attendance
|
import io.github.wulkanowy.data.db.entities.Attendance
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -12,5 +12,5 @@ import javax.inject.Singleton
|
||||||
interface AttendanceDao : BaseDao<Attendance> {
|
interface AttendanceDao : BaseDao<Attendance> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
@Query("SELECT * FROM Attendance WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
||||||
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow<List<Attendance>>
|
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe<List<Attendance>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,11 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.AttendanceSummary
|
import io.github.wulkanowy.data.db.entities.AttendanceSummary
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface AttendanceSummaryDao : BaseDao<AttendanceSummary> {
|
interface AttendanceSummaryDao : BaseDao<AttendanceSummary> {
|
||||||
|
|
||||||
@Query("SELECT * FROM AttendanceSummary WHERE diary_id = :diaryId AND student_id = :studentId AND subject_id = :subjectId")
|
@Query("SELECT * FROM AttendanceSummary WHERE diary_id = :diaryId AND student_id = :studentId AND subject_id = :subjectId")
|
||||||
fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): Flow<List<AttendanceSummary>>
|
fun loadAll(diaryId: Int, studentId: Int, subjectId: Int): Maybe<List<AttendanceSummary>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,11 @@ import androidx.room.Update
|
||||||
interface BaseDao<T> {
|
interface BaseDao<T> {
|
||||||
|
|
||||||
@Insert
|
@Insert
|
||||||
suspend fun insertAll(items: List<T>): List<Long>
|
fun insertAll(items: List<T>): List<Long>
|
||||||
|
|
||||||
@Update
|
@Update
|
||||||
suspend fun updateAll(items: List<T>)
|
fun updateAll(items: List<T>)
|
||||||
|
|
||||||
@Delete
|
@Delete
|
||||||
suspend fun deleteAll(items: List<T>)
|
fun deleteAll(items: List<T>)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -12,5 +12,5 @@ import javax.inject.Singleton
|
||||||
interface CompletedLessonsDao : BaseDao<CompletedLesson> {
|
interface CompletedLessonsDao : BaseDao<CompletedLesson> {
|
||||||
|
|
||||||
@Query("SELECT * FROM CompletedLesson WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
@Query("SELECT * FROM CompletedLesson WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
||||||
fun loadAll(studentId: Int, diaryId: Int, from: LocalDate, end: LocalDate): Flow<List<CompletedLesson>>
|
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe<List<CompletedLesson>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Query
|
|
||||||
import io.github.wulkanowy.data.db.entities.Conference
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import javax.inject.Singleton
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
@Singleton
|
|
||||||
interface ConferenceDao : BaseDao<Conference> {
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Conferences WHERE diary_id = :diaryId AND student_id = :studentId")
|
|
||||||
fun loadAll(diaryId: Int, studentId: Int): Flow<List<Conference>>
|
|
||||||
}
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Exam
|
import io.github.wulkanowy.data.db.entities.Exam
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -12,5 +12,5 @@ import javax.inject.Singleton
|
||||||
interface ExamDao : BaseDao<Exam> {
|
interface ExamDao : BaseDao<Exam> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Exams WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
@Query("SELECT * FROM Exams WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
||||||
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow<List<Exam>>
|
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe<List<Exam>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Grade
|
import io.github.wulkanowy.data.db.entities.Grade
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -11,5 +11,6 @@ import javax.inject.Singleton
|
||||||
interface GradeDao : BaseDao<Grade> {
|
interface GradeDao : BaseDao<Grade> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId")
|
@Query("SELECT * FROM Grades WHERE semester_id = :semesterId AND student_id = :studentId")
|
||||||
fun loadAll(semesterId: Int, studentId: Int): Flow<List<Grade>>
|
fun loadAll(semesterId: Int, studentId: Int): Maybe<List<Grade>>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Query
|
|
||||||
import io.github.wulkanowy.data.db.entities.GradePartialStatistics
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
interface GradePartialStatisticsDao : BaseDao<GradePartialStatistics> {
|
|
||||||
|
|
||||||
@Query("SELECT * FROM GradePartialStatistics WHERE student_id = :studentId AND semester_id = :semesterId")
|
|
||||||
fun loadAll(semesterId: Int, studentId: Int): Flow<List<GradePartialStatistics>>
|
|
||||||
}
|
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.GradePointsStatistics
|
import io.github.wulkanowy.data.db.entities.GradePointsStatistics
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -11,8 +11,8 @@ import javax.inject.Singleton
|
||||||
interface GradePointsStatisticsDao : BaseDao<GradePointsStatistics> {
|
interface GradePointsStatisticsDao : BaseDao<GradePointsStatistics> {
|
||||||
|
|
||||||
@Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName")
|
@Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId AND subject = :subjectName")
|
||||||
fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): Flow<List<GradePointsStatistics>>
|
fun loadSubject(semesterId: Int, studentId: Int, subjectName: String): Maybe<List<GradePointsStatistics>>
|
||||||
|
|
||||||
@Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId")
|
@Query("SELECT * FROM GradesPointsStatistics WHERE student_id = :studentId AND semester_id = :semesterId")
|
||||||
fun loadAll(semesterId: Int, studentId: Int): Flow<List<GradePointsStatistics>>
|
fun loadAll(semesterId: Int, studentId: Int): Maybe<List<GradePointsStatistics>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Query
|
|
||||||
import io.github.wulkanowy.data.db.entities.GradeSemesterStatistics
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
interface GradeSemesterStatisticsDao : BaseDao<GradeSemesterStatistics> {
|
|
||||||
|
|
||||||
@Query("SELECT * FROM GradeSemesterStatistics WHERE student_id = :studentId AND semester_id = :semesterId")
|
|
||||||
fun loadAll(semesterId: Int, studentId: Int): Flow<List<GradeSemesterStatistics>>
|
|
||||||
}
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package io.github.wulkanowy.data.db.dao
|
||||||
|
|
||||||
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Query
|
||||||
|
import io.github.wulkanowy.data.db.entities.GradeStatistics
|
||||||
|
import io.reactivex.Maybe
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Dao
|
||||||
|
interface GradeStatisticsDao : BaseDao<GradeStatistics> {
|
||||||
|
|
||||||
|
@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<List<GradeStatistics>>
|
||||||
|
|
||||||
|
@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<List<GradeStatistics>>
|
||||||
|
}
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.GradeSummary
|
import io.github.wulkanowy.data.db.entities.GradeSummary
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -11,5 +11,5 @@ import javax.inject.Singleton
|
||||||
interface GradeSummaryDao : BaseDao<GradeSummary> {
|
interface GradeSummaryDao : BaseDao<GradeSummary> {
|
||||||
|
|
||||||
@Query("SELECT * FROM GradesSummary WHERE student_id = :studentId AND semester_id = :semesterId")
|
@Query("SELECT * FROM GradesSummary WHERE student_id = :studentId AND semester_id = :semesterId")
|
||||||
fun loadAll(semesterId: Int, studentId: Int): Flow<List<GradeSummary>>
|
fun loadAll(semesterId: Int, studentId: Int): Maybe<List<GradeSummary>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Homework
|
import io.github.wulkanowy.data.db.entities.Homework
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -12,5 +12,5 @@ import javax.inject.Singleton
|
||||||
interface HomeworkDao : BaseDao<Homework> {
|
interface HomeworkDao : BaseDao<Homework> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Homework WHERE semester_id = :semesterId AND student_id = :studentId AND date >= :from AND date <= :end")
|
@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): Flow<List<Homework>>
|
fun loadAll(semesterId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe<List<Homework>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -12,5 +12,5 @@ import javax.inject.Singleton
|
||||||
interface LuckyNumberDao : BaseDao<LuckyNumber> {
|
interface LuckyNumberDao : BaseDao<LuckyNumber> {
|
||||||
|
|
||||||
@Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date")
|
@Query("SELECT * FROM LuckyNumbers WHERE student_id = :studentId AND date = :date")
|
||||||
fun load(studentId: Int, date: LocalDate): Flow<LuckyNumber?>
|
fun load(studentId: Int, date: LocalDate): Maybe<LuckyNumber>
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,5 +9,5 @@ import io.github.wulkanowy.data.db.entities.MessageAttachment
|
||||||
interface MessageAttachmentDao : BaseDao<MessageAttachment> {
|
interface MessageAttachmentDao : BaseDao<MessageAttachment> {
|
||||||
|
|
||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
suspend fun insertAttachments(items: List<MessageAttachment>): List<Long>
|
fun insertAttachments(items: List<MessageAttachment>): List<Long>
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,15 +5,19 @@ import androidx.room.Query
|
||||||
import androidx.room.Transaction
|
import androidx.room.Transaction
|
||||||
import io.github.wulkanowy.data.db.entities.Message
|
import io.github.wulkanowy.data.db.entities.Message
|
||||||
import io.github.wulkanowy.data.db.entities.MessageWithAttachment
|
import io.github.wulkanowy.data.db.entities.MessageWithAttachment
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
|
import io.reactivex.Single
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface MessagesDao : BaseDao<Message> {
|
interface MessagesDao : BaseDao<Message> {
|
||||||
|
|
||||||
@Transaction
|
@Transaction
|
||||||
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId")
|
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId")
|
||||||
fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow<MessageWithAttachment?>
|
fun loadMessageWithAttachment(studentId: Int, messageId: Int): Single<MessageWithAttachment>
|
||||||
|
|
||||||
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder ORDER BY date DESC")
|
@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): Flow<List<Message>>
|
fun loadAll(studentId: Int, folder: Int): Maybe<List<Message>>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND removed = 1 ORDER BY date DESC")
|
||||||
|
fun loadDeleted(studentId: Int): Maybe<List<Message>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,11 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.MobileDevice
|
import io.github.wulkanowy.data.db.entities.MobileDevice
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface MobileDeviceDao : BaseDao<MobileDevice> {
|
interface MobileDeviceDao : BaseDao<MobileDevice> {
|
||||||
|
|
||||||
@Query("SELECT * FROM MobileDevices WHERE student_id = :userLoginId ORDER BY date DESC")
|
@Query("SELECT * FROM MobileDevices WHERE student_id = :studentId ORDER BY date DESC")
|
||||||
fun loadAll(userLoginId: Int): Flow<List<MobileDevice>>
|
fun loadAll(studentId: Int): Maybe<List<MobileDevice>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Note
|
import io.github.wulkanowy.data.db.entities.Note
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -11,5 +11,5 @@ import javax.inject.Singleton
|
||||||
interface NoteDao : BaseDao<Note> {
|
interface NoteDao : BaseDao<Note> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Notes WHERE student_id = :studentId")
|
@Query("SELECT * FROM Notes WHERE student_id = :studentId")
|
||||||
fun loadAll(studentId: Int): Flow<List<Note>>
|
fun loadAll(studentId: Int): Maybe<List<Note>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,13 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Recipient
|
import io.github.wulkanowy.data.db.entities.Recipient
|
||||||
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Dao
|
@Dao
|
||||||
interface RecipientDao : BaseDao<Recipient> {
|
interface RecipientDao : BaseDao<Recipient> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Recipients WHERE student_id = :userLoginId AND unit_id = :unitId AND role = :role")
|
@Query("SELECT * FROM Recipients WHERE student_id = :studentId AND role = :role AND unit_id = :unitId")
|
||||||
suspend fun loadAll(userLoginId: Int, unitId: Int, role: Int): List<Recipient>
|
fun load(studentId: Int, role: Int, unitId: Int): Maybe<List<Recipient>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.ReportingUnit
|
import io.github.wulkanowy.data.db.entities.ReportingUnit
|
||||||
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -10,8 +11,8 @@ import javax.inject.Singleton
|
||||||
interface ReportingUnitDao : BaseDao<ReportingUnit> {
|
interface ReportingUnitDao : BaseDao<ReportingUnit> {
|
||||||
|
|
||||||
@Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId")
|
@Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId")
|
||||||
suspend fun load(studentId: Int): List<ReportingUnit>
|
fun load(studentId: Int): Maybe<List<ReportingUnit>>
|
||||||
|
|
||||||
@Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId AND real_id = :unitId")
|
@Query("SELECT * FROM ReportingUnits WHERE student_id = :studentId AND real_id = :unitId")
|
||||||
suspend fun loadOne(studentId: Int, unitId: Int): ReportingUnit?
|
fun loadOne(studentId: Int, unitId: Int): Maybe<ReportingUnit>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.School
|
import io.github.wulkanowy.data.db.entities.School
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -11,5 +11,5 @@ import javax.inject.Singleton
|
||||||
interface SchoolDao : BaseDao<School> {
|
interface SchoolDao : BaseDao<School> {
|
||||||
|
|
||||||
@Query("SELECT * FROM School WHERE student_id = :studentId AND class_id = :classId")
|
@Query("SELECT * FROM School WHERE student_id = :studentId AND class_id = :classId")
|
||||||
fun load(studentId: Int, classId: Int): Flow<School?>
|
fun load(studentId: Int, classId: Int): Maybe<School>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,15 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
package io.github.wulkanowy.data.db.dao
|
||||||
|
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Insert
|
|
||||||
import androidx.room.OnConflictStrategy
|
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Semester
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Dao
|
@Dao
|
||||||
interface SemesterDao : BaseDao<Semester> {
|
interface SemesterDao : BaseDao<Semester> {
|
||||||
|
|
||||||
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
|
||||||
suspend fun insertSemesters(items: List<Semester>): List<Long>
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Semesters WHERE student_id = :studentId AND class_id = :classId")
|
@Query("SELECT * FROM Semesters WHERE student_id = :studentId AND class_id = :classId")
|
||||||
suspend fun loadAll(studentId: Int, classId: Int): List<Semester>
|
fun loadAll(studentId: Int, classId: Int): Maybe<List<Semester>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,11 +5,8 @@ import androidx.room.Delete
|
||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.OnConflictStrategy.ABORT
|
import androidx.room.OnConflictStrategy.ABORT
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import androidx.room.Transaction
|
|
||||||
import androidx.room.Update
|
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
import io.github.wulkanowy.data.db.entities.StudentNick
|
import io.reactivex.Maybe
|
||||||
import io.github.wulkanowy.data.db.entities.StudentWithSemesters
|
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -17,30 +14,23 @@ import javax.inject.Singleton
|
||||||
interface StudentDao {
|
interface StudentDao {
|
||||||
|
|
||||||
@Insert(onConflict = ABORT)
|
@Insert(onConflict = ABORT)
|
||||||
suspend fun insertAll(student: List<Student>): List<Long>
|
fun insertAll(student: List<Student>): List<Long>
|
||||||
|
|
||||||
@Delete
|
@Delete
|
||||||
suspend fun delete(student: Student)
|
fun delete(student: Student)
|
||||||
|
|
||||||
@Update(entity = Student::class)
|
|
||||||
suspend fun update(studentNick: StudentNick)
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Students WHERE is_current = 1")
|
@Query("SELECT * FROM Students WHERE is_current = 1")
|
||||||
suspend fun loadCurrent(): Student?
|
fun loadCurrent(): Maybe<Student>
|
||||||
|
|
||||||
@Query("SELECT * FROM Students WHERE id = :id")
|
@Query("SELECT * FROM Students WHERE id = :id")
|
||||||
suspend fun loadById(id: Int): Student?
|
fun loadById(id: Int): Maybe<Student>
|
||||||
|
|
||||||
@Query("SELECT * FROM Students")
|
@Query("SELECT * FROM Students")
|
||||||
suspend fun loadAll(): List<Student>
|
fun loadAll(): Maybe<List<Student>>
|
||||||
|
|
||||||
@Transaction
|
|
||||||
@Query("SELECT * FROM Students")
|
|
||||||
suspend fun loadStudentsWithSemesters(): List<StudentWithSemesters>
|
|
||||||
|
|
||||||
@Query("UPDATE Students SET is_current = 1 WHERE id = :id")
|
@Query("UPDATE Students SET is_current = 1 WHERE id = :id")
|
||||||
suspend fun updateCurrent(id: Long)
|
fun updateCurrent(id: Long)
|
||||||
|
|
||||||
@Query("UPDATE Students SET is_current = 0")
|
@Query("UPDATE Students SET is_current = 0")
|
||||||
suspend fun resetCurrent()
|
fun resetCurrent()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Query
|
|
||||||
import io.github.wulkanowy.data.db.entities.StudentInfo
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import javax.inject.Singleton
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Dao
|
|
||||||
interface StudentInfoDao : BaseDao<StudentInfo> {
|
|
||||||
|
|
||||||
@Query("SELECT * FROM StudentInfo WHERE student_id = :studentId")
|
|
||||||
fun loadStudentInfo(studentId: Int): Flow<StudentInfo?>
|
|
||||||
}
|
|
|
@ -3,11 +3,11 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Subject
|
import io.github.wulkanowy.data.db.entities.Subject
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface SubjectDao : BaseDao<Subject> {
|
interface SubjectDao : BaseDao<Subject> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Subjects WHERE diary_id = :diaryId AND student_id = :studentId")
|
@Query("SELECT * FROM Subjects WHERE diary_id = :diaryId AND student_id = :studentId")
|
||||||
fun loadAll(diaryId: Int, studentId: Int): Flow<List<Subject>>
|
fun loadAll(diaryId: Int, studentId: Int): Maybe<List<Subject>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Teacher
|
import io.github.wulkanowy.data.db.entities.Teacher
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -11,5 +11,5 @@ import javax.inject.Singleton
|
||||||
interface TeacherDao : BaseDao<Teacher> {
|
interface TeacherDao : BaseDao<Teacher> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Teachers WHERE student_id = :studentId AND class_id = :classId")
|
@Query("SELECT * FROM Teachers WHERE student_id = :studentId AND class_id = :classId")
|
||||||
fun loadAll(studentId: Int, classId: Int): Flow<List<Teacher>>
|
fun loadAll(studentId: Int, classId: Int): Maybe<List<Teacher>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Query
|
|
||||||
import io.github.wulkanowy.data.db.entities.TimetableAdditional
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import java.time.LocalDate
|
|
||||||
import javax.inject.Singleton
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
@Singleton
|
|
||||||
interface TimetableAdditionalDao : BaseDao<TimetableAdditional> {
|
|
||||||
|
|
||||||
@Query("SELECT * FROM TimetableAdditional WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
|
||||||
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow<List<TimetableAdditional>>
|
|
||||||
}
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.dao
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.github.wulkanowy.data.db.entities.Timetable
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
import kotlinx.coroutines.flow.Flow
|
import io.reactivex.Maybe
|
||||||
import java.time.LocalDate
|
import org.threeten.bp.LocalDate
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
@ -12,5 +12,5 @@ import javax.inject.Singleton
|
||||||
interface TimetableDao : BaseDao<Timetable> {
|
interface TimetableDao : BaseDao<Timetable> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
@Query("SELECT * FROM Timetable WHERE diary_id = :diaryId AND student_id = :studentId AND date >= :from AND date <= :end")
|
||||||
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Flow<List<Timetable>>
|
fun loadAll(diaryId: Int, studentId: Int, from: LocalDate, end: LocalDate): Maybe<List<Timetable>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "Attendance")
|
@Entity(tableName = "Attendance")
|
||||||
data class Attendance(
|
data class Attendance(
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.Month
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.Month
|
|
||||||
|
|
||||||
@Entity(tableName = "AttendanceSummary")
|
@Entity(tableName = "AttendanceSummary")
|
||||||
data class AttendanceSummary(
|
data class AttendanceSummary(
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "CompletedLesson")
|
@Entity(tableName = "CompletedLesson")
|
||||||
data class CompletedLesson(
|
data class CompletedLesson(
|
||||||
|
|
|
@ -1,35 +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
|
|
||||||
import java.time.LocalDateTime
|
|
||||||
|
|
||||||
@Entity(tableName = "Conferences")
|
|
||||||
data class Conference(
|
|
||||||
|
|
||||||
@ColumnInfo(name = "student_id")
|
|
||||||
val studentId: Int,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "diary_id")
|
|
||||||
val diaryId: Int,
|
|
||||||
|
|
||||||
val title: String,
|
|
||||||
|
|
||||||
val subject: String,
|
|
||||||
|
|
||||||
val agenda: String,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "present_on_conference")
|
|
||||||
val presentOnConference: String,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "conference_id")
|
|
||||||
val conferenceId: Int,
|
|
||||||
|
|
||||||
val date: LocalDateTime
|
|
||||||
) : Serializable {
|
|
||||||
|
|
||||||
@PrimaryKey(autoGenerate = true)
|
|
||||||
var id: Long = 0
|
|
||||||
}
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "Exams")
|
@Entity(tableName = "Exams")
|
||||||
data class Exam(
|
data class Exam(
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "Grades")
|
@Entity(tableName = "Grades")
|
||||||
data class Grade(
|
data class Grade(
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.entities
|
|
||||||
|
|
||||||
import androidx.room.ColumnInfo
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity(tableName = "GradePartialStatistics")
|
|
||||||
data class GradePartialStatistics(
|
|
||||||
|
|
||||||
@ColumnInfo(name = "student_id")
|
|
||||||
val studentId: Int,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "semester_id")
|
|
||||||
val semesterId: Int,
|
|
||||||
|
|
||||||
val subject: String,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "class_average")
|
|
||||||
val classAverage: String,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "student_average")
|
|
||||||
val studentAverage: String,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "class_amounts")
|
|
||||||
val classAmounts: List<Int>,
|
|
||||||
|
|
||||||
@ColumnInfo(name = "student_amounts")
|
|
||||||
val studentAmounts: List<Int>
|
|
||||||
|
|
||||||
) {
|
|
||||||
@PrimaryKey(autoGenerate = true)
|
|
||||||
var id: Long = 0
|
|
||||||
}
|
|
|
@ -4,8 +4,8 @@ import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
@Entity(tableName = "GradeSemesterStatistics")
|
@Entity(tableName = "GradesStatistics")
|
||||||
data class GradeSemesterStatistics(
|
data class GradeStatistics(
|
||||||
|
|
||||||
@ColumnInfo(name = "student_id")
|
@ColumnInfo(name = "student_id")
|
||||||
val studentId: Int,
|
val studentId: Int,
|
||||||
|
@ -15,14 +15,13 @@ data class GradeSemesterStatistics(
|
||||||
|
|
||||||
val subject: String,
|
val subject: String,
|
||||||
|
|
||||||
val amounts: List<Int>,
|
val grade: Int,
|
||||||
|
|
||||||
@ColumnInfo(name = "student_grade")
|
val amount: Int,
|
||||||
val studentGrade: Int
|
|
||||||
|
@ColumnInfo(name = "is_semester")
|
||||||
|
val semester: Boolean
|
||||||
) {
|
) {
|
||||||
@PrimaryKey(autoGenerate = true)
|
@PrimaryKey(autoGenerate = true)
|
||||||
var id: Long = 0
|
var id: Long = 0
|
||||||
|
|
||||||
@Transient
|
|
||||||
var average: String = ""
|
|
||||||
}
|
}
|
|
@ -3,7 +3,7 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import java.time.LocalDateTime
|
import org.threeten.bp.LocalDateTime
|
||||||
|
|
||||||
@Entity(tableName = "GradesSummary")
|
@Entity(tableName = "GradesSummary")
|
||||||
data class GradeSummary(
|
data class GradeSummary(
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "Homework")
|
@Entity(tableName = "Homework")
|
||||||
data class Homework(
|
data class Homework(
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "LuckyNumbers")
|
@Entity(tableName = "LuckyNumbers")
|
||||||
data class LuckyNumber (
|
data class LuckyNumber (
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDateTime
|
|
||||||
|
|
||||||
@Entity(tableName = "Messages")
|
@Entity(tableName = "Messages")
|
||||||
data class Message(
|
data class Message(
|
||||||
|
@ -29,6 +29,8 @@ data class Message(
|
||||||
|
|
||||||
val subject: String,
|
val subject: String,
|
||||||
|
|
||||||
|
var content: String,
|
||||||
|
|
||||||
val date: LocalDateTime,
|
val date: LocalDateTime,
|
||||||
|
|
||||||
@ColumnInfo(name = "folder_id")
|
@ColumnInfo(name = "folder_id")
|
||||||
|
@ -36,6 +38,12 @@ data class Message(
|
||||||
|
|
||||||
var unread: Boolean,
|
var unread: Boolean,
|
||||||
|
|
||||||
|
@ColumnInfo(name = "unread_by")
|
||||||
|
val unreadBy: Int,
|
||||||
|
|
||||||
|
@ColumnInfo(name = "read_by")
|
||||||
|
val readBy: Int,
|
||||||
|
|
||||||
val removed: Boolean,
|
val removed: Boolean,
|
||||||
|
|
||||||
@ColumnInfo(name = "has_attachments")
|
@ColumnInfo(name = "has_attachments")
|
||||||
|
@ -47,12 +55,4 @@ data class Message(
|
||||||
|
|
||||||
@ColumnInfo(name = "is_notified")
|
@ColumnInfo(name = "is_notified")
|
||||||
var isNotified: Boolean = true
|
var isNotified: Boolean = true
|
||||||
|
|
||||||
@ColumnInfo(name = "unread_by")
|
|
||||||
var unreadBy: Int = 0
|
|
||||||
|
|
||||||
@ColumnInfo(name = "read_by")
|
|
||||||
var readBy: Int = 0
|
|
||||||
|
|
||||||
var content: String = ""
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,14 +3,14 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDateTime
|
|
||||||
|
|
||||||
@Entity(tableName = "MobileDevices")
|
@Entity(tableName = "MobileDevices")
|
||||||
data class MobileDevice(
|
data class MobileDevice(
|
||||||
|
|
||||||
@ColumnInfo(name = "student_id")
|
@ColumnInfo(name = "student_id")
|
||||||
val userLoginId: Int,
|
val studentId: Int,
|
||||||
|
|
||||||
@ColumnInfo(name = "device_id")
|
@ColumnInfo(name = "device_id")
|
||||||
val deviceId: Int,
|
val deviceId: Int,
|
||||||
|
|
|
@ -3,8 +3,8 @@ package io.github.wulkanowy.data.db.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "Notes")
|
@Entity(tableName = "Notes")
|
||||||
data class Note(
|
data class Note(
|
||||||
|
|
|
@ -9,7 +9,7 @@ import java.io.Serializable
|
||||||
data class Recipient(
|
data class Recipient(
|
||||||
|
|
||||||
@ColumnInfo(name = "student_id")
|
@ColumnInfo(name = "student_id")
|
||||||
val userLoginId: Int,
|
val studentId: Int,
|
||||||
|
|
||||||
@ColumnInfo(name = "real_id")
|
@ColumnInfo(name = "real_id")
|
||||||
val realId: String,
|
val realId: String,
|
||||||
|
|
|
@ -12,7 +12,7 @@ data class ReportingUnit(
|
||||||
val studentId: Int,
|
val studentId: Int,
|
||||||
|
|
||||||
@ColumnInfo(name = "real_id")
|
@ColumnInfo(name = "real_id")
|
||||||
val unitId: Int,
|
val realId: Int,
|
||||||
|
|
||||||
@ColumnInfo(name = "short")
|
@ColumnInfo(name = "short")
|
||||||
val shortName: String,
|
val shortName: String,
|
||||||
|
|
|
@ -4,8 +4,7 @@ import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.Index
|
import androidx.room.Index
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import java.io.Serializable
|
import org.threeten.bp.LocalDate
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
@Entity(tableName = "Semesters", indices = [Index(value = ["student_id", "diary_id", "semester_id"], unique = true)])
|
@Entity(tableName = "Semesters", indices = [Index(value = ["student_id", "diary_id", "semester_id"], unique = true)])
|
||||||
data class Semester(
|
data class Semester(
|
||||||
|
@ -37,7 +36,7 @@ data class Semester(
|
||||||
|
|
||||||
@ColumnInfo(name = "unit_id")
|
@ColumnInfo(name = "unit_id")
|
||||||
val unitId: Int
|
val unitId: Int
|
||||||
): Serializable {
|
) {
|
||||||
|
|
||||||
@PrimaryKey(autoGenerate = true)
|
@PrimaryKey(autoGenerate = true)
|
||||||
var id: Long = 0
|
var id: Long = 0
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue