From f0bf6b8b81a0d57bc1197bb972512c7bf44d27dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 6 Oct 2019 20:58:05 +0200 Subject: [PATCH] [APIv2] Add sparse array extensions - simplify getting data from database. --- .../pl/szczodrzynski/edziennik/Extensions.kt | 43 ++++++++++++++- .../v2/librus/data/api/LibrusApiSchools.kt | 3 +- .../edziennik/api/v2/models/Data.kt | 55 ++++++++----------- 3 files changed, 66 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index 613d9e65..85ec6718 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -6,7 +6,10 @@ import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.os.Bundle +import android.util.LongSparseArray +import android.util.SparseArray import androidx.core.app.ActivityCompat +import androidx.core.util.forEach import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject @@ -135,4 +138,42 @@ const val HOUR = 60L*MINUTE const val DAY = 24L*HOUR const val WEEK = 7L*DAY const val MONTH = 30L*DAY -const val YEAR = 365L*DAY \ No newline at end of file +const val YEAR = 365L*DAY + +fun LongSparseArray.values(): List { + val result = mutableListOf() + forEach { _, value -> + result += value + } + return result +} + +fun SparseArray.values(): List { + val result = mutableListOf() + forEach { _, value -> + result += value + } + return result +} + +fun List.toSparseArray(destination: SparseArray, key: (T) -> Int) { + forEach { + destination.put(key(it), it) + } +} +fun List.toSparseArray(destination: LongSparseArray, key: (T) -> Long) { + forEach { + destination.put(key(it), it) + } +} + +fun List.toSparseArray(key: (T) -> Int): SparseArray { + val result = SparseArray() + toSparseArray(result, key) + return result +} +fun List.toSparseArray(key: (T) -> Long): LongSparseArray { + val result = LongSparseArray() + toSparseArray(result, key) + return result +} \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/api/LibrusApiSchools.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/api/LibrusApiSchools.kt index 582462f1..bcf36092 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/api/LibrusApiSchools.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/api/LibrusApiSchools.kt @@ -41,7 +41,8 @@ class LibrusApiSchools(override val data: DataLibrus, val range = rangeEl.asJsonObject val from = range.getString("From") ?: return@forEachIndexed val to = range.getString("To") ?: return@forEachIndexed - data.lessonRanges.add( + data.lessonRanges.put( + index, LessonRange( profileId, index, diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Data.kt index 23cc19fb..1ea4374b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Data.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Data.kt @@ -1,6 +1,7 @@ package pl.szczodrzynski.edziennik.api.v2.models import android.util.LongSparseArray +import android.util.SparseArray import androidx.core.util.forEach import androidx.core.util.isNotEmpty import com.google.gson.JsonObject @@ -27,7 +28,9 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject import pl.szczodrzynski.edziennik.data.db.modules.teachers.Teacher import pl.szczodrzynski.edziennik.data.db.modules.teams.Team +import pl.szczodrzynski.edziennik.toSparseArray import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.values import java.io.InterruptedIOException import java.net.SocketTimeoutException import java.net.UnknownHostException @@ -37,6 +40,9 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore) var fakeLogin = false + val profileId + get() = profile?.id ?: -1 + /** * A callback passed to all [Feature]s and [LoginMethod]s */ @@ -90,8 +96,8 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore) val teacherList = LongSparseArray() val subjectList = LongSparseArray() - var teamList = mutableListOf() - var lessonRanges = mutableListOf() + var teamList = LongSparseArray() + var lessonRanges = SparseArray() var lessonsToRemove: DataRemoveModel? = null val lessonList = mutableListOf() @@ -128,18 +134,11 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore) clear() if (profile != null) { - db.endpointTimerDao().getAllNow(profile.id).forEach { endpointTimer -> - endpointTimers.add(endpointTimer) - } - - lessonRanges = db.lessonRangeDao().getAllNow(profile.id).toMutableList() - db.teacherDao().getAllNow(profile.id).forEach { teacher -> - teacherList.put(teacher.id, teacher) - } - db.subjectDao().getAllNow(profile.id).forEach { subject -> - subjectList.put(subject.id, subject) - } - teamList = db.teamDao().getAllNow(profile.id).toMutableList() + endpointTimers = db.endpointTimerDao().getAllNow(profile.id).toMutableList() + db.teacherDao().getAllNow(profileId).toSparseArray(teacherList) { it.id } + db.subjectDao().getAllNow(profileId).toSparseArray(subjectList) { it.id } + db.teamDao().getAllNow(profileId).toSparseArray(teamList) { it.id } + db.lessonRangeDao().getAllNow(profileId).toSparseArray(lessonRanges) { it.lessonNumber } } /*val teacher = teachers.byNameFirstLast("Jan Kowalski") ?: Teacher(1, 1, "", "").let { @@ -152,11 +151,11 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore) loginMethods.clear() endpointTimers.clear() - teacherList.clear() subjectList.clear() teamList.clear() lessonRanges.clear() + lessonList.clear() lessonChangeList.clear() gradeCategoryList.clear() @@ -180,25 +179,15 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore) db.loginStoreDao().add(loginStore) db.endpointTimerDao().addAll(endpointTimers) + db.teacherDao().clear(profileId) + db.teacherDao().addAll(teacherList.values()) + db.subjectDao().clear(profileId) + db.subjectDao().addAll(subjectList.values()) + db.teamDao().clear(profileId) + db.teamDao().addAll(teamList.values()) + db.lessonRangeDao().clear(profileId) + db.lessonRangeDao().addAll(lessonRanges.values()) - db.lessonRangeDao().addAll(lessonRanges) - - if (teacherList.isNotEmpty()) { - val tempList: ArrayList = ArrayList() - teacherList.forEach { _, teacher -> - tempList.add(teacher) - } - db.teacherDao().addAll(tempList) - } - if (subjectList.isNotEmpty()) { - val tempList: ArrayList = ArrayList() - subjectList.forEach { _, subject -> - tempList.add(subject) - } - db.subjectDao().addAll(tempList) - } - if (teamList.isNotEmpty()) - db.teamDao().addAll(teamList) if (lessonList.isNotEmpty()) { db.lessonDao().clear(profile.id) db.lessonDao().addAll(lessonList)