Skip to content

Commit e816e86

Browse files
author
Ahsan Arif
committed
perf: optimised data loading on dashboard and course details
1 parent 46c32a2 commit e816e86

File tree

22 files changed

+481
-121
lines changed

22 files changed

+481
-121
lines changed

app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/build
22
/google-services.json
3+
/schemas

app/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,7 @@ private def setupFirebaseConfigFields(buildType) {
180180

181181
buildType.manifestPlaceholders = [fcmEnabled: firebaseEnabled && cloudMessagingEnabled]
182182
}
183+
184+
ksp {
185+
arg("room.schemaLocation", "$projectDir/schemas")
186+
}

app/src/main/java/org/openedx/app/room/AppDatabase.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.openedx.app.room
22

3+
import androidx.room.AutoMigration
34
import androidx.room.Database
45
import androidx.room.RoomDatabase
56
import androidx.room.TypeConverters
67
import org.openedx.core.data.model.room.CourseCalendarEventEntity
78
import org.openedx.core.data.model.room.CourseCalendarStateEntity
9+
import org.openedx.core.data.model.room.CourseEnrollmentDetailsEntity
810
import org.openedx.core.data.model.room.CourseStructureEntity
911
import org.openedx.core.data.model.room.OfflineXBlockProgress
1012
import org.openedx.core.data.model.room.discovery.EnrolledCourseEntity
@@ -18,7 +20,7 @@ import org.openedx.discovery.data.converter.DiscoveryConverter
1820
import org.openedx.discovery.data.model.room.CourseEntity
1921
import org.openedx.discovery.data.storage.DiscoveryDao
2022

21-
const val DATABASE_VERSION = 1
23+
const val DATABASE_VERSION = 2
2224
const val DATABASE_NAME = "OpenEdX_db"
2325

2426
@Database(
@@ -29,10 +31,13 @@ const val DATABASE_NAME = "OpenEdX_db"
2931
DownloadModelEntity::class,
3032
OfflineXBlockProgress::class,
3133
CourseCalendarEventEntity::class,
32-
CourseCalendarStateEntity::class
34+
CourseCalendarStateEntity::class,
35+
CourseEnrollmentDetailsEntity::class
3336
],
34-
version = DATABASE_VERSION,
35-
exportSchema = false
37+
autoMigrations = [
38+
AutoMigration(1, DATABASE_VERSION)
39+
],
40+
version = DATABASE_VERSION
3641
)
3742
@TypeConverters(DiscoveryConverter::class, CourseConverter::class)
3843
abstract class AppDatabase : RoomDatabase() {

app/src/main/java/org/openedx/app/room/DatabaseManager.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class DatabaseManager(
1818
override fun clearTables() {
1919
CoroutineScope(Dispatchers.IO).launch {
2020
courseDao.clearCachedData()
21+
courseDao.clearEnrollmentCachedData()
2122
dashboardDao.clearCachedData()
2223
downloadDao.clearOfflineProgress()
2324
discoveryDao.clearCachedData()
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package org.openedx.core.data.model.room
2+
3+
import androidx.room.ColumnInfo
4+
import androidx.room.Embedded
5+
import androidx.room.Entity
6+
import androidx.room.PrimaryKey
7+
import org.openedx.core.data.model.room.discovery.CertificateDb
8+
import org.openedx.core.data.model.room.discovery.CourseAccessDetailsDb
9+
import org.openedx.core.data.model.room.discovery.CourseSharingUtmParametersDb
10+
import org.openedx.core.data.model.room.discovery.EnrollmentDetailsDB
11+
import org.openedx.core.domain.model.CourseEnrollmentDetails
12+
import org.openedx.core.domain.model.CourseInfoOverview
13+
import java.util.Date
14+
15+
@Entity(tableName = "course_enrollment_details_table")
16+
data class CourseEnrollmentDetailsEntity(
17+
@PrimaryKey
18+
@ColumnInfo("id")
19+
val id: String,
20+
@ColumnInfo("courseUpdates")
21+
val courseUpdates: String,
22+
@ColumnInfo("courseHandouts")
23+
val courseHandouts: String,
24+
@ColumnInfo("discussionUrl")
25+
val discussionUrl: String,
26+
@Embedded
27+
val courseAccessDetails: CourseAccessDetailsDb,
28+
@Embedded
29+
val certificate: CertificateDb?,
30+
@Embedded
31+
val enrollmentDetails: EnrollmentDetailsDB,
32+
@Embedded
33+
val courseInfoOverview: CourseInfoOverviewDb
34+
) {
35+
fun mapToDomain() = CourseEnrollmentDetails(
36+
id = id,
37+
courseUpdates = courseUpdates,
38+
courseHandouts = courseHandouts,
39+
discussionUrl = discussionUrl,
40+
courseAccessDetails = courseAccessDetails.mapToDomain(),
41+
certificate = certificate?.mapToDomain(),
42+
enrollmentDetails = enrollmentDetails.mapToDomain(),
43+
courseInfoOverview = courseInfoOverview.mapToDomain()
44+
)
45+
}
46+
47+
data class CourseInfoOverviewDb(
48+
@ColumnInfo("name")
49+
val name: String,
50+
@ColumnInfo("number")
51+
val number: String,
52+
@ColumnInfo("org")
53+
val org: String,
54+
@Embedded
55+
val start: Date?,
56+
@ColumnInfo("startDisplay")
57+
val startDisplay: String,
58+
@ColumnInfo("startType")
59+
val startType: String,
60+
@Embedded
61+
val end: Date?,
62+
@ColumnInfo("isSelfPaced")
63+
val isSelfPaced: Boolean,
64+
@Embedded
65+
var media: MediaDb?,
66+
@Embedded
67+
val courseSharingUtmParameters: CourseSharingUtmParametersDb,
68+
@ColumnInfo("courseAbout")
69+
val courseAbout: String,
70+
) {
71+
fun mapToDomain() = CourseInfoOverview(
72+
name = name,
73+
number = number,
74+
org = org,
75+
start = start,
76+
startDisplay = startDisplay,
77+
startType = startType,
78+
end = end,
79+
isSelfPaced = isSelfPaced,
80+
media = media?.mapToDomain(),
81+
courseSharingUtmParameters = courseSharingUtmParameters.mapToDomain(),
82+
courseAbout = courseAbout
83+
)
84+
}

core/src/main/java/org/openedx/core/domain/model/Certificate.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package org.openedx.core.domain.model
22

33
import android.os.Parcelable
44
import kotlinx.parcelize.Parcelize
5+
import org.openedx.core.data.model.room.discovery.CertificateDb
56

67
@Parcelize
78
data class Certificate(
89
val certificateURL: String?
910
) : Parcelable {
1011
fun isCertificateEarned() = certificateURL?.isNotEmpty() == true
12+
13+
fun mapToRoomEntity() = CertificateDb(certificateURL)
1114
}

core/src/main/java/org/openedx/core/domain/model/CourseAccessDetails.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.openedx.core.domain.model
22

33
import android.os.Parcelable
4+
import com.google.gson.internal.bind.util.ISO8601Utils
45
import kotlinx.parcelize.Parcelize
6+
import org.openedx.core.data.model.room.discovery.CourseAccessDetailsDb
57
import java.util.Date
68

79
@Parcelize
@@ -11,4 +13,14 @@ data class CourseAccessDetails(
1113
val isStaff: Boolean,
1214
val auditAccessExpires: Date?,
1315
val coursewareAccess: CoursewareAccess?,
14-
) : Parcelable
16+
) : Parcelable {
17+
18+
fun mapToRoomEntity(): CourseAccessDetailsDb =
19+
CourseAccessDetailsDb(
20+
hasUnmetPrerequisites = hasUnmetPrerequisites,
21+
isTooEarly = isTooEarly,
22+
isStaff = isStaff,
23+
auditAccessExpires = auditAccessExpires?.let { ISO8601Utils.format(it) },
24+
coursewareAccess = coursewareAccess?.mapToEntity()
25+
)
26+
}

core/src/main/java/org/openedx/core/domain/model/CourseEnrollmentDetails.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.openedx.core.domain.model
22

33
import android.os.Parcelable
44
import kotlinx.parcelize.Parcelize
5+
import org.openedx.core.data.model.room.CourseEnrollmentDetailsEntity
56
import org.openedx.core.extension.isNotNull
67
import java.util.Date
78

@@ -23,6 +24,17 @@ data class CourseEnrollmentDetails(
2324
val isAuditAccessExpired: Boolean
2425
get() = courseAccessDetails.auditAccessExpires.isNotNull() &&
2526
Date().after(courseAccessDetails.auditAccessExpires)
27+
28+
fun mapToEntity() = CourseEnrollmentDetailsEntity(
29+
id = id,
30+
courseUpdates = courseUpdates,
31+
courseHandouts = courseHandouts,
32+
discussionUrl = discussionUrl,
33+
courseAccessDetails = courseAccessDetails.mapToRoomEntity(),
34+
certificate = certificate?.mapToRoomEntity(),
35+
enrollmentDetails = enrollmentDetails.mapToEntity(),
36+
courseInfoOverview = courseInfoOverview.mapToEntity()
37+
)
2638
}
2739

2840
enum class CourseAccessError {

core/src/main/java/org/openedx/core/domain/model/CourseInfoOverview.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.openedx.core.domain.model
22

33
import android.os.Parcelable
44
import kotlinx.parcelize.Parcelize
5+
import org.openedx.core.data.model.room.CourseInfoOverviewDb
56
import java.util.Date
67

78
@Parcelize
@@ -20,4 +21,18 @@ data class CourseInfoOverview(
2021
) : Parcelable {
2122
val isStarted: Boolean
2223
get() = start?.before(Date()) ?: false
24+
25+
fun mapToEntity() = CourseInfoOverviewDb(
26+
name = name,
27+
number = number,
28+
org = org,
29+
start = start,
30+
startDisplay = startDisplay,
31+
startType = startType,
32+
end = end,
33+
isSelfPaced = isSelfPaced,
34+
media = media?.mapToEntity(),
35+
courseSharingUtmParameters = courseSharingUtmParameters.mapToEntity(),
36+
courseAbout = courseAbout
37+
)
2338
}

core/src/main/java/org/openedx/core/domain/model/CourseSharingUtmParameters.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@ package org.openedx.core.domain.model
22

33
import android.os.Parcelable
44
import kotlinx.parcelize.Parcelize
5+
import org.openedx.core.data.model.room.discovery.CourseSharingUtmParametersDb
56

67
@Parcelize
78
data class CourseSharingUtmParameters(
89
val facebook: String,
910
val twitter: String
10-
) : Parcelable
11+
) : Parcelable {
12+
13+
fun mapToEntity() = CourseSharingUtmParametersDb(
14+
facebook = facebook,
15+
twitter = twitter
16+
)
17+
}

0 commit comments

Comments
 (0)