Compare commits
No commits in common. "0.25.0" and "0.15.0" have entirely different histories.
750 changed files with 12460 additions and 45253 deletions
|
@ -1,3 +1,3 @@
|
||||||
component_depth: 10
|
component_depth: 8
|
||||||
languages:
|
languages:
|
||||||
- kotlin
|
- kotlin
|
||||||
|
|
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;
|
|
5
.gitignore
vendored
5
.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
|
||||||
|
@ -64,7 +63,6 @@ captures/
|
||||||
.idea/dynamic.xml
|
.idea/dynamic.xml
|
||||||
.idea/uiDesigner.xml
|
.idea/uiDesigner.xml
|
||||||
.idea/runConfigurations.xml
|
.idea/runConfigurations.xml
|
||||||
.idea/discord.xml
|
|
||||||
|
|
||||||
# Keystore files
|
# Keystore files
|
||||||
*.jks
|
*.jks
|
||||||
|
@ -114,6 +112,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
|
|
||||||
|
|
29
.idea/codeStyles/Project.xml
generated
29
.idea/codeStyles/Project.xml
generated
|
@ -1,26 +1,29 @@
|
||||||
<component name="ProjectCodeStyleConfiguration">
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
<code_scheme name="Project" version="173">
|
<code_scheme name="Project" version="173">
|
||||||
<option name="LINE_SEPARATOR" value=" " />
|
<option name="LINE_SEPARATOR" value=" " />
|
||||||
|
<AndroidXmlCodeStyleSettings>
|
||||||
|
<option name="ARRANGEMENT_SETTINGS_MIGRATED_TO_191" value="true" />
|
||||||
|
</AndroidXmlCodeStyleSettings>
|
||||||
<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 +137,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>
|
||||||
|
|
40
.travis.yml
40
.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.2
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
|
@ -14,7 +14,7 @@ cache:
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- develop
|
- develop
|
||||||
- 0.24.0
|
- 0.15.0
|
||||||
|
|
||||||
android:
|
android:
|
||||||
licenses:
|
licenses:
|
||||||
|
@ -28,40 +28,40 @@ 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 lintPlayRelease -x fabricGenerateResourcesPlayRelease --stacktrace --daemon
|
||||||
- ./gradlew -Pcoverage connectedFdroidDebugAndroidTest --stacktrace --daemon
|
- ./gradlew testPlayDebugUnitTest -x fabricGenerateResourcesPlay --stacktrace --daemon
|
||||||
- ./gradlew -Pcoverage jacocoTestReport --stacktrace --daemon
|
- ./gradlew createFdroidDebugCoverageReport --stacktrace --daemon
|
||||||
|
- ./gradlew jacocoTestReport --stacktrace --daemon
|
||||||
|
- if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else
|
||||||
|
git fetch --unshallow;
|
||||||
|
./gradlew sonarqube -x test -x lint -x fabricGenerateResourcesPlayRelease -x fabricGenerateResourcesFdroidRelease -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} --stacktrace --daemon;
|
||||||
|
fi
|
||||||
- |
|
- |
|
||||||
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 -PenableCrashlytics --stacktrace;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
|
|
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)
|
||||||
|
|
||||||
|
|
166
app/build.gradle
166
app/build.gradle
|
@ -1,38 +1,34 @@
|
||||||
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: 'kotlin-android-extensions'
|
||||||
apply plugin: 'com.google.firebase.crashlytics'
|
apply plugin: 'io.fabric'
|
||||||
apply plugin: 'com.github.triplet.play'
|
apply plugin: 'com.github.triplet.play'
|
||||||
apply plugin: 'com.mikepenz.aboutlibraries.plugin'
|
|
||||||
apply from: 'jacoco.gradle'
|
apply from: 'jacoco.gradle'
|
||||||
apply from: 'sonarqube.gradle'
|
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.2'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "io.github.wulkanowy"
|
applicationId "io.github.wulkanowy"
|
||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 17
|
minSdkVersion 16
|
||||||
targetSdkVersion 30
|
targetSdkVersion 29
|
||||||
versionCode 82
|
versionCode 52
|
||||||
versionName "0.25.0"
|
versionName "0.15.0"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
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")
|
fabric_api_key : System.getenv("FABRIC_API_KEY") ?: "null",
|
||||||
|
crashlytics_enabled: project.hasProperty("enableCrashlytics")
|
||||||
]
|
]
|
||||||
javaCompileOptions {
|
javaCompileOptions {
|
||||||
annotationProcessorOptions {
|
annotationProcessorOptions {
|
||||||
arguments += [
|
arguments = [
|
||||||
"room.schemaLocation": "$projectDir/schemas".toString(),
|
"room.schemaLocation": "$projectDir/schemas".toString(),
|
||||||
"room.incremental" : "true"
|
"room.incremental" : "true"
|
||||||
]
|
]
|
||||||
|
@ -55,73 +51,55 @@ android {
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
|
buildConfigField "boolean", "CRASHLYTICS_ENABLED", "true"
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
shrinkResources true
|
shrinkResources true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
}
|
}
|
||||||
debug {
|
debug {
|
||||||
resValue "string", "app_name", "Wulkanowy DEV " + defaultConfig.versionCode
|
buildConfigField "boolean", "CRASHLYTICS_ENABLED", project.hasProperty("enableCrashlytics") ? "true" : "false"
|
||||||
applicationIdSuffix ".dev"
|
applicationIdSuffix ".dev"
|
||||||
versionNameSuffix "-dev"
|
versionNameSuffix "-dev"
|
||||||
testCoverageEnabled = project.hasProperty('coverage')
|
testCoverageEnabled = true
|
||||||
ext.enableCrashlytics = project.hasProperty("enableFirebase")
|
ext.enableCrashlytics = project.hasProperty("enableCrashlytics")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
buildConfigField "boolean", "CRASHLYTICS_ENABLED", "false"
|
||||||
dimension "platform"
|
dimension "platform"
|
||||||
manifestPlaceholders = [
|
|
||||||
install_channel: "F-Droid"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildFeatures {
|
|
||||||
viewBinding = true
|
|
||||||
}
|
|
||||||
|
|
||||||
lintOptions {
|
lintOptions {
|
||||||
disable 'HardwareIds'
|
disable 'HardwareIds'
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
exclude 'META-INF/library_release.kotlin_module'
|
exclude 'META-INF/library_release.kotlin_module'
|
||||||
exclude 'META-INF/library-core_release.kotlin_module'
|
exclude 'META-INF/library-core_release.kotlin_module'
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
aboutLibraries {
|
androidExtensions {
|
||||||
configPath = "app/src/main/res/raw"
|
experimental = true
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
play {
|
play {
|
||||||
|
@ -129,103 +107,97 @@ 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.0"
|
||||||
work_hilt = "1.0.0-alpha03"
|
room = "2.2.3"
|
||||||
room = "2.3.0-beta01"
|
dagger = "2.25.4"
|
||||||
chucker = "3.4.0"
|
chucker = "2.0.4"
|
||||||
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.15.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-rc01"
|
||||||
|
|
||||||
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.1.0"
|
||||||
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.0"
|
||||||
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"
|
||||||
|
|
||||||
implementation "androidx.preference:preference-ktx:1.1.1"
|
implementation "androidx.preference:preference-ktx:1.1.0"
|
||||||
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-alpha03"
|
||||||
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-rc02"
|
||||||
implementation "com.github.wulkanowy:material-chips-input:2.1.1"
|
implementation "com.github.wulkanowy:material-chips-input:2.0.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 "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 "eu.davidea:flexible-adapter:5.1.0"
|
||||||
|
implementation "eu.davidea:flexible-adapter-ui:1.0.0"
|
||||||
implementation "com.aurelhubert:ahbottomnavigation:2.3.4"
|
implementation "com.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.1.0"
|
||||||
|
|
||||||
implementation "com.squareup.moshi:moshi:$moshi"
|
implementation "com.github.pwittchen:reactivenetwork-rx2:3.0.6"
|
||||||
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.17"
|
||||||
|
|
||||||
|
implementation "com.google.code.gson:gson:2.8.6"
|
||||||
|
implementation "com.jakewharton.threetenabp:threetenabp:1.2.2"
|
||||||
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 "com.mikepenz:aboutlibraries-core:7.1.0"
|
||||||
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.github.wulkanowy:AppKillerManager:3.0.0"
|
|
||||||
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
|
||||||
|
|
||||||
playImplementation platform('com.google.firebase:firebase-bom:26.4.0')
|
implementation("io.coil-kt:coil:0.9.2")
|
||||||
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
|
||||||
playImplementation 'com.google.firebase:firebase-inappmessaging-display-ktx'
|
|
||||||
playImplementation "com.google.firebase:firebase-inappmessaging-ktx"
|
|
||||||
playImplementation 'com.google.firebase:firebase-messaging:'
|
|
||||||
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'
|
|
||||||
|
|
||||||
hmsImplementation 'com.huawei.hms:hianalytics:5.1.0.301'
|
playImplementation "com.google.firebase:firebase-core:17.2.2"
|
||||||
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.5.0.200'
|
playImplementation "com.crashlytics.sdk.android:crashlytics:2.10.1"
|
||||||
|
|
||||||
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
releaseImplementation "fr.o80.chucker:library-no-op:$chucker"
|
||||||
|
|
||||||
debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker"
|
debugImplementation "fr.o80.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.1"
|
||||||
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
testImplementation "org.mockito:mockito-inline:3.2.4"
|
||||||
|
|
||||||
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.2.4"
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
|
14
app/proguard-rules.pro
vendored
14
app/proguard-rules.pro
vendored
|
@ -30,16 +30,16 @@
|
||||||
-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.** { *; }
|
||||||
|
|
||||||
|
|
||||||
#Config for Material Components
|
#Config for Material Components
|
||||||
-keep class com.google.android.material.tabs.** { *; }
|
-keep class com.google.android.material.tabs.** { *; }
|
||||||
|
|
||||||
|
|
||||||
#Config for About Libraries
|
|
||||||
-keep class .R
|
|
||||||
-keep class **.R$* {
|
|
||||||
<fields>;
|
|
||||||
}
|
|
||||||
|
|
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
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,11 @@ 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.now
|
||||||
|
import org.threeten.bp.LocalDate.of
|
||||||
import kotlin.test.assertFalse
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@ -27,7 +27,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 +61,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)
|
||||||
|
|
||||||
|
@ -104,45 +104,45 @@ class Migration13Test : AbstractMigrationTest() {
|
||||||
val db = helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
val db = helper.runMigrationsAndValidate(dbName, 13, true, Migration13())
|
||||||
|
|
||||||
val semesters1 = getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 1 AND class_id = 5")
|
val semesters1 = getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 1 AND class_id = 5")
|
||||||
assertTrue { semesters1.single { it.second }.second }
|
assertTrue { semesters1.single { it.isCurrent }.isCurrent }
|
||||||
semesters1[0].run {
|
semesters1[0].run {
|
||||||
assertFalse(second)
|
assertFalse(isCurrent)
|
||||||
assertEquals(1, first.semesterId)
|
assertEquals(1, semesterId)
|
||||||
assertEquals(1, first.diaryId)
|
assertEquals(1, diaryId)
|
||||||
}
|
}
|
||||||
semesters1[2].run {
|
semesters1[2].run {
|
||||||
assertFalse(second)
|
assertFalse(isCurrent)
|
||||||
assertEquals(3, first.semesterId)
|
assertEquals(3, semesterId)
|
||||||
assertEquals(2, first.diaryId)
|
assertEquals(2, diaryId)
|
||||||
}
|
}
|
||||||
semesters1[3].run {
|
semesters1[3].run {
|
||||||
assertTrue(second)
|
assertTrue(isCurrent)
|
||||||
assertEquals(4, first.semesterId)
|
assertEquals(4, semesterId)
|
||||||
assertEquals(2, first.diaryId)
|
assertEquals(2, diaryId)
|
||||||
}
|
}
|
||||||
|
|
||||||
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { semesters ->
|
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let {
|
||||||
assertTrue { semesters.single { it.second }.second }
|
assertTrue { it.single { it.isCurrent }.isCurrent }
|
||||||
assertEquals(1970, semesters[0].first.schoolYear)
|
assertEquals(1970, it[0].schoolYear)
|
||||||
assertEquals(of(1970, 1, 1), semesters[0].first.end)
|
assertEquals(of(1970, 1, 1), it[0].end)
|
||||||
assertEquals(of(1970, 1, 1), semesters[0].first.start)
|
assertEquals(of(1970, 1, 1), it[0].start)
|
||||||
assertFalse(semesters[0].second)
|
assertFalse(it[0].isCurrent)
|
||||||
assertFalse(semesters[1].second)
|
assertFalse(it[1].isCurrent)
|
||||||
assertFalse(semesters[2].second)
|
assertFalse(it[2].isCurrent)
|
||||||
assertTrue(semesters[3].second)
|
assertTrue(it[3].isCurrent)
|
||||||
}
|
}
|
||||||
|
|
||||||
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let { semesters ->
|
getSemesters(db, "SELECT * FROM Semesters WHERE student_id = 2 AND class_id = 5").let {
|
||||||
assertTrue { semesters.single { it.second }.second }
|
assertTrue { it.single { it.isCurrent }.isCurrent }
|
||||||
assertFalse(semesters[0].second)
|
assertFalse(it[0].isCurrent)
|
||||||
assertFalse(semesters[1].second)
|
assertFalse(it[1].isCurrent)
|
||||||
assertFalse(semesters[2].second)
|
assertFalse(it[2].isCurrent)
|
||||||
assertTrue(semesters[3].second)
|
assertTrue(it[3].isCurrent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getSemesters(db: SupportSQLiteDatabase, query: String): List<Pair<Semester, Boolean>> {
|
private fun getSemesters(db: SupportSQLiteDatabase, query: String): List<Semester> {
|
||||||
val semesters = mutableListOf<Pair<Semester, Boolean>>()
|
val semesters = mutableListOf<Semester>()
|
||||||
|
|
||||||
val cursor = db.query(query)
|
val cursor = db.query(query)
|
||||||
if (cursor.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
|
@ -153,12 +153,13 @@ class Migration13Test : AbstractMigrationTest() {
|
||||||
diaryName = cursor.getString(3),
|
diaryName = cursor.getString(3),
|
||||||
semesterId = cursor.getInt(4),
|
semesterId = cursor.getInt(4),
|
||||||
semesterName = cursor.getInt(5),
|
semesterName = cursor.getInt(5),
|
||||||
|
isCurrent = cursor.getInt(6) == 1,
|
||||||
classId = cursor.getInt(7),
|
classId = cursor.getInt(7),
|
||||||
unitId = cursor.getInt(8),
|
unitId = cursor.getInt(8),
|
||||||
schoolYear = cursor.getInt(9),
|
schoolYear = cursor.getInt(9),
|
||||||
start = Converters().timestampToDate(cursor.getLong(10))!!,
|
start = Converters().timestampToDate(cursor.getLong(10))!!,
|
||||||
end = Converters().timestampToDate(cursor.getLong(11))!!
|
end = Converters().timestampToDate(cursor.getLong(11))!!
|
||||||
) to (cursor.getInt(6) == 1))
|
))
|
||||||
} while (cursor.moveToNext())
|
} while (cursor.moveToNext())
|
||||||
}
|
}
|
||||||
return semesters.toList()
|
return semesters.toList()
|
||||||
|
|
|
@ -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,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,53 @@
|
||||||
|
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 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(
|
||||||
|
Attendance(1, 2, 3, LocalDate.of(2018, 9, 10), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.ACCEPTED.name),
|
||||||
|
Attendance(1, 2, 3, LocalDate.of(2018, 9, 14), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.WAITING.name),
|
||||||
|
Attendance(1, 2, 3, LocalDate.of(2018, 9, 17), 0, "", "", false, false, false, false, false, false, false, SentExcuseStatus.ACCEPTED.name)
|
||||||
|
))
|
||||||
|
|
||||||
|
val attendance = attendanceLocal
|
||||||
|
.getAttendance(Semester(1, 2, "", 1, 3, 2019, true, now(), now(), 1, 1),
|
||||||
|
LocalDate.of(2018, 9, 10),
|
||||||
|
LocalDate.of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, attendance.size)
|
||||||
|
assertEquals(attendance[0].date, LocalDate.of(2018, 9, 10))
|
||||||
|
assertEquals(attendance[1].date, LocalDate.of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.completedlessons
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.CompletedLesson
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class CompletedLessonsLocalTest {
|
||||||
|
|
||||||
|
private lateinit var completedLessonsLocal: CompletedLessonsLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
completedLessonsLocal = CompletedLessonsLocal(testDb.completedLessonsDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
completedLessonsLocal.saveCompletedLessons(listOf(
|
||||||
|
getCompletedLesson(LocalDate.of(2018, 9, 10), 1),
|
||||||
|
getCompletedLesson(LocalDate.of(2018, 9, 14), 2),
|
||||||
|
getCompletedLesson(LocalDate.of(2018, 9, 17), 3)
|
||||||
|
))
|
||||||
|
|
||||||
|
val completed = completedLessonsLocal
|
||||||
|
.getCompletedLessons(Semester(1, 2, "", 1, 3, 2019, true, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
LocalDate.of(2018, 9, 10),
|
||||||
|
LocalDate.of(2018, 9, 14)
|
||||||
|
)
|
||||||
|
.blockingGet()
|
||||||
|
assertEquals(2, completed.size)
|
||||||
|
assertEquals(completed[0].date, LocalDate.of(2018, 9, 10))
|
||||||
|
assertEquals(completed[1].date, LocalDate.of(2018, 9, 14))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getCompletedLesson(date: LocalDate, number: Int): CompletedLesson {
|
||||||
|
return CompletedLesson(1, 2, date, number, "", "", "", "", "", "", "")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
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
|
||||||
|
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, LocalDate.of(2018, 9, 10), LocalDate.now(), "", "", "", "", "", ""),
|
||||||
|
Exam(1, 2, LocalDate.of(2018, 9, 14), LocalDate.now(), "", "", "", "", "", ""),
|
||||||
|
Exam(1, 2, LocalDate.of(2018, 9, 17), LocalDate.now(), "", "", "", "", "", "")
|
||||||
|
))
|
||||||
|
|
||||||
|
val exams = examLocal
|
||||||
|
.getExams(Semester(1, 2, "", 1, 3, 2019, true, 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,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)
|
||||||
|
}
|
||||||
|
|
||||||
|
@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, true, now(), now(), 1, 1)
|
||||||
|
|
||||||
|
val grades = gradeLocal
|
||||||
|
.getGrades(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,185 @@
|
||||||
|
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.SdkHelper
|
||||||
|
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.mockk.MockKAnnotations
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
import io.mockk.impl.annotations.SpyK
|
||||||
|
import io.mockk.just
|
||||||
|
import io.mockk.runs
|
||||||
|
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)
|
||||||
|
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")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date }
|
||||||
|
|
||||||
|
assertFalse { grades[0].isRead }
|
||||||
|
assertFalse { grades[1].isRead }
|
||||||
|
assertTrue { grades[2].isRead }
|
||||||
|
assertTrue { grades[3].isRead }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun mitigateOldGradesNotifications() {
|
||||||
|
gradeLocal.saveGrades(listOf(
|
||||||
|
createGradeLocal(5, 3.0, of(2019, 2, 25), "Jedna ocena"),
|
||||||
|
createGradeLocal(4, 4.0, of(2019, 2, 26), "Druga"),
|
||||||
|
createGradeLocal(3, 5.0, of(2019, 2, 27), "Trzecia")
|
||||||
|
))
|
||||||
|
|
||||||
|
every { 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")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet().sortedByDescending { it.date }
|
||||||
|
|
||||||
|
assertFalse { grades[0].isRead }
|
||||||
|
assertFalse { grades[1].isRead }
|
||||||
|
assertTrue { grades[2].isRead }
|
||||||
|
assertTrue { grades[3].isRead }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun 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")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(2, grades.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")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(3, grades.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")
|
||||||
|
))
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(3, grades.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(listOf())
|
||||||
|
|
||||||
|
val grades = GradeRepository(settings, gradeLocal, gradeRemote)
|
||||||
|
.getGrades(studentMock, semesterMock, true).blockingGet()
|
||||||
|
|
||||||
|
assertEquals(0, grades.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,115 @@
|
||||||
|
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
|
||||||
|
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(
|
||||||
|
Semester(2, 2, "", 2019, 1, 2, true, LocalDate.now(), LocalDate.now(), 1, 1), false,
|
||||||
|
"Matematyka"
|
||||||
|
).blockingGet()
|
||||||
|
assertEquals(1, stats.size)
|
||||||
|
assertEquals(stats[0].subject, "Matematyka")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_all() {
|
||||||
|
gradeStatisticsLocal.saveGradesStatistics(listOf(
|
||||||
|
getGradeStatistics("Matematyka", 2, 1),
|
||||||
|
getGradeStatistics("Chemia", 2, 1),
|
||||||
|
getGradeStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesStatistics(
|
||||||
|
Semester(2, 2, "", 2019, 1, 2, true, LocalDate.now(), LocalDate.now(), 1, 1), false,
|
||||||
|
"Wszystkie"
|
||||||
|
).blockingGet()
|
||||||
|
assertEquals(1, stats.size)
|
||||||
|
assertEquals(stats[0].subject, "Wszystkie")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_points() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf(
|
||||||
|
getGradePointsStatistics("Matematyka", 2, 1),
|
||||||
|
getGradePointsStatistics("Chemia", 2, 1),
|
||||||
|
getGradePointsStatistics("Fizyka", 1, 2)
|
||||||
|
))
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(
|
||||||
|
Semester(2, 2, "", 2019, 1, 2, true, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
"Matematyka"
|
||||||
|
).blockingGet()
|
||||||
|
with(stats) {
|
||||||
|
assertEquals(subject, "Matematyka")
|
||||||
|
assertEquals(others, 5.0)
|
||||||
|
assertEquals(student, 5.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_subjectEmpty() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf())
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(
|
||||||
|
Semester(2, 2, "", 2019, 1, 2, true, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
"Matematyka"
|
||||||
|
).blockingGet()
|
||||||
|
assertEquals(null, stats)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndRead_allEmpty() {
|
||||||
|
gradeStatisticsLocal.saveGradesPointsStatistics(listOf())
|
||||||
|
|
||||||
|
val stats = gradeStatisticsLocal.getGradesPointsStatistics(
|
||||||
|
Semester(2, 2, "", 2019, 1, 2, true, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
"Wszystkie"
|
||||||
|
).blockingGet()
|
||||||
|
assertEquals(null, stats)
|
||||||
|
}
|
||||||
|
|
||||||
|
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,47 @@
|
||||||
|
package io.github.wulkanowy.data.repositories.luckynumber
|
||||||
|
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
|
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.threeten.bp.LocalDate
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class LuckyNumberLocalTest {
|
||||||
|
|
||||||
|
private lateinit var luckyNumberLocal: LuckyNumberLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(ApplicationProvider.getApplicationContext(), AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
luckyNumberLocal = LuckyNumberLocal(testDb.luckyNumberDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
luckyNumberLocal.saveLuckyNumber(LuckyNumber(1, LocalDate.of(2019, 1, 20), 14))
|
||||||
|
|
||||||
|
val luckyNumber = luckyNumberLocal.getLuckyNumber(Semester(1, 1, "", 1, 3, 2019, true, LocalDate.now(), LocalDate.now(), 1, 1),
|
||||||
|
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,48 @@
|
||||||
|
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.db.SharedPrefProvider
|
||||||
|
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.now
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class StudentLocalTest {
|
||||||
|
|
||||||
|
private lateinit var studentLocal: StudentLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
private lateinit var sharedProvider: SharedPrefProvider
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun createDb() {
|
||||||
|
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)
|
||||||
|
.build()
|
||||||
|
sharedProvider = SharedPrefProvider(context.getSharedPreferences("TEST", Context.MODE_PRIVATE))
|
||||||
|
studentLocal = StudentLocal(testDb.studentDao, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun closeDb() {
|
||||||
|
testDb.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun saveAndReadTest() {
|
||||||
|
studentLocal.saveStudents(listOf(Student(email = "test", password = "test123", schoolSymbol = "23", scrapperBaseUrl = "fakelog.cf", loginType = "AUTO", isCurrent = true, studentName = "", schoolName = "", studentId = 0, classId = 1, symbol = "", registrationDate = now(), className = "", loginMode = "API", certificateKey = "", privateKey = "", mobileBaseUrl = "", userLoginId = 0, isParent = false)))
|
||||||
|
.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 = "",
|
||||||
|
studentPlan = 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, true, 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,147 @@
|
||||||
|
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.repositories.TestInternetObservingStrategy
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
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
|
||||||
|
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 semesterMock: Semester
|
||||||
|
|
||||||
|
private lateinit var timetableRemote: TimetableRemote
|
||||||
|
|
||||||
|
private lateinit var timetableLocal: TimetableLocal
|
||||||
|
|
||||||
|
private lateinit var testDb: AppDatabase
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun initApi() {
|
||||||
|
MockKAnnotations.init(this)
|
||||||
|
testDb = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java).build()
|
||||||
|
timetableLocal = TimetableLocal(testDb.timetableDao)
|
||||||
|
timetableRemote = TimetableRemote(mockSdk)
|
||||||
|
|
||||||
|
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)
|
||||||
|
.getTimetable(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)
|
||||||
|
.getTimetable(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 |
|
@ -1,4 +0,0 @@
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
|
||||||
|
|
||||||
<bool name="pref_default_notification_debug">true</bool>
|
|
||||||
</resources>
|
|
3
app/src/debug/res/values/strings.xml
Normal file
3
app/src/debug/res/values/strings.xml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Wulkanowy DEV</string>
|
||||||
|
</resources>
|
|
@ -1,22 +0,0 @@
|
||||||
package io.github.wulkanowy.utils
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import javax.inject.Inject
|
|
||||||
import javax.inject.Singleton
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Suppress("UNUSED_PARAMETER")
|
|
||||||
class AnalyticsHelper @Inject constructor() {
|
|
||||||
|
|
||||||
fun logEvent(name: String, vararg params: Pair<String, Any?>) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setCurrentScreen(activity: Activity, name: String?) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
fun popCurrentScreen(name: String?) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
@file:Suppress("UNUSED_PARAMETER")
|
|
||||||
|
|
||||||
package io.github.wulkanowy.utils
|
|
||||||
|
|
||||||
import timber.log.Timber
|
|
||||||
|
|
||||||
open class TimberTreeNoOp : Timber.Tree() {
|
|
||||||
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CrashLogTree : TimberTreeNoOp()
|
|
||||||
|
|
||||||
class CrashLogExceptionTree : TimberTreeNoOp()
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
@file:Suppress("UNUSED_PARAMETER")
|
||||||
|
|
||||||
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import timber.log.Timber
|
||||||
|
|
||||||
|
fun initCrashlytics(context: Context, appInfo: AppInfo) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
class CrashlyticsTree : Timber.Tree() {
|
||||||
|
|
||||||
|
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class FirebaseAnalyticsHelper @Inject constructor() {
|
||||||
|
|
||||||
|
@Suppress("UNUSED_PARAMETER")
|
||||||
|
fun logEvent(name: String, vararg params: Pair<String, Any?>) {
|
||||||
|
// 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"
|
||||||
|
@ -45,8 +22,7 @@
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.splash.SplashActivity"
|
android:name=".ui.modules.splash.SplashActivity"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:theme="@style/WulkanowyTheme.SplashScreen"
|
android:theme="@style/WulkanowyTheme.SplashScreen">
|
||||||
tools:ignore="LockedOrientationActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
@ -62,14 +38,13 @@
|
||||||
android:name=".ui.modules.main.MainActivity"
|
android:name=".ui.modules.main.MainActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:label="@string/main_title"
|
android:label="@string/main_title"
|
||||||
android:theme="@style/WulkanowyTheme.NoActionBar"
|
android:theme="@style/WulkanowyTheme.NoActionBar" />
|
||||||
android:windowSoftInputMode="adjustPan" />
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.message.send.SendMessageActivity"
|
android:name=".ui.modules.message.send.SendMessageActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:label="@string/send_message_title"
|
android:label="@string/send_message_title"
|
||||||
android:theme="@style/WulkanowyTheme.NoActionBar"
|
android:windowSoftInputMode="adjustResize"
|
||||||
android:windowSoftInputMode="adjustResize" />
|
android:theme="@style/WulkanowyTheme.NoActionBar" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.timetablewidget.TimetableWidgetConfigureActivity"
|
android:name=".ui.modules.timetablewidget.TimetableWidgetConfigureActivity"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
|
@ -115,62 +90,17 @@
|
||||||
android:resource="@xml/provider_widget_lucky_number" />
|
android:resource="@xml/provider_widget_lucky_number" />
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<receiver android:name=".services.alarm.TimetableNotificationReceiver" />
|
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.work.impl.WorkManagerInitializer"
|
android:name="androidx.work.impl.WorkManagerInitializer"
|
||||||
android:authorities="${applicationId}.workmanager-init"
|
android:authorities="${applicationId}.workmanager-init"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
tools:node="remove" />
|
tools:node="remove" />
|
||||||
|
|
||||||
<provider
|
|
||||||
android:name="androidx.core.content.FileProvider"
|
|
||||||
android:authorities="${applicationId}.fileprovider"
|
|
||||||
android:exported="false"
|
|
||||||
android:grantUriPermissions="true">
|
|
||||||
<meta-data
|
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
||||||
android:resource="@xml/provider_paths" />
|
|
||||||
</provider>
|
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="install_channel"
|
android:name="io.fabric.ApiKey"
|
||||||
android:value="${install_channel}" />
|
android:value="${fabric_api_key}" />
|
||||||
|
|
||||||
<!-- 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 -->
|
|
||||||
<provider
|
|
||||||
android:name="com.google.firebase.provider.FirebaseInitProvider"
|
|
||||||
android:authorities="${applicationId}.firebaseinitprovider"
|
|
||||||
android:enabled="${firebase_enabled}"
|
|
||||||
android:exported="false" />
|
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="firebase_analytics_collection_enabled"
|
|
||||||
android:value="${firebase_enabled}" />
|
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="google_analytics_adid_collection_enabled"
|
|
||||||
android:value="${firebase_enabled}" />
|
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="firebase_crashlytics_collection_enabled"
|
android:name="firebase_crashlytics_collection_enabled"
|
||||||
android:value="${firebase_enabled}" />
|
android:value="${crashlytics_enabled}" />
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="firebase_messaging_auto_init_enabled"
|
|
||||||
android:value="${firebase_enabled}" />
|
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="firebase_inapp_messaging_auto_data_collection_enabled"
|
|
||||||
android:value="${firebase_enabled}" />
|
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="com.google.firebase.messaging.default_notification_icon"
|
|
||||||
android:resource="@drawable/ic_stat_push" />
|
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
|
||||||
android:value="push_channel" />
|
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"githubUsername": "doteq"
|
"githubUsername": "doteq"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayName": "Paweł Krzyś",
|
"displayName": "Pavuloff",
|
||||||
"githubUsername": "pavuloff"
|
"githubUsername": "pavuloff"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -30,9 +30,5 @@
|
||||||
{
|
{
|
||||||
"displayName": "Dinolek",
|
"displayName": "Dinolek",
|
||||||
"githubUsername": "Dinolek"
|
"githubUsername": "Dinolek"
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "Mateusz Idziejczak",
|
|
||||||
"githubUsername": "Luncenok"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -1,94 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="pl">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>%SUBJECT% | Wulkanowy</title>
|
|
||||||
<style>
|
|
||||||
@page {
|
|
||||||
margin: 2.5cm;
|
|
||||||
size: A4;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
line-height: 1.5;
|
|
||||||
letter-spacing: 1pt;
|
|
||||||
font-size: 24pt;
|
|
||||||
font-weight: 200;
|
|
||||||
margin: 0 0 0.5cm;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
margin: 0.5cm 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info div {
|
|
||||||
font-size: 14pt;
|
|
||||||
font-weight: 400;
|
|
||||||
margin: 0.5cm 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-weight: 200;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 1pt;
|
|
||||||
font-size: 10pt;
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 0.25cm;
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
margin-top: 0.5cm;
|
|
||||||
font-size: 14pt;
|
|
||||||
font-weight: 400;
|
|
||||||
text-align: justify;
|
|
||||||
font-family: serif;
|
|
||||||
line-height: 1.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content p {
|
|
||||||
page-break-after: auto;
|
|
||||||
page-break-inside: auto;
|
|
||||||
margin-bottom: 0.6cm;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
font-size: 11pt;
|
|
||||||
font-weight: 200;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
color: rgba(0, 0, 0, 0.5)
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 0.5cm;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer .logo {
|
|
||||||
height: 0.5cm;
|
|
||||||
width: 0.5cm;
|
|
||||||
display: block;
|
|
||||||
margin-right: 0.2cm;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1 class="title">%SUBJECT%</h1>
|
|
||||||
<hr>
|
|
||||||
<div class="info">
|
|
||||||
%INFO%
|
|
||||||
</div>
|
|
||||||
<div class="footer">
|
|
||||||
<img src="wulkanowy-logo-black.svg" class="logo">
|
|
||||||
Wulkanowy Dzienniczek
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="content">
|
|
||||||
<h4>Treść wiadomości</h4>
|
|
||||||
%CONTENT%
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,74 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
version="1.1"
|
|
||||||
id="Layer_1"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
viewBox="0 0 1024 1024"
|
|
||||||
xml:space="preserve"
|
|
||||||
width="1024"
|
|
||||||
height="1024"><metadata
|
|
||||||
id="metadata15"><rdf:RDF><cc:Work
|
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
|
||||||
id="defs13" /><style
|
|
||||||
type="text/css"
|
|
||||||
id="style2">
|
|
||||||
.st0{fill:#D32F2F;}
|
|
||||||
.st1{fill:#AD2A2A;}
|
|
||||||
.st2{fill:#FFFFFF;}
|
|
||||||
</style><g
|
|
||||||
id="layer4"
|
|
||||||
style="display:none;fill:#808080"><rect
|
|
||||||
id="XMLID_57_"
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
class="st0"
|
|
||||||
width="3584"
|
|
||||||
height="1024"
|
|
||||||
style="display:inline;fill:#808080;stroke-width:1.02195609" /></g><g
|
|
||||||
id="layer3"
|
|
||||||
style="display:none;fill:#808080"><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="M 3046.8164,390.66602 3134.3164,542 v 91.33398 L 3524.9824,1024 H 3584 V 732.18359 L 3242.4824,390.66602 h -23.666 l -53.0352,94.63086 -94.6308,-94.63086 z"
|
|
||||||
id="path18992" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="m 2746.9824,390.66602 62,242.66796 L 3199.6484,1024 H 3584 V 940.68359 L 3033.9824,390.66602 h -21 l -21.9043,90.92773 -90.9277,-90.92773 h -18.5 l -25.4043,88.26367 -88.2637,-88.26367 z"
|
|
||||||
id="path18990" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="m 2620.8164,387.33398 c -18.6667,0 -35.1667,4.60982 -49.5,13.83204 -14.3333,9.11111 -25.4451,22.22287 -33.334,39.33398 -7.7778,17 -11.666,36.5549 -11.666,58.66602 v 25 c 0,34.44444 8.7216,61.83463 26.166,82.16796 L 2970.1484,1024 h 323.168 l -623.166,-623.16602 c -14.2222,-9 -30.6673,-13.5 -49.334,-13.5 z"
|
|
||||||
id="path18988" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="M 2293.4824,390.66602 V 633.33398 L 2684.1484,1024 h 423.336 l -633.334,-633.33398 h -20.334 v 139.66601 l -139.666,-139.66601 z"
|
|
||||||
id="path18984" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="M 1864.8164,390.66602 V 633.33398 L 2255.4824,1024 h 413.334 l -633.334,-633.33398 h -25.832 l -60.584,63.75 -63.75,-63.75 z"
|
|
||||||
id="path18978" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="M 1684.8164,390.66602 V 633.33398 L 2075.4824,1024 h 263.334 l -633.334,-633.33398 z"
|
|
||||||
id="path18976" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="m 1133.6504,390.66602 62,242.66796 L 1586.3164,1024 h 467.668 l -633.334,-633.33398 h -21 l -21.9043,90.92773 -90.9277,-90.92773 h -18.5 l -25.4043,88.26367 -88.2637,-88.26367 z"
|
|
||||||
id="path19059" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="m 1456.4824,390.66602 v 167.16796 c 0.5556,24.66667 8.5007,44 23.834,58 L 1888.4824,1024 h 372.168 l -633.334,-633.33398 h -20.666 V 520.5 l -129.834,-129.83398 z"
|
|
||||||
id="path18966" /><path
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;display:inline;fill:#808080;fill-opacity:1;stroke:none"
|
|
||||||
d="M 2146.3164,390.66602 2054.4824,633.33398 2445.1484,1024 h 354.002 l -633.334,-633.33398 z"
|
|
||||||
id="path18982" /><path
|
|
||||||
style="display:inline;fill:#808080;stroke-width:0.78179646"
|
|
||||||
d="M 637.15234,214.95703 487.75,364.35742 466.01562,386.0918 c 0.31273,0.31271 0.54872,0.54666 0.70508,0.85937 0.0782,0.23454 0.23432,0.54671 0.3125,0.78125 0.31272,0.54726 0.47071,1.17339 0.47071,1.79883 0.0782,0.54726 -0.0799,1.01725 -0.31446,1.48633 -0.23454,0.54725 -0.70285,1.40597 -1.09375,1.79687 l 150.8086,149.71485 -23.68946,23.6875 -12.74414,-12.74219 -13.44726,-13.44727 -78.80469,-78.80664 -11.17969,-11.17968 -7.5039,-7.50391 -35.41602,-35.17969 -3.08984,-0.98047 -4.33594,4.26367 v 0.46876 c 0,7.34888 0.38998,15.00865 -1.48633,22.20117 -0.85998,3.28355 -2.34444,6.25595 -4.14258,8.91406 -0.15636,0.15636 -0.23627,0.23426 -0.31445,0.39062 -1.87631,2.57993 -4.06471,4.84619 -6.48828,6.95704 -5.3944,4.53442 -11.25752,8.67896 -17.27734,12.50976 -0.15637,0.0782 -0.23427,0.1562 -0.39063,0.23438 -2.11085,1.40723 -4.3012,2.7354 -6.49023,4.06445 -8.91248,5.39439 -18.37192,10.08772 -28.37891,13.13672 -1.25087,0.31272 -2.42317,-0.001 -3.36133,-0.70508 l -6.01953,5.94141 c 1.25087,0.62543 2.03136,1.87776 1.875,3.51953 -10e-6,0.15636 -0.0762,0.23231 -0.0762,0.38867 0,0.0782 -0.0781,0.23628 -0.0781,0.31445 -1.32905,4.45624 -2.34505,8.98897 -3.2832,13.60156 -0.15636,0.70363 -0.23622,1.33154 -0.39258,2.03516 -0.85997,4.37806 -1.64209,8.83288 -2.3457,13.21094 0.23453,5.3944 0.39263,11.0234 0.31445,16.65234 v 0.39258 c -0.0782,7.66161 -0.78373,15.32114 -2.8164,22.51367 -2.26721,8.28704 -6.64376,15.63728 -10.55274,23.22071 -0.0782,0.15636 -0.15815,0.23426 -0.23633,0.39062 -1.25088,2.42357 -2.49924,4.92399 -3.59375,7.50391 -4.84714,11.33605 -7.42749,23.92328 -10.55468,35.88476 -0.23454,0.70362 -0.39046,1.48578 -0.625,2.26758 0,0.15636 -0.0801,0.23427 -0.0801,0.39063 -2.97082,11.10151 -6.09819,22.28173 -10.94532,32.75781 -1.40724,2.97082 -2.81531,5.86322 -4.3789,8.75586 -0.15636,0.23454 -0.23231,0.46858 -0.38867,0.70312 -0.62544,1.09451 -1.25152,2.26871 -1.87696,3.44141 -0.0782,0.15636 -0.15619,0.23426 -0.23437,0.39062 -3.51809,6.25438 -7.27098,12.43118 -10.78906,18.68555 -5.0035,8.8343 -8.99075,18.13635 -13.83789,27.04883 -0.0782,0.15636 -0.1562,0.23426 -0.23438,0.39062 -0.70362,1.32905 -1.48579,2.65728 -2.26758,3.98633 -5.0035,8.20887 -10.63256,16.0279 -16.57422,23.61133 -0.15635,0.15636 -0.23426,0.3124 -0.39062,0.46875 -0.7818,1.01634 -1.48578,1.95443 -2.26758,2.89258 -3.90898,4.92532 -7.97378,9.85009 -11.96094,14.77539 -0.0782,0.15637 -0.23432,0.23622 -0.3125,0.39258 -8.75612,10.71061 -17.35628,21.49761 -24.54883,33.30273 0,0.70362 -0.15602,1.33159 -0.46874,1.95703 -1.25087,2.42357 -2.65734,4.68971 -3.90821,7.11328 -0.0782,0.15636 0.62511,1.24989 0.46875,1.40625 L 429.86133,1024 H 1463.0215 L 661.85547,222.92969 c -0.93816,2.11087 -5.23681,1.40935 -7.34766,-0.23242 -1.71995,-1.32906 -3.12603,-3.05147 -4.45508,-4.84961 -0.62544,-0.31271 -1.25168,-0.62288 -1.64257,-0.85743 -2.89265,-1.40723 -6.09933,-1.48632 -9.30469,-1.48632 -0.7818,-0.0782 -1.40588,-0.23416 -1.95313,-0.54688 z m -206.12304,191.41992 0.11914,-0.11523 -0.23438,0.0781 z"
|
|
||||||
id="XMLID_64_" /></g><g
|
|
||||||
id="layer2"
|
|
||||||
style="display:inline;fill:#000000;fill-opacity:0.49803922"><path
|
|
||||||
id="XMLID_42_"
|
|
||||||
d="m 295.17362,965.05417 c 1.0692,3.47527 0.5346,7.21786 -1.3367,10.29214 l -25.7972,41.83679 c -2.5396,4.1436 -7.2178,6.8169 -12.297,6.8169 H 14.345318 C 3.1176178,1024 -3.6991822,1012.2376 2.3157178,1003.4158 L 157.76692,774.44928 c 0.9356,-1.33663 1.4704,-2.80694 1.8713,-4.27723 l 71.2428,-304.21933 c 0.8021,-3.60893 3.2081,-6.6832 6.6833,-8.55449 l 96.5054,-52.93096 c 3.4753,-1.8713 5.8812,-4.94557 6.6832,-8.68816 l 12.9654,-56.53988 c 2.6733,-11.76242 19.5151,-14.30205 26.1981,-4.00991 l 4.6783,7.48519 c 2.0049,3.20793 2.5396,7.21785 1.2031,10.82678 l -87.9511,254.22895 c -0.6683,2.00497 -0.9355,4.1436 -0.5346,6.28223 l 21.9209,121.63426 c 0.401,2.40595 0.1334,4.94556 -0.9357,7.21785 l -52.2625,117.357 c -1.203,2.80696 -1.4704,5.88123 -0.5347,8.68817 z M 1009.7413,1024 H 843.46322 c -4.8117,0 -9.2228,-2.4059 -11.8959,-6.1485 L 719.69042,860.52891 c -0.6683,-1.0693 -1.3366,-2.13861 -1.7375,-3.3416 l -55.4707,-162.00078 c -1.0692,-3.20793 -3.6088,-6.01489 -6.8169,-7.61886 l -135.8026,-68.56965 c -3.7426,-1.87127 -6.4159,-5.34655 -7.2179,-9.22281 l -20.0495,-99.44603 c -0.2674,-1.60396 -0.9357,-3.20793 -2.005,-4.67824 l -46.1141,-67.76766 c -2.5396,-3.74259 -2.9405,-8.28717 -1.0693,-12.2971 l 28.0694,-60.01513 c 2.1387,-4.54457 6.817,-7.61886 12.1634,-7.88619 l 52.129,-3.07427 c 3.0742,-0.1337 5.8812,-1.20296 8.1536,-3.07427 l 38.3615,-29.80707 c 7.2178,-5.61388 18.1784,-3.20794 22.0546,4.67824 l 132.1937,268.93201 c 0.5346,1.20297 0.9357,2.40595 1.2029,3.60894 l 16.3072,108.13418 c 0.4009,2.53963 1.4701,4.8119 3.2079,6.6832 l 263.31808,288.17958 c 7.7525,8.5545 1.203,22.0546 -10.8269,22.0546 z M 363.20852,182.58501 c 0,-30.60907 19.3812,-56.94088 47.1834,-69.23798 -2.005,-3.3416 -3.2079,-6.95052 -3.2079,-10.82678 0,-14.836705 17.109,-26.866465 38.0942,-26.866465 0.5346,0 0.9356,0 1.4704,0 8.688,-14.43572 25.2624,-24.19318 44.2426,-24.19318 1.3367,0 2.6733,0 4.01,0.1337 1.7377,0.13369 3.4753,-0.66833 4.4109,-2.00497 14.0347,-21.38624 49.5894,-36.62394 91.159,-36.62394 15.3712,0 29.9406,2.13863 42.906,5.74756 3.0744,-5.07924 9.8911,-8.5545 17.7773,-8.5545 8.9556,0 16.5744,4.54458 18.8466,10.82678 10.9606,-12.69809 29.5398,-20.98524 50.6587,-20.98524 33.6834,0 60.9508,21.25257 60.9508,47.45072 0,3.20793 -0.401,6.2822 -1.203,9.35647 -0.5346,2.13864 0.6683,4.27725 2.9407,5.07924 21.5199,7.88618 36.0893,22.85655 36.0893,39.965535 0,19.51495 -18.8466,36.22296 -45.4458,42.77249 -2.1387,0.53466 -3.4753,2.40595 -3.4753,4.41092 0,0.1337 0,0.26731 0,0.40098 0,15.10404 -14.9704,27.5348 -34.218,28.87144 0.1333,0.66833 0.1333,1.33663 0.1333,2.13862 0,29.00509 -55.2031,52.3963 -123.2382,52.3963 -14.7029,0 -28.7377,-1.06932 -41.7031,-3.07427 0,0.26733 0,0.40099 0,0.66832 0,12.02975 -15.5051,21.78723 -34.4854,21.78723 -1.0692,0 -2.0049,0 -2.9405,-0.13369 1.3367,2.9406 2.005,6.01487 2.005,9.22281 0,18.71296 -23.6586,33.81699 -52.9311,33.81699 -3.2079,0 -6.2821,-0.1337 -9.3563,-0.53466 -2.4061,-0.26731 -4.6783,1.20299 -5.2131,3.47529 -2.5396,9.35647 -10.693,16.17333 -20.4504,16.17333 -11.7625,0 -21.119,-10.0248 -21.119,-22.32189 0,-5.74755 2.005,-10.96045 5.3466,-14.83671 1.203,-1.33663 1.6039,-3.20793 0.8019,-4.81191 -1.8713,-3.47526 -2.6733,-7.08419 -2.6733,-10.96044 v 0 c 0,-2.13862 -1.7376,-3.87626 -3.8763,-4.4109 -36.2228,-8.01985 -63.4903,-38.22792 -63.4903,-74.3172 z m 306.8925,726.06294 c 0.5348,1.60398 0.6683,3.20796 0.6683,4.94558 l -7.7525,97.97577 c -0.5346,6.9505 -6.6832,12.4307 -14.1683,12.4307 h -250.219 c -5.3466,0 -10.2921,-3.0743 -12.6982,-7.4852 l -41.3021,-76.72312 c -0.2673,-0.401 -0.401,-0.80199 -0.5347,-1.20298 l -38.8962,-94.23313 c -1.4702,-3.3416 -1.203,-7.21785 0.4011,-10.42581 l 64.5596,-126.31249 c 1.604,-3.07427 1.8712,-6.6832 0.6683,-9.89114 l -31.5447,-87.41626 c -1.0693,-3.07428 -0.9356,-6.54955 0.4011,-9.49015 l 52.6636,-112.14412 c 5.3464,-11.22778 22.8565,-10.29212 26.5991,1.47031 l 16.4407,51.05965 50.124,134.19868 c 1.3367,3.7426 4.5446,6.6832 8.5545,8.01985 l 106.9312,36.49027 c 4.1435,1.47032 7.3516,4.54458 8.6881,8.42084 z"
|
|
||||||
style="fill:#000000;stroke-width:0.78179646;fill-opacity:0.49803922" /><g
|
|
||||||
aria-label="WULKANOWY"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:341.33334351px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:'Roboto Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.49803922;stroke:none"
|
|
||||||
id="text4752" /></g></svg>
|
|
Before Width: | Height: | Size: 13 KiB |
|
@ -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.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 fr.bipi.tressence.file.FileLoggerTree
|
import dagger.android.support.DaggerApplication
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
|
import eu.davidea.flexibleadapter.utils.Log
|
||||||
|
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.CrashlyticsTree
|
||||||
import io.github.wulkanowy.utils.CrashLogTree
|
|
||||||
import io.github.wulkanowy.utils.DebugLogTree
|
import io.github.wulkanowy.utils.DebugLogTree
|
||||||
|
import io.github.wulkanowy.utils.initCrashlytics
|
||||||
|
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,35 @@ 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()
|
initCrashlytics(this, appInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initLogging() {
|
private fun initLogging() {
|
||||||
if (appInfo.isDebug) {
|
if (appInfo.isDebug) {
|
||||||
Timber.plant(DebugLogTree())
|
Timber.plant(DebugLogTree())
|
||||||
Timber.plant(
|
FlexibleAdapter.enableLogs(Log.Level.DEBUG)
|
||||||
FileLoggerTree.Builder()
|
|
||||||
.withFileName("wulkanowy.%g.log")
|
|
||||||
.withDirName(applicationContext.filesDir.absolutePath)
|
|
||||||
.withFileLimit(10)
|
|
||||||
.withMinPriority(DEBUG)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
Timber.plant(CrashLogExceptionTree())
|
Timber.plant(CrashlyticsTree())
|
||||||
Timber.plant(CrashLogTree())
|
|
||||||
}
|
}
|
||||||
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()
|
||||||
|
|
|
@ -5,75 +5,67 @@ import android.content.SharedPreferences
|
||||||
import android.content.res.AssetManager
|
import android.content.res.AssetManager
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.chuckerteam.chucker.api.ChuckerCollector
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings
|
||||||
import com.chuckerteam.chucker.api.ChuckerInterceptor
|
import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.WalledGardenInternetObservingStrategy
|
||||||
import com.chuckerteam.chucker.api.RetentionManager
|
import com.readystatesoftware.chuck.api.ChuckCollector
|
||||||
|
import com.readystatesoftware.chuck.api.ChuckInterceptor
|
||||||
|
import com.readystatesoftware.chuck.api.RetentionManager
|
||||||
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(chuckCollector: ChuckCollector, 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(ChuckInterceptor(context, chuckCollector).maxContentLength(250000L), true)
|
||||||
ChuckerInterceptor.Builder(context)
|
|
||||||
.collector(chuckerCollector)
|
|
||||||
.alwaysReadResponseBody(true)
|
|
||||||
.build(), network = true
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideChuckerCollector(
|
fun provideChuckCollector(context: Context, prefRepository: PreferencesRepository): ChuckCollector {
|
||||||
@ApplicationContext context: Context,
|
return ChuckCollector(context)
|
||||||
prefRepository: PreferencesRepository
|
.showNotification(prefRepository.isDebugNotificationEnable)
|
||||||
): ChuckerCollector {
|
.retentionManager(RetentionManager(context, ChuckCollector.Period.ONE_HOUR))
|
||||||
return ChuckerCollector(
|
|
||||||
context = context,
|
|
||||||
showNotification = prefRepository.isDebugNotificationEnable,
|
|
||||||
retentionPeriod = RetentionManager.Period.ONE_HOUR
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@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,25 +85,16 @@ 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
|
||||||
fun provideMessagesDao(database: AppDatabase) = database.messagesDao
|
fun provideMessagesDao(database: AppDatabase) = database.messagesDao
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Provides
|
|
||||||
fun provideMessageAttachmentsDao(database: AppDatabase) = database.messageAttachmentDao
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideExamDao(database: AppDatabase) = database.examsDao
|
fun provideExamDao(database: AppDatabase) = database.examsDao
|
||||||
|
@ -167,16 +150,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
|
|
||||||
}
|
|
30
app/src/main/java/io/github/wulkanowy/data/SdkHelper.kt
Normal file
30
app/src/main/java/io/github/wulkanowy/data/SdkHelper.kt
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package io.github.wulkanowy.data
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class SdkHelper @Inject constructor(private val sdk: Sdk) {
|
||||||
|
|
||||||
|
fun init(student: Student) {
|
||||||
|
sdk.apply {
|
||||||
|
email = student.email
|
||||||
|
password = student.password
|
||||||
|
symbol = student.symbol
|
||||||
|
schoolSymbol = student.schoolSymbol
|
||||||
|
studentId = student.studentId
|
||||||
|
classId = student.classId
|
||||||
|
|
||||||
|
if (Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.API) {
|
||||||
|
scrapperBaseUrl = student.scrapperBaseUrl
|
||||||
|
loginType = Sdk.ScrapperLoginType.valueOf(student.loginType)
|
||||||
|
}
|
||||||
|
loginId = student.userLoginId
|
||||||
|
|
||||||
|
mode = Sdk.Mode.valueOf(student.loginMode)
|
||||||
|
mobileBaseUrl = student.mobileBaseUrl
|
||||||
|
certKey = student.certificateKey
|
||||||
|
privateKey = student.privateKey
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,16 +10,13 @@ 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
|
||||||
import io.github.wulkanowy.data.db.dao.MessageAttachmentDao
|
|
||||||
import io.github.wulkanowy.data.db.dao.MessagesDao
|
import io.github.wulkanowy.data.db.dao.MessagesDao
|
||||||
import io.github.wulkanowy.data.db.dao.MobileDeviceDao
|
import io.github.wulkanowy.data.db.dao.MobileDeviceDao
|
||||||
import io.github.wulkanowy.data.db.dao.NoteDao
|
import io.github.wulkanowy.data.db.dao.NoteDao
|
||||||
|
@ -28,25 +25,20 @@ 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
|
||||||
import io.github.wulkanowy.data.db.entities.Message
|
import io.github.wulkanowy.data.db.entities.Message
|
||||||
import io.github.wulkanowy.data.db.entities.MessageAttachment
|
|
||||||
import io.github.wulkanowy.data.db.entities.MobileDevice
|
import io.github.wulkanowy.data.db.entities.MobileDevice
|
||||||
import io.github.wulkanowy.data.db.entities.Note
|
import io.github.wulkanowy.data.db.entities.Note
|
||||||
import io.github.wulkanowy.data.db.entities.Recipient
|
import io.github.wulkanowy.data.db.entities.Recipient
|
||||||
|
@ -54,11 +46,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
|
||||||
|
@ -72,18 +62,7 @@ import io.github.wulkanowy.data.db.migrations.Migration19
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration2
|
import io.github.wulkanowy.data.db.migrations.Migration2
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration20
|
import io.github.wulkanowy.data.db.migrations.Migration20
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration21
|
import io.github.wulkanowy.data.db.migrations.Migration21
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration22
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration23
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration24
|
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration25
|
|
||||||
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,11 +82,9 @@ 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,
|
|
||||||
Note::class,
|
Note::class,
|
||||||
Homework::class,
|
Homework::class,
|
||||||
Subject::class,
|
Subject::class,
|
||||||
|
@ -117,10 +94,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 +103,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 = 21
|
||||||
|
|
||||||
fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array<Migration> {
|
fun getMigrations(sharedPrefProvider: SharedPrefProvider): Array<Migration> {
|
||||||
return arrayOf(
|
return arrayOf(
|
||||||
|
@ -152,18 +126,7 @@ abstract class AppDatabase : RoomDatabase() {
|
||||||
Migration18(),
|
Migration18(),
|
||||||
Migration19(sharedPrefProvider),
|
Migration19(sharedPrefProvider),
|
||||||
Migration20(),
|
Migration20(),
|
||||||
Migration21(),
|
Migration21()
|
||||||
Migration22(),
|
|
||||||
Migration23(),
|
|
||||||
Migration24(),
|
|
||||||
Migration25(),
|
|
||||||
Migration26(),
|
|
||||||
Migration27(),
|
|
||||||
Migration28(),
|
|
||||||
Migration29(),
|
|
||||||
Migration30(),
|
|
||||||
Migration31(),
|
|
||||||
Migration32()
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,16 +156,12 @@ 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
|
||||||
|
|
||||||
abstract val messageAttachmentDao: MessageAttachmentDao
|
|
||||||
|
|
||||||
abstract val noteDao: NoteDao
|
abstract val noteDao: NoteDao
|
||||||
|
|
||||||
abstract val homeworkDao: HomeworkDao
|
abstract val homeworkDao: HomeworkDao
|
||||||
|
@ -222,10 +181,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,12 @@ 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
|
|
||||||
fun stringPairListToJson(list: List<Pair<String, String>>): String {
|
|
||||||
return stringListPairAdapter.toJson(list)
|
|
||||||
}
|
|
||||||
|
|
||||||
@TypeConverter
|
|
||||||
fun jsonToStringPairList(value: String): List<Pair<String, String>> {
|
|
||||||
return stringListPairAdapter.fromJson(value).orEmpty()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<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>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package io.github.wulkanowy.data.db.dao
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Insert
|
|
||||||
import androidx.room.OnConflictStrategy
|
|
||||||
import io.github.wulkanowy.data.db.entities.MessageAttachment
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
interface MessageAttachmentDao : BaseDao<MessageAttachment> {
|
|
||||||
|
|
||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
|
||||||
suspend fun insertAttachments(items: List<MessageAttachment>): List<Long>
|
|
||||||
}
|
|
|
@ -2,18 +2,18 @@ package io.github.wulkanowy.data.db.dao
|
||||||
|
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
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.reactivex.Maybe
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface MessagesDao : BaseDao<Message> {
|
interface MessagesDao : BaseDao<Message> {
|
||||||
|
|
||||||
@Transaction
|
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder AND removed = 0 ORDER BY date DESC")
|
||||||
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId")
|
fun loadAll(studentId: Int, folder: Int): Maybe<List<Message>>
|
||||||
fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow<MessageWithAttachment?>
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder ORDER BY date DESC")
|
@Query("SELECT * FROM Messages WHERE id = :id")
|
||||||
fun loadAll(studentId: Int, folder: Int): Flow<List<Message>>
|
fun load(id: Long): Maybe<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,20 @@ 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")
|
|
||||||
suspend fun loadById(id: Int): 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(
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue