diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/DataMobidziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/DataMobidziennik.kt index 8f32d59b..ddfb0113 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/DataMobidziennik.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/DataMobidziennik.kt @@ -5,7 +5,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik import android.util.LongSparseArray -import androidx.core.util.isNotEmpty import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.currentTimeUnix import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_MOBIDZIENNIK_WEB @@ -39,9 +38,9 @@ class DataMobidziennik(app: App, profile: Profile?, loginStore: LoginStore) : Da val teachersMap = LongSparseArray() val subjectsMap = LongSparseArray() - val gradeAddedDates = LongSparseArray() - val gradeAverages = LongSparseArray() - val gradeColors = LongSparseArray() + val gradeAddedDates = sortedMapOf() + val gradeAverages = sortedMapOf() + val gradeColors = sortedMapOf() private var mLoginServerName: String? = null var loginServerName: String? diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt index 3e750352..2922815b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt @@ -138,11 +138,10 @@ class MobidziennikWebGrades(override val data: DataMobidziennik, gradeAddedDateMillis )) } - } else { - data.gradeAverages.put(gradeId, gradeClassAverage) - data.gradeAddedDates.put(gradeId, gradeAddedDateMillis) - data.gradeColors.put(gradeId, gradeColor) } + data.gradeAverages[gradeId] = gradeClassAverage + data.gradeAddedDates[gradeId] = gradeAddedDateMillis + data.gradeColors[gradeId] = gradeColor } } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.java deleted file mode 100644 index 137df85d..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.dao; - -import android.util.LongSparseArray; - -import androidx.lifecycle.LiveData; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; -import androidx.room.RawQuery; -import androidx.room.Transaction; -import androidx.sqlite.db.SimpleSQLiteQuery; -import androidx.sqlite.db.SupportSQLiteQuery; - -import java.util.List; - -import pl.szczodrzynski.edziennik.data.db.entity.Grade; -import pl.szczodrzynski.edziennik.data.db.full.GradeFull; - -import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_GRADE; - -@Dao -public abstract class GradeDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract long add(Grade grade); - - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract void addAll(List gradeList); - - @Query("DELETE FROM grades WHERE profileId = :profileId") - public abstract void clear(int profileId); - - @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeType = :type") - public abstract void clearWithType(int profileId, int type); - - @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester") - public abstract void clearForSemester(int profileId, int semester); - - @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester AND gradeType = :type") - public abstract void clearForSemesterWithType(int profileId, int semester, int type); - - @RawQuery(observedEntities = {Grade.class}) - abstract LiveData> getAll(SupportSQLiteQuery query); - public LiveData> getAll(int profileId, String filter, String orderBy) { - return getAll(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM grades \n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + TYPE_GRADE + " AND metadata.profileId = "+profileId+"\n" + - "WHERE grades.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY "+orderBy)); // TODO: 2019-04-30 why did I add sorting by gradeType??? - } - public LiveData> getAllOrderBy(int profileId, String orderBy) { - return getAll(profileId, "1", orderBy); - } - public LiveData> getAllWhere(int profileId, String filter) { - return getAll(profileId, filter, "addedDate DESC"); - } - - @RawQuery - abstract List getAllNow(SupportSQLiteQuery query); - public List getAllNow(int profileId, String filter) { - return getAllNow(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM grades \n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + TYPE_GRADE + " AND metadata.profileId = "+profileId+"\n" + - "WHERE grades.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public List getNotNotifiedNow(int profileId) { - return getAllNow(profileId, "notified = 0"); - } - public List getAllWithParentIdNow(int profileId, long parentId) { - return getAllNow(profileId, "gradeParentId = "+parentId); - } - - @Query("SELECT * FROM grades " + - "LEFT JOIN subjects USING(profileId, subjectId) " + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + TYPE_GRADE + " AND metadata.profileId = grades.profileId " + - "WHERE notified = 0 " + - "ORDER BY addedDate DESC") - public abstract List getNotNotifiedNow(); - - @RawQuery - abstract GradeFull getNow(SupportSQLiteQuery query); - public GradeFull getNow(int profileId, String filter) { - return getNow(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM grades \n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + TYPE_GRADE + " AND metadata.profileId = "+profileId+"\n" + - "WHERE grades.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public GradeFull getByIdNow(int profileId, long gradeId) { - return getNow(profileId, "gradeId = "+gradeId); - } - - @Query("UPDATE grades SET gradeClassAverage = :classAverage, gradeColor = :color WHERE profileId = :profileId AND gradeId = :gradeId") - public abstract void updateDetailsById(int profileId, long gradeId, float classAverage, int color); - - @Query("UPDATE metadata SET addedDate = :addedDate WHERE profileId = :profileId AND thingType = "+TYPE_GRADE+" AND thingId = :gradeId") - public abstract void updateAddedDateById(int profileId, long gradeId, long addedDate); - - @Transaction - public void updateDetails(int profileId, LongSparseArray gradeAverages, LongSparseArray gradeAddedDates, LongSparseArray gradeColors) { - for (int i = 0; i < gradeAverages.size(); i++) { - long gradeId = gradeAverages.keyAt(i); - float classAverage = gradeAverages.valueAt(i); - long addedDate = gradeAddedDates.valueAt(i); - int color = gradeColors.valueAt(i); - updateDetailsById(profileId, gradeId, classAverage, color); - updateAddedDateById(profileId, gradeId, addedDate); - } - } - - @Query("SELECT gradeId FROM grades WHERE profileId = :profileId ORDER BY gradeId") - public abstract List getIds(int profileId); - @Query("SELECT gradeClassAverage FROM grades WHERE profileId = :profileId ORDER BY gradeId") - public abstract List getClassAverages(int profileId); - @Query("SELECT gradeColor FROM grades WHERE profileId = :profileId ORDER BY gradeId") - public abstract List getColors(int profileId); - @Query("SELECT addedDate FROM metadata WHERE profileId = :profileId AND thingType = "+TYPE_GRADE+" ORDER BY thingId") - public abstract List getAddedDates(int profileId); - @Transaction - public void getDetails(int profileId, LongSparseArray gradeAddedDates, LongSparseArray gradeAverages, LongSparseArray gradeColors) { - List ids = getIds(profileId); - List classAverages = getClassAverages(profileId); - List colors = getColors(profileId); - List addedDates = getAddedDates(profileId); - for (int index = 0; index < ids.size(); index++) { - if (classAverages.size() > index) { - gradeAverages.put(ids.get(index), classAverages.get(index)); - } - if (colors.size() > index) { - gradeColors.put(ids.get(index), colors.get(index)); - } - if (addedDates.size() > index) { - gradeAddedDates.put(ids.get(index), addedDates.get(index)); - } - } - } - - public LiveData> getAllFromDate(int profileId, long date) { - return getAllWhere(profileId, "addedDate > " + date); - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt new file mode 100644 index 00000000..9c3e93c5 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt @@ -0,0 +1,141 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + */ +package pl.szczodrzynski.edziennik.data.db.dao + +import androidx.lifecycle.LiveData +import androidx.room.* +import androidx.sqlite.db.SimpleSQLiteQuery +import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.data.db.entity.Grade +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.full.GradeFull +import java.util.* +import kotlin.collections.List +import kotlin.collections.component1 +import kotlin.collections.component2 +import kotlin.collections.iterator +import kotlin.collections.set + +@Dao +abstract class GradeDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + abstract fun add(grade: Grade): Long + + @Insert(onConflict = OnConflictStrategy.REPLACE) + abstract fun addAll(gradeList: List) + + @Query("DELETE FROM grades WHERE profileId = :profileId") + abstract fun clear(profileId: Int) + + @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeType = :type") + abstract fun clearWithType(profileId: Int, type: Int) + + @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester") + abstract fun clearForSemester(profileId: Int, semester: Int) + + @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester AND gradeType = :type") + abstract fun clearForSemesterWithType(profileId: Int, semester: Int, type: Int) + + @RawQuery(observedEntities = [Grade::class]) + abstract fun getAll(query: SupportSQLiteQuery?): LiveData> + + fun getAll(profileId: Int, filter: String, orderBy: String): LiveData> { + return getAll(SimpleSQLiteQuery("SELECT \n" + + "*, \n" + + "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + + "FROM grades \n" + + "LEFT JOIN subjects USING(profileId, subjectId)\n" + + "LEFT JOIN teachers USING(profileId, teacherId)\n" + + "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + Metadata.TYPE_GRADE + " AND metadata.profileId = " + profileId + "\n" + + "WHERE grades.profileId = " + profileId + " AND " + filter + "\n" + + "ORDER BY " + orderBy)) // TODO: 2019-04-30 why did I add sorting by gradeType??? + } + + fun getAllOrderBy(profileId: Int, orderBy: String): LiveData> { + return getAll(profileId, "1", orderBy) + } + + fun getAllWhere(profileId: Int, filter: String): LiveData> { + return getAll(profileId, filter, "addedDate DESC") + } + + @RawQuery + abstract fun getAllNow(query: SupportSQLiteQuery?): List + + fun getAllNow(profileId: Int, filter: String): List { + return getAllNow(SimpleSQLiteQuery("SELECT \n" + + "*, \n" + + "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + + "FROM grades \n" + + "LEFT JOIN subjects USING(profileId, subjectId)\n" + + "LEFT JOIN teachers USING(profileId, teacherId)\n" + + "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + Metadata.TYPE_GRADE + " AND metadata.profileId = " + profileId + "\n" + + "WHERE grades.profileId = " + profileId + " AND " + filter + "\n" + + "ORDER BY addedDate DESC")) + } + + fun getNotNotifiedNow(profileId: Int): List { + return getAllNow(profileId, "notified = 0") + } + + fun getAllWithParentIdNow(profileId: Int, parentId: Long): List { + return getAllNow(profileId, "gradeParentId = $parentId") + } + + @get:Query("SELECT * FROM grades " + + "LEFT JOIN subjects USING(profileId, subjectId) " + + "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + Metadata.TYPE_GRADE + " AND metadata.profileId = grades.profileId " + + "WHERE notified = 0 " + + "ORDER BY addedDate DESC") + abstract val notNotifiedNow: List + + @RawQuery + abstract fun getNow(query: SupportSQLiteQuery): GradeFull? + + @Query("UPDATE grades SET gradeClassAverage = :classAverage, gradeColor = :color WHERE profileId = :profileId AND gradeId = :gradeId") + abstract fun updateDetailsById(profileId: Int, gradeId: Long, classAverage: Float, color: Int) + + @Query("UPDATE metadata SET addedDate = :addedDate WHERE profileId = :profileId AND thingType = " + Metadata.TYPE_GRADE + " AND thingId = :gradeId") + abstract fun updateAddedDateById(profileId: Int, gradeId: Long, addedDate: Long) + + @Transaction + open fun updateDetails(profileId: Int, gradeAverages: SortedMap, gradeAddedDates: SortedMap, gradeColors: SortedMap) { + for ((gradeId, addedDate) in gradeAddedDates) { + val classAverage = gradeAverages[gradeId] ?: 0.0f + val color = gradeColors[gradeId] ?: 0xff2196f3.toInt() + updateDetailsById(profileId, gradeId, classAverage, color) + updateAddedDateById(profileId, gradeId, addedDate) + } + } + + @Query("SELECT gradeId FROM grades WHERE profileId = :profileId ORDER BY gradeId") + abstract fun getIds(profileId: Int): List + + @Query("SELECT gradeClassAverage FROM grades WHERE profileId = :profileId ORDER BY gradeId") + abstract fun getClassAverages(profileId: Int): List + + @Query("SELECT gradeColor FROM grades WHERE profileId = :profileId ORDER BY gradeId") + abstract fun getColors(profileId: Int): List + + @Query("SELECT addedDate FROM metadata WHERE profileId = :profileId AND thingType = " + Metadata.TYPE_GRADE + " ORDER BY thingId") + abstract fun getAddedDates(profileId: Int): List + + @Transaction + open fun getDetails(profileId: Int, gradeAddedDates: SortedMap, gradeAverages: SortedMap, gradeColors: SortedMap) { + val ids = getIds(profileId).iterator() + val classAverages = getClassAverages(profileId).iterator() + val colors = getColors(profileId).iterator() + val addedDates = getAddedDates(profileId).iterator() + while (ids.hasNext() && classAverages.hasNext() && colors.hasNext() && addedDates.hasNext()) { + val gradeId = ids.next() + gradeAverages[gradeId] = classAverages.next() + gradeColors[gradeId] = colors.next() + gradeAddedDates[gradeId] = addedDates.next() + } + } + + fun getAllFromDate(profileId: Int, date: Long): LiveData> { + return getAllWhere(profileId, "addedDate > $date") + } +}