@@ -5,9 +5,7 @@ import org.json.JSONObject
5
5
import org.oppia.android.app.model.ChapterPlayState
6
6
import org.oppia.android.app.model.ChapterProgress
7
7
import org.oppia.android.app.model.ChapterSummary
8
- import org.oppia.android.app.model.ClassroomIdList
9
8
import org.oppia.android.app.model.ClassroomRecord
10
- import org.oppia.android.app.model.ClassroomRecord.TopicIdList
11
9
import org.oppia.android.app.model.ComingSoonTopicList
12
10
import org.oppia.android.app.model.EphemeralTopicSummary
13
11
import org.oppia.android.app.model.LessonThumbnail
@@ -29,7 +27,7 @@ import org.oppia.android.app.model.TopicProgress
29
27
import org.oppia.android.app.model.TopicRecord
30
28
import org.oppia.android.app.model.TopicSummary
31
29
import org.oppia.android.app.model.UpcomingTopic
32
- import org.oppia.android.domain.classroom.TEST_CLASSROOM_ID_0
30
+ import org.oppia.android.domain.classroom.ClassroomController
33
31
import org.oppia.android.domain.translation.TranslationController
34
32
import org.oppia.android.domain.util.JsonAssetRetriever
35
33
import org.oppia.android.domain.util.getStringFromObject
@@ -101,6 +99,7 @@ class TopicListController @Inject constructor(
101
99
private val oppiaClock : OppiaClock ,
102
100
private val assetRepository : AssetRepository ,
103
101
private val translationController : TranslationController ,
102
+ private val classroomController : ClassroomController ,
104
103
@LoadLessonProtosFromAssets private val loadLessonProtosFromAssets : Boolean
105
104
) {
106
105
@@ -137,7 +136,7 @@ class TopicListController @Inject constructor(
137
136
138
137
private fun createTopicList (contentLocale : OppiaLocale .ContentLocale ): TopicList {
139
138
return if (loadLessonProtosFromAssets) {
140
- val topicIdList = loadCombinedClassroomsTopicIdList ()
139
+ val topicIdList = loadCombinedTopicIdList ()
141
140
return TopicList .newBuilder().apply {
142
141
// Only include topics currently playable in the topic list.
143
142
addAllTopicSummary(
@@ -152,7 +151,7 @@ class TopicListController @Inject constructor(
152
151
}
153
152
154
153
private fun loadTopicListFromJson (contentLocale : OppiaLocale .ContentLocale ): TopicList {
155
- val topicIdList = loadCombinedClassroomsTopicIdList ()
154
+ val topicIdList = loadCombinedTopicIdList ()
156
155
val topicListBuilder = TopicList .newBuilder()
157
156
for (topicId in topicIdList) {
158
157
val ephemeralSummary = createEphemeralTopicSummary(topicId, contentLocale)
@@ -166,7 +165,7 @@ class TopicListController @Inject constructor(
166
165
}
167
166
168
167
private fun computeComingSoonTopicList (): ComingSoonTopicList {
169
- val topicIdList = loadCombinedClassroomsTopicIdList ()
168
+ val topicIdList = loadCombinedTopicIdList ()
170
169
val comingSoonTopicListBuilder = ComingSoonTopicList .newBuilder()
171
170
for (topicId in topicIdList) {
172
171
val upcomingTopicSummary = createUpcomingTopicSummary(topicId)
@@ -185,7 +184,7 @@ class TopicListController @Inject constructor(
185
184
contentLocale : OppiaLocale .ContentLocale
186
185
): EphemeralTopicSummary {
187
186
val topicSummary = createTopicSummary(topicId)
188
- val classroomRecord = loadClassroomById (topicSummary.classroomId)
187
+ val classroomRecord = classroomController.getClassroomById (topicSummary.classroomId)
189
188
return EphemeralTopicSummary .newBuilder().apply {
190
189
this .topicSummary = topicSummary
191
190
writtenTranslationContext =
@@ -217,7 +216,7 @@ class TopicListController @Inject constructor(
217
216
this .topicId = topicId
218
217
putAllWrittenTranslations(topicRecord.writtenTranslationsMap)
219
218
title = topicRecord.translatableTitle
220
- classroomId = getClassroomIdByTopicId(topicId)
219
+ classroomId = classroomController. getClassroomIdByTopicId(topicId)
221
220
totalChapterCount = storyRecords.map { it.chaptersList.size }.sum()
222
221
topicThumbnail = topicRecord.topicThumbnail
223
222
topicPlayAvailability = if (topicRecord.isPublished) {
@@ -259,7 +258,7 @@ class TopicListController @Inject constructor(
259
258
contentId = " title"
260
259
html = jsonObject.getStringFromObject(" topic_name" )
261
260
}.build()
262
- val classroomId = getClassroomIdByTopicId(topicId)
261
+ val classroomId = classroomController. getClassroomIdByTopicId(topicId)
263
262
// No written translations are included since none are retrieved from JSON.
264
263
return TopicSummary .newBuilder()
265
264
.setTopicId(topicId)
@@ -296,7 +295,7 @@ class TopicListController @Inject constructor(
296
295
html = jsonObject.getStringFromObject(" topic_name" )
297
296
}.build()
298
297
299
- val classroomId = getClassroomIdByTopicId(topicId)
298
+ val classroomId = classroomController. getClassroomIdByTopicId(topicId)
300
299
301
300
val classroomJsonObject = jsonAssetRetriever.loadJsonFromAsset(" $classroomId .json" )!!
302
301
val classroomTitle = classroomJsonObject.getJSONObject(" classroom_title" ).let {
@@ -369,8 +368,8 @@ class TopicListController @Inject constructor(
369
368
sortedTopicProgressList.forEach { topicProgress ->
370
369
val topic = topicController.retrieveTopic(topicProgress.topicId)
371
370
val classroom = topic?.topicId?.let { topicId ->
372
- val classroomId = getClassroomIdByTopicId(topicId)
373
- loadClassroomById (classroomId)
371
+ val classroomId = classroomController. getClassroomIdByTopicId(topicId)
372
+ classroomController.getClassroomById (classroomId)
374
373
} ? : ClassroomRecord .getDefaultInstance()
375
374
// Ignore topics that are no longer on the device, or that have been unpublished.
376
375
if (topic?.topicPlayAvailability?.availabilityCase == AVAILABLE_TO_PLAY_NOW ) {
@@ -556,7 +555,7 @@ class TopicListController @Inject constructor(
556
555
* being suggested.
557
556
*/
558
557
private fun retrieveTopicDependencies (topicId : String ): List <String > {
559
- val classrooms = loadClassrooms ()
558
+ val classrooms = classroomController.getClassrooms ()
560
559
for (classroom in classrooms) {
561
560
if (classroom.topicPrerequisitesMap.containsKey(topicId)) {
562
561
return classroom.topicPrerequisitesMap.getValue(topicId).topicIdsList
@@ -589,7 +588,7 @@ class TopicListController @Inject constructor(
589
588
contentLocale : OppiaLocale .ContentLocale
590
589
): List <PromotedStory > {
591
590
return if (loadLessonProtosFromAssets) {
592
- val topicIdList = loadCombinedClassroomsTopicIdList ()
591
+ val topicIdList = loadCombinedTopicIdList ()
593
592
return computeSuggestedStoriesForTopicIds(topicProgressList, topicIdList, contentLocale)
594
593
} else computeSuggestedStoriesFromJson(topicProgressList, contentLocale)
595
594
}
@@ -599,7 +598,7 @@ class TopicListController @Inject constructor(
599
598
contentLocale : OppiaLocale .ContentLocale
600
599
): List <PromotedStory > {
601
600
// All topics that could potentially be recommended.
602
- val topicIdList = loadCombinedClassroomsTopicIdList ()
601
+ val topicIdList = loadCombinedTopicIdList ()
603
602
return computeSuggestedStoriesForTopicIds(topicProgressList, topicIdList, contentLocale)
604
603
}
605
604
@@ -713,7 +712,7 @@ class TopicListController @Inject constructor(
713
712
)
714
713
val classroomRecord =
715
714
assetRepository.loadProtoFromLocalAssets(
716
- assetName = getClassroomIdByTopicId(topicId),
715
+ assetName = classroomController. getClassroomIdByTopicId(topicId),
717
716
baseMessage = ClassroomRecord .getDefaultInstance()
718
717
)
719
718
return PromotedStory .newBuilder().apply {
@@ -783,7 +782,7 @@ class TopicListController @Inject constructor(
783
782
}.build()
784
783
} ? : SubtitledHtml .getDefaultInstance()
785
784
786
- val classroomId = getClassroomIdByTopicId(topicId)
785
+ val classroomId = classroomController. getClassroomIdByTopicId(topicId)
787
786
788
787
val classroomJson = jsonAssetRetriever.loadJsonFromAsset(" $classroomId .json" )
789
788
if (classroomJson!! .optString(" classroom_title" ).isNullOrEmpty()) return null
@@ -867,104 +866,8 @@ class TopicListController @Inject constructor(
867
866
.build()
868
867
}
869
868
870
- private fun getClassroomIdByTopicId (topicId : String ): String {
871
- var classroomId = TEST_CLASSROOM_ID_0
872
- loadClassrooms().forEach {
873
- if (it.topicPrerequisitesMap.keys.contains(topicId)) {
874
- classroomId = it.id
875
- }
876
- }
877
- return classroomId
878
- }
879
-
880
- // TODO(#5344): Remove this in favor of per-classroom data handling.
881
- private fun loadClassrooms (): List <ClassroomRecord > {
882
- return if (loadLessonProtosFromAssets) {
883
- assetRepository.loadProtoFromLocalAssets(
884
- assetName = " classrooms" ,
885
- baseMessage = ClassroomIdList .getDefaultInstance()
886
- ).classroomIdsList.map { classroomId ->
887
- loadClassroomById(classroomId)
888
- }
889
- } else loadClassroomsFromJson()
890
- }
891
-
892
- // TODO(#5344): Remove this in favor of per-classroom data handling.
893
- private fun loadClassroomsFromJson (): List <ClassroomRecord > {
894
- // Load the classrooms.json file.
895
- val classroomIdsObj = jsonAssetRetriever.loadJsonFromAsset(" classrooms.json" )
896
- checkNotNull(classroomIdsObj) { " Failed to load classrooms.json." }
897
- val classroomIds = classroomIdsObj.optJSONArray(" classroom_id_list" )
898
- checkNotNull(classroomIds) { " classrooms.json is missing classroom IDs." }
899
-
900
- // Initialize a list to store the [ClassroomRecord]s.
901
- val classroomRecords = mutableListOf<ClassroomRecord >()
902
-
903
- // Iterate over all classroomIds and load each classroom's JSON.
904
- for (i in 0 until classroomIds.length()) {
905
- val classroomId = checkNotNull(classroomIds.optString(i)) {
906
- " Expected non-null classroom ID at index $i ."
907
- }
908
- val classroomRecord = loadClassroomById(classroomId)
909
- classroomRecords.add(classroomRecord)
910
- }
911
-
912
- return classroomRecords
913
- }
914
-
915
- // TODO(#5344): Move this to classroom controller.
916
- private fun loadClassroomById (classroomId : String ): ClassroomRecord {
917
- return if (loadLessonProtosFromAssets) {
918
- assetRepository.tryLoadProtoFromLocalAssets(
919
- assetName = classroomId,
920
- defaultMessage = ClassroomRecord .getDefaultInstance()
921
- ) ? : ClassroomRecord .getDefaultInstance()
922
- } else loadClassroomByIdFromJson(classroomId)
923
- }
924
-
925
- // TODO(#5344): Remove this in favor of per-classroom data handling.
926
- private fun loadClassroomByIdFromJson (classroomId : String ): ClassroomRecord {
927
- // Load the classroom obj.
928
- val classroomObj = jsonAssetRetriever.loadJsonFromAsset(" $classroomId .json" )
929
- checkNotNull(classroomObj) { " Failed to load $classroomId .json." }
930
-
931
- val classroomTitle = classroomObj.getJSONObject(" classroom_title" )
932
-
933
- // Load the topic prerequisite map.
934
- val topicPrereqsObj = checkNotNull(classroomObj.optJSONObject(" topic_prerequisites" )) {
935
- " Expected classroom to have non-null topic_prerequisites."
936
- }
937
- val topicPrereqs = topicPrereqsObj.keys().asSequence().associateWith { topicId ->
938
- val topicIdArray = checkNotNull(topicPrereqsObj.optJSONArray(topicId)) {
939
- " Expected topic $topicId to have a non-null string list."
940
- }
941
- return @associateWith List (topicIdArray.length()) { index ->
942
- checkNotNull(topicIdArray.optString(index)) {
943
- " Expected topic $topicId to have non-null string at index $index ."
944
- }
945
- }
946
- }
947
- return ClassroomRecord .newBuilder().apply {
948
- id = checkNotNull(classroomObj.optString(" classroom_id" )) {
949
- " Expected classroom to have ID."
950
- }
951
- translatableTitle = SubtitledHtml .newBuilder().apply {
952
- contentId = classroomTitle.getStringFromObject(" content_id" )
953
- html = classroomTitle.getStringFromObject(" html" )
954
- }.build()
955
- putAllTopicPrerequisites(
956
- topicPrereqs.mapValues { (_, topicIds) ->
957
- TopicIdList .newBuilder().apply {
958
- addAllTopicIds(topicIds)
959
- }.build()
960
- }
961
- )
962
- }.build()
963
- }
964
-
965
- // TODO(#5344): Remove this in favor of per-classroom data handling.
966
- private fun loadCombinedClassroomsTopicIdList (): List <String > =
967
- loadClassrooms().flatMap { it.topicPrerequisitesMap.keys.toList() }
869
+ private fun loadCombinedTopicIdList (): List <String > =
870
+ classroomController.getClassrooms().flatMap { it.topicPrerequisitesMap.keys.toList() }
968
871
}
969
872
970
873
internal fun createTopicThumbnailFromJson (topicJsonObject : JSONObject ): LessonThumbnail {
0 commit comments