forked from github/szkolny
Compare commits
149 Commits
v4.8
...
v4.13-beta
Author | SHA1 | Date | |
---|---|---|---|
6f12227c2e | |||
3a91f87ccd | |||
52a53334ca | |||
3ab9602865 | |||
dc19043f73 | |||
cf25507850 | |||
044cedff99 | |||
4de066bf5f | |||
8d174bda01 | |||
e2fd714070 | |||
8097e8d06d | |||
93ccdbdeb7 | |||
7ded400a30 | |||
2ff784066e | |||
6c96875c83 | |||
9f3aaf6e86 | |||
55369eaa8b | |||
c983c16907 | |||
c7362bce12 | |||
7935d0f097 | |||
4b64277948 | |||
132729bbd9 | |||
6d36ab27d1 | |||
11fabb231f | |||
6fd999f88c | |||
7711413b30 | |||
cdc0c9d458 | |||
8e5f750a80 | |||
f4e7e8978c | |||
96c542d6d2 | |||
77d22b87aa | |||
37c68443bd | |||
9dbb5d70e9 | |||
99afa77a63 | |||
a5d0f4212d | |||
a85f935eb4 | |||
bb44fa066c | |||
54a61c6254 | |||
ac10874bf1 | |||
fa55b4901a | |||
0f90430387 | |||
745523c620 | |||
8911ce2bc1 | |||
2990fc5479 | |||
48b7adb564 | |||
f8ac9e793a | |||
148597e578 | |||
6c50a80b42 | |||
1bf0679e92 | |||
5b5dc5cade | |||
98a89b1ca1 | |||
6d1e18cce2 | |||
8fe0f88be4 | |||
aeed735521 | |||
e314fafaff | |||
2ab0dd7546 | |||
aa06868a4e | |||
2b104e6463 | |||
afb1863827 | |||
d8228748e4 | |||
b0608c47c4 | |||
dda0d88f19 | |||
a1b5560977 | |||
86f5811bda | |||
3f11e75985 | |||
c39b5442c9 | |||
3b80adf355 | |||
cae41d17b6 | |||
519d75d9d9 | |||
cb953ea8a8 | |||
52968cafad | |||
b7755dae96 | |||
113ecc0ef1 | |||
23bd9b8e05 | |||
decfd2068a | |||
a88cfb8ae3 | |||
50cb0acc7d | |||
27413a9745 | |||
49a093201b | |||
7c925cb88a | |||
8745d7d526 | |||
e02246f97d | |||
e629e03b33 | |||
e2ad3758e0 | |||
f3e2d21b89 | |||
fd62653d79 | |||
ca3e6f7fc9 | |||
d8abac1917 | |||
2807659da3 | |||
7884bf4077 | |||
59f80c049c | |||
f1e58db151 | |||
74b766f18a | |||
7e0f69d95d | |||
fa318d4509 | |||
63b74a9fda | |||
1a543814f4 | |||
50ae767fcd | |||
44263ac95f | |||
a6aca42c8c | |||
83daae46b8 | |||
6611fc5843 | |||
fe82c86c93 | |||
692555732d | |||
d59286bb05 | |||
91cfa7e945 | |||
2d277e80cc | |||
3cdca5eb33 | |||
591abb4bb8 | |||
0b4421c7a7 | |||
325efd8b14 | |||
959168771b | |||
18c306b9ea | |||
c6be1a7954 | |||
e8e9f04050 | |||
3700a71c39 | |||
60f0628f5e | |||
80dcd9aa69 | |||
91b685576b | |||
2e3e3dcf3c | |||
118f5e1794 | |||
e902352a4b | |||
2f7fcb6dc3 | |||
21ddb9d706 | |||
efa63452e7 | |||
83f84de019 | |||
b9aca981e5 | |||
5913707519 | |||
dd6a2c0979 | |||
9fdee6e0c7 | |||
b31bf5c1ab | |||
cf4906f2f4 | |||
680a5dfea3 | |||
c1062cd7ed | |||
8edc581f0b | |||
ea9d801d08 | |||
8f72e11d0c | |||
452271e8c0 | |||
7b4effe889 | |||
e2bf48d1b6 | |||
c88056ddb9 | |||
96dbb0a057 | |||
288c80ea26 | |||
5a217aca01 | |||
4bed62aa6f | |||
a4d604e146 | |||
ae4405ef78 | |||
71ca51e813 | |||
1bf07d736f |
11
.github/workflows/build-nightly-apk.yml
vendored
11
.github/workflows/build-nightly-apk.yml
vendored
@ -51,10 +51,11 @@ jobs:
|
|||||||
androidHome: ${{ env.ANDROID_HOME }}
|
androidHome: ${{ env.ANDROID_HOME }}
|
||||||
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
||||||
steps:
|
steps:
|
||||||
- name: Setup JDK 1.8
|
- name: Setup JDK 11
|
||||||
uses: actions/setup-java@v1
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
java-version: 1.8
|
distribution: 'temurin'
|
||||||
|
java-version: '11'
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v2
|
uses: android-actions/setup-android@v2
|
||||||
- name: Clean build artifacts
|
- name: Clean build artifacts
|
||||||
@ -63,7 +64,9 @@ jobs:
|
|||||||
rm -rf app/build/outputs/apk/*
|
rm -rf app/build/outputs/apk/*
|
||||||
rm -rf app/build/outputs/bundle/*
|
rm -rf app/build/outputs/bundle/*
|
||||||
- name: Assemble official release with Gradle
|
- name: Assemble official release with Gradle
|
||||||
run: ./gradlew assembleOfficialRelease
|
uses: gradle/gradle-build-action@v2
|
||||||
|
with:
|
||||||
|
arguments: assembleOfficialRelease
|
||||||
sign:
|
sign:
|
||||||
name: Sign APK
|
name: Sign APK
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
|
11
.github/workflows/build-release-aab-play.yml
vendored
11
.github/workflows/build-release-aab-play.yml
vendored
@ -43,10 +43,11 @@ jobs:
|
|||||||
androidHome: ${{ env.ANDROID_HOME }}
|
androidHome: ${{ env.ANDROID_HOME }}
|
||||||
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
||||||
steps:
|
steps:
|
||||||
- name: Setup JDK 1.8
|
- name: Setup JDK 11
|
||||||
uses: actions/setup-java@v1
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
java-version: 1.8
|
distribution: 'temurin'
|
||||||
|
java-version: '11'
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v2
|
uses: android-actions/setup-android@v2
|
||||||
- name: Clean build artifacts
|
- name: Clean build artifacts
|
||||||
@ -55,7 +56,9 @@ jobs:
|
|||||||
rm -rf app/build/outputs/apk/*
|
rm -rf app/build/outputs/apk/*
|
||||||
rm -rf app/build/outputs/bundle/*
|
rm -rf app/build/outputs/bundle/*
|
||||||
- name: Bundle play release with Gradle
|
- name: Bundle play release with Gradle
|
||||||
run: ./gradlew bundlePlayRelease
|
uses: gradle/gradle-build-action@v2
|
||||||
|
with:
|
||||||
|
arguments: bundlePlayRelease
|
||||||
sign:
|
sign:
|
||||||
name: Sign App Bundle
|
name: Sign App Bundle
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
|
11
.github/workflows/build-release-apk.yml
vendored
11
.github/workflows/build-release-apk.yml
vendored
@ -43,10 +43,11 @@ jobs:
|
|||||||
androidHome: ${{ env.ANDROID_HOME }}
|
androidHome: ${{ env.ANDROID_HOME }}
|
||||||
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
||||||
steps:
|
steps:
|
||||||
- name: Setup JDK 1.8
|
- name: Setup JDK 11
|
||||||
uses: actions/setup-java@v1
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
java-version: 1.8
|
distribution: 'temurin'
|
||||||
|
java-version: '11'
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v2
|
uses: android-actions/setup-android@v2
|
||||||
- name: Clean build artifacts
|
- name: Clean build artifacts
|
||||||
@ -55,7 +56,9 @@ jobs:
|
|||||||
rm -rf app/build/outputs/apk/*
|
rm -rf app/build/outputs/apk/*
|
||||||
rm -rf app/build/outputs/bundle/*
|
rm -rf app/build/outputs/bundle/*
|
||||||
- name: Assemble official release with Gradle
|
- name: Assemble official release with Gradle
|
||||||
run: ./gradlew assembleOfficialRelease
|
uses: gradle/gradle-build-action@v2
|
||||||
|
with:
|
||||||
|
arguments: assembleOfficialRelease
|
||||||
sign:
|
sign:
|
||||||
name: Sign APK
|
name: Sign APK
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -265,3 +265,4 @@ fabric.properties
|
|||||||
# End of https://www.toptal.com/developers/gitignore/api/android,androidstudio,gradle,java,kotlin
|
# End of https://www.toptal.com/developers/gitignore/api/android,androidstudio,gradle,java,kotlin
|
||||||
|
|
||||||
signatures/
|
signatures/
|
||||||
|
.idea/*.xml
|
||||||
|
1
.idea/codeStyles/Project.xml
generated
1
.idea/codeStyles/Project.xml
generated
@ -1,6 +1,7 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
<code_scheme name="Project" version="173">
|
<code_scheme name="Project" version="173">
|
||||||
<JetCodeStyleSettings>
|
<JetCodeStyleSettings>
|
||||||
|
<option name="ALLOW_TRAILING_COMMA" value="true" />
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
</JetCodeStyleSettings>
|
</JetCodeStyleSettings>
|
||||||
<codeStyleSettings language="XML">
|
<codeStyleSettings language="XML">
|
||||||
|
6
.idea/copyright/Antoni.xml
generated
Normal file
6
.idea/copyright/Antoni.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright (c) Antoni Czaplicki &#36;{today.year}-&#36;{today.month}-&#36;{today.day}. " />
|
||||||
|
<option name="myName" value="Antoni" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
1
.idea/dictionaries/Kuba.xml
generated
1
.idea/dictionaries/Kuba.xml
generated
@ -13,6 +13,7 @@
|
|||||||
<w>synergia</w>
|
<w>synergia</w>
|
||||||
<w>szczodrzyński</w>
|
<w>szczodrzyński</w>
|
||||||
<w>szkolny</w>
|
<w>szkolny</w>
|
||||||
|
<w>usos</w>
|
||||||
</words>
|
</words>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</component>
|
</component>
|
9
.idea/discord.xml
generated
9
.idea/discord.xml
generated
@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="DiscordProjectSettings">
|
|
||||||
<option name="show" value="PROJECT_FILES" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectNotificationSettings">
|
|
||||||
<option name="askShowProject" value="false" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
6
.idea/kotlinc.xml
generated
6
.idea/kotlinc.xml
generated
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Kotlin2JvmCompilerArguments">
|
|
||||||
<option name="jvmTarget" value="1.8" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
13
.idea/runConfigurations.xml
generated
13
.idea/runConfigurations.xml
generated
@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="RunConfigurationProducerService">
|
|
||||||
<option name="ignoredProducers">
|
|
||||||
<set>
|
|
||||||
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
|
|
||||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
|
||||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
|
||||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
|
||||||
</set>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
110
app/build.gradle
110
app/build.gradle
@ -1,6 +1,7 @@
|
|||||||
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: 'kotlin-parcelize'
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
apply plugin: 'com.google.firebase.crashlytics'
|
apply plugin: 'com.google.firebase.crashlytics'
|
||||||
|
|
||||||
@ -30,11 +31,21 @@ android {
|
|||||||
cppFlags "-std=c++11"
|
cppFlags "-std=c++11"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kapt {
|
||||||
|
arguments {
|
||||||
|
arg("room.schemaLocation", "$projectDir/schemas")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
|
getIsDefault().set(true)
|
||||||
minifyEnabled = false
|
minifyEnabled = false
|
||||||
|
manifestPlaceholders = [
|
||||||
|
buildTimestamp: 0
|
||||||
|
]
|
||||||
}
|
}
|
||||||
release {
|
release {
|
||||||
minifyEnabled = true
|
minifyEnabled = true
|
||||||
@ -45,23 +56,34 @@ android {
|
|||||||
}
|
}
|
||||||
flavorDimensions "platform"
|
flavorDimensions "platform"
|
||||||
productFlavors {
|
productFlavors {
|
||||||
main {
|
unofficial {
|
||||||
versionName gitInfo.versionHuman
|
getIsDefault().set(true)
|
||||||
|
versionName "${release.versionName}-${gitInfo.versionSuffix}"
|
||||||
}
|
}
|
||||||
official {}
|
official {}
|
||||||
play {}
|
play {}
|
||||||
}
|
}
|
||||||
variantFilter { variant ->
|
variantFilter { variant ->
|
||||||
def flavors = variant.flavors*.name
|
def flavors = variant.flavors*.name
|
||||||
setIgnore(variant.buildType.name == "debug" && !flavors.contains("main"))
|
setIgnore(variant.buildType.name == "debug" && !flavors.contains("unofficial") || flavors.contains("main"))
|
||||||
|
}
|
||||||
|
sourceSets {
|
||||||
|
unofficial {
|
||||||
|
java.srcDirs = ["src/main/java", "src/play-not/java"]
|
||||||
|
manifest.srcFile("src/play-not/AndroidManifest.xml")
|
||||||
|
}
|
||||||
|
official {
|
||||||
|
java.srcDirs = ["src/main/java", "src/play-not/java"]
|
||||||
|
manifest.srcFile("src/play-not/AndroidManifest.xml")
|
||||||
|
}
|
||||||
|
play {
|
||||||
|
java.srcDirs = ["src/main/java", "src/play/java"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
}
|
}
|
||||||
lintOptions {
|
|
||||||
checkReleaseBuilds = false
|
|
||||||
}
|
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
dataBinding = true
|
dataBinding = true
|
||||||
viewBinding = true
|
viewBinding = true
|
||||||
@ -75,7 +97,9 @@ android {
|
|||||||
jvmTarget = "1.8"
|
jvmTarget = "1.8"
|
||||||
}
|
}
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
exclude 'META-INF/library-core_release.kotlin_module'
|
resources {
|
||||||
|
excludes += ['META-INF/library-core_release.kotlin_module']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
@ -83,6 +107,9 @@ android {
|
|||||||
version "3.10.2"
|
version "3.10.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
lint {
|
||||||
|
checkReleaseBuilds false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.whenTaskAdded { task ->
|
tasks.whenTaskAdded { task ->
|
||||||
@ -117,28 +144,29 @@ dependencies {
|
|||||||
|
|
||||||
// Language cores
|
// Language cores
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
|
implementation "androidx.multidex:multidex:2.0.1"
|
||||||
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
|
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
|
||||||
|
|
||||||
// Android Jetpack
|
// Android Jetpack
|
||||||
implementation "androidx.appcompat:appcompat:1.2.0"
|
implementation "androidx.appcompat:appcompat:1.5.1"
|
||||||
implementation "androidx.cardview:cardview:1.0.0"
|
implementation "androidx.cardview:cardview:1.0.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
|
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
||||||
implementation "androidx.core:core-ktx:1.3.2"
|
implementation "androidx.core:core-ktx:1.9.0"
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0"
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
|
||||||
implementation "androidx.navigation:navigation-fragment-ktx:2.3.4"
|
implementation "androidx.navigation:navigation-fragment-ktx:2.5.2"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
implementation "androidx.recyclerview:recyclerview:1.2.1"
|
||||||
implementation "androidx.room:room-runtime:2.2.6"
|
implementation "androidx.room:room-runtime:2.4.3"
|
||||||
implementation "androidx.work:work-runtime-ktx:2.5.0"
|
implementation "androidx.work:work-runtime-ktx:2.7.1"
|
||||||
kapt "androidx.room:room-compiler:2.2.6"
|
kapt "androidx.room:room-compiler:2.4.3"
|
||||||
|
|
||||||
// Google design libs
|
// Google design libs
|
||||||
implementation "com.google.android.material:material:1.3.0"
|
implementation "com.google.android.material:material:1.6.1"
|
||||||
implementation "com.google.android:flexbox:2.0.1"
|
implementation "com.google.android.flexbox:flexbox:3.0.0"
|
||||||
|
|
||||||
// Play Services/Firebase
|
// Play Services/Firebase
|
||||||
implementation "com.google.android.gms:play-services-wearable:17.0.0"
|
implementation "com.google.android.gms:play-services-wearable:17.1.0"
|
||||||
implementation "com.google.firebase:firebase-core:18.0.2"
|
implementation("com.google.firebase:firebase-core") { version { strictly "19.0.2" } }
|
||||||
implementation "com.google.firebase:firebase-crashlytics:17.4.0"
|
implementation "com.google.firebase:firebase-crashlytics:18.2.13"
|
||||||
implementation("com.google.firebase:firebase-messaging") { version { strictly "20.1.3" } }
|
implementation("com.google.firebase:firebase-messaging") { version { strictly "20.1.3" } }
|
||||||
|
|
||||||
// OkHttp, Retrofit, Gson, Jsoup
|
// OkHttp, Retrofit, Gson, Jsoup
|
||||||
@ -146,21 +174,22 @@ dependencies {
|
|||||||
implementation "com.squareup.retrofit2:retrofit:2.9.0"
|
implementation "com.squareup.retrofit2:retrofit:2.9.0"
|
||||||
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
|
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
|
||||||
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
|
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.8'
|
||||||
implementation "org.jsoup:jsoup:1.13.1"
|
implementation 'org.jsoup:jsoup:1.14.3'
|
||||||
implementation "pl.droidsonroids:jspoon:1.3.2"
|
implementation "pl.droidsonroids:jspoon:1.3.2"
|
||||||
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
|
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
|
||||||
|
|
||||||
// Szkolny.eu libraries/forks
|
// Szkolny.eu libraries/forks
|
||||||
implementation "eu.szkolny:android-snowfall:1ca9ea2da3"
|
implementation "eu.szkolny:android-snowfall:1ca9ea2da3"
|
||||||
implementation "eu.szkolny:agendacalendarview:5431f03098"
|
implementation "eu.szkolny:agendacalendarview:1.0.4"
|
||||||
implementation "eu.szkolny:cafebar:5bf0c618de"
|
implementation "eu.szkolny:cafebar:5bf0c618de"
|
||||||
implementation "eu.szkolny.fslogin:lib:2.0.0"
|
implementation "eu.szkolny.fslogin:lib:2.0.0"
|
||||||
implementation "eu.szkolny:material-about-library:1d5ebaf47c"
|
implementation "eu.szkolny:material-about-library:1d5ebaf47c"
|
||||||
implementation "eu.szkolny:mhttp:af4b62e6e9"
|
implementation "eu.szkolny:mhttp:af4b62e6e9"
|
||||||
implementation "eu.szkolny:nachos:0e5dfcaceb"
|
implementation "eu.szkolny:nachos:0e5dfcaceb"
|
||||||
implementation "eu.szkolny.selective-dao:annotation:27f8f3f194"
|
implementation "eu.szkolny.selective-dao:annotation:27f8f3f194"
|
||||||
implementation "eu.szkolny:ssl-provider:1.0.0"
|
officialImplementation "eu.szkolny:ssl-provider:1.0.0"
|
||||||
|
unofficialImplementation "eu.szkolny:ssl-provider:1.0.0"
|
||||||
implementation "pl.szczodrzynski:navlib:0.8.0"
|
implementation "pl.szczodrzynski:navlib:0.8.0"
|
||||||
implementation "pl.szczodrzynski:numberslidingpicker:2921225f76"
|
implementation "pl.szczodrzynski:numberslidingpicker:2921225f76"
|
||||||
implementation "pl.szczodrzynski:recyclertablayout:700f980584"
|
implementation "pl.szczodrzynski:recyclertablayout:700f980584"
|
||||||
@ -168,33 +197,34 @@ dependencies {
|
|||||||
kapt "eu.szkolny.selective-dao:codegen:27f8f3f194"
|
kapt "eu.szkolny.selective-dao:codegen:27f8f3f194"
|
||||||
|
|
||||||
// Iconics & related
|
// Iconics & related
|
||||||
implementation "com.mikepenz:iconics-core:5.3.0-b01"
|
implementation "com.mikepenz:iconics-core:5.3.2"
|
||||||
implementation "com.mikepenz:iconics-views:5.3.0-b01"
|
implementation "com.mikepenz:iconics-views:5.3.2"
|
||||||
implementation "com.mikepenz:community-material-typeface:5.8.55.0-kotlin@aar"
|
implementation "com.mikepenz:community-material-typeface:5.8.55.0-kotlin@aar"
|
||||||
implementation "eu.szkolny:szkolny-font:1.3"
|
implementation "eu.szkolny:szkolny-font:77e33acc2a"
|
||||||
|
|
||||||
// Other dependencies
|
// Other dependencies
|
||||||
implementation "cat.ereza:customactivityoncrash:2.3.0"
|
implementation "cat.ereza:customactivityoncrash:2.3.0"
|
||||||
implementation "com.applandeo:material-calendar-view:1.5.0"
|
implementation "com.android.volley:volley:1.2.1"
|
||||||
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
|
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
|
||||||
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2"
|
implementation "com.github.Applandeo:Material-Calendar-View:15de569cbc" // https://github.com/Applandeo/Material-Calendar-View
|
||||||
implementation "com.github.bassaer:chatmessageview:2.0.1"
|
implementation "com.github.CanHub:Android-Image-Cropper:2.2.2" // https://github.com/CanHub/Android-Image-Cropper
|
||||||
implementation "com.github.CanHub:Android-Image-Cropper:2.2.2"
|
implementation "com.github.ChuckerTeam.Chucker:library:3.0.1" // https://github.com/ChuckerTeam/chucker
|
||||||
implementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
|
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2" // https://github.com/antonKozyriatskyi/CircularProgressIndicator
|
||||||
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31"
|
implementation "com.github.bassaer:chatmessageview:2.0.1" // https://github.com/bassaer/ChatMessageView
|
||||||
implementation("com.heinrichreimersoftware:material-intro") { version { strictly "1.5.8" } }
|
implementation "com.github.hypertrack:hyperlog-android:0.0.10" // https://github.com/hypertrack/hyperlog-android
|
||||||
implementation "com.hypertrack:hyperlog:0.0.10"
|
implementation "com.github.smuyyh:JsonViewer:V1.0.6" // https://github.com/smuyyh/JsonViewer
|
||||||
|
implementation "com.github.underwindfall.PowerPermission:powerpermission-coroutines:1.4.0" // https://github.com/underwindfall/PowerPermission
|
||||||
|
implementation "com.github.underwindfall.PowerPermission:powerpermission:1.4.0" // https://github.com/underwindfall/PowerPermission
|
||||||
|
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31" // https://github.com/wulkanowy/uonet-request-signer
|
||||||
implementation "com.jaredrummler:colorpicker:1.1.0"
|
implementation "com.jaredrummler:colorpicker:1.1.0"
|
||||||
implementation "com.qifan.powerpermission:powerpermission-coroutines:1.3.0"
|
|
||||||
implementation "com.qifan.powerpermission:powerpermission:1.3.0"
|
|
||||||
implementation "com.yuyh.json:jsonviewer:1.0.6"
|
|
||||||
implementation "io.coil-kt:coil:1.1.1"
|
implementation "io.coil-kt:coil:1.1.1"
|
||||||
implementation "me.dm7.barcodescanner:zxing:1.9.8"
|
implementation "me.dm7.barcodescanner:zxing:1.9.8"
|
||||||
implementation "me.grantland:autofittextview:0.2.1"
|
implementation "me.grantland:autofittextview:0.2.1"
|
||||||
implementation "me.leolin:ShortcutBadger:1.1.22@aar"
|
implementation "me.leolin:ShortcutBadger:1.1.22@aar"
|
||||||
implementation "org.greenrobot:eventbus:3.2.0"
|
implementation "org.greenrobot:eventbus:3.2.0"
|
||||||
|
implementation("com.heinrichreimersoftware:material-intro") { version { strictly "1.5.8" } }
|
||||||
implementation("pl.droidsonroids.gif:android-gif-drawable") { version { strictly "1.2.15" } }
|
implementation("pl.droidsonroids.gif:android-gif-drawable") { version { strictly "1.2.15" } }
|
||||||
|
|
||||||
// Debug-only dependencies
|
// Debug-only dependencies
|
||||||
debugImplementation "com.amitshekhar.android:debug-db:1.0.5"
|
debugImplementation "com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:v1.0.6"
|
||||||
}
|
}
|
||||||
|
@ -97,18 +97,17 @@ private def buildGitInfo() {
|
|||||||
def tag = getLastTag(repo, git, head)
|
def tag = getLastTag(repo, git, head)
|
||||||
def tagName = tag[1]
|
def tagName = tag[1]
|
||||||
def tagRevCount = tag[2]
|
def tagRevCount = tag[2]
|
||||||
def versionName = tagName.replace("v", "")
|
|
||||||
|
|
||||||
def result = [
|
def result = [
|
||||||
hash : head.objectId.name,
|
hash : head.objectId.name,
|
||||||
branch : repo.branch,
|
branch : repo.branch,
|
||||||
dirty : dirty,
|
dirty : dirty,
|
||||||
remotes : remotes,
|
remotes : remotes,
|
||||||
unstaged : status.uncommittedChanges.join("; "),
|
unstaged : status.uncommittedChanges.join("; "),
|
||||||
tag : tagName,
|
tag : tagName,
|
||||||
revCount : tagRevCount,
|
revCount : tagRevCount,
|
||||||
version : """$tagName-$tagRevCount-g${head.objectId.name.substring(0, 8)}""" + (dirty ? ".dirty" : ""),
|
version : """$tagName-$tagRevCount-g${head.objectId.name.substring(0, 8)}""" + (dirty ? ".dirty" : ""),
|
||||||
versionHuman: """$versionName-${repo.branch.replace("/", "_")}""" + (dirty ? ".dirty" : "")
|
versionSuffix : """${repo.branch.replace("/", "_")}""" + (dirty ? ".dirty" : "")
|
||||||
]
|
]
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
5
app/proguard-rules.pro
vendored
5
app/proguard-rules.pro
vendored
@ -25,7 +25,8 @@
|
|||||||
-keep class pl.szczodrzynski.edziennik.data.db.entity.Event { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.entity.Event { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.data.db.full.EventFull { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.full.EventFull { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.ui.modules.home.HomeCardModel { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.entity.Note { *; }
|
||||||
|
-keep class pl.szczodrzynski.edziennik.ui.home.HomeCardModel { *; }
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.ui.widgets.WidgetConfig { public *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.ui.widgets.WidgetConfig { public *; }
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider
|
||||||
@ -67,7 +68,7 @@
|
|||||||
|
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo$Platform { *; }
|
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.login.LoginInfo$Platform { *; }
|
||||||
|
|
||||||
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData { *; }
|
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData$Type { *; }
|
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData$Type { *; }
|
||||||
|
2293
app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/97.json
Normal file
2293
app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/97.json
Normal file
File diff suppressed because it is too large
Load Diff
2314
app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/98.json
Normal file
2314
app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/98.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="pl.szczodrzynski.edziennik">
|
package="pl.szczodrzynski.edziennik">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
@ -13,7 +12,7 @@
|
|||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
<!-- PowerPermission uses minSdk 21, it's safe to override as it is used only in >= 23 -->
|
<!-- PowerPermission uses minSdk 21, it's safe to override as it is used only in >= 23 -->
|
||||||
<uses-sdk tools:overrideLibrary="com.qifan.powerpermission.coroutines, com.qifan.powerpermission.core" />
|
<uses-sdk tools:overrideLibrary="com.qifan.powerpermission.coroutines, com.qifan.powerpermission.core" />
|
||||||
|
|
||||||
@ -43,6 +42,7 @@
|
|||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
|
android:exported="true"
|
||||||
android:theme="@style/SplashTheme">
|
android:theme="@style/SplashTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@ -66,6 +66,7 @@
|
|||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
|
android:exported="true"
|
||||||
android:theme="@style/AppTheme.Dark.NoDisplay">
|
android:theme="@style/AppTheme.Dark.NoDisplay">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
||||||
@ -73,7 +74,8 @@
|
|||||||
</activity>
|
</activity>
|
||||||
<!-- TIMETABLE -->
|
<!-- TIMETABLE -->
|
||||||
<receiver android:name=".ui.widgets.timetable.WidgetTimetableProvider"
|
<receiver android:name=".ui.widgets.timetable.WidgetTimetableProvider"
|
||||||
android:label="@string/widget_timetable_title">
|
android:label="@string/widget_timetable_title"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -88,10 +90,12 @@
|
|||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
|
android:exported="true"
|
||||||
android:theme="@style/AppTheme.Dark.NoDisplay" />
|
android:theme="@style/AppTheme.Dark.NoDisplay" />
|
||||||
<!-- NOTIFICATIONS -->
|
<!-- NOTIFICATIONS -->
|
||||||
<receiver android:name=".ui.widgets.notifications.WidgetNotificationsProvider"
|
<receiver android:name=".ui.widgets.notifications.WidgetNotificationsProvider"
|
||||||
android:label="@string/widget_notifications_title">
|
android:label="@string/widget_notifications_title"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -104,7 +108,8 @@
|
|||||||
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
||||||
<!-- LUCKY NUMBER -->
|
<!-- LUCKY NUMBER -->
|
||||||
<receiver android:name=".ui.widgets.luckynumber.WidgetLuckyNumberProvider"
|
<receiver android:name=".ui.widgets.luckynumber.WidgetLuckyNumberProvider"
|
||||||
android:label="@string/widget_lucky_number_title">
|
android:label="@string/widget_lucky_number_title"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -121,31 +126,43 @@
|
|||||||
/ ____ \ (__| |_| |\ V /| | |_| | __/\__ \
|
/ ____ \ (__| |_| |\ V /| | |_| | __/\__ \
|
||||||
/_/ \_\___|\__|_| \_/ |_|\__|_|\___||___/
|
/_/ \_\___|\__|_| \_/ |_|\__|_|\___||___/
|
||||||
-->
|
-->
|
||||||
<activity android:name=".ui.modules.base.CrashActivity"
|
<activity android:name=".ui.base.CrashActivity"
|
||||||
android:configChanges="orientation|screenSize|keyboardHidden"
|
android:configChanges="orientation|screenSize|keyboardHidden"
|
||||||
android:process=":error_activity"
|
android:process=":error_activity"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/DeadTheme" />
|
android:theme="@style/DeadTheme" />
|
||||||
<activity android:name=".ui.modules.intro.ChangelogIntroActivity"
|
<activity android:name=".ui.intro.ChangelogIntroActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/Theme.Intro" />
|
android:theme="@style/Theme.Intro" />
|
||||||
<activity android:name=".ui.modules.login.LoginActivity"
|
<activity android:name=".ui.login.LoginActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/AppTheme.Light" />
|
android:theme="@style/AppTheme.Light" />
|
||||||
<activity android:name=".ui.modules.home.CounterActivity"
|
<activity android:name=".ui.home.CounterActivity"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/AppTheme.Black" />
|
android:theme="@style/AppTheme.Black" />
|
||||||
<activity android:name=".ui.modules.feedback.FeedbackActivity"
|
<activity android:name=".ui.feedback.FeedbackActivity"
|
||||||
android:configChanges="orientation|screenSize|keyboardHidden"
|
android:configChanges="orientation|screenSize|keyboardHidden"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/AppTheme" />
|
android:theme="@style/AppTheme" />
|
||||||
<activity android:name=".ui.modules.settings.SettingsLicenseActivity"
|
<activity android:name=".ui.settings.SettingsLicenseActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/AppTheme" />
|
android:theme="@style/AppTheme" />
|
||||||
<activity android:name="com.canhub.cropper.CropImageActivity"
|
<activity android:name="com.canhub.cropper.CropImageActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
|
android:exported="false"
|
||||||
android:theme="@style/Base.Theme.AppCompat" />
|
android:theme="@style/Base.Theme.AppCompat" />
|
||||||
<activity android:name=".ui.modules.base.BuildInvalidActivity" />
|
<activity android:name=".ui.login.oauth.OAuthLoginActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden"
|
||||||
|
android:exported="false"
|
||||||
|
android:theme="@style/AppTheme.Light" />
|
||||||
|
<activity android:name=".ui.base.BuildInvalidActivity" android:exported="false" />
|
||||||
|
<activity android:name=".ui.settings.contributors.ContributorsActivity" android:exported="false" />
|
||||||
|
|
||||||
<!-- _____ _
|
<!-- _____ _
|
||||||
| __ \ (_)
|
| __ \ (_)
|
||||||
@ -155,12 +172,14 @@
|
|||||||
|_| \_\___|\___\___|_| \_/ \___|_| |___/
|
|_| \_\___|\___\___|_| \_/ \___|_| |___/
|
||||||
-->
|
-->
|
||||||
<receiver android:name=".receivers.UserPresentReceiver"
|
<receiver android:name=".receivers.UserPresentReceiver"
|
||||||
android:enabled="true">
|
android:enabled="true"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.USER_PRESENT" />
|
<action android:name="android.intent.action.USER_PRESENT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<receiver android:name=".sync.UpdateDownloaderService$DownloadProgressReceiver">
|
<receiver android:name=".sync.UpdateDownloaderService$DownloadProgressReceiver"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
|
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
<h3>Wersja 4.8, 2021-05-26</h3>
|
<h3>Wersja 4.13-beta.1, 2022-10-17</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Dodano ikony dla powiadomień. @Luncenok</li>
|
<li>Poprawione powiadomienia na Androidzie 13. @santoni0</li>
|
||||||
<li>Terminarz: opcje konfiguracji, widok kompaktowy, grupowanie wydarzeń, znaczki nieprzeczytanych, nowe ikony i wiele innych usprawnień.</li>
|
<li>Możliwość dostosowania wyświetlania planu lekcji</li>
|
||||||
<li>Wiadomości: usprawiono wyszukiwanie - zapisywanie szukanego tekstu po wejściu w wiadomość.</li>
|
<li>Opcja kolorowania bloków w planie lekcji</li>
|
||||||
<li>Wiadomości: dodano opcję konfiguracji podpisu przy wysyłaniu wiadomości.</li>
|
<li><b>USOS</b> - pierwsza wersja obsługi systemu</li>
|
||||||
<li>Plan lekcji: dodano znacznik aktualnej pory dnia w planie lekcji.</li>
|
|
||||||
<li>Powiadomienia: dodano szczegółowy opis po rozwinięciu.</li>
|
|
||||||
<li>Wydarzenia: nowy rodzaj "lekcja online".</li>
|
|
||||||
<li>Naprawiono odbieranie nagrody w easter egg'u.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
Dzięki za korzystanie ze Szkolnego!<br>
|
Dzięki za korzystanie ze Szkolnego!<br>
|
||||||
<i>© [Kuba Szczodrzyński](@kuba2k2), [Kacper Ziubryniewicz](@kapi2289) 2021</i>
|
<i>© [Kuba Szczodrzyński](@kuba2k2), [Kacper Ziubryniewicz](@kapi2289) 2022</i>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
/*secret password - removed for source code publication*/
|
/*secret password - removed for source code publication*/
|
||||||
static toys AES_IV[16] = {
|
static toys AES_IV[16] = {
|
||||||
0x71, 0xcf, 0xdf, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
0x12, 0xdd, 0xb2, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||||
|
|
||||||
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
||||||
|
|
||||||
|
@ -26,8 +26,6 @@ import com.google.firebase.messaging.FirebaseMessaging
|
|||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.hypertrack.hyperlog.HyperLog
|
import com.hypertrack.hyperlog.HyperLog
|
||||||
import com.mikepenz.iconics.Iconics
|
import com.mikepenz.iconics.Iconics
|
||||||
import eu.szkolny.sslprovider.SSLProvider
|
|
||||||
import eu.szkolny.sslprovider.enableSupportedTls
|
|
||||||
import im.wangchao.mhttp.MHttp
|
import im.wangchao.mhttp.MHttp
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import me.leolin.shortcutbadger.ShortcutBadger
|
import me.leolin.shortcutbadger.ShortcutBadger
|
||||||
@ -35,17 +33,21 @@ import okhttp3.OkHttpClient
|
|||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import pl.szczodrzynski.edziennik.config.Config
|
import pl.szczodrzynski.edziennik.config.Config
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.ProfileListEmptyEvent
|
import pl.szczodrzynski.edziennik.data.api.events.ProfileListEmptyEvent
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing
|
import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing
|
||||||
import pl.szczodrzynski.edziennik.data.db.AppDb
|
import pl.szczodrzynski.edziennik.data.db.AppDb
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
|
import pl.szczodrzynski.edziennik.ext.DAY
|
||||||
|
import pl.szczodrzynski.edziennik.ext.MS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.setLanguage
|
||||||
|
import pl.szczodrzynski.edziennik.network.SSLProviderInstaller
|
||||||
import pl.szczodrzynski.edziennik.network.cookie.DumbCookieJar
|
import pl.szczodrzynski.edziennik.network.cookie.DumbCookieJar
|
||||||
import pl.szczodrzynski.edziennik.sync.SyncWorker
|
import pl.szczodrzynski.edziennik.sync.SyncWorker
|
||||||
import pl.szczodrzynski.edziennik.sync.UpdateWorker
|
import pl.szczodrzynski.edziennik.sync.UpdateWorker
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity
|
import pl.szczodrzynski.edziennik.ui.base.CrashActivity
|
||||||
import pl.szczodrzynski.edziennik.utils.*
|
import pl.szczodrzynski.edziennik.utils.*
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.*
|
import pl.szczodrzynski.edziennik.utils.managers.*
|
||||||
import timber.log.Timber
|
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
@ -58,10 +60,12 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
|||||||
val profileId
|
val profileId
|
||||||
get() = profile.id
|
get() = profile.id
|
||||||
|
|
||||||
|
var enableChucker = false
|
||||||
var debugMode = false
|
var debugMode = false
|
||||||
var devMode = false
|
var devMode = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val api by lazy { SzkolnyApi(this) }
|
||||||
val notificationChannelsManager by lazy { NotificationChannelsManager(this) }
|
val notificationChannelsManager by lazy { NotificationChannelsManager(this) }
|
||||||
val userActionManager by lazy { UserActionManager(this) }
|
val userActionManager by lazy { UserActionManager(this) }
|
||||||
val gradesManager by lazy { GradesManager(this) }
|
val gradesManager by lazy { GradesManager(this) }
|
||||||
@ -70,6 +74,10 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
|||||||
val permissionManager by lazy { PermissionManager(this) }
|
val permissionManager by lazy { PermissionManager(this) }
|
||||||
val attendanceManager by lazy { AttendanceManager(this) }
|
val attendanceManager by lazy { AttendanceManager(this) }
|
||||||
val buildManager by lazy { BuildManager(this) }
|
val buildManager by lazy { BuildManager(this) }
|
||||||
|
val availabilityManager by lazy { AvailabilityManager(this) }
|
||||||
|
val textStylingManager by lazy { TextStylingManager(this) }
|
||||||
|
val messageManager by lazy { MessageManager(this) }
|
||||||
|
val noteManager by lazy { NoteManager(this) }
|
||||||
|
|
||||||
val db
|
val db
|
||||||
get() = App.db
|
get() = App.db
|
||||||
@ -109,15 +117,18 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
|||||||
.connectTimeout(15, TimeUnit.SECONDS)
|
.connectTimeout(15, TimeUnit.SECONDS)
|
||||||
.writeTimeout(10, TimeUnit.SECONDS)
|
.writeTimeout(10, TimeUnit.SECONDS)
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
.enableSupportedTls(enableCleartext = true)
|
|
||||||
|
SSLProviderInstaller.enableSupportedTls(builder, enableCleartext = true)
|
||||||
|
|
||||||
if (devMode) {
|
if (devMode) {
|
||||||
HyperLog.initialize(this)
|
HyperLog.initialize(this)
|
||||||
HyperLog.setLogLevel(Log.VERBOSE)
|
HyperLog.setLogLevel(Log.VERBOSE)
|
||||||
HyperLog.setLogFormat(DebugLogFormat(this))
|
HyperLog.setLogFormat(DebugLogFormat(this))
|
||||||
val chuckerCollector = ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR)
|
if (enableChucker) {
|
||||||
val chuckerInterceptor = ChuckerInterceptor(this, chuckerCollector)
|
val chuckerCollector = ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR)
|
||||||
builder.addInterceptor(chuckerInterceptor)
|
val chuckerInterceptor = ChuckerInterceptor(this, chuckerCollector)
|
||||||
|
builder.addInterceptor(chuckerInterceptor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
http = builder.build()
|
http = builder.build()
|
||||||
@ -171,7 +182,8 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
|||||||
App.config = Config(App.db)
|
App.config = Config(App.db)
|
||||||
App.profile = Profile(0, 0, 0, "")
|
App.profile = Profile(0, 0, 0, "")
|
||||||
debugMode = BuildConfig.DEBUG
|
debugMode = BuildConfig.DEBUG
|
||||||
devMode = config.debugMode || debugMode
|
devMode = config.devMode ?: debugMode
|
||||||
|
enableChucker = config.enableChucker ?: devMode
|
||||||
|
|
||||||
if (!profileLoadById(config.lastProfileId)) {
|
if (!profileLoadById(config.lastProfileId)) {
|
||||||
db.profileDao().firstId?.let { profileLoadById(it) }
|
db.profileDao().firstId?.let { profileLoadById(it) }
|
||||||
@ -190,18 +202,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
|||||||
withContext(Dispatchers.Default) {
|
withContext(Dispatchers.Default) {
|
||||||
config.migrate(this@App)
|
config.migrate(this@App)
|
||||||
|
|
||||||
SSLProvider.install(
|
SSLProviderInstaller.install(applicationContext, this@App::buildHttp)
|
||||||
applicationContext,
|
|
||||||
downloadIfNeeded = true,
|
|
||||||
supportTls13 = false,
|
|
||||||
onFinish = {
|
|
||||||
buildHttp()
|
|
||||||
},
|
|
||||||
onError = {
|
|
||||||
Timber.e("Failed to install SSLProvider: $it")
|
|
||||||
it.printStackTrace()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if (config.devModePassword != null)
|
if (config.devModePassword != null)
|
||||||
checkDevModePassword()
|
checkDevModePassword()
|
||||||
|
@ -4,8 +4,11 @@
|
|||||||
package pl.szczodrzynski.edziennik
|
package pl.szczodrzynski.edziennik
|
||||||
|
|
||||||
import android.graphics.Paint
|
import android.graphics.Paint
|
||||||
|
import android.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.databinding.BindingAdapter
|
import androidx.databinding.BindingAdapter
|
||||||
|
import pl.szczodrzynski.edziennik.ext.dp
|
||||||
|
|
||||||
object Binding {
|
object Binding {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@ -17,4 +20,64 @@ object Binding {
|
|||||||
textView.paintFlags = textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
|
textView.paintFlags = textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:isVisible")
|
||||||
|
fun isVisible(view: View, isVisible: Boolean) {
|
||||||
|
view.isVisible = isVisible
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun resizeDrawable(textView: TextView, index: Int, size: Int) {
|
||||||
|
val drawables = textView.compoundDrawables
|
||||||
|
drawables[index]?.setBounds(0, 0, size, size)
|
||||||
|
textView.setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3])
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:drawableLeftAutoSize")
|
||||||
|
fun drawableLeftAutoSize(textView: TextView, enable: Boolean) = resizeDrawable(
|
||||||
|
textView,
|
||||||
|
index = 0,
|
||||||
|
size = textView.textSize.toInt(),
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:drawableRightAutoSize")
|
||||||
|
fun drawableRightAutoSize(textView: TextView, enable: Boolean) = resizeDrawable(
|
||||||
|
textView,
|
||||||
|
index = 2,
|
||||||
|
size = textView.textSize.toInt(),
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:drawableLeftSize")
|
||||||
|
fun drawableLeftSize(textView: TextView, sizeDp: Int) = resizeDrawable(
|
||||||
|
textView,
|
||||||
|
index = 0,
|
||||||
|
size = sizeDp.dp,
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:drawableTopSize")
|
||||||
|
fun drawableTopSize(textView: TextView, sizeDp: Int) = resizeDrawable(
|
||||||
|
textView,
|
||||||
|
index = 1,
|
||||||
|
size = sizeDp.dp,
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:drawableRightSize")
|
||||||
|
fun drawableRightSize(textView: TextView, sizeDp: Int) = resizeDrawable(
|
||||||
|
textView,
|
||||||
|
index = 2,
|
||||||
|
size = sizeDp.dp,
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@BindingAdapter("android:drawableBottomSize")
|
||||||
|
fun drawableBottomSize(textView: TextView, sizeDp: Int) = resizeDrawable(
|
||||||
|
textView,
|
||||||
|
index = 3,
|
||||||
|
size = sizeDp.dp,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -11,7 +11,7 @@ import android.provider.OpenableColumns
|
|||||||
import com.canhub.cropper.CropImage
|
import com.canhub.cropper.CropImage
|
||||||
import com.canhub.cropper.CropImageView
|
import com.canhub.cropper.CropImageView
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity
|
import pl.szczodrzynski.edziennik.ui.login.LoginActivity
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
|
|
||||||
|
@ -12,10 +12,7 @@ import kotlinx.coroutines.launch
|
|||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.BuildConfig
|
import pl.szczodrzynski.edziennik.BuildConfig
|
||||||
import pl.szczodrzynski.edziennik.config.db.ConfigEntry
|
import pl.szczodrzynski.edziennik.config.db.ConfigEntry
|
||||||
import pl.szczodrzynski.edziennik.config.utils.ConfigMigration
|
import pl.szczodrzynski.edziennik.config.utils.*
|
||||||
import pl.szczodrzynski.edziennik.config.utils.get
|
|
||||||
import pl.szczodrzynski.edziennik.config.utils.set
|
|
||||||
import pl.szczodrzynski.edziennik.config.utils.toHashMap
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
|
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
|
||||||
import pl.szczodrzynski.edziennik.data.db.AppDb
|
import pl.szczodrzynski.edziennik.data.db.AppDb
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
@ -75,10 +72,15 @@ class Config(val db: AppDb) : CoroutineScope, AbstractConfig {
|
|||||||
get() { mPrivacyPolicyAccepted = mPrivacyPolicyAccepted ?: values.get("privacyPolicyAccepted", false); return mPrivacyPolicyAccepted ?: false }
|
get() { mPrivacyPolicyAccepted = mPrivacyPolicyAccepted ?: values.get("privacyPolicyAccepted", false); return mPrivacyPolicyAccepted ?: false }
|
||||||
set(value) { set("privacyPolicyAccepted", value); mPrivacyPolicyAccepted = value }
|
set(value) { set("privacyPolicyAccepted", value); mPrivacyPolicyAccepted = value }
|
||||||
|
|
||||||
private var mDebugMode: Boolean? = null
|
private var mDevMode: Boolean? = null
|
||||||
var debugMode: Boolean
|
var devMode: Boolean?
|
||||||
get() { mDebugMode = mDebugMode ?: values.get("debugMode", false); return mDebugMode ?: false }
|
get() { mDevMode = mDevMode ?: values.getBooleanOrNull("debugMode"); return mDevMode }
|
||||||
set(value) { set("debugMode", value); mDebugMode = value }
|
set(value) { set("debugMode", value?.toString()); mDevMode = value }
|
||||||
|
|
||||||
|
private var mEnableChucker: Boolean? = null
|
||||||
|
var enableChucker: Boolean?
|
||||||
|
get() { mEnableChucker = mEnableChucker ?: values.getBooleanOrNull("enableChucker"); return mEnableChucker }
|
||||||
|
set(value) { set("enableChucker", value?.toString()); mEnableChucker = value }
|
||||||
|
|
||||||
private var mDevModePassword: String? = null
|
private var mDevModePassword: String? = null
|
||||||
var devModePassword: String?
|
var devModePassword: String?
|
||||||
@ -120,6 +122,11 @@ class Config(val db: AppDb) : CoroutineScope, AbstractConfig {
|
|||||||
get() { mApiInvalidCert = mApiInvalidCert ?: values["apiInvalidCert"]; return mApiInvalidCert }
|
get() { mApiInvalidCert = mApiInvalidCert ?: values["apiInvalidCert"]; return mApiInvalidCert }
|
||||||
set(value) { set("apiInvalidCert", value); mApiInvalidCert = value }
|
set(value) { set("apiInvalidCert", value); mApiInvalidCert = value }
|
||||||
|
|
||||||
|
private var mApiAvailabilityCheck: Boolean? = null
|
||||||
|
var apiAvailabilityCheck: Boolean
|
||||||
|
get() { mApiAvailabilityCheck = mApiAvailabilityCheck ?: values.get("apiAvailabilityCheck", true); return mApiAvailabilityCheck ?: true }
|
||||||
|
set(value) { set("apiAvailabilityCheck", value); mApiAvailabilityCheck = value }
|
||||||
|
|
||||||
private var rawEntries: List<ConfigEntry> = db.configDao().getAllNow()
|
private var rawEntries: List<ConfigEntry> = db.configDao().getAllNow()
|
||||||
private val profileConfigs: HashMap<Int, ProfileConfig> = hashMapOf()
|
private val profileConfigs: HashMap<Int, ProfileConfig> = hashMapOf()
|
||||||
init {
|
init {
|
||||||
|
@ -18,7 +18,7 @@ import kotlin.coroutines.CoroutineContext
|
|||||||
|
|
||||||
class ProfileConfig(val db: AppDb, val profileId: Int, rawEntries: List<ConfigEntry>) : CoroutineScope, AbstractConfig {
|
class ProfileConfig(val db: AppDb, val profileId: Int, rawEntries: List<ConfigEntry>) : CoroutineScope, AbstractConfig {
|
||||||
companion object {
|
companion object {
|
||||||
const val DATA_VERSION = 2
|
const val DATA_VERSION = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
private val job = Job()
|
private val job = Job()
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.config
|
package pl.szczodrzynski.edziennik.config
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.config.utils.get
|
import pl.szczodrzynski.edziennik.config.utils.getIntList
|
||||||
import pl.szczodrzynski.edziennik.config.utils.set
|
import pl.szczodrzynski.edziennik.config.utils.set
|
||||||
|
|
||||||
class ProfileConfigSync(private val config: ProfileConfig) {
|
class ProfileConfigSync(private val config: ProfileConfig) {
|
||||||
private var mNotificationFilter: List<Int>? = null
|
private var mNotificationFilter: List<Int>? = null
|
||||||
var notificationFilter: List<Int>
|
var notificationFilter: List<Int>
|
||||||
get() { mNotificationFilter = mNotificationFilter ?: config.values.get("notificationFilter", listOf()); return mNotificationFilter ?: listOf() }
|
get() { mNotificationFilter = mNotificationFilter ?: config.values.getIntList("notificationFilter", listOf()); return mNotificationFilter ?: listOf() }
|
||||||
set(value) { config.set("notificationFilter", value); mNotificationFilter = value }
|
set(value) { config.set("notificationFilter", value); mNotificationFilter = value }
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ package pl.szczodrzynski.edziennik.config
|
|||||||
import pl.szczodrzynski.edziennik.config.utils.get
|
import pl.szczodrzynski.edziennik.config.utils.get
|
||||||
import pl.szczodrzynski.edziennik.config.utils.set
|
import pl.szczodrzynski.edziennik.config.utils.set
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.home.HomeCardModel
|
import pl.szczodrzynski.edziennik.ui.home.HomeCardModel
|
||||||
|
|
||||||
class ProfileConfigUI(private val config: ProfileConfig) {
|
class ProfileConfigUI(private val config: ProfileConfig) {
|
||||||
private var mAgendaViewType: Int? = null
|
private var mAgendaViewType: Int? = null
|
||||||
@ -69,4 +69,24 @@ class ProfileConfigUI(private val config: ProfileConfig) {
|
|||||||
var messagesGreetingText: String?
|
var messagesGreetingText: String?
|
||||||
get() { mMessagesGreetingText = mMessagesGreetingText ?: config.values["messagesGreetingText"]; return mMessagesGreetingText }
|
get() { mMessagesGreetingText = mMessagesGreetingText ?: config.values["messagesGreetingText"]; return mMessagesGreetingText }
|
||||||
set(value) { config.set("messagesGreetingText", value); mMessagesGreetingText = value }
|
set(value) { config.set("messagesGreetingText", value); mMessagesGreetingText = value }
|
||||||
|
|
||||||
|
private var mTimetableShowAttendance: Boolean? = null
|
||||||
|
var timetableShowAttendance: Boolean
|
||||||
|
get() { mTimetableShowAttendance = mTimetableShowAttendance ?: config.values.get("timetableShowAttendance", true); return mTimetableShowAttendance ?: true }
|
||||||
|
set(value) { config.set("timetableShowAttendance", value); mTimetableShowAttendance = value }
|
||||||
|
|
||||||
|
private var mTimetableShowEvents: Boolean? = null
|
||||||
|
var timetableShowEvents: Boolean
|
||||||
|
get() { mTimetableShowEvents = mTimetableShowEvents ?: config.values.get("timetableShowEvents", true); return mTimetableShowEvents ?: true }
|
||||||
|
set(value) { config.set("timetableShowEvents", value); mTimetableShowEvents = value }
|
||||||
|
|
||||||
|
private var mTimetableTrimHourRange: Boolean? = null
|
||||||
|
var timetableTrimHourRange: Boolean
|
||||||
|
get() { mTimetableTrimHourRange = mTimetableTrimHourRange ?: config.values.get("timetableTrimHourRange", false); return mTimetableTrimHourRange ?: false }
|
||||||
|
set(value) { config.set("timetableTrimHourRange", value); mTimetableTrimHourRange = value }
|
||||||
|
|
||||||
|
private var mTimetableColorSubjectName: Boolean? = null
|
||||||
|
var timetableColorSubjectName: Boolean
|
||||||
|
get() { mTimetableColorSubjectName = mTimetableColorSubjectName ?: config.values.get("timetableColorSubjectName", false); return mTimetableColorSubjectName ?: false }
|
||||||
|
set(value) { config.set("timetableColorSubjectName", value); mTimetableColorSubjectName = value }
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,9 @@ fun HashMap<String, String?>.get(key: String, default: String?): String? {
|
|||||||
fun HashMap<String, String?>.get(key: String, default: Boolean): Boolean {
|
fun HashMap<String, String?>.get(key: String, default: Boolean): Boolean {
|
||||||
return this[key]?.toBoolean() ?: default
|
return this[key]?.toBoolean() ?: default
|
||||||
}
|
}
|
||||||
|
fun HashMap<String, String?>.getBooleanOrNull(key: String): Boolean? {
|
||||||
|
return this[key]?.toBooleanStrictOrNull()
|
||||||
|
}
|
||||||
fun HashMap<String, String?>.get(key: String, default: Int): Int {
|
fun HashMap<String, String?>.get(key: String, default: Int): Int {
|
||||||
return this[key]?.toIntOrNull() ?: default
|
return this[key]?.toIntOrNull() ?: default
|
||||||
}
|
}
|
||||||
|
@ -5,13 +5,14 @@ package pl.szczodrzynski.edziennik.config.utils
|
|||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
import pl.szczodrzynski.edziennik.getInt
|
import pl.szczodrzynski.edziennik.ext.getInt
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.home.HomeCardModel
|
import pl.szczodrzynski.edziennik.ui.home.HomeCardModel
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
|
||||||
class ConfigGsonUtils {
|
class ConfigGsonUtils {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun <T> deserializeList(gson: Gson, str: String?, classOfT: Class<T>): List<T> {
|
fun <T> deserializeList(gson: Gson, str: String?, classOfT: Class<T>): List<T> {
|
||||||
val json = JsonParser().parse(str)
|
val json = JsonParser.parseString(str)
|
||||||
val list: MutableList<T> = mutableListOf()
|
val list: MutableList<T> = mutableListOf()
|
||||||
if (!json.isJsonArray)
|
if (!json.isJsonArray)
|
||||||
return list
|
return list
|
||||||
@ -41,4 +42,4 @@ class ConfigGsonUtils {
|
|||||||
|
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@ package pl.szczodrzynski.edziennik.config.utils
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.BuildConfig
|
import pl.szczodrzynski.edziennik.BuildConfig
|
||||||
import pl.szczodrzynski.edziennik.HOUR
|
|
||||||
import pl.szczodrzynski.edziennik.MainActivity
|
import pl.szczodrzynski.edziennik.MainActivity
|
||||||
import pl.szczodrzynski.edziennik.config.Config
|
import pl.szczodrzynski.edziennik.config.Config
|
||||||
|
import pl.szczodrzynski.edziennik.ext.HOUR
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_DATE_DESC
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_DATE_DESC
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
@ -42,7 +42,7 @@ class ConfigMigration(app: App, config: Config) {
|
|||||||
MainActivity.DRAWER_ITEM_SETTINGS
|
MainActivity.DRAWER_ITEM_SETTINGS
|
||||||
)
|
)
|
||||||
sync.enabled = true
|
sync.enabled = true
|
||||||
sync.interval = 1*HOUR.toInt()
|
sync.interval = 1* HOUR.toInt()
|
||||||
sync.notifyAboutUpdates = true
|
sync.notifyAboutUpdates = true
|
||||||
sync.onlyWifi = false
|
sync.onlyWifi = false
|
||||||
sync.quietHoursEnabled = false
|
sync.quietHoursEnabled = false
|
||||||
@ -67,7 +67,7 @@ class ConfigMigration(app: App, config: Config) {
|
|||||||
if (dataVersion < 3) {
|
if (dataVersion < 3) {
|
||||||
update = null
|
update = null
|
||||||
privacyPolicyAccepted = false
|
privacyPolicyAccepted = false
|
||||||
debugMode = false
|
devMode = null
|
||||||
devModePassword = null
|
devModePassword = null
|
||||||
appInstalledTime = 0L
|
appInstalledTime = 0L
|
||||||
appRateSnackbarTime = 0L
|
appRateSnackbarTime = 0L
|
||||||
|
@ -7,6 +7,8 @@ package pl.szczodrzynski.edziennik.config.utils
|
|||||||
import pl.szczodrzynski.edziennik.config.ProfileConfig
|
import pl.szczodrzynski.edziennik.config.ProfileConfig
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Notification
|
import pl.szczodrzynski.edziennik.data.db.entity.Notification
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
|
||||||
|
import pl.szczodrzynski.edziennik.ui.home.HomeCard
|
||||||
|
import pl.szczodrzynski.edziennik.ui.home.HomeCardModel
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
|
||||||
|
|
||||||
@ -33,5 +35,15 @@ class ProfileConfigMigration(config: ProfileConfig) {
|
|||||||
|
|
||||||
dataVersion = 2
|
dataVersion = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dataVersion < 3) {
|
||||||
|
if (ui.homeCards.isNotEmpty()) {
|
||||||
|
ui.homeCards = ui.homeCards.toMutableList().also {
|
||||||
|
it.add(HomeCardModel(config.profileId, HomeCard.CARD_NOTES))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dataVersion = 3
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ import pl.szczodrzynski.edziennik.data.api.task.ErrorReportTask
|
|||||||
import pl.szczodrzynski.edziennik.data.api.task.IApiTask
|
import pl.szczodrzynski.edziennik.data.api.task.IApiTask
|
||||||
import pl.szczodrzynski.edziennik.data.api.task.SzkolnyTask
|
import pl.szczodrzynski.edziennik.data.api.task.SzkolnyTask
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
import pl.szczodrzynski.edziennik.toApiError
|
import pl.szczodrzynski.edziennik.ext.toApiError
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@ -84,19 +84,21 @@ class ApiService : Service() {
|
|||||||
runTask()
|
runTask()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onRequiresUserAction(event: UserActionRequiredEvent) {
|
||||||
|
app.userActionManager.sendToUser(event)
|
||||||
|
taskRunning?.cancel()
|
||||||
|
clearTask()
|
||||||
|
runTask()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onError(apiError: ApiError) {
|
override fun onError(apiError: ApiError) {
|
||||||
lastEventTime = System.currentTimeMillis()
|
lastEventTime = System.currentTimeMillis()
|
||||||
d(TAG, "Task $taskRunningId threw an error - $apiError")
|
d(TAG, "Task $taskRunningId threw an error - $apiError")
|
||||||
apiError.profileId = taskProfileId
|
apiError.profileId = taskProfileId
|
||||||
|
|
||||||
if (app.userActionManager.requiresUserAction(apiError)) {
|
EventBus.getDefault().postSticky(ApiTaskErrorEvent(apiError))
|
||||||
app.userActionManager.sendToUser(apiError)
|
errorList.add(apiError)
|
||||||
}
|
apiError.throwable?.printStackTrace()
|
||||||
else {
|
|
||||||
EventBus.getDefault().postSticky(ApiTaskErrorEvent(apiError))
|
|
||||||
errorList.add(apiError)
|
|
||||||
apiError.throwable?.printStackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (apiError.isCritical) {
|
if (apiError.isCritical) {
|
||||||
taskRunning?.cancel()
|
taskRunning?.cancel()
|
||||||
|
@ -24,7 +24,7 @@ const val FAKE_LIBRUS_ACCOUNTS = "/synergia_accounts.php"
|
|||||||
|
|
||||||
val LIBRUS_USER_AGENT = "${SYSTEM_USER_AGENT}LibrusMobileApp"
|
val LIBRUS_USER_AGENT = "${SYSTEM_USER_AGENT}LibrusMobileApp"
|
||||||
const val SYNERGIA_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/62.0"
|
const val SYNERGIA_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/62.0"
|
||||||
const val LIBRUS_CLIENT_ID = "0RbsDOkV9tyKEQYzlLv5hs3DM1ukrynFI4p6C1Yc"
|
const val LIBRUS_CLIENT_ID = "VaItV6oRutdo8fnjJwysnTjVlvaswf52ZqmXsJGP"
|
||||||
const val LIBRUS_REDIRECT_URL = "app://librus"
|
const val LIBRUS_REDIRECT_URL = "app://librus"
|
||||||
const val LIBRUS_AUTHORIZE_URL = "https://portal.librus.pl/oauth2/authorize?client_id=$LIBRUS_CLIENT_ID&redirect_uri=$LIBRUS_REDIRECT_URL&response_type=code"
|
const val LIBRUS_AUTHORIZE_URL = "https://portal.librus.pl/oauth2/authorize?client_id=$LIBRUS_CLIENT_ID&redirect_uri=$LIBRUS_REDIRECT_URL&response_type=code"
|
||||||
const val LIBRUS_LOGIN_URL = "https://portal.librus.pl/rodzina/login/action"
|
const val LIBRUS_LOGIN_URL = "https://portal.librus.pl/rodzina/login/action"
|
||||||
@ -43,7 +43,7 @@ const val LIBRUS_API_TOKEN_URL = "https://api.librus.pl/OAuth/Token"
|
|||||||
const val LIBRUS_API_TOKEN_JST_URL = "https://api.librus.pl/OAuth/TokenJST"
|
const val LIBRUS_API_TOKEN_JST_URL = "https://api.librus.pl/OAuth/TokenJST"
|
||||||
const val LIBRUS_API_AUTHORIZATION = "Mjg6ODRmZGQzYTg3YjAzZDNlYTZmZmU3NzdiNThiMzMyYjE="
|
const val LIBRUS_API_AUTHORIZATION = "Mjg6ODRmZGQzYTg3YjAzZDNlYTZmZmU3NzdiNThiMzMyYjE="
|
||||||
const val LIBRUS_API_SECRET_JST = "18b7c1ee08216f636a1b1a2440e68398"
|
const val LIBRUS_API_SECRET_JST = "18b7c1ee08216f636a1b1a2440e68398"
|
||||||
const val LIBRUS_API_CLIENT_ID_JST = "49"
|
const val LIBRUS_API_CLIENT_ID_JST = "59"
|
||||||
//const val LIBRUS_API_CLIENT_ID_JST_REFRESH = "42"
|
//const val LIBRUS_API_CLIENT_ID_JST_REFRESH = "42"
|
||||||
|
|
||||||
const val LIBRUS_JST_DEMO_CODE = "68656A21"
|
const val LIBRUS_JST_DEMO_CODE = "68656A21"
|
||||||
@ -59,40 +59,15 @@ const val LIBRUS_SANDBOX_URL = "https://sandbox.librus.pl/index.php?action="
|
|||||||
const val LIBRUS_SYNERGIA_HOMEWORK_ATTACHMENT_URL = "https://synergia.librus.pl/homework/downloadFile"
|
const val LIBRUS_SYNERGIA_HOMEWORK_ATTACHMENT_URL = "https://synergia.librus.pl/homework/downloadFile"
|
||||||
const val LIBRUS_SYNERGIA_MESSAGES_ATTACHMENT_URL = "https://synergia.librus.pl/wiadomosci/pobierz_zalacznik"
|
const val LIBRUS_SYNERGIA_MESSAGES_ATTACHMENT_URL = "https://synergia.librus.pl/wiadomosci/pobierz_zalacznik"
|
||||||
|
|
||||||
const val IDZIENNIK_USER_AGENT = SYNERGIA_USER_AGENT
|
const val LIBRUS_PORTAL_RECAPTCHA_KEY = "6Lf48moUAAAAAB9ClhdvHr46gRWR"
|
||||||
const val IDZIENNIK_WEB_URL = "https://iuczniowie.progman.pl/idziennik"
|
const val LIBRUS_PORTAL_RECAPTCHA_REFERER = "https://portal.librus.pl/rodzina/login"
|
||||||
const val IDZIENNIK_WEB_LOGIN = "login.aspx"
|
|
||||||
const val IDZIENNIK_WEB_SETTINGS = "mod_panelRodzica/Ustawienia.aspx"
|
|
||||||
const val IDZIENNIK_WEB_HOME = "mod_panelRodzica/StronaGlowna.aspx"
|
|
||||||
const val IDZIENNIK_WEB_TIMETABLE = "mod_panelRodzica/plan/WS_Plan.asmx/pobierzPlanZajec"
|
|
||||||
const val IDZIENNIK_WEB_GRADES = "mod_panelRodzica/oceny/WS_ocenyUcznia.asmx/pobierzOcenyUcznia"
|
|
||||||
const val IDZIENNIK_WEB_MISSING_GRADES = "mod_panelRodzica/brak_ocen/WS_BrakOcenUcznia.asmx/pobierzBrakujaceOcenyUcznia"
|
|
||||||
const val IDZIENNIK_WEB_EXAMS = "mod_panelRodzica/sprawdziany/mod_sprawdzianyPanel.asmx/pobierzListe"
|
|
||||||
const val IDZIENNIK_WEB_HOMEWORK = "mod_panelRodzica/pracaDomowa/WS_pracaDomowa.asmx/pobierzPraceDomowe"
|
|
||||||
const val IDZIENNIK_WEB_NOTICES = "mod_panelRodzica/uwagi/WS_uwagiUcznia.asmx/pobierzUwagiUcznia"
|
|
||||||
const val IDZIENNIK_WEB_ATTENDANCE = "mod_panelRodzica/obecnosci/WS_obecnosciUcznia.asmx/pobierzObecnosciUcznia"
|
|
||||||
const val IDZIENNIK_WEB_ANNOUNCEMENTS = "mod_panelRodzica/tabOgl/WS_tablicaOgloszen.asmx/GetOgloszenia"
|
|
||||||
const val IDZIENNIK_WEB_MESSAGES_LIST = "mod_komunikator/WS_wiadomosci.asmx/PobierzListeWiadomosci"
|
|
||||||
const val IDZIENNIK_WEB_GET_MESSAGE = "mod_komunikator/WS_wiadomosci.asmx/PobierzWiadomosc"
|
|
||||||
const val IDZIENNIK_WEB_GET_RECIPIENT_LIST = "mod_komunikator/WS_wiadomosci.asmx/pobierzListeOdbiorcowPanelRodzic"
|
|
||||||
const val IDZIENNIK_WEB_SEND_MESSAGE = "mod_komunikator/WS_wiadomosci.asmx/WyslijWiadomosc"
|
|
||||||
const val IDZIENNIK_WEB_GET_ATTACHMENT = "mod_komunikator/Download.ashx"
|
|
||||||
const val IDZIENNIK_WEB_GET_HOMEWORK = "mod_panelRodzica/pracaDomowa/WS_pracaDomowa.asmx/pobierzJednaPraceDomowa"
|
|
||||||
const val IDZIENNIK_WEB_GET_HOMEWORK_ATTACHMENT = "mod_panelRodzica/pracaDomowa.aspx"
|
|
||||||
|
|
||||||
val IDZIENNIK_API_USER_AGENT = SYSTEM_USER_AGENT
|
|
||||||
const val IDZIENNIK_API_URL = "https://iuczniowie.progman.pl/idziennik/api"
|
|
||||||
const val IDZIENNIK_API_CURRENT_REGISTER = "Uczniowie/\$STUDENT_ID/AktualnyDziennik"
|
|
||||||
const val IDZIENNIK_API_GRADES = "Uczniowie/\$STUDENT_ID/Oceny/" /* + semester */
|
|
||||||
const val IDZIENNIK_API_MESSAGES_INBOX = "Wiadomosci/Odebrane"
|
|
||||||
const val IDZIENNIK_API_MESSAGES_SENT = "Wiadomosci/Wyslane"
|
|
||||||
|
|
||||||
|
|
||||||
val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT
|
val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT
|
||||||
|
|
||||||
const val VULCAN_HEBE_USER_AGENT = "Dart/2.10 (dart:io)"
|
const val VULCAN_HEBE_USER_AGENT = "Dart/2.10 (dart:io)"
|
||||||
const val VULCAN_HEBE_APP_NAME = "DzienniczekPlus 2.0"
|
const val VULCAN_HEBE_APP_NAME = "DzienniczekPlus 2.0"
|
||||||
const val VULCAN_HEBE_APP_VERSION = "21.02.09 (G)"
|
const val VULCAN_HEBE_APP_VERSION = "22.09.02 (G)"
|
||||||
private const val VULCAN_API_DEVICE_NAME_PREFIX = "Szkolny.eu "
|
private const val VULCAN_API_DEVICE_NAME_PREFIX = "Szkolny.eu "
|
||||||
private const val VULCAN_API_DEVICE_NAME_SUFFIX = " - nie usuwać"
|
private const val VULCAN_API_DEVICE_NAME_SUFFIX = " - nie usuwać"
|
||||||
val VULCAN_API_DEVICE_NAME by lazy {
|
val VULCAN_API_DEVICE_NAME by lazy {
|
||||||
@ -109,20 +84,30 @@ const val VULCAN_HEBE_ENDPOINT_PUSH_ALL = "api/mobile/push/all"
|
|||||||
const val VULCAN_HEBE_ENDPOINT_TIMETABLE = "api/mobile/schedule"
|
const val VULCAN_HEBE_ENDPOINT_TIMETABLE = "api/mobile/schedule"
|
||||||
const val VULCAN_HEBE_ENDPOINT_TIMETABLE_CHANGES = "api/mobile/schedule/changes"
|
const val VULCAN_HEBE_ENDPOINT_TIMETABLE_CHANGES = "api/mobile/schedule/changes"
|
||||||
const val VULCAN_HEBE_ENDPOINT_ADDRESSBOOK = "api/mobile/addressbook"
|
const val VULCAN_HEBE_ENDPOINT_ADDRESSBOOK = "api/mobile/addressbook"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_TEACHERS = "api/mobile/teacher"
|
||||||
const val VULCAN_HEBE_ENDPOINT_EXAMS = "api/mobile/exam"
|
const val VULCAN_HEBE_ENDPOINT_EXAMS = "api/mobile/exam"
|
||||||
const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade"
|
const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade"
|
||||||
const val VULCAN_HEBE_ENDPOINT_GRADE_SUMMARY = "api/mobile/grade/summary"
|
const val VULCAN_HEBE_ENDPOINT_GRADE_SUMMARY = "api/mobile/grade/summary"
|
||||||
const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework"
|
const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework"
|
||||||
const val VULCAN_HEBE_ENDPOINT_NOTICES = "api/mobile/note"
|
const val VULCAN_HEBE_ENDPOINT_NOTICES = "api/mobile/note"
|
||||||
const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson"
|
const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson"
|
||||||
const val VULCAN_HEBE_ENDPOINT_MESSAGES = "api/mobile/message"
|
const val VULCAN_HEBE_ENDPOINT_MESSAGEBOX = "api/mobile/messagebox"
|
||||||
const val VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS = "api/mobile/message/status"
|
const val VULCAN_HEBE_ENDPOINT_MESSAGEBOX_ADDRESSBOOK = "api/mobile/messagebox/addressbook"
|
||||||
const val VULCAN_HEBE_ENDPOINT_MESSAGES_SEND = "api/mobile/message"
|
const val VULCAN_HEBE_ENDPOINT_MESSAGEBOX_MESSAGES = "api/mobile/messagebox/message"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_MESSAGEBOX_STATUS = "api/mobile/messagebox/message/status"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_MESSAGEBOX_SEND = "api/mobile/messagebox/message"
|
||||||
const val VULCAN_HEBE_ENDPOINT_LUCKY_NUMBER = "api/mobile/school/lucky"
|
const val VULCAN_HEBE_ENDPOINT_LUCKY_NUMBER = "api/mobile/school/lucky"
|
||||||
|
|
||||||
const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
|
||||||
|
|
||||||
const val PODLASIE_API_VERSION = "1.0.62"
|
const val PODLASIE_API_VERSION = "1.0.62"
|
||||||
const val PODLASIE_API_URL = "https://cpdklaser.zeto.bialystok.pl/api"
|
const val PODLASIE_API_URL = "https://cpdklaser.zeto.bialystok.pl/api"
|
||||||
const val PODLASIE_API_USER_ENDPOINT = "/pobierzDaneUcznia"
|
const val PODLASIE_API_USER_ENDPOINT = "/pobierzDaneUcznia"
|
||||||
const val PODLASIE_API_LOGOUT_DEVICES_ENDPOINT = "/wyczyscUrzadzenia"
|
const val PODLASIE_API_LOGOUT_DEVICES_ENDPOINT = "/wyczyscUrzadzenia"
|
||||||
|
|
||||||
|
const val USOS_API_OAUTH_REDIRECT_URL = "szkolny://redirect/usos"
|
||||||
|
|
||||||
|
val USOS_API_SCOPES by lazy { listOf(
|
||||||
|
"offline_access",
|
||||||
|
"studies",
|
||||||
|
"grades",
|
||||||
|
"events",
|
||||||
|
) }
|
||||||
|
@ -11,8 +11,9 @@ import android.content.Context
|
|||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationCompat.PRIORITY_MIN
|
import androidx.core.app.NotificationCompat.PRIORITY_MIN
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.Bundle
|
|
||||||
import pl.szczodrzynski.edziennik.R
|
import pl.szczodrzynski.edziennik.R
|
||||||
|
import pl.szczodrzynski.edziennik.ext.Bundle
|
||||||
|
import pl.szczodrzynski.edziennik.ext.pendingIntentFlag
|
||||||
import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver
|
import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@ -40,14 +41,14 @@ class EdziennikNotification(val app: App) {
|
|||||||
"task" to "TaskCancelRequest",
|
"task" to "TaskCancelRequest",
|
||||||
"taskId" to taskId
|
"taskId" to taskId
|
||||||
))
|
))
|
||||||
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) as PendingIntent
|
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or pendingIntentFlag()) as PendingIntent
|
||||||
}
|
}
|
||||||
private val closePendingIntent: PendingIntent
|
private val closePendingIntent: PendingIntent
|
||||||
get() {
|
get() {
|
||||||
val intent = SzkolnyReceiver.getIntent(app, Bundle(
|
val intent = SzkolnyReceiver.getIntent(app, Bundle(
|
||||||
"task" to "ServiceCloseRequest"
|
"task" to "ServiceCloseRequest"
|
||||||
))
|
))
|
||||||
return PendingIntent.getBroadcast(app, 0, intent, 0) as PendingIntent
|
return PendingIntent.getBroadcast(app, 0, intent, pendingIntentFlag()) as PendingIntent
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun errorCountText(): String? {
|
private fun errorCountText(): String? {
|
||||||
|
@ -58,11 +58,7 @@ const val ERROR_INVALID_LOGIN_MODE = 110
|
|||||||
const val ERROR_LOGIN_METHOD_NOT_SATISFIED = 111
|
const val ERROR_LOGIN_METHOD_NOT_SATISFIED = 111
|
||||||
const val ERROR_NOT_IMPLEMENTED = 112
|
const val ERROR_NOT_IMPLEMENTED = 112
|
||||||
const val ERROR_FILE_DOWNLOAD = 113
|
const val ERROR_FILE_DOWNLOAD = 113
|
||||||
|
const val ERROR_REQUIRES_USER_ACTION = 114
|
||||||
const val ERROR_NO_STUDENTS_IN_ACCOUNT = 115
|
|
||||||
|
|
||||||
const val ERROR_CAPTCHA_NEEDED = 3000
|
|
||||||
const val ERROR_CAPTCHA_LIBRUS_PORTAL = 3001
|
|
||||||
|
|
||||||
const val ERROR_API_PDO_ERROR = 5000
|
const val ERROR_API_PDO_ERROR = 5000
|
||||||
const val ERROR_API_INVALID_CLIENT = 5001
|
const val ERROR_API_INVALID_CLIENT = 5001
|
||||||
@ -195,21 +191,21 @@ const val ERROR_VULCAN_HEBE_FIREBASE_ERROR = 362
|
|||||||
const val ERROR_VULCAN_HEBE_CERTIFICATE_GONE = 363
|
const val ERROR_VULCAN_HEBE_CERTIFICATE_GONE = 363
|
||||||
const val ERROR_VULCAN_HEBE_SERVER_ERROR = 364
|
const val ERROR_VULCAN_HEBE_SERVER_ERROR = 364
|
||||||
const val ERROR_VULCAN_HEBE_ENTITY_NOT_FOUND = 365
|
const val ERROR_VULCAN_HEBE_ENTITY_NOT_FOUND = 365
|
||||||
|
const val ERROR_VULCAN_HEBE_MISSING_SENDER_ENTRY = 366
|
||||||
const val ERROR_VULCAN_API_DEPRECATED = 390
|
const val ERROR_VULCAN_API_DEPRECATED = 390
|
||||||
|
|
||||||
const val ERROR_LOGIN_EDUDZIENNIK_WEB_INVALID_LOGIN = 501
|
|
||||||
const val ERROR_LOGIN_EDUDZIENNIK_WEB_OTHER = 510
|
|
||||||
const val ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID = 511
|
|
||||||
const val ERROR_EDUDZIENNIK_WEB_LIMITED_ACCESS = 521
|
|
||||||
const val ERROR_EDUDZIENNIK_WEB_SESSION_EXPIRED = 522
|
|
||||||
const val ERROR_EDUDZIENNIK_WEB_TEAM_MISSING = 530
|
|
||||||
|
|
||||||
const val ERROR_LOGIN_PODLASIE_API_INVALID_TOKEN = 601
|
const val ERROR_LOGIN_PODLASIE_API_INVALID_TOKEN = 601
|
||||||
const val ERROR_LOGIN_PODLASIE_API_DEVICE_LIMIT = 602
|
const val ERROR_LOGIN_PODLASIE_API_DEVICE_LIMIT = 602
|
||||||
const val ERROR_PODLASIE_API_NO_TOKEN = 630
|
const val ERROR_PODLASIE_API_NO_TOKEN = 630
|
||||||
const val ERROR_PODLASIE_API_OTHER = 631
|
const val ERROR_PODLASIE_API_OTHER = 631
|
||||||
const val ERROR_PODLASIE_API_DATA_MISSING = 632
|
const val ERROR_PODLASIE_API_DATA_MISSING = 632
|
||||||
|
|
||||||
|
const val ERROR_USOS_OAUTH_GOT_DIFFERENT_TOKEN = 702
|
||||||
|
const val ERROR_USOS_OAUTH_INCOMPLETE_RESPONSE = 703
|
||||||
|
const val ERROR_USOS_NO_STUDENT_PROGRAMMES = 704
|
||||||
|
const val ERROR_USOS_API_INCOMPLETE_RESPONSE = 705
|
||||||
|
const val ERROR_USOS_API_MISSING_RESPONSE = 706
|
||||||
|
|
||||||
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
||||||
|
|
||||||
const val EXCEPTION_API_TASK = 900
|
const val EXCEPTION_API_TASK = 900
|
||||||
@ -223,8 +219,6 @@ const val EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST = 908
|
|||||||
const val EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST = 909
|
const val EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST = 909
|
||||||
const val EXCEPTION_NOTIFY = 910
|
const val EXCEPTION_NOTIFY = 910
|
||||||
const val EXCEPTION_LIBRUS_MESSAGES_REQUEST = 911
|
const val EXCEPTION_LIBRUS_MESSAGES_REQUEST = 911
|
||||||
const val EXCEPTION_EDUDZIENNIK_WEB_REQUEST = 920
|
|
||||||
const val EXCEPTION_EDUDZIENNIK_FILE_REQUEST = 921
|
|
||||||
const val ERROR_ONEDRIVE_DOWNLOAD = 930
|
const val ERROR_ONEDRIVE_DOWNLOAD = 930
|
||||||
const val EXCEPTION_VULCAN_WEB_LOGIN = 931
|
const val EXCEPTION_VULCAN_WEB_LOGIN = 931
|
||||||
const val EXCEPTION_VULCAN_WEB_REQUEST = 932
|
const val EXCEPTION_VULCAN_WEB_REQUEST = 932
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api
|
package pl.szczodrzynski.edziennik.data.api
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginMessages
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginMessages
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginPortal
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginPortal
|
||||||
@ -14,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.Mobidzie
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login.PodlasieLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login.PodlasieLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginWeb
|
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginWeb
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.login.UsosLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginHebe
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginHebe
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
||||||
@ -26,8 +26,9 @@ import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
|||||||
|
|
||||||
const val SYNERGIA_API_ENABLED = false
|
const val SYNERGIA_API_ENABLED = false
|
||||||
|
|
||||||
|
// the graveyard
|
||||||
const val LOGIN_TYPE_IDZIENNIK = 3
|
const val LOGIN_TYPE_IDZIENNIK = 3
|
||||||
|
const val LOGIN_TYPE_EDUDZIENNIK = 5
|
||||||
|
|
||||||
const val LOGIN_TYPE_TEMPLATE = 21
|
const val LOGIN_TYPE_TEMPLATE = 21
|
||||||
|
|
||||||
@ -118,15 +119,6 @@ val vulcanLoginMethods = listOf(
|
|||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
||||||
)
|
)
|
||||||
|
|
||||||
const val LOGIN_TYPE_EDUDZIENNIK = 5
|
|
||||||
const val LOGIN_MODE_EDUDZIENNIK_WEB = 0
|
|
||||||
const val LOGIN_METHOD_EDUDZIENNIK_WEB = 100
|
|
||||||
val edudziennikLoginMethods = listOf(
|
|
||||||
LoginMethod(LOGIN_TYPE_EDUDZIENNIK, LOGIN_METHOD_EDUDZIENNIK_WEB, EdudziennikLoginWeb::class.java)
|
|
||||||
.withIsPossible { _, _ -> true }
|
|
||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
|
||||||
)
|
|
||||||
|
|
||||||
const val LOGIN_TYPE_PODLASIE = 6
|
const val LOGIN_TYPE_PODLASIE = 6
|
||||||
const val LOGIN_MODE_PODLASIE_API = 0
|
const val LOGIN_MODE_PODLASIE_API = 0
|
||||||
const val LOGIN_METHOD_PODLASIE_API = 100
|
const val LOGIN_METHOD_PODLASIE_API = 100
|
||||||
@ -136,6 +128,15 @@ val podlasieLoginMethods = listOf(
|
|||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const val LOGIN_TYPE_USOS = 7
|
||||||
|
const val LOGIN_MODE_USOS_OAUTH = 0
|
||||||
|
const val LOGIN_METHOD_USOS_API = 100
|
||||||
|
val usosLoginMethods = listOf(
|
||||||
|
LoginMethod(LOGIN_TYPE_USOS, LOGIN_METHOD_USOS_API, UsosLoginApi::class.java)
|
||||||
|
.withIsPossible { _, _ -> true }
|
||||||
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
||||||
|
)
|
||||||
|
|
||||||
val templateLoginMethods = listOf(
|
val templateLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java)
|
LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java)
|
||||||
.withIsPossible { _, _ -> true }
|
.withIsPossible { _, _ -> true }
|
||||||
|
@ -16,6 +16,14 @@ object Regexes {
|
|||||||
"""[^0-9]""".toRegex()
|
"""[^0-9]""".toRegex()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val HTML_BR by lazy {
|
||||||
|
"""<br\s?/?>""".toRegex()
|
||||||
|
}
|
||||||
|
|
||||||
|
val MESSAGE_META by lazy {
|
||||||
|
"""^\[META:([A-z0-9-&=]+)]""".toRegex()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
val MOBIDZIENNIK_GRADES_SUBJECT_NAME by lazy {
|
val MOBIDZIENNIK_GRADES_SUBJECT_NAME by lazy {
|
||||||
@ -50,15 +58,16 @@ object Regexes {
|
|||||||
"""events: (.+),$""".toRegex(RegexOption.MULTILINE)
|
"""events: (.+),$""".toRegex(RegexOption.MULTILINE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val MOBIDZIENNIK_WEB_ATTACHMENT by lazy {
|
||||||
|
"""href="https://.+?\.mobidziennik.pl/.+?&(?:amp;)?zalacznik(_rozwiazania)?=([0-9]+)".+?>(.+?)(?: <small.+?\(([0-9.]+)\s(M|K|G|)B\)</small>)?</a>""".toRegex()
|
||||||
|
}
|
||||||
|
|
||||||
val MOBIDZIENNIK_MESSAGE_READ_DATE by lazy {
|
val MOBIDZIENNIK_MESSAGE_READ_DATE by lazy {
|
||||||
"""czas przeczytania:.+?,\s([0-9]+)\s(.+?)\s([0-9]{4}),\sgodzina\s([0-9:]+)""".toRegex(DOT_MATCHES_ALL)
|
"""czas przeczytania:.+?,\s([0-9]+)\s(.+?)\s([0-9]{4}),\sgodzina\s([0-9:]+)""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_MESSAGE_SENT_READ_DATE by lazy {
|
val MOBIDZIENNIK_MESSAGE_SENT_READ_DATE by lazy {
|
||||||
""".+?,\s([0-9]+)\s(.+?)\s([0-9]{4}),\sgodzina\s([0-9:]+)""".toRegex(DOT_MATCHES_ALL)
|
""".+?,\s([0-9]+)\s(.+?)\s([0-9]{4}),\sgodzina\s([0-9:]+)""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_MESSAGE_ATTACHMENT by lazy {
|
|
||||||
"""href="https://.+?\.mobidziennik.pl/.+?&(?:amp;)?zalacznik=([0-9]+)"(?:.+?<small.+?\(([0-9.]+)\s(M|K|G|)B\))*""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val MOBIDZIENNIK_MESSAGE_SENT_READ_BY by lazy {
|
val MOBIDZIENNIK_MESSAGE_SENT_READ_BY by lazy {
|
||||||
"""([0-9]+)/([0-9]+)""".toRegex()
|
"""([0-9]+)/([0-9]+)""".toRegex()
|
||||||
}
|
}
|
||||||
@ -100,61 +109,43 @@ object Regexes {
|
|||||||
"""<strong>(.+?)</strong>\s*<small>\s*\((.+?),\s*(.+?)\)""".toRegex(DOT_MATCHES_ALL)
|
"""<strong>(.+?)</strong>\s*<small>\s*\((.+?),\s*(.+?)\)""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
|
|
||||||
val MOBIDZIENNIK_HOMEWORK_ROW by lazy {
|
val MOBIDZIENNIK_MOBILE_HOMEWORK_ROW by lazy {
|
||||||
"""class="rowRolling">(.+?</div>\s*</td>)""".toRegex(DOT_MATCHES_ALL)
|
"""class="rowRolling">(.+?</div>\s*</td>)""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_HOMEWORK_ITEM by lazy {
|
val MOBIDZIENNIK_MOBILE_HOMEWORK_ITEM by lazy {
|
||||||
"""<p><b>(.+?):</b>\s*(.+?)\s*</p>""".toRegex(DOT_MATCHES_ALL)
|
"""<p><b>(.+?):</b>\s*(.+?)\s*</p>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_HOMEWORK_BODY by lazy {
|
val MOBIDZIENNIK_MOBILE_HOMEWORK_BODY by lazy {
|
||||||
"""Treść:</b>(.+?)<p><b>""".toRegex(DOT_MATCHES_ALL)
|
"""Treść:</b>(.+?)<p><b>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_HOMEWORK_ID by lazy {
|
val MOBIDZIENNIK_MOBILE_HOMEWORK_ID by lazy {
|
||||||
"""zadanieFormularz\(([0-9]+),""".toRegex(DOT_MATCHES_ALL)
|
"""name="id_zadania" value="([0-9]+)"""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_HOMEWORK_ATTACHMENT by lazy {
|
val MOBIDZIENNIK_MOBILE_HOMEWORK_ATTACHMENT by lazy {
|
||||||
"""zalacznik(_zadania)?=([0-9]+)'.+?word-break">(.+?)</td>""".toRegex(DOT_MATCHES_ALL)
|
"""zalacznik(_zadania)?=([0-9]+)'.+?word-break">(.+?)</td>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val MOBIDZIENNIK_WEB_HOMEWORK_ADDED_DATE by lazy {
|
||||||
|
"""Wpisał\(a\):</td>\s+<th>\s+(.+?), (.+?), ([0-9]{1,2}) (.+?) ([0-9]{4}), godzina ([0-9:]+)""".toRegex()
|
||||||
val IDZIENNIK_LOGIN_HIDDEN_FIELDS by lazy {
|
|
||||||
"""<input type="hidden".+?name="([A-z0-9_]+)?".+?value="([A-z0-9_+-/=]+)?".+?>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val IDZIENNIK_LOGIN_ERROR by lazy {
|
|
||||||
"""id="spanErrorMessage">(.*?)</""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val IDZIENNIK_LOGIN_FIRST_ACCOUNT_NAME by lazy {
|
|
||||||
"""Imię i nazwisko:.+?">(.+?)</div>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val IDZIENNIK_LOGIN_FIRST_IS_PARENT by lazy {
|
|
||||||
"""id="ctl00_CzyRodzic" value="([01])" />""".toRegex()
|
|
||||||
}
|
|
||||||
val IDZIENNIK_LOGIN_FIRST_SCHOOL_YEAR by lazy {
|
|
||||||
"""name="ctl00\${"$"}dxComboRokSzkolny".+?selected="selected".*?value="([0-9]+)">([0-9]+)/([0-9]+)<""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val IDZIENNIK_LOGIN_FIRST_STUDENT_SELECT by lazy {
|
|
||||||
"""<select.*?name="ctl00\${"$"}dxComboUczniowie".*?</select>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val IDZIENNIK_LOGIN_FIRST_STUDENT by lazy {
|
|
||||||
"""<option.*?value="([0-9]+)"\sdata-id-ucznia="([A-z0-9]+?)".*?>(.+?)\s(.+?)\s*\((.+?),\s*(.+?)\)</option>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val IDZIENNIK_MESSAGES_RECIPIENT_PARENT by lazy {
|
|
||||||
"""(.+?)\s\((.+)\)""".toRegex()
|
|
||||||
}
|
|
||||||
/*<span id="ctl00_spanSzczesliwyLos">Szczęśliwy los na dzisiaj to <b>19</b>. Los na jutro to <b>22</b></span>*/
|
|
||||||
val IDZIENNIK_WEB_LUCKY_NUMBER by lazy {
|
|
||||||
"""dzisiaj to <b>([0-9]+)</b>""".toRegex()
|
|
||||||
}
|
|
||||||
val IDZIENNIK_WEB_SELECTED_REGISTER by lazy {
|
|
||||||
"""selected="selected" value="([0-9]+)" data-id-ucznia""".toRegex()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val MOBIDZIENNIK_TIMETABLE_TOP by lazy {
|
||||||
val VULCAN_SHIFT_ANNOTATION by lazy {
|
"""<div class="plansc_top">.+?</div></div>""".toRegex(DOT_MATCHES_ALL)
|
||||||
"""\(przeniesiona (z|na) lekcj[ię] ([0-9]+), (.+)\)""".toRegex()
|
|
||||||
}
|
}
|
||||||
|
val MOBIDZIENNIK_TIMETABLE_CELL by lazy {
|
||||||
|
"""<div class="plansc_cnt_w" style="(.+?)">.+?style="(.+?)".+?title="(.+?)".+?>\s+(.+?)\s+</div>""".toRegex(DOT_MATCHES_ALL)
|
||||||
|
}
|
||||||
|
val MOBIDZIENNIK_TIMETABLE_LEFT by lazy {
|
||||||
|
"""<div class="plansc_godz">.+?</div></div>""".toRegex(DOT_MATCHES_ALL)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val MOBIDZIENNIK_EVENT_CONTENT by lazy {
|
||||||
|
"""<h1>(.+?) <small>\(wpisał\(a\) (.+?) w dniu ([0-9-]{10})\).+?<strong>(.+?)</strong><br""".toRegex(DOT_MATCHES_ALL)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
val VULCAN_WEB_PERMISSIONS by lazy {
|
val VULCAN_WEB_PERMISSIONS by lazy {
|
||||||
"""permissions: '([A-z0-9/=+\-_|]+?)'""".toRegex()
|
"""permissions: '([A-z0-9/=+\-_|]+?)'""".toRegex()
|
||||||
}
|
}
|
||||||
@ -172,82 +163,6 @@ object Regexes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
val EDUDZIENNIK_STUDENTS_START by lazy {
|
|
||||||
"""<li><a href="/Students/([\w-_]+?)/start/">(.*?)</a>""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_ACCOUNT_NAME_START by lazy {
|
|
||||||
"""<span id='user_dn'>(.*?)</span>""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_SUBJECTS_START by lazy {
|
|
||||||
"""<a class="menu-course" href="/Students/[\w-_]+?/Courses/([\w-_]+)/">(.+?)</a>""".toRegex()
|
|
||||||
}
|
|
||||||
|
|
||||||
val EDUDZIENNIK_ATTENDANCE_ENTRIES by lazy {
|
|
||||||
"""<td id="([\d-]+?):(\d+?)".*?>(.+?)</td>""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_ATTENDANCE_TYPES by lazy {
|
|
||||||
"""<div class="info">.*?<p>(.*?)</p>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_ATTENDANCE_TYPE by lazy {
|
|
||||||
"""\((.+?)\) (.+)""".toRegex()
|
|
||||||
}
|
|
||||||
|
|
||||||
val EDUDZIENNIK_ANNOUNCEMENT_DESCRIPTION by lazy {
|
|
||||||
"""<div class="desc">.*?<p>(.*?)</p>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_HOMEWORK_DESCRIPTION by lazy {
|
|
||||||
"""<div class="desc">(.*?)</div>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
|
|
||||||
val EDUDZIENNIK_SUBJECT_ID by lazy {
|
|
||||||
"""/Courses/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_GRADE_ID by lazy {
|
|
||||||
"""/Grades/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_EXAM_ID by lazy {
|
|
||||||
"""/Evaluations/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_EVENT_TYPE_ID by lazy {
|
|
||||||
"""/GradeLabels/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_ANNOUNCEMENT_ID by lazy {
|
|
||||||
"""/Announcement/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_HOMEWORK_ID by lazy {
|
|
||||||
"""/Homework/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_TEACHER_ID by lazy {
|
|
||||||
"""/Teachers/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_EVENT_ID by lazy {
|
|
||||||
"""/KlassEvent/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_NOTE_ID by lazy {
|
|
||||||
"""/RegistryNotes/([\w-_]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
|
|
||||||
val EDUDZIENNIK_SCHOOL_DETAIL_ID by lazy {
|
|
||||||
"""<a id="School_detail".*?/School/([\w-_]+?)/""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_SCHOOL_DETAIL_NAME by lazy {
|
|
||||||
"""</li>.*?<p>(.*?)</p>.*?<li>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_CLASS_DETAIL_ID by lazy {
|
|
||||||
"""<a id="Klass_detail".*?/Klass/([\w-_]+?)/""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val EDUDZIENNIK_CLASS_DETAIL_NAME by lazy {
|
|
||||||
"""<a id="Klass_detail".*?>(.*?)</a>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
|
|
||||||
val EDUDZIENNIK_TEACHERS by lazy {
|
|
||||||
"""<div class="teacher">.*?<p>(.+?) (.+?)</p>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
val LINKIFY_DATE_YMD by lazy {
|
val LINKIFY_DATE_YMD by lazy {
|
||||||
"""(1\d{3}|20\d{2})[\-./](1[0-2]|0?\d)[\-./]([1-2]\d|3[0-1]|0?\d)""".toRegex()
|
"""(1\d{3}|20\d{2})[\-./](1[0-2]|0?\d)[\-./]([1-2]\d|3[0-1]|0?\d)""".toRegex()
|
||||||
}
|
}
|
||||||
|
@ -8,17 +8,16 @@ import com.google.gson.JsonObject
|
|||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import pl.szczodrzynski.edziennik.*
|
import pl.szczodrzynski.edziennik.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.Edudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.Librus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.Librus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.Podlasie
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.Podlasie
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.Template
|
import pl.szczodrzynski.edziennik.data.api.edziennik.template.Template
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.Usos
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.Vulcan
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.Vulcan
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.RegisterAvailabilityEvent
|
import pl.szczodrzynski.edziennik.data.api.events.RegisterAvailabilityEvent
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.task.IApiTask
|
import pl.szczodrzynski.edziennik.data.api.task.IApiTask
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
@ -27,6 +26,7 @@ import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
|
|||||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
|
import pl.szczodrzynski.edziennik.utils.managers.AvailabilityManager.Error.Type
|
||||||
|
|
||||||
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
|
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -90,35 +90,21 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
profile.registerName?.also { registerName ->
|
val error = app.availabilityManager.check(profile)
|
||||||
var status = app.config.sync.registerAvailability[registerName]
|
when (error?.type) {
|
||||||
if (status == null || status.nextCheckAt < currentTimeUnix()) {
|
Type.NOT_AVAILABLE -> {
|
||||||
val api = SzkolnyApi(app)
|
|
||||||
api.runCatching({
|
|
||||||
val availability = getRegisterAvailability()
|
|
||||||
app.config.sync.registerAvailability = availability
|
|
||||||
status = availability[registerName]
|
|
||||||
}, onError = {
|
|
||||||
val apiError = it.toApiError(TAG)
|
|
||||||
if (apiError.errorCode == ERROR_API_INVALID_SIGNATURE) {
|
|
||||||
return@also
|
|
||||||
}
|
|
||||||
taskCallback.onError(apiError)
|
|
||||||
return
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status?.available != true
|
|
||||||
|| status?.minVersionCode ?: BuildConfig.VERSION_CODE > BuildConfig.VERSION_CODE) {
|
|
||||||
if (EventBus.getDefault().hasSubscriberForEvent(RegisterAvailabilityEvent::class.java)) {
|
if (EventBus.getDefault().hasSubscriberForEvent(RegisterAvailabilityEvent::class.java)) {
|
||||||
EventBus.getDefault().postSticky(
|
EventBus.getDefault().postSticky(RegisterAvailabilityEvent())
|
||||||
RegisterAvailabilityEvent(app.config.sync.registerAvailability)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
cancel()
|
cancel()
|
||||||
taskCallback.onCompleted()
|
taskCallback.onCompleted()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Type.API_ERROR -> {
|
||||||
|
taskCallback.onError(error.apiError!!)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else -> return@let
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,9 +112,9 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
|||||||
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_EDUDZIENNIK -> Edudziennik(app, profile, loginStore, taskCallback)
|
|
||||||
LOGIN_TYPE_PODLASIE -> Podlasie(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_PODLASIE -> Podlasie(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback)
|
||||||
|
LOGIN_TYPE_USOS -> Usos(app, profile, loginStore, taskCallback)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
if (edziennikInterface == null) {
|
if (edziennikInterface == null) {
|
||||||
|
@ -6,9 +6,9 @@ package pl.szczodrzynski.edziennik.data.api.edziennik
|
|||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.Intent
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
|
import pl.szczodrzynski.edziennik.ext.Intent
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
|
@ -1,153 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.Data
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.*
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use http://patorjk.com/software/taag/#p=display&f=Big for the ascii art
|
|
||||||
*
|
|
||||||
* Use https://codepen.io/kubasz/pen/RwwwbGN to easily generate the student data getters/setters
|
|
||||||
*/
|
|
||||||
class DataEdudziennik(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
|
||||||
|
|
||||||
fun isWebLoginValid() = webSessionIdExpiryTime-30 > currentTimeUnix() && webSessionId.isNotNullNorEmpty()
|
|
||||||
|
|
||||||
override fun satisfyLoginMethods() {
|
|
||||||
loginMethods.clear()
|
|
||||||
if (isWebLoginValid()) {
|
|
||||||
loginMethods += LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun generateUserCode() = "$schoolName:$loginEmail:${studentId?.crc32()}"
|
|
||||||
|
|
||||||
private var mLoginEmail: String? = null
|
|
||||||
var loginEmail: String?
|
|
||||||
get() { mLoginEmail = mLoginEmail ?: loginStore.getLoginData("email", null); return mLoginEmail }
|
|
||||||
set(value) { loginStore.putLoginData("email", value); mLoginEmail = value }
|
|
||||||
|
|
||||||
private var mLoginPassword: String? = null
|
|
||||||
var loginPassword: String?
|
|
||||||
get() { mLoginPassword = mLoginPassword ?: loginStore.getLoginData("password", null); return mLoginPassword }
|
|
||||||
set(value) { loginStore.putLoginData("password", value); mLoginPassword = value }
|
|
||||||
|
|
||||||
private var mStudentId: String? = null
|
|
||||||
var studentId: String?
|
|
||||||
get() { mStudentId = mStudentId ?: profile?.getStudentData("studentId", null); return mStudentId }
|
|
||||||
set(value) { profile?.putStudentData("studentId", value) ?: return; mStudentId = value }
|
|
||||||
|
|
||||||
private var mSchoolId: String? = null
|
|
||||||
var schoolId: String?
|
|
||||||
get() { mSchoolId = mSchoolId ?: profile?.getStudentData("schoolId", null); return mSchoolId }
|
|
||||||
set(value) { profile?.putStudentData("schoolId", value) ?: return; mSchoolId = value }
|
|
||||||
|
|
||||||
private var mClassId: String? = null
|
|
||||||
var classId: String?
|
|
||||||
get() { mClassId = mClassId ?: profile?.getStudentData("classId", null); return mClassId }
|
|
||||||
set(value) { profile?.putStudentData("classId", value) ?: return; mClassId = value }
|
|
||||||
|
|
||||||
/* __ __ _
|
|
||||||
\ \ / / | |
|
|
||||||
\ \ /\ / /__| |__
|
|
||||||
\ \/ \/ / _ \ '_ \
|
|
||||||
\ /\ / __/ |_) |
|
|
||||||
\/ \/ \___|_._*/
|
|
||||||
private var mWebSessionId: String? = null
|
|
||||||
var webSessionId: String?
|
|
||||||
get() { mWebSessionId = mWebSessionId ?: loginStore.getLoginData("webSessionId", null); return mWebSessionId }
|
|
||||||
set(value) { loginStore.putLoginData("webSessionId", value); mWebSessionId = value }
|
|
||||||
|
|
||||||
private var mWebSessionIdExpiryTime: Long? = null
|
|
||||||
var webSessionIdExpiryTime: Long
|
|
||||||
get() { mWebSessionIdExpiryTime = mWebSessionIdExpiryTime ?: loginStore.getLoginData("webSessionIdExpiryTime", 0L); return mWebSessionIdExpiryTime ?: 0L }
|
|
||||||
set(value) { loginStore.putLoginData("webSessionIdExpiryTime", value); mWebSessionIdExpiryTime = value }
|
|
||||||
|
|
||||||
/* ____ _ _
|
|
||||||
/ __ \| | | |
|
|
||||||
| | | | |_| |__ ___ _ __
|
|
||||||
| | | | __| '_ \ / _ \ '__|
|
|
||||||
| |__| | |_| | | | __/ |
|
|
||||||
\____/ \__|_| |_|\___|*/
|
|
||||||
private var mCurrentSemester: Int? = null
|
|
||||||
var currentSemester: Int
|
|
||||||
get() { mCurrentSemester = mCurrentSemester ?: profile?.getStudentData("currentSemester", 1); return mCurrentSemester ?: 1 }
|
|
||||||
set(value) { profile?.putStudentData("currentSemester", value) ?: return; mCurrentSemester = value }
|
|
||||||
|
|
||||||
private var mSchoolName: String? = null
|
|
||||||
var schoolName: String?
|
|
||||||
get() { mSchoolName = mSchoolName ?: profile?.getStudentData("schoolName", null); return mSchoolName }
|
|
||||||
set(value) { profile?.putStudentData("schoolName", value) ?: return; mSchoolName = value }
|
|
||||||
|
|
||||||
val studentEndpoint: String
|
|
||||||
get() = "Students/$studentId/"
|
|
||||||
|
|
||||||
val schoolEndpoint: String
|
|
||||||
get() = "Schools/$schoolId/"
|
|
||||||
|
|
||||||
val classStudentEndpoint: String
|
|
||||||
get() = "Class/$studentId/"
|
|
||||||
|
|
||||||
val schoolClassEndpoint: String
|
|
||||||
get() = "Schools/$classId/"
|
|
||||||
|
|
||||||
val studentAndClassEndpoint: String
|
|
||||||
get() = "Students/$studentId/Klass/$classId/"
|
|
||||||
|
|
||||||
val studentAndClassesEndpoint: String
|
|
||||||
get() = "Students/$studentId/Classes/$classId/"
|
|
||||||
|
|
||||||
val timetableEndpoint: String
|
|
||||||
get() = "Plan/$studentId/"
|
|
||||||
|
|
||||||
val studentAndTeacherClassEndpoint: String
|
|
||||||
get() = "Students/$studentId/Teachers/$classId/"
|
|
||||||
|
|
||||||
val courseStudentEndpoint: String
|
|
||||||
get() = "Course/$studentId/"
|
|
||||||
|
|
||||||
fun getSubject(longId: String, name: String): Subject {
|
|
||||||
val id = longId.crc32()
|
|
||||||
return subjectList.singleOrNull { it.id == id } ?: run {
|
|
||||||
val subject = Subject(profileId, id, name, name)
|
|
||||||
subjectList.put(id, subject)
|
|
||||||
subject
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getTeacher(firstName: String, lastName: String, longId: String? = null): Teacher {
|
|
||||||
val name = "$firstName $lastName".fixName()
|
|
||||||
val id = name.crc32()
|
|
||||||
return teacherList.singleOrNull { it.id == id }?.also {
|
|
||||||
if (longId != null && it.loginId == null) it.loginId = longId
|
|
||||||
} ?: run {
|
|
||||||
val teacher = Teacher(profileId, id, firstName, lastName, longId)
|
|
||||||
teacherList.put(id, teacher)
|
|
||||||
teacher
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getTeacherByFirstLast(nameFirstLast: String, longId: String? = null): Teacher {
|
|
||||||
val nameParts = nameFirstLast.split(" ")
|
|
||||||
return getTeacher(nameParts[0], nameParts[1], longId)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getTeacherByLastFirst(nameLastFirst: String, longId: String? = null): Teacher {
|
|
||||||
val nameParts = nameLastFirst.split(" ")
|
|
||||||
return getTeacher(nameParts[1], nameParts[0], longId)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getEventType(longId: String, name: String): EventType {
|
|
||||||
val id = longId.crc16().toLong()
|
|
||||||
return eventTypes.singleOrNull { it.id == id } ?: run {
|
|
||||||
val eventType = EventType(profileId, id, name, colorFromName(name))
|
|
||||||
eventTypes.put(id, eventType)
|
|
||||||
eventType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik
|
|
||||||
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import pl.szczodrzynski.edziennik.App
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikData
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebGetAnnouncement
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebGetHomework
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.firstlogin.EdudziennikFirstLogin
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLogin
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
|
||||||
|
|
||||||
class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "Edudziennik"
|
|
||||||
}
|
|
||||||
|
|
||||||
val internalErrorList = mutableListOf<Int>()
|
|
||||||
val data: DataEdudziennik
|
|
||||||
private var afterLogin: (() -> Unit)? = null
|
|
||||||
|
|
||||||
init {
|
|
||||||
data = DataEdudziennik(app, profile, loginStore).apply {
|
|
||||||
callback = wrapCallback(this@Edudziennik.callback)
|
|
||||||
satisfyLoginMethods()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun completed() {
|
|
||||||
data.saveData()
|
|
||||||
callback.onCompleted()
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _______ _ _ _ _ _
|
|
||||||
|__ __| | /\ | | (_) | | |
|
|
||||||
| | | |__ ___ / \ | | __ _ ___ _ __ _| |_| |__ _ __ ___
|
|
||||||
| | | '_ \ / _ \ / /\ \ | |/ _` |/ _ \| '__| | __| '_ \| '_ ` _ \
|
|
||||||
| | | | | | __/ / ____ \| | (_| | (_) | | | | |_| | | | | | | | |
|
|
||||||
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
|
|
||||||
__/ |
|
|
||||||
|__*/
|
|
||||||
override fun sync(featureIds: List<Int>, viewId: Int?, onlyEndpoints: List<Int>?, arguments: JsonObject?) {
|
|
||||||
data.arguments = arguments
|
|
||||||
data.prepare(edudziennikLoginMethods, EdudziennikFeatures, featureIds, viewId, onlyEndpoints)
|
|
||||||
login()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun login(loginMethodId: Int? = null, afterLogin: (() -> Unit)? = null) {
|
|
||||||
d(TAG, "Trying to login with ${data.targetLoginMethodIds}")
|
|
||||||
if (internalErrorList.isNotEmpty()) {
|
|
||||||
d(TAG, " - Internal errors:")
|
|
||||||
internalErrorList.forEach { d(TAG, " - code $it") }
|
|
||||||
}
|
|
||||||
loginMethodId?.let { data.prepareFor(edudziennikLoginMethods, it) }
|
|
||||||
afterLogin?.let { this.afterLogin = it }
|
|
||||||
EdudziennikLogin(data) {
|
|
||||||
data()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun data() {
|
|
||||||
d(TAG, "Endpoint IDs: ${data.targetEndpointIds}")
|
|
||||||
if (internalErrorList.isNotEmpty()) {
|
|
||||||
d(TAG, " - Internal errors:")
|
|
||||||
internalErrorList.forEach { d(TAG, " - code $it") }
|
|
||||||
}
|
|
||||||
afterLogin?.invoke() ?: EdudziennikData(data) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getMessage(message: MessageFull) {}
|
|
||||||
override fun sendMessage(recipients: List<Teacher>, subject: String, text: String) {}
|
|
||||||
override fun markAllAnnouncementsAsRead() {}
|
|
||||||
|
|
||||||
override fun getAnnouncement(announcement: AnnouncementFull) {
|
|
||||||
EdudziennikLoginWeb(data) {
|
|
||||||
EdudziennikWebGetAnnouncement(data, announcement) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {}
|
|
||||||
override fun getRecipientList() {}
|
|
||||||
|
|
||||||
override fun getEvent(eventFull: EventFull) {
|
|
||||||
EdudziennikLoginWeb(data) {
|
|
||||||
EdudziennikWebGetHomework(data, eventFull) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun firstLogin() { EdudziennikFirstLogin(data) { completed() } }
|
|
||||||
override fun cancel() {
|
|
||||||
d(TAG, "Cancelled")
|
|
||||||
data.cancel()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
|
|
||||||
return object : EdziennikCallback {
|
|
||||||
override fun onCompleted() { callback.onCompleted() }
|
|
||||||
override fun onProgress(step: Float) { callback.onProgress(step) }
|
|
||||||
override fun onStartProgress(stringRes: Int) { callback.onStartProgress(stringRes) }
|
|
||||||
override fun onError(apiError: ApiError) {
|
|
||||||
if (apiError.errorCode in internalErrorList) {
|
|
||||||
// finish immediately if the same error occurs twice during the same sync
|
|
||||||
callback.onError(apiError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
internalErrorList.add(apiError.errorCode)
|
|
||||||
when (apiError.errorCode) {
|
|
||||||
ERROR_EDUDZIENNIK_WEB_SESSION_EXPIRED -> {
|
|
||||||
login()
|
|
||||||
}
|
|
||||||
ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID -> {
|
|
||||||
login()
|
|
||||||
}
|
|
||||||
ERROR_EDUDZIENNIK_WEB_LIMITED_ACCESS -> {
|
|
||||||
data()
|
|
||||||
}
|
|
||||||
else -> callback.onError(apiError)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.Feature
|
|
||||||
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_START = 1000
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_TEACHERS = 1001
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_GRADES = 1011
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE = 1012
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_EXAMS = 1013
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE = 1014
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS = 1015
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK = 1016
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_EVENTS = 1017
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_NOTES = 1018
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER = 1030
|
|
||||||
|
|
||||||
val EdudziennikFeatures = listOf(
|
|
||||||
/* School and team info and subjects */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_STUDENT_INFO, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_START to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Teachers */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_TEACHERS, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_TEACHERS to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Timetable */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_TIMETABLE, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Grades */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_GRADES, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_GRADES to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Agenda */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_AGENDA, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_EXAMS to LOGIN_METHOD_EDUDZIENNIK_WEB,
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK to LOGIN_METHOD_EDUDZIENNIK_WEB,
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_EVENTS to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Homework */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_HOMEWORK, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Behaviour */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_BEHAVIOUR, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_NOTES to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Attendance */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_ATTENDANCE, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Announcements */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_ANNOUNCEMENTS, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
|
||||||
|
|
||||||
/* Lucky number */
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_LUCKY_NUMBER, listOf(
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER to LOGIN_METHOD_EDUDZIENNIK_WEB
|
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB))
|
|
||||||
)
|
|
@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.R
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.*
|
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
|
||||||
|
|
||||||
class EdudziennikData(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikData"
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
nextEndpoint(onSuccess)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun nextEndpoint(onSuccess: () -> Unit) {
|
|
||||||
if (data.targetEndpointIds.isEmpty()) {
|
|
||||||
onSuccess()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (data.cancelled) {
|
|
||||||
onSuccess()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
val id = data.targetEndpointIds.firstKey()
|
|
||||||
val lastSync = data.targetEndpointIds.remove(id)
|
|
||||||
useEndpoint(id, lastSync) { endpointId ->
|
|
||||||
data.progress(data.progressStep)
|
|
||||||
nextEndpoint(onSuccess)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
|
|
||||||
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
|
|
||||||
when (endpointId) {
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_START -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_data)
|
|
||||||
EdudziennikWebStart(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_TEACHERS -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teachers)
|
|
||||||
EdudziennikWebTeachers(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_GRADES -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
|
||||||
EdudziennikWebGrades(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
|
||||||
EdudziennikWebTimetable(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_EXAMS -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_exams)
|
|
||||||
EdudziennikWebExams(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
|
||||||
EdudziennikWebAttendance(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_announcements)
|
|
||||||
EdudziennikWebAnnouncements(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
|
||||||
EdudziennikWebHomework(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_EVENTS -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_events)
|
|
||||||
EdudziennikWebEvents(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_NOTES -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
|
||||||
EdudziennikWebNotes(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
|
||||||
EdudziennikWebLuckyNumber(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
else -> onSuccess(endpointId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
|
||||||
|
|
||||||
import im.wangchao.mhttp.Request
|
|
||||||
import im.wangchao.mhttp.Response
|
|
||||||
import im.wangchao.mhttp.callback.TextCallbackHandler
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
open class EdudziennikWeb(open val data: DataEdudziennik, open val lastSync: Long?) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWeb"
|
|
||||||
}
|
|
||||||
|
|
||||||
val profileId
|
|
||||||
get() = data.profile?.id ?: -1
|
|
||||||
|
|
||||||
val profile
|
|
||||||
get() = data.profile
|
|
||||||
|
|
||||||
fun webGet(tag: String, endpoint: String, xhr: Boolean = false, semester: Int? = null, onSuccess: (text: String) -> Unit) {
|
|
||||||
val url = "https://dziennikel.appspot.com/" + when (endpoint.endsWith('/') || endpoint.contains('?') || endpoint.isEmpty()) {
|
|
||||||
true -> endpoint
|
|
||||||
else -> "$endpoint/"
|
|
||||||
} + (semester?.let { "?semester=" + if(it == -1) "all" else it } ?: "")
|
|
||||||
|
|
||||||
d(tag, "Request: Edudziennik/Web - $url")
|
|
||||||
|
|
||||||
val callback = object : TextCallbackHandler() {
|
|
||||||
override fun onSuccess(text: String?, response: Response?) {
|
|
||||||
if (text == null || response == null) {
|
|
||||||
data.error(ApiError(tag, ERROR_RESPONSE_EMPTY)
|
|
||||||
.withResponse(response))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (semester == null && url.contains("start")) {
|
|
||||||
profile?.also { profile ->
|
|
||||||
val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com")
|
|
||||||
val semesterCookie = cookies["semester"]?.toIntOrNull()
|
|
||||||
|
|
||||||
semesterCookie?.let { data.currentSemester = it }
|
|
||||||
|
|
||||||
if (semesterCookie == 2 && profile.dateSemester2Start > Date.getToday())
|
|
||||||
profile.dateSemester2Start = Date.getToday().stepForward(0, 0, -1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
onSuccess(text)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
data.error(ApiError(tag, EXCEPTION_EDUDZIENNIK_WEB_REQUEST)
|
|
||||||
.withThrowable(e)
|
|
||||||
.withResponse(response)
|
|
||||||
.withApiResponse(text))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(response: Response?, throwable: Throwable?) {
|
|
||||||
val error = when (response?.code()) {
|
|
||||||
402 -> ERROR_EDUDZIENNIK_WEB_LIMITED_ACCESS
|
|
||||||
403 -> ERROR_EDUDZIENNIK_WEB_SESSION_EXPIRED
|
|
||||||
else -> ERROR_REQUEST_FAILURE
|
|
||||||
}
|
|
||||||
data.error(ApiError(tag, error)
|
|
||||||
.withResponse(response)
|
|
||||||
.withThrowable(throwable))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.app.cookieJar.set("dziennikel.appspot.com", "sessionid", data.webSessionId)
|
|
||||||
|
|
||||||
Request.builder()
|
|
||||||
.url(url)
|
|
||||||
.userAgent(EDUDZIENNIK_USER_AGENT)
|
|
||||||
.apply {
|
|
||||||
if (xhr) header("X-Requested-With", "XMLHttpRequest")
|
|
||||||
}
|
|
||||||
.get()
|
|
||||||
.callback(callback)
|
|
||||||
.build()
|
|
||||||
.enqueue()
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-26
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_ANNOUNCEMENT_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Announcement
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebAnnouncements(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebAnnouncements"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.schoolClassEndpoint + "Announcements") { text ->
|
|
||||||
val doc = Jsoup.parse(text)
|
|
||||||
|
|
||||||
if (doc.getElementsByClass("message").text().trim() != "Brak ogłoszeń.") {
|
|
||||||
doc.select("table.list tbody tr").forEach { announcementElement ->
|
|
||||||
val titleElement = announcementElement.child(0).child(0)
|
|
||||||
|
|
||||||
val longId = EDUDZIENNIK_ANNOUNCEMENT_ID.find(titleElement.attr("href"))?.get(1)
|
|
||||||
?: return@forEach
|
|
||||||
val id = longId.crc32()
|
|
||||||
val subject = titleElement.text()
|
|
||||||
|
|
||||||
val teacherName = announcementElement.child(1).text()
|
|
||||||
val teacher = data.getTeacherByFirstLast(teacherName)
|
|
||||||
|
|
||||||
val dateString = announcementElement.getElementsByClass("datetime").first().text()
|
|
||||||
val startDate = Date.fromY_m_d(dateString)
|
|
||||||
val addedDate = Date.fromIsoHm(dateString)
|
|
||||||
|
|
||||||
val announcementObject = Announcement(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
subject = subject,
|
|
||||||
text = null,
|
|
||||||
startDate = startDate,
|
|
||||||
endDate = null,
|
|
||||||
teacherId = teacher.id,
|
|
||||||
addedDate = addedDate
|
|
||||||
).also {
|
|
||||||
it.idString = longId
|
|
||||||
}
|
|
||||||
|
|
||||||
data.announcementList.add(announcementObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_ANNOUNCEMENT,
|
|
||||||
id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS)
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ANNOUNCEMENTS) }
|
|
||||||
}
|
|
@ -1,114 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-24
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_ATTENDANCE_ENTRIES
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_ATTENDANCE_TYPE
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_ATTENDANCE_TYPES
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.singleOrNull
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class EdudziennikWebAttendance(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWebAttendance"
|
|
||||||
}
|
|
||||||
|
|
||||||
private var requestSemester: Int? = null
|
|
||||||
|
|
||||||
init {
|
|
||||||
if (profile?.empty == true && data.currentSemester == 2) requestSemester = 1
|
|
||||||
getAttendances()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getAttendances() { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.studentEndpoint + "Presence", semester = requestSemester) { text ->
|
|
||||||
|
|
||||||
val attendanceTypes = EDUDZIENNIK_ATTENDANCE_TYPES.find(text)?.get(1)?.split(',')?.map {
|
|
||||||
val type = EDUDZIENNIK_ATTENDANCE_TYPE.find(it.trim())
|
|
||||||
val symbol = type?.get(1)?.trim() ?: "?"
|
|
||||||
val name = type?.get(2)?.trim() ?: "nieznany rodzaj"
|
|
||||||
return@map Triple(
|
|
||||||
symbol,
|
|
||||||
name,
|
|
||||||
when (name.toLowerCase(Locale.ROOT)) {
|
|
||||||
"obecność" -> Attendance.TYPE_PRESENT
|
|
||||||
"nieobecność" -> Attendance.TYPE_ABSENT
|
|
||||||
"spóźnienie" -> Attendance.TYPE_BELATED
|
|
||||||
"nieobecność usprawiedliwiona" -> Attendance.TYPE_ABSENT_EXCUSED
|
|
||||||
"dzień wolny" -> Attendance.TYPE_DAY_FREE
|
|
||||||
"brak zajęć" -> Attendance.TYPE_DAY_FREE
|
|
||||||
"oddelegowany" -> Attendance.TYPE_RELEASED
|
|
||||||
else -> Attendance.TYPE_UNKNOWN
|
|
||||||
}
|
|
||||||
)
|
|
||||||
} ?: emptyList()
|
|
||||||
|
|
||||||
EDUDZIENNIK_ATTENDANCE_ENTRIES.findAll(text).forEach { attendanceElement ->
|
|
||||||
val date = Date.fromY_m_d(attendanceElement[1])
|
|
||||||
val lessonNumber = attendanceElement[2].toInt()
|
|
||||||
val attendanceSymbol = attendanceElement[3]
|
|
||||||
|
|
||||||
val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date)
|
|
||||||
val lesson = lessons.firstOrNull { it.lessonNumber == lessonNumber }
|
|
||||||
|
|
||||||
val id = "${date.stringY_m_d}:$lessonNumber:$attendanceSymbol".crc32()
|
|
||||||
|
|
||||||
val (typeSymbol, typeName, baseType) = attendanceTypes.firstOrNull { (symbol, _, _) -> symbol == attendanceSymbol }
|
|
||||||
?: return@forEach
|
|
||||||
|
|
||||||
val startTime = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber }?.startTime
|
|
||||||
?: return@forEach
|
|
||||||
|
|
||||||
val attendanceObject = Attendance(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
baseType = baseType,
|
|
||||||
typeName = typeName,
|
|
||||||
typeShort = data.app.attendanceManager.getTypeShort(baseType),
|
|
||||||
typeSymbol = typeSymbol,
|
|
||||||
typeColor = null,
|
|
||||||
date = date,
|
|
||||||
startTime = lesson?.displayStartTime ?: startTime,
|
|
||||||
semester = profile.currentSemester,
|
|
||||||
teacherId = lesson?.displayTeacherId ?: -1,
|
|
||||||
subjectId = lesson?.displaySubjectId ?: -1
|
|
||||||
).also {
|
|
||||||
it.lessonNumber = lessonNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
data.attendanceList.add(attendanceObject)
|
|
||||||
if (baseType != Attendance.TYPE_PRESENT) {
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_ATTENDANCE,
|
|
||||||
id,
|
|
||||||
profile.empty || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN,
|
|
||||||
profile.empty || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (profile.empty && requestSemester == 1 && data.currentSemester == 2) {
|
|
||||||
requestSemester = null
|
|
||||||
getAttendances()
|
|
||||||
} else {
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE) }
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-1
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_EVENT_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_EVENTS
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebEvents(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebEvents"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.studentAndClassesEndpoint + "KlassEvent", xhr = true) { text ->
|
|
||||||
val doc = Jsoup.parseBodyFragment("<table>" + text.trim() + "</table>")
|
|
||||||
|
|
||||||
doc.getElementsByTag("tr").forEach { eventElement ->
|
|
||||||
val date = Date.fromY_m_d(eventElement.child(1).text())
|
|
||||||
|
|
||||||
val titleElement = eventElement.child(2).child(0)
|
|
||||||
val title = titleElement.text().trim()
|
|
||||||
|
|
||||||
val id = EDUDZIENNIK_EVENT_ID.find(titleElement.attr("href"))?.get(1)?.crc32()
|
|
||||||
?: return@forEach
|
|
||||||
|
|
||||||
val eventObject = Event(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
date = date,
|
|
||||||
time = null,
|
|
||||||
topic = title,
|
|
||||||
color = null,
|
|
||||||
type = Event.TYPE_CLASS_EVENT,
|
|
||||||
teacherId = -1,
|
|
||||||
subjectId = -1,
|
|
||||||
teamId = data.teamClass?.id ?: -1
|
|
||||||
)
|
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_EVENT,
|
|
||||||
id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_CLASS_EVENT))
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_EVENTS, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_EVENTS)
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_EVENTS) }
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-24
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_EVENT_TYPE_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_EXAM_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SUBJECT_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_EXAMS
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebExams(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebExams"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { profile?.also { profile ->
|
|
||||||
webGet(TAG, data.studentAndClassEndpoint + "Evaluations", xhr = true) { text ->
|
|
||||||
val doc = Jsoup.parseBodyFragment("<table>" + text.trim() + "</table>")
|
|
||||||
|
|
||||||
doc.select("tr").forEach { examElement ->
|
|
||||||
val id = EDUDZIENNIK_EXAM_ID.find(examElement.child(0).child(0).attr("href"))
|
|
||||||
?.get(1)?.crc32() ?: return@forEach
|
|
||||||
val topic = examElement.child(0).text().trim()
|
|
||||||
|
|
||||||
val subjectElement = examElement.child(1).child(0)
|
|
||||||
val subjectId = EDUDZIENNIK_SUBJECT_ID.find(subjectElement.attr("href"))?.get(1)
|
|
||||||
?: return@forEach
|
|
||||||
val subjectName = subjectElement.text().trim()
|
|
||||||
val subject = data.getSubject(subjectId, subjectName)
|
|
||||||
|
|
||||||
val dateString = examElement.child(2).text().trim()
|
|
||||||
if (dateString.isBlank()) return@forEach
|
|
||||||
val date = Date.fromY_m_d(dateString)
|
|
||||||
|
|
||||||
val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date)
|
|
||||||
val startTime = lessons.firstOrNull { it.displaySubjectId == subject.id }?.displayStartTime
|
|
||||||
|
|
||||||
val eventTypeElement = examElement.child(3).child(0)
|
|
||||||
val eventTypeId = EDUDZIENNIK_EVENT_TYPE_ID.find(eventTypeElement.attr("href"))?.get(1)
|
|
||||||
?: return@forEach
|
|
||||||
val eventTypeName = eventTypeElement.text()
|
|
||||||
val eventType = data.getEventType(eventTypeId, eventTypeName)
|
|
||||||
|
|
||||||
val eventObject = Event(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
date = date,
|
|
||||||
time = startTime,
|
|
||||||
topic = topic,
|
|
||||||
color = null,
|
|
||||||
type = eventType.id,
|
|
||||||
teacherId = -1,
|
|
||||||
subjectId = subject.id,
|
|
||||||
teamId = data.teamClass?.id ?: -1
|
|
||||||
)
|
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_EVENT,
|
|
||||||
id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
data.toRemove.add(DataRemoveModel.Events.futureExceptTypes(listOf(
|
|
||||||
Event.TYPE_HOMEWORK,
|
|
||||||
Event.TYPE_CLASS_EVENT
|
|
||||||
)))
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_EXAMS, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_EXAMS)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-26
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.greenrobot.eventbus.EventBus
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.AnnouncementGetEvent
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
|
|
||||||
class EdudziennikWebGetAnnouncement(override val data: DataEdudziennik,
|
|
||||||
private val announcement: AnnouncementFull,
|
|
||||||
val onSuccess: () -> Unit
|
|
||||||
) : EdudziennikWeb(data, null) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebGetAnnouncement"
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
webGet(TAG, "Announcement/${announcement.idString}") { text ->
|
|
||||||
val description = Regexes.EDUDZIENNIK_ANNOUNCEMENT_DESCRIPTION.find(text)?.get(1)?.trim() ?: ""
|
|
||||||
|
|
||||||
announcement.text = description
|
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(AnnouncementGetEvent(announcement))
|
|
||||||
|
|
||||||
data.announcementList.add(announcement)
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import android.text.Html
|
|
||||||
import org.greenrobot.eventbus.EventBus
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
|
||||||
|
|
||||||
class EdudziennikWebGetHomework(
|
|
||||||
override val data: DataEdudziennik,
|
|
||||||
val event: EventFull,
|
|
||||||
val onSuccess: () -> Unit
|
|
||||||
) : EdudziennikWeb(data, null) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebGetHomework"
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
if (event.attachmentNames.isNotNullNorEmpty()) {
|
|
||||||
val id = event.attachmentNames!![0]
|
|
||||||
|
|
||||||
webGet(TAG, "Homework/$id") { text ->
|
|
||||||
val description = Regexes.EDUDZIENNIK_HOMEWORK_DESCRIPTION.find(text)?.get(1)?.trim()
|
|
||||||
|
|
||||||
if (description != null) event.topic = Html.fromHtml(description).toString()
|
|
||||||
|
|
||||||
event.homeworkBody = ""
|
|
||||||
event.attachmentNames = null
|
|
||||||
|
|
||||||
data.eventList += event
|
|
||||||
data.eventListReplace = true
|
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(EventGetEvent(event))
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
EventBus.getDefault().postSticky(EventGetEvent(event))
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,230 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-25
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import android.graphics.Color
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.colorFromCssName
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_GRADES
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_NORMAL
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_POINT_SUM
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_FINAL
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_PROPOSED
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER2_FINAL
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER2_PROPOSED
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebGrades(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWebGrades"
|
|
||||||
}
|
|
||||||
|
|
||||||
private var requestSemester: Int? = null
|
|
||||||
|
|
||||||
init {
|
|
||||||
if (profile?.empty == true && data.currentSemester == 2) requestSemester = 1
|
|
||||||
getGrades()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getGrades() { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.studentEndpoint + "start", semester = requestSemester) { text ->
|
|
||||||
val semester = requestSemester ?: data.currentSemester
|
|
||||||
|
|
||||||
val doc = Jsoup.parse(text)
|
|
||||||
val subjects = doc.select("#student_grades tbody").firstOrNull()?.children()
|
|
||||||
|
|
||||||
subjects?.forEach { subjectElement ->
|
|
||||||
if (subjectElement.id().isBlank()) return@forEach
|
|
||||||
|
|
||||||
val subjectId = subjectElement.id().trim()
|
|
||||||
val subjectName = subjectElement.child(0).text().trim()
|
|
||||||
val subject = data.getSubject(subjectId, subjectName)
|
|
||||||
|
|
||||||
val gradeType = when {
|
|
||||||
subjectElement.select("#sum").text().isNotBlank() -> TYPE_POINT_SUM
|
|
||||||
else -> TYPE_NORMAL
|
|
||||||
}
|
|
||||||
|
|
||||||
val gradeCountToAverage = subjectElement.select("#avg").text().isNotBlank()
|
|
||||||
|
|
||||||
val grades = subjectElement.select(".grade[data-edited]")
|
|
||||||
val gradesInfo = subjectElement.select(".grade-tip")
|
|
||||||
|
|
||||||
val gradeValues = if (grades.isNotEmpty()) {
|
|
||||||
subjects.select(".avg-$subjectId .grade-tip > p").first()
|
|
||||||
.text().split('+').map {
|
|
||||||
val split = it.split('*')
|
|
||||||
val value = split[1].trim().toFloatOrNull()
|
|
||||||
val weight = value?.let { split[0].trim().toFloatOrNull() } ?: 0f
|
|
||||||
|
|
||||||
Pair(value ?: 0f, weight)
|
|
||||||
}
|
|
||||||
} else emptyList()
|
|
||||||
|
|
||||||
grades.forEachIndexed { index, gradeElement ->
|
|
||||||
val id = Regexes.EDUDZIENNIK_GRADE_ID.find(gradeElement.attr("href"))?.get(1)?.crc32()
|
|
||||||
?: return@forEachIndexed
|
|
||||||
val (value, weight) = gradeValues[index]
|
|
||||||
val name = gradeElement.text().trim().let {
|
|
||||||
if (it.contains(',') || it.contains('.')) {
|
|
||||||
val replaced = it.replace(',', '.')
|
|
||||||
val float = replaced.toFloatOrNull()
|
|
||||||
|
|
||||||
if (float != null && float % 1 == 0f) float.toInt().toString()
|
|
||||||
else it
|
|
||||||
} else it
|
|
||||||
}
|
|
||||||
|
|
||||||
val info = gradesInfo[index]
|
|
||||||
val fullName = info.child(0).text().trim()
|
|
||||||
val columnName = info.child(4).text().trim()
|
|
||||||
val comment = info.ownText()
|
|
||||||
|
|
||||||
val description = columnName + if (comment.isNotBlank()) " - $comment" else null
|
|
||||||
|
|
||||||
val teacherName = info.child(1).text()
|
|
||||||
val teacher = data.getTeacherByLastFirst(teacherName)
|
|
||||||
|
|
||||||
val addedDate = info.child(2).text().split(' ').let {
|
|
||||||
val day = it[0].toInt()
|
|
||||||
val month = Utils.monthFromName(it[1])
|
|
||||||
val year = it[2].toInt()
|
|
||||||
|
|
||||||
Date(year, month, day).inMillis
|
|
||||||
}
|
|
||||||
|
|
||||||
val color = Regexes.STYLE_CSS_COLOR.find(gradeElement.attr("style"))?.get(1)?.let {
|
|
||||||
if (it.startsWith('#')) Color.parseColor(it)
|
|
||||||
else colorFromCssName(it)
|
|
||||||
} ?: -1
|
|
||||||
|
|
||||||
val gradeObject = Grade(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
name = name,
|
|
||||||
type = gradeType,
|
|
||||||
value = value,
|
|
||||||
weight = if (gradeCountToAverage) weight else 0f,
|
|
||||||
color = color,
|
|
||||||
category = fullName,
|
|
||||||
description = description,
|
|
||||||
comment = null,
|
|
||||||
semester = semester,
|
|
||||||
teacherId = teacher.id,
|
|
||||||
subjectId = subject.id,
|
|
||||||
addedDate = addedDate
|
|
||||||
)
|
|
||||||
|
|
||||||
data.gradeList.add(gradeObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_GRADE,
|
|
||||||
id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
val proposed = subjectElement.select(".proposal").firstOrNull()?.text()?.trim()
|
|
||||||
|
|
||||||
if (proposed != null && proposed.isNotBlank()) {
|
|
||||||
val proposedGradeObject = Grade(
|
|
||||||
profileId = profileId,
|
|
||||||
id = (-1 * subject.id) - 1,
|
|
||||||
name = proposed,
|
|
||||||
type = when (semester) {
|
|
||||||
1 -> TYPE_SEMESTER1_PROPOSED
|
|
||||||
else -> TYPE_SEMESTER2_PROPOSED
|
|
||||||
},
|
|
||||||
value = proposed.toFloatOrNull() ?: 0f,
|
|
||||||
weight = 0f,
|
|
||||||
color = -1,
|
|
||||||
category = null,
|
|
||||||
description = null,
|
|
||||||
comment = null,
|
|
||||||
semester = semester,
|
|
||||||
teacherId = -1,
|
|
||||||
subjectId = subject.id
|
|
||||||
)
|
|
||||||
|
|
||||||
data.gradeList.add(proposedGradeObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_GRADE,
|
|
||||||
proposedGradeObject.id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
val final = subjectElement.select(".final").firstOrNull()?.text()?.trim()
|
|
||||||
|
|
||||||
if (final != null && final.isNotBlank()) {
|
|
||||||
val finalGradeObject = Grade(
|
|
||||||
profileId = profileId,
|
|
||||||
id = (-1 * subject.id) - 2,
|
|
||||||
name = final,
|
|
||||||
type = when (semester) {
|
|
||||||
1 -> TYPE_SEMESTER1_FINAL
|
|
||||||
else -> TYPE_SEMESTER2_FINAL
|
|
||||||
},
|
|
||||||
value = final.toFloatOrNull() ?: 0f,
|
|
||||||
weight = 0f,
|
|
||||||
color = -1,
|
|
||||||
category = null,
|
|
||||||
description = null,
|
|
||||||
comment = null,
|
|
||||||
semester = semester,
|
|
||||||
teacherId = -1,
|
|
||||||
subjectId = subject.id
|
|
||||||
)
|
|
||||||
|
|
||||||
data.gradeList.add(finalGradeObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
data.profileId,
|
|
||||||
Metadata.TYPE_GRADE,
|
|
||||||
finalGradeObject.id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!subjects.isNullOrEmpty()) {
|
|
||||||
data.toRemove.addAll(listOf(
|
|
||||||
TYPE_NORMAL,
|
|
||||||
TYPE_POINT_SUM,
|
|
||||||
TYPE_SEMESTER1_PROPOSED,
|
|
||||||
TYPE_SEMESTER2_PROPOSED,
|
|
||||||
TYPE_SEMESTER1_FINAL,
|
|
||||||
TYPE_SEMESTER2_FINAL
|
|
||||||
).map {
|
|
||||||
DataRemoveModel.Grades.semesterWithType(semester, it)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (profile.empty && requestSemester == 1 && data.currentSemester == 2) {
|
|
||||||
requestSemester = null
|
|
||||||
getGrades()
|
|
||||||
} else {
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_GRADES, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_GRADES)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_GRADES) }
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-29
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_HOMEWORK_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SUBJECT_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebHomework(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebHomework"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.courseStudentEndpoint + "Homework", xhr = true) { text ->
|
|
||||||
val doc = Jsoup.parseBodyFragment("<table>" + text.trim() + "</table>")
|
|
||||||
|
|
||||||
if (doc.getElementsByClass("message").text().trim() != "Brak prac domowych") {
|
|
||||||
doc.getElementsByTag("tr").forEach { homeworkElement ->
|
|
||||||
val dateElement = homeworkElement.getElementsByClass("date").first().child(0)
|
|
||||||
val idStr = EDUDZIENNIK_HOMEWORK_ID.find(dateElement.attr("href"))?.get(1) ?: return@forEach
|
|
||||||
val id = idStr.crc32()
|
|
||||||
val date = Date.fromY_m_d(dateElement.text())
|
|
||||||
|
|
||||||
val subjectElement = homeworkElement.child(1).child(0)
|
|
||||||
val subjectId = EDUDZIENNIK_SUBJECT_ID.find(subjectElement.attr("href"))?.get(1)
|
|
||||||
?: return@forEach
|
|
||||||
val subjectName = subjectElement.text()
|
|
||||||
val subject = data.getSubject(subjectId, subjectName)
|
|
||||||
|
|
||||||
val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date)
|
|
||||||
val startTime = lessons.firstOrNull { it.subjectId == subject.id }?.displayStartTime
|
|
||||||
|
|
||||||
val teacherName = homeworkElement.child(2).text()
|
|
||||||
val teacher = data.getTeacherByFirstLast(teacherName)
|
|
||||||
|
|
||||||
val topic = homeworkElement.child(4).text()?.trim()
|
|
||||||
|
|
||||||
val eventObject = Event(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
date = date,
|
|
||||||
time = startTime,
|
|
||||||
topic = topic ?: "",
|
|
||||||
color = null,
|
|
||||||
type = Event.TYPE_HOMEWORK,
|
|
||||||
teacherId = teacher.id,
|
|
||||||
subjectId = subject.id,
|
|
||||||
teamId = data.teamClass?.id ?: -1
|
|
||||||
)
|
|
||||||
|
|
||||||
eventObject.attachmentNames = mutableListOf(idStr)
|
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_HOMEWORK,
|
|
||||||
id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_HOMEWORK))
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK)
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_HOMEWORK) }
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebLuckyNumber(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWebLuckyNumber"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.schoolEndpoint + "Lucky", xhr = true) { text ->
|
|
||||||
text.toIntOrNull()?.also { luckyNumber ->
|
|
||||||
val luckyNumberObject = LuckyNumber(
|
|
||||||
profileId = profileId,
|
|
||||||
date = Date.getToday(),
|
|
||||||
number = luckyNumber
|
|
||||||
)
|
|
||||||
|
|
||||||
data.luckyNumberList.add(luckyNumberObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_LUCKY_NUMBER,
|
|
||||||
luckyNumberObject.date.value.toLong(),
|
|
||||||
true,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER)
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER) }
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-1
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_NOTE_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_NOTES
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Notice
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class EdudziennikWebNotes(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "EdudziennikWebNotes"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
|
||||||
webGet(TAG, data.classStudentEndpoint + "RegistryNotesStudent", xhr = true) { text ->
|
|
||||||
val doc = Jsoup.parseBodyFragment("<table>" + text.trim() + "</table>")
|
|
||||||
|
|
||||||
doc.getElementsByTag("tr").forEach { noteElement ->
|
|
||||||
val dateElement = noteElement.getElementsByClass("date").first().child(0)
|
|
||||||
val addedDate = Date.fromY_m_d(dateElement.text()).inMillis
|
|
||||||
|
|
||||||
val id = EDUDZIENNIK_NOTE_ID.find(dateElement.attr("href"))?.get(0)?.crc32()
|
|
||||||
?: return@forEach
|
|
||||||
|
|
||||||
val teacherName = noteElement.child(1).text()
|
|
||||||
val teacher = data.getTeacherByFirstLast(teacherName)
|
|
||||||
|
|
||||||
val description = noteElement.child(3).text()
|
|
||||||
|
|
||||||
val noticeObject = Notice(
|
|
||||||
profileId = profileId,
|
|
||||||
id = id,
|
|
||||||
type = Notice.TYPE_NEUTRAL,
|
|
||||||
semester = profile.currentSemester,
|
|
||||||
text = description,
|
|
||||||
category = null,
|
|
||||||
points = null,
|
|
||||||
teacherId = teacher.id,
|
|
||||||
addedDate = addedDate
|
|
||||||
)
|
|
||||||
|
|
||||||
data.noticeList.add(noticeObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_NOTICE,
|
|
||||||
id,
|
|
||||||
profile.empty,
|
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_NOTES, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_NOTES)
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_NOTES) }
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.MONTH
|
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.ERROR_EDUDZIENNIK_WEB_TEAM_MISSING
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SUBJECTS_START
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_START
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Team
|
|
||||||
import pl.szczodrzynski.edziennik.firstLettersName
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
|
|
||||||
class EdudziennikWebStart(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWebStart"
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
webGet(TAG, data.studentEndpoint + "start") { text ->
|
|
||||||
getSchoolAndTeam(text)
|
|
||||||
getSubjects(text)
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_START, MONTH)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_START)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getSchoolAndTeam(text: String) {
|
|
||||||
val schoolId = Regexes.EDUDZIENNIK_SCHOOL_DETAIL_ID.find(text)?.get(1)?.trim()
|
|
||||||
val schoolLongName = Regexes.EDUDZIENNIK_SCHOOL_DETAIL_NAME.find(text)?.get(1)?.trim()
|
|
||||||
data.schoolId = schoolId
|
|
||||||
|
|
||||||
val classId = Regexes.EDUDZIENNIK_CLASS_DETAIL_ID.find(text)?.get(1)?.trim()
|
|
||||||
val className = Regexes.EDUDZIENNIK_CLASS_DETAIL_NAME.find(text)?.get(1)?.trim()
|
|
||||||
data.classId = classId
|
|
||||||
|
|
||||||
if (classId == null || className == null || schoolId == null || schoolLongName == null) {
|
|
||||||
data.error(ApiError(TAG, ERROR_EDUDZIENNIK_WEB_TEAM_MISSING)
|
|
||||||
.withApiResponse(text))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val schoolName = schoolId.crc32().toString() + schoolLongName.firstLettersName + "_edu"
|
|
||||||
data.schoolName = schoolName
|
|
||||||
|
|
||||||
val teamId = classId.crc32()
|
|
||||||
val teamCode = "$schoolName:$className"
|
|
||||||
|
|
||||||
val teamObject = Team(
|
|
||||||
data.profileId,
|
|
||||||
teamId,
|
|
||||||
className,
|
|
||||||
Team.TYPE_CLASS,
|
|
||||||
teamCode,
|
|
||||||
-1
|
|
||||||
)
|
|
||||||
|
|
||||||
data.teamClass = teamObject
|
|
||||||
data.teamList.put(teamObject.id, teamObject)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getSubjects(text: String) {
|
|
||||||
EDUDZIENNIK_SUBJECTS_START.findAll(text).forEach {
|
|
||||||
val id = it[1].trim()
|
|
||||||
val name = it[2].trim()
|
|
||||||
data.getSubject(id, name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-25
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.MONTH
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_TEACHERS
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_TEACHERS
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
|
|
||||||
class EdudziennikWebTeachers(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWebTeachers"
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
webGet(TAG, data.studentAndTeacherClassEndpoint + "grid") { text ->
|
|
||||||
EDUDZIENNIK_TEACHERS.findAll(text).forEach {
|
|
||||||
val lastName = it[1].trim()
|
|
||||||
val firstName = it[2].trim()
|
|
||||||
data.getTeacher(firstName, lastName)
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_TEACHERS, MONTH)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_TEACHERS)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
|
||||||
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SUBJECT_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_TEACHER_ID
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LessonRange
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.getString
|
|
||||||
import pl.szczodrzynski.edziennik.singleOrNull
|
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Week
|
|
||||||
|
|
||||||
class EdudziennikWebTimetable(override val data: DataEdudziennik,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : EdudziennikWeb(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikWebTimetable"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
|
||||||
|
|
||||||
val currentWeekStart = Week.getWeekStart()
|
|
||||||
|
|
||||||
if (Date.getToday().weekDay > 4) {
|
|
||||||
currentWeekStart.stepForward(0, 0, 7)
|
|
||||||
}
|
|
||||||
|
|
||||||
val getDate = data.arguments?.getString("weekStart") ?: currentWeekStart.stringY_m_d
|
|
||||||
|
|
||||||
val weekStart = Date.fromY_m_d(getDate)
|
|
||||||
val weekEnd = weekStart.clone().stepForward(0, 0, 6)
|
|
||||||
|
|
||||||
webGet(TAG, data.timetableEndpoint + "print?date=$getDate") { text ->
|
|
||||||
val doc = Jsoup.parse(text)
|
|
||||||
|
|
||||||
val dataDays = mutableListOf<Int>()
|
|
||||||
val dataStart = weekStart.clone()
|
|
||||||
while (dataStart <= weekEnd) {
|
|
||||||
dataDays += dataStart.value
|
|
||||||
dataStart.stepForward(0, 0, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
val table = doc.select("#Schedule tbody").first()
|
|
||||||
|
|
||||||
if (!table.text().contains("Brak planu lekcji.")) {
|
|
||||||
table.children().forEach { row ->
|
|
||||||
val rowElements = row.children()
|
|
||||||
|
|
||||||
val lessonNumber = rowElements[0].text().toInt()
|
|
||||||
|
|
||||||
val times = rowElements[1].text().split('-')
|
|
||||||
val startTime = Time.fromH_m(times[0].trim())
|
|
||||||
val endTime = Time.fromH_m(times[1].trim())
|
|
||||||
|
|
||||||
data.lessonRanges.singleOrNull {
|
|
||||||
it.lessonNumber == lessonNumber && it.startTime == startTime && it.endTime == endTime
|
|
||||||
} ?: run {
|
|
||||||
data.lessonRanges.put(lessonNumber, LessonRange(profileId, lessonNumber, startTime, endTime))
|
|
||||||
}
|
|
||||||
|
|
||||||
rowElements.subList(2, rowElements.size).forEachIndexed { index, lesson ->
|
|
||||||
val course = lesson.select(".course").firstOrNull() ?: return@forEachIndexed
|
|
||||||
val info = course.select("span > span")
|
|
||||||
|
|
||||||
if (info.isEmpty()) return@forEachIndexed
|
|
||||||
|
|
||||||
val type = when (course.hasClass("substitute")) {
|
|
||||||
true -> Lesson.TYPE_CHANGE
|
|
||||||
else -> Lesson.TYPE_NORMAL
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Getting subject */
|
|
||||||
|
|
||||||
val subjectElement = info[0].child(0)
|
|
||||||
val subjectId = EDUDZIENNIK_SUBJECT_ID.find(subjectElement.attr("href"))?.get(1)
|
|
||||||
?: return@forEachIndexed
|
|
||||||
val subjectName = subjectElement.text().trim()
|
|
||||||
val subject = data.getSubject(subjectId, subjectName)
|
|
||||||
|
|
||||||
/* Getting teacher */
|
|
||||||
|
|
||||||
val teacherId = if (info.size >= 2) {
|
|
||||||
val teacherElement = info[1].child(0)
|
|
||||||
val teacherLongId = EDUDZIENNIK_TEACHER_ID.find(teacherElement.attr("href"))?.get(1)
|
|
||||||
val teacherName = teacherElement.text().trim()
|
|
||||||
data.getTeacherByLastFirst(teacherName, teacherLongId).id
|
|
||||||
} else null
|
|
||||||
|
|
||||||
val lessonObject = Lesson(profileId, -1).also {
|
|
||||||
it.type = type
|
|
||||||
it.date = weekStart.clone().stepForward(0, 0, index)
|
|
||||||
it.lessonNumber = lessonNumber
|
|
||||||
it.startTime = startTime
|
|
||||||
it.endTime = endTime
|
|
||||||
it.subjectId = subject.id
|
|
||||||
it.teacherId = teacherId
|
|
||||||
it.teamId = data.teamClass?.id
|
|
||||||
|
|
||||||
it.id = it.buildId()
|
|
||||||
}
|
|
||||||
|
|
||||||
data.lessonList.add(lessonObject)
|
|
||||||
dataDays.remove(lessonObject.date!!.value)
|
|
||||||
|
|
||||||
if (type != Lesson.TYPE_NORMAL) {
|
|
||||||
val seen = profile.empty || lessonObject.date!! < Date.getToday()
|
|
||||||
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_LESSON_CHANGE,
|
|
||||||
lessonObject.id,
|
|
||||||
seen,
|
|
||||||
seen
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (day in dataDays) {
|
|
||||||
val lessonDate = Date.fromValue(day)
|
|
||||||
data.lessonList += Lesson(profileId, lessonDate.value.toLong()).apply {
|
|
||||||
type = Lesson.TYPE_NO_LESSONS
|
|
||||||
date = lessonDate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
d(TAG, "Clearing lessons between ${weekStart.stringY_m_d} and ${weekEnd.stringY_m_d} - timetable downloaded for $getDate")
|
|
||||||
|
|
||||||
data.toRemove.add(DataRemoveModel.Timetable.between(weekStart, weekEnd))
|
|
||||||
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE, SYNC_ALWAYS)
|
|
||||||
onSuccess(ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE)
|
|
||||||
}
|
|
||||||
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE) }
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.firstlogin
|
|
||||||
|
|
||||||
import org.greenrobot.eventbus.EventBus
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_EDUDZIENNIK
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_ACCOUNT_NAME_START
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_STUDENTS_START
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
|
||||||
import pl.szczodrzynski.edziennik.fixName
|
|
||||||
import pl.szczodrzynski.edziennik.get
|
|
||||||
import pl.szczodrzynski.edziennik.getShortName
|
|
||||||
import pl.szczodrzynski.edziennik.set
|
|
||||||
|
|
||||||
class EdudziennikFirstLogin(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikFirstLogin"
|
|
||||||
}
|
|
||||||
|
|
||||||
private val web = EdudziennikWeb(data, null)
|
|
||||||
private val profileList = mutableListOf<Profile>()
|
|
||||||
|
|
||||||
init {
|
|
||||||
val loginStoreId = data.loginStore.id
|
|
||||||
val loginStoreType = LOGIN_TYPE_EDUDZIENNIK
|
|
||||||
var firstProfileId = loginStoreId
|
|
||||||
|
|
||||||
EdudziennikLoginWeb(data) {
|
|
||||||
web.webGet(TAG, "") { text ->
|
|
||||||
val accountNameLong = EDUDZIENNIK_ACCOUNT_NAME_START.find(text)?.get(1)?.fixName()
|
|
||||||
|
|
||||||
EDUDZIENNIK_STUDENTS_START.findAll(text).forEach {
|
|
||||||
val studentId = it[1]
|
|
||||||
val studentNameLong = it[2].fixName()
|
|
||||||
|
|
||||||
if (studentId.isBlank() || studentNameLong.isBlank()) return@forEach
|
|
||||||
|
|
||||||
val studentNameShort = studentNameLong.getShortName()
|
|
||||||
val accountName = if (accountNameLong == studentNameLong) null else accountNameLong
|
|
||||||
|
|
||||||
val profile = Profile(
|
|
||||||
firstProfileId++,
|
|
||||||
loginStoreId,
|
|
||||||
loginStoreType,
|
|
||||||
studentNameLong,
|
|
||||||
data.loginEmail,
|
|
||||||
studentNameLong,
|
|
||||||
studentNameShort,
|
|
||||||
accountName
|
|
||||||
).apply {
|
|
||||||
studentData["studentId"] = studentId
|
|
||||||
}
|
|
||||||
profileList.add(profile)
|
|
||||||
}
|
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login
|
|
||||||
|
|
||||||
import im.wangchao.mhttp.Request
|
|
||||||
import im.wangchao.mhttp.Response
|
|
||||||
import im.wangchao.mhttp.callback.TextCallbackHandler
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
|
||||||
import pl.szczodrzynski.edziennik.getUnixDate
|
|
||||||
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
|
||||||
|
|
||||||
class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "EdudziennikLoginWeb"
|
|
||||||
}
|
|
||||||
|
|
||||||
init { run {
|
|
||||||
if (data.isWebLoginValid()) {
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
data.app.cookieJar.clear("dziennikel.appspot.com")
|
|
||||||
if (data.loginEmail.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) {
|
|
||||||
loginWithCredentials()
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
data.error(ApiError(TAG, ERROR_LOGIN_DATA_MISSING))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
|
|
||||||
private fun loginWithCredentials() {
|
|
||||||
d(TAG, "Request: Edudziennik/Login/Web - https://dziennikel.appspot.com/login/?next=/")
|
|
||||||
|
|
||||||
val callback = object : TextCallbackHandler() {
|
|
||||||
override fun onSuccess(text: String?, response: Response?) {
|
|
||||||
if (text == null || response == null) {
|
|
||||||
data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY)
|
|
||||||
.withResponse(response))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val url = response.raw().request().url().toString()
|
|
||||||
|
|
||||||
if (!url.contains("Student")) {
|
|
||||||
when {
|
|
||||||
text.contains("Wprowadzono nieprawidłową nazwę użytkownika lub hasło.") -> ERROR_LOGIN_EDUDZIENNIK_WEB_INVALID_LOGIN
|
|
||||||
else -> ERROR_LOGIN_EDUDZIENNIK_WEB_OTHER
|
|
||||||
}.let { errorCode ->
|
|
||||||
data.error(ApiError(TAG, errorCode)
|
|
||||||
.withApiResponse(text)
|
|
||||||
.withResponse(response))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com")
|
|
||||||
val sessionId = cookies["sessionid"]
|
|
||||||
|
|
||||||
if (sessionId == null) {
|
|
||||||
data.error(ApiError(TAG, ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID)
|
|
||||||
.withResponse(response)
|
|
||||||
.withApiResponse(text))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
data.webSessionId = sessionId
|
|
||||||
data.webSessionIdExpiryTime = response.getUnixDate() + 45 * 60 /* 45 min */
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(response: Response?, throwable: Throwable?) {
|
|
||||||
data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
|
|
||||||
.withResponse(response)
|
|
||||||
.withThrowable(throwable))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Request.builder()
|
|
||||||
.url("https://dziennikel.appspot.com/login/?next=/")
|
|
||||||
.userAgent(EDUDZIENNIK_USER_AGENT)
|
|
||||||
.contentType("application/x-www-form-urlencoded")
|
|
||||||
.addParameter("email", data.loginEmail)
|
|
||||||
.addParameter("password", data.loginPassword)
|
|
||||||
.addParameter("auth_method", "password")
|
|
||||||
.addParameter("next", "/")
|
|
||||||
.post()
|
|
||||||
.callback(callback)
|
|
||||||
.build()
|
|
||||||
.enqueue()
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,7 +5,6 @@
|
|||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.currentTimeUnix
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_API
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_API
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_MESSAGES
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_MESSAGES
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_PORTAL
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_PORTAL
|
||||||
@ -13,7 +12,8 @@ import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_SYNERGIA
|
|||||||
import pl.szczodrzynski.edziennik.data.api.models.Data
|
import pl.szczodrzynski.edziennik.data.api.models.Data
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
import pl.szczodrzynski.edziennik.ext.currentTimeUnix
|
||||||
|
import pl.szczodrzynski.edziennik.ext.isNotNullNorEmpty
|
||||||
|
|
||||||
class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.Librus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.*
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.firstlogin.LibrusFirstLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.firstlogin.LibrusFirstLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLogin
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.events.UserActionRequiredEvent
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
@ -162,6 +163,7 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|
|||||||
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
|
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
|
||||||
return object : EdziennikCallback {
|
return object : EdziennikCallback {
|
||||||
override fun onCompleted() { callback.onCompleted() }
|
override fun onCompleted() { callback.onCompleted() }
|
||||||
|
override fun onRequiresUserAction(event: UserActionRequiredEvent) { callback.onRequiresUserAction(event) }
|
||||||
override fun onProgress(step: Float) { callback.onProgress(step) }
|
override fun onProgress(step: Float) { callback.onProgress(step) }
|
||||||
override fun onStartProgress(stringRes: Int) { callback.onStartProgress(stringRes) }
|
override fun onStartProgress(stringRes: Int) { callback.onStartProgress(stringRes) }
|
||||||
override fun onError(apiError: ApiError) {
|
override fun onError(apiError: ApiError) {
|
||||||
|
@ -10,7 +10,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import pl.szczodrzynski.edziennik.startCoroutineTimer
|
import pl.szczodrzynski.edziennik.ext.startCoroutineTimer
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
class LibrusRecaptchaHelper(
|
class LibrusRecaptchaHelper(
|
||||||
|
@ -11,7 +11,7 @@ import im.wangchao.mhttp.callback.JsonCallbackHandler
|
|||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.getString
|
import pl.szczodrzynski.edziennik.ext.getString
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import java.net.HttpURLConnection.*
|
import java.net.HttpURLConnection.*
|
||||||
|
|
||||||
|
@ -182,10 +182,6 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
|
|||||||
data.startProgress(R.string.edziennik_progress_endpoint_pt_meetings)
|
data.startProgress(R.string.edziennik_progress_endpoint_pt_meetings)
|
||||||
LibrusApiPtMeetings(data, lastSync, onSuccess)
|
LibrusApiPtMeetings(data, lastSync, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES -> {
|
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_day_types)
|
|
||||||
LibrusApiTeacherFreeDayTypes(data, lastSync, onSuccess)
|
|
||||||
}
|
|
||||||
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS -> {
|
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_days)
|
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_days)
|
||||||
LibrusApiTeacherFreeDays(data, lastSync, onSuccess)
|
LibrusApiTeacherFreeDays(data, lastSync, onSuccess)
|
||||||
|
@ -7,7 +7,7 @@ import im.wangchao.mhttp.callback.JsonCallbackHandler
|
|||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.getString
|
import pl.szczodrzynski.edziennik.ext.getString
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import java.net.HttpURLConnection
|
import java.net.HttpURLConnection
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Announcement
|
import pl.szczodrzynski.edziennik.data.db.entity.Announcement
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiAnnouncements(override val data: DataLibrus,
|
class LibrusApiAnnouncements(override val data: DataLibrus,
|
||||||
|
@ -11,6 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.AttendanceType
|
import pl.szczodrzynski.edziennik.data.db.entity.AttendanceType
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiAttendanceTypes(override val data: DataLibrus,
|
class LibrusApiAttendanceTypes(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -58,7 +59,7 @@ class LibrusApiAttendanceTypes(override val data: DataLibrus,
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 2*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 2* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES)
|
onSuccess(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiAttendances(override val data: DataLibrus,
|
class LibrusApiAttendances(override val data: DataLibrus,
|
||||||
|
@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_BEHAVIOUR_GRADE_CATEGORIES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_BEHAVIOUR_GRADE_CATEGORIES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiBehaviourGradeCategories(override val data: DataLibrus,
|
class LibrusApiBehaviourGradeCategories(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiBehaviourGradeComments(override val data: DataLibrus,
|
class LibrusApiBehaviourGradeComments(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_POINT_SUM
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
|
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.DAY
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_CLASSES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_CLASSES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Team
|
import pl.szczodrzynski.edziennik.data.db.entity.Team
|
||||||
import pl.szczodrzynski.edziennik.getJsonObject
|
import pl.szczodrzynski.edziennik.ext.DAY
|
||||||
import pl.szczodrzynski.edziennik.getLong
|
import pl.szczodrzynski.edziennik.ext.getJsonObject
|
||||||
import pl.szczodrzynski.edziennik.getString
|
import pl.szczodrzynski.edziennik.ext.getLong
|
||||||
|
import pl.szczodrzynski.edziennik.ext.getString
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiClasses(override val data: DataLibrus,
|
class LibrusApiClasses(override val data: DataLibrus,
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_CLASSROOMS
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_CLASSROOMS
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Classroom
|
import pl.szczodrzynski.edziennik.data.db.entity.Classroom
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class LibrusApiClassrooms(override val data: DataLibrus,
|
class LibrusApiClassrooms(override val data: DataLibrus,
|
||||||
@ -25,8 +26,8 @@ class LibrusApiClassrooms(override val data: DataLibrus,
|
|||||||
|
|
||||||
classrooms?.forEach { classroom ->
|
classrooms?.forEach { classroom ->
|
||||||
val id = classroom.getLong("Id") ?: return@forEach
|
val id = classroom.getLong("Id") ?: return@forEach
|
||||||
val name = classroom.getString("Name")?.toLowerCase(Locale.getDefault()) ?: ""
|
val name = classroom.getString("Name")?.lowercase() ?: ""
|
||||||
val symbol = classroom.getString("Symbol")?.toLowerCase(Locale.getDefault()) ?: ""
|
val symbol = classroom.getString("Symbol")?.lowercase() ?: ""
|
||||||
val nameShort = name.fixWhiteSpaces().split(" ").onEach { it[0] }.joinToString()
|
val nameShort = name.fixWhiteSpaces().split(" ").onEach { it[0] }.joinToString()
|
||||||
val symbolParts = symbol.fixWhiteSpaces().split(" ")
|
val symbolParts = symbol.fixWhiteSpaces().split(" ")
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ class LibrusApiClassrooms(override val data: DataLibrus,
|
|||||||
data.classrooms.put(id, Classroom(profileId, id, friendlyName))
|
data.classrooms.put(id, Classroom(profileId, id, friendlyName))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_CLASSROOMS, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_CLASSROOMS, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_CLASSROOMS)
|
onSuccess(ENDPOINT_LIBRUS_API_CLASSROOMS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_DESCRIPTIVE_GRADE_CATEGORIES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_DESCRIPTIVE_GRADE_CATEGORIES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiDescriptiveGradeCategories(override val data: DataLibrus,
|
class LibrusApiDescriptiveGradeCategories(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -15,6 +15,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_TEXT
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiDescriptiveGrades(override val data: DataLibrus,
|
class LibrusApiDescriptiveGrades(override val data: DataLibrus,
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_EVENT_TYPES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_EVENT_TYPES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.EventType
|
import pl.szczodrzynski.edziennik.data.db.entity.EventType
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiEventTypes(override val data: DataLibrus,
|
class LibrusApiEventTypes(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -30,7 +31,7 @@ class LibrusApiEventTypes(override val data: DataLibrus,
|
|||||||
data.eventTypes.put(id, EventType(profileId, id, name, color))
|
data.eventTypes.put(id, EventType(profileId, id, name, color))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_EVENT_TYPES, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_EVENT_TYPES, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_EVENT_TYPES)
|
onSuccess(ENDPOINT_LIBRUS_API_EVENT_TYPES)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiGradeCategories(override val data: DataLibrus,
|
class LibrusApiGradeCategories(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiGradeComments(override val data: DataLibrus,
|
class LibrusApiGradeComments(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -16,6 +16,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPO
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiHomework(override val data: DataLibrus,
|
class LibrusApiHomework(override val data: DataLibrus,
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LESSONS
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LESSONS
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LibrusLesson
|
import pl.szczodrzynski.edziennik.data.db.entity.LibrusLesson
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiLessons(override val data: DataLibrus,
|
class LibrusApiLessons(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -39,7 +40,7 @@ class LibrusApiLessons(override val data: DataLibrus,
|
|||||||
data.librusLessons.put(id, librusLesson)
|
data.librusLessons.put(id, librusLesson)
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_LESSONS, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_LESSONS, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_LESSONS)
|
onSuccess(ENDPOINT_LIBRUS_API_LESSONS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LUCKY_NUMBER
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LUCKY_NUMBER
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
|
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ class LibrusApiLuckyNumber(override val data: DataLibrus,
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
var nextSync = System.currentTimeMillis() + 2*DAY*1000
|
var nextSync = System.currentTimeMillis() + 2* DAY *1000
|
||||||
|
|
||||||
apiGet(TAG, "LuckyNumbers") { json ->
|
apiGet(TAG, "LuckyNumbers") { json ->
|
||||||
if (json.isJsonNull) {
|
if (json.isJsonNull) {
|
||||||
@ -41,7 +41,7 @@ class LibrusApiLuckyNumber(override val data: DataLibrus,
|
|||||||
if (luckyNumberDate >= Date.getToday())
|
if (luckyNumberDate >= Date.getToday())
|
||||||
nextSync = luckyNumberDate.combineWith(Time(15, 0, 0))
|
nextSync = luckyNumberDate.combineWith(Time(15, 0, 0))
|
||||||
else
|
else
|
||||||
nextSync = System.currentTimeMillis() + 6*HOUR*1000
|
nextSync = System.currentTimeMillis() + 6* HOUR *1000
|
||||||
|
|
||||||
data.luckyNumberList.add(luckyNumberObject)
|
data.luckyNumberList.add(luckyNumberObject)
|
||||||
data.metadataList.add(
|
data.metadataList.add(
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_ME
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_ME
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiMe(override val data: DataLibrus,
|
class LibrusApiMe(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -34,7 +34,7 @@ class LibrusApiMe(override val data: DataLibrus,
|
|||||||
data.profile?.studentNameLong =
|
data.profile?.studentNameLong =
|
||||||
buildFullName(user?.getString("FirstName"), user?.getString("LastName"))
|
buildFullName(user?.getString("FirstName"), user?.getString("LastName"))
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_ME, 2*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_ME, 2* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_ME)
|
onSuccess(ENDPOINT_LIBRUS_API_ME)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_NOTICE_TYPES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_NOTICE_TYPES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.NoticeType
|
import pl.szczodrzynski.edziennik.data.db.entity.NoticeType
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiNoticeTypes(override val data: DataLibrus,
|
class LibrusApiNoticeTypes(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -29,7 +30,7 @@ class LibrusApiNoticeTypes(override val data: DataLibrus,
|
|||||||
data.noticeTypes.put(id, NoticeType(profileId, id, name))
|
data.noticeTypes.put(id, NoticeType(profileId, id, name))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_NOTICE_TYPES, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_NOTICE_TYPES, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_NOTICE_TYPES)
|
onSuccess(ENDPOINT_LIBRUS_API_NOTICE_TYPES)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Notice
|
import pl.szczodrzynski.edziennik.data.db.entity.Notice
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiNotices(override val data: DataLibrus,
|
class LibrusApiNotices(override val data: DataLibrus,
|
||||||
|
@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_POINT_GRADE_CATEGORIES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_POINT_GRADE_CATEGORIES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiPointGradeCategories(override val data: DataLibrus,
|
class LibrusApiPointGradeCategories(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_POINT_AVG
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiPointGrades(override val data: DataLibrus,
|
class LibrusApiPointGrades(override val data: DataLibrus,
|
||||||
|
@ -11,6 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
|||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
|
||||||
@ -64,7 +65,7 @@ class LibrusApiPtMeetings(override val data: DataLibrus,
|
|||||||
|
|
||||||
data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_PT_MEETING))
|
data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_PT_MEETING))
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_PT_MEETINGS, 12*HOUR)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_PT_MEETINGS, 12* HOUR)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_PT_MEETINGS)
|
onSuccess(ENDPOINT_LIBRUS_API_PT_MEETINGS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.JsonObject
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_PUSH_CONFIG
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_PUSH_CONFIG
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
import pl.szczodrzynski.edziennik.getInt
|
import pl.szczodrzynski.edziennik.ext.JsonObject
|
||||||
import pl.szczodrzynski.edziennik.getJsonObject
|
import pl.szczodrzynski.edziennik.ext.getInt
|
||||||
|
import pl.szczodrzynski.edziennik.ext.getJsonObject
|
||||||
|
|
||||||
class LibrusApiPushConfig(override val data: DataLibrus,
|
class LibrusApiPushConfig(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_SCHOOLS
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_SCHOOLS
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LessonRange
|
import pl.szczodrzynski.edziennik.data.db.entity.LessonRange
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ class LibrusApiSchools(override val data: DataLibrus,
|
|||||||
// create the school's short name using first letters of each long name's word
|
// create the school's short name using first letters of each long name's word
|
||||||
// append the town name and save to student data
|
// append the town name and save to student data
|
||||||
val schoolNameShort = schoolNameLong?.firstLettersName
|
val schoolNameShort = schoolNameLong?.firstLettersName
|
||||||
val schoolTown = school?.getString("Town")?.toLowerCase(Locale.getDefault())
|
val schoolTown = school?.getString("Town")?.lowercase()
|
||||||
data.schoolName = schoolId.toString() + schoolNameShort + "_" + schoolTown
|
data.schoolName = schoolId.toString() + schoolNameShort + "_" + schoolTown
|
||||||
|
|
||||||
school?.getJsonArray("LessonsRange")?.let { ranges ->
|
school?.getJsonArray("LessonsRange")?.let { ranges ->
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_SUBJECTS
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_SUBJECTS
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Subject
|
import pl.szczodrzynski.edziennik.data.db.entity.Subject
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiSubjects(override val data: DataLibrus,
|
class LibrusApiSubjects(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -32,7 +33,7 @@ class LibrusApiSubjects(override val data: DataLibrus,
|
|||||||
|
|
||||||
data.subjectList.put(1, Subject(profileId, 1, "Zachowanie", "zach"))
|
data.subjectList.put(1, Subject(profileId, 1, "Zachowanie", "zach"))
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_SUBJECTS, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_SUBJECTS, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_SUBJECTS)
|
onSuccess(ENDPOINT_LIBRUS_API_SUBJECTS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Kacper Ziubryniewicz 2019-10-19
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.*
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.TeacherAbsenceType
|
|
||||||
|
|
||||||
class LibrusApiTeacherFreeDayTypes(override val data: DataLibrus,
|
|
||||||
override val lastSync: Long?,
|
|
||||||
val onSuccess: (endpointId: Int) -> Unit
|
|
||||||
) : LibrusApi(data, lastSync) {
|
|
||||||
companion object {
|
|
||||||
const val TAG = "LibrusApiTeacherFreeDayTypes"
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
apiGet(TAG, "TeacherFreeDays/Types") { json ->
|
|
||||||
val teacherAbsenceTypes = json.getJsonArray("Types")?.asJsonObjectList()
|
|
||||||
|
|
||||||
teacherAbsenceTypes?.forEach { teacherAbsenceType ->
|
|
||||||
val id = teacherAbsenceType.getLong("Id") ?: return@forEach
|
|
||||||
val name = teacherAbsenceType.getString("Name") ?: return@forEach
|
|
||||||
|
|
||||||
val teacherAbsenceTypeObject = TeacherAbsenceType(
|
|
||||||
profileId,
|
|
||||||
id,
|
|
||||||
name
|
|
||||||
)
|
|
||||||
|
|
||||||
data.teacherAbsenceTypes.put(id, teacherAbsenceTypeObject)
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES, 7 * DAY)
|
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,6 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.TeacherAbsence
|
import pl.szczodrzynski.edziennik.data.db.entity.TeacherAbsence
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
|
||||||
@ -35,8 +36,6 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
|
|||||||
val id = teacherAbsence.getLong("Id") ?: return@forEach
|
val id = teacherAbsence.getLong("Id") ?: return@forEach
|
||||||
val teacherId = teacherAbsence.getJsonObject("Teacher")?.getLong("Id")
|
val teacherId = teacherAbsence.getJsonObject("Teacher")?.getLong("Id")
|
||||||
?: return@forEach
|
?: return@forEach
|
||||||
val type = teacherAbsence.getJsonObject("Type").getLong("Id") ?: return@forEach
|
|
||||||
val name = data.teacherAbsenceTypes.singleOrNull { it.id == type }?.name
|
|
||||||
val dateFrom = Date.fromY_m_d(teacherAbsence.getString("DateFrom"))
|
val dateFrom = Date.fromY_m_d(teacherAbsence.getString("DateFrom"))
|
||||||
val dateTo = Date.fromY_m_d(teacherAbsence.getString("DateTo"))
|
val dateTo = Date.fromY_m_d(teacherAbsence.getString("DateTo"))
|
||||||
val timeFrom = teacherAbsence.getString("TimeFrom")?.let { Time.fromH_m_s(it) }
|
val timeFrom = teacherAbsence.getString("TimeFrom")?.let { Time.fromH_m_s(it) }
|
||||||
@ -45,8 +44,8 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
|
|||||||
val teacherAbsenceObject = TeacherAbsence(
|
val teacherAbsenceObject = TeacherAbsence(
|
||||||
profileId = profileId,
|
profileId = profileId,
|
||||||
id = id,
|
id = id,
|
||||||
type = type,
|
type = -1L,
|
||||||
name = name,
|
name = null,
|
||||||
dateFrom = dateFrom,
|
dateFrom = dateFrom,
|
||||||
dateTo = dateTo,
|
dateTo = dateTo,
|
||||||
timeFrom = timeFrom,
|
timeFrom = timeFrom,
|
||||||
@ -64,7 +63,7 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS, 6*HOUR, DRAWER_ITEM_AGENDA)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS, 6* HOUR, DRAWER_ITEM_AGENDA)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS)
|
onSuccess(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_TEXT_GRADE_CATEGORIES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_TEXT_GRADE_CATEGORIES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiTextGradeCategories(override val data: DataLibrus,
|
class LibrusApiTextGradeCategories(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_DESCRIPTIV
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class LibrusApiTextGrades(override val data: DataLibrus,
|
class LibrusApiTextGrades(override val data: DataLibrus,
|
||||||
|
@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
|||||||
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
|
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.*
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_UNITS
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_UNITS
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiUnits(override val data: DataLibrus,
|
class LibrusApiUnits(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_USERS
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_USERS
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiUsers(override val data: DataLibrus,
|
class LibrusApiUsers(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -37,7 +38,7 @@ class LibrusApiUsers(override val data: DataLibrus,
|
|||||||
data.teacherList.put(id, teacher)
|
data.teacherList.put(id, teacher)
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_USERS, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_USERS, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_USERS)
|
onSuccess(ENDPOINT_LIBRUS_API_USERS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
|||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Team
|
import pl.szczodrzynski.edziennik.data.db.entity.Team
|
||||||
|
import pl.szczodrzynski.edziennik.ext.*
|
||||||
|
|
||||||
class LibrusApiVirtualClasses(override val data: DataLibrus,
|
class LibrusApiVirtualClasses(override val data: DataLibrus,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
@ -31,7 +32,7 @@ class LibrusApiVirtualClasses(override val data: DataLibrus,
|
|||||||
data.teamList.put(id, Team(profileId, id, name, 2, code, teacherId))
|
data.teamList.put(id, Team(profileId, id, name, 2, code, teacherId))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES, 4*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES, 4* DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES)
|
onSuccess(ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user