Skip to content

Commit 18fa030

Browse files
authored
Fix #1547, parts of #169, #5344, #5365, #5411: Add data layer support for (multiple) classrooms & topic dependencies, and prepare for #4885 (#5398)
## Explanation Fixes #1547 Fixes part of #169 Fixes part of #5344 Fixes part of #5365 Fixes part of #5411 The main purpose of this PR is to introduce support for multiple classrooms in the data layer of the app (with minimal domain integration to avoid the change extending beyond the lesson structures). However, the PR is also doing a few more things including preparing the Android codebase for introducing an asset download script (#4885) and other peripheral cleanups of code (rather than updating it) that was noticed along the way. ### Preparing for multiple classrooms This addresses part of #5365. #5344 is introducing support for multiple classrooms in the app. To help prepare for those changes, this PR introduces the necessary data structure and domain loading changes to load a new proto structure: ```proto message ClassroomList { repeated ClassroomRecord classrooms = 1; } message ClassroomRecord { string id = 1; map<string, TranslationMapping> written_translations = 2; SubtitledHtml translatable_title = 3; LessonThumbnail classroom_thumbnail = 4; map<string, TopicIdList> topic_prerequisites = 5; message TopicIdList { repeated string topic_ids = 1; } } ``` Rather than just a flat topic list. Some important details to note: - The recommended topics structure has been updated to use this new ``topic_prerequisites`` value being loaded from classrooms. This will also extend to production assets since the asset download script from #4885 is also being updated to include support for this multiple classrooms structure to address the remainder of #5365. - To minimize domain changes, the new loading code assumes only **one** classroom is present. TODOs have been added on #5344 to extend this to support multiple classrooms. - Current loading code (including for JSON) is ignoring all but: ``classrooms``, ``id``, and ``topic_prerequisites`` (including ``topic_ids``) from the protos above. These other fields are expected to have supported added as part of #5344. - There were some color simplifications made in ``TopicListController``. These largely shouldn't have a major impact outside of developer assets. These changes were made to ensure non-specificity to the previous lesson classroom. In general, all of this should eventually be removed in favor of loading colors from lesson assets, but that will need to wait until the JSON pipeline is completely removed. ### Asset priming removal This addresses part of #169. ``PrimeTopicAssetsController`` and its implementation were responsible for hackily pre-loading all lesson images and audio to be on-device to enable offline support. This was the first attempt at offline support early in the app's development, but it had a few significant drawbacks: - It required preloading everything upon first app open. Since it can take a while for loading to occur, some robustness needed to be built in for pausing, cancelling, and resuming. I'm not certain if these were even 100% handled in the current implementation. - It doesn't perform strong compatibility checks until you're in the app which means lesson incompatibilities would just cause the app to get stuck rather than addressing it during lesson import time (e.g. via an asset downloader script). - It required very significant workarounds to existing loading pipelines that aren't ideal to keep in the codebase long-term (code smell). - There's no guarantee the user even has enough disk space to download all the needed assets (particularly audio), or if they'll have sufficient internet connectivity & bandwidth to perform those downloads upon first app open. This approach was abandoned after the earliest alpha releases for an asset download script (which is now being migrated over to this codebase per #5411. This removal unfortunately required removing a module that was referenced in a lot of tests throughout the codebase. While the removal itself was fairly simple, it does affect a lot of files. Other areas changed (but unaffected by tests since these flows didn't have automated tests): - ``SplashActivityPresenter`` for enabling the downloader to start and block the UI using a dialog box while the downloading occurred. - ``AudioPlayerController` for removing the special loading logic for primed audio files (the app now no longer supports loading audio files from disk as we don't yet have a good long-term solution for offline-available audio files due to their significant size). - ``GlideImageLoader`` for removing support for loading locally cached images (only through this flow; the flow we use for the asset download script uses a different annotation and is still supported). As alluded to above, two annotations were removed as part of this cleanup: - ``CacheAssetsLocally``: a boolean indicating whether the prime download flow should be enabled. - ``TopicListToCache``: this specified the list of topics to pre-download if the flow was enabled. ### GAE structure cleanup & preparing for asset script Preparing for #4885 included a few other changes, some of which were nice-to-have: - Introducing support for incorporating the protos from https://github.com/oppia/oppia-proto-api (specifically oppia/oppia-proto-api#1 since they are still a work-in-progress). - Adding ``java_proto`` versions for many of the app's proto structures (since the download script runs in the JVM and doesn't use the javalite proto environment). - Removed all of the unused GAE services and models (addressing #1547 by essentially making it obsolete), plus their mocks. These were never hooked up, and they're never going to be: the long-term plan for the codebase is to use new proto endpoints that will be added to Oppia web. These Retrofit endpoints have actually been rebuilt and repurposed to be used in the asset download script as a medium-term stop-gap until the permanent proto endpoints can be added to Oppia web. - ``RemoteAuthNetworkInterceptorTest`` was updated to use a different example service since ``TopicService`` has been removed. The services for platform parameters and user feedback are being kept. - Some test file & KDoc exemptions have been removed since their corresponding files have been deleted. Note that the new Java proto targets & oppia-proto-api targets aren't being used yet, but they will be in future PRs. This just provides the basis of support for the asset download script while also helping to split up the code to review across multiple PRs. ## Essential Checklist - [x] The PR title and explanation each start with "Fix #bugnum: " (If this PR fixes part of an issue, prefix the title with "Fix part of #bugnum: ...".) - [x] Any changes to [scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets) files have their rationale included in the PR explanation. - [x] The PR follows the [style guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide). - [x] The PR does not contain any unnecessary code changes from Android Studio ([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)). - [x] The PR is made from a branch that's **not** called "develop" and is up-to-date with "develop". - [x] The PR is **assigned** to the appropriate reviewers ([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)). ## For UI-specific PRs only This is essentially only data infrastructural except for a couple of points: - Topic loading is now happening through a classrooms structure rather than a tropic ID list. Since there's only one test & one production classroom, this shouldn't actually change the UX. - An at-app-open flow for predownloading image & audio assets has been removed. This hasn't been used since the very earliest alpha releases of the app, so it won't actually affect any users. - Some colors for developer lesson and topic thumbnails were updated--see above.
1 parent 4898027 commit 18fa030

File tree

264 files changed

+419
-3047
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

264 files changed

+419
-3047
lines changed

WORKSPACE

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@ android_sdk_repository(
1515
build_tools_version = "29.0.2",
1616
)
1717

18+
# Oppia's backend proto API definitions.
19+
git_repository(
20+
name = "oppia_proto_api",
21+
commit = HTTP_DEPENDENCY_VERSIONS["oppia_proto_api"]["version"],
22+
remote = "https://github.com/oppia/oppia-proto-api",
23+
shallow_since = "1716846301 -0700",
24+
)
25+
26+
load("@oppia_proto_api//repo:deps.bzl", "initializeDepsForWorkspace")
27+
28+
initializeDepsForWorkspace()
29+
30+
load("@oppia_proto_api//repo:toolchains.bzl", "initializeToolchainsForWorkspace")
31+
32+
initializeToolchainsForWorkspace()
33+
1834
# Add support for JVM rules: https://github.com/bazelbuild/rules_jvm_external
1935
http_archive(
2036
name = "rules_jvm_external",

app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import org.oppia.android.domain.platformparameter.PlatformParameterAlphaModule
4343
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
4444
import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule
4545
import org.oppia.android.domain.question.QuestionModule
46-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
4746
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
4847
import org.oppia.android.util.accessibility.AccessibilityProdModule
4948
import org.oppia.android.util.caching.AssetModule
@@ -82,7 +81,7 @@ import javax.inject.Singleton
8281
ImageParsingModule::class, HtmlParserEntityTypeModule::class, CachingModule::class,
8382
QuestionModule::class, AccessibilityProdModule::class, ImageClickInputModule::class,
8483
LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class,
85-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
84+
ExpirationMetaDataRetrieverModule::class,
8685
RatioInputModule::class, UncaughtExceptionLoggerModule::class,
8786
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
8887
WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class,

app/src/main/java/org/oppia/android/app/application/alphakenya/AlphaKenyaApplicationComponent.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import org.oppia.android.domain.platformparameter.PlatformParameterAlphaKenyaMod
4444
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
4545
import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule
4646
import org.oppia.android.domain.question.QuestionModule
47-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
4847
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
4948
import org.oppia.android.util.accessibility.AccessibilityProdModule
5049
import org.oppia.android.util.caching.AssetModule
@@ -83,7 +82,7 @@ import javax.inject.Singleton
8382
ImageParsingModule::class, HtmlParserEntityTypeModule::class, CachingModule::class,
8483
QuestionModule::class, AccessibilityProdModule::class, ImageClickInputModule::class,
8584
LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class,
86-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
85+
ExpirationMetaDataRetrieverModule::class,
8786
RatioInputModule::class, UncaughtExceptionLoggerModule::class,
8887
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
8988
WorkManagerConfigurationModule::class, HintsAndSolutionConfigAlphaKenyaModule::class,

app/src/main/java/org/oppia/android/app/application/beta/BetaApplicationComponent.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import org.oppia.android.domain.platformparameter.PlatformParameterModule
4343
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
4444
import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule
4545
import org.oppia.android.domain.question.QuestionModule
46-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
4746
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
4847
import org.oppia.android.util.accessibility.AccessibilityProdModule
4948
import org.oppia.android.util.caching.AssetModule
@@ -82,7 +81,7 @@ import javax.inject.Singleton
8281
ImageParsingModule::class, HtmlParserEntityTypeModule::class, CachingModule::class,
8382
QuestionModule::class, AccessibilityProdModule::class, ImageClickInputModule::class,
8483
LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class,
85-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
84+
ExpirationMetaDataRetrieverModule::class,
8685
RatioInputModule::class, UncaughtExceptionLoggerModule::class,
8786
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
8887
WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class,

app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import org.oppia.android.domain.platformparameter.PlatformParameterModule
4444
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
4545
import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule
4646
import org.oppia.android.domain.question.QuestionModule
47-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
4847
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
4948
import org.oppia.android.util.accessibility.AccessibilityProdModule
5049
import org.oppia.android.util.caching.AssetModule
@@ -83,7 +82,7 @@ import javax.inject.Singleton
8382
ImageParsingModule::class, HtmlParserEntityTypeModule::class, CachingModule::class,
8483
QuestionModule::class, DebugLogReportingModule::class, AccessibilityProdModule::class,
8584
ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class,
86-
ViewBindingShimModule::class, PrimeTopicAssetsControllerModule::class,
85+
ViewBindingShimModule::class,
8786
ExpirationMetaDataRetrieverModule::class, RatioInputModule::class,
8887
UncaughtExceptionLoggerModule::class, ApplicationStartupListenerModule::class,
8988
LogReportWorkerModule::class, WorkManagerConfigurationModule::class,

app/src/main/java/org/oppia/android/app/application/ga/GaApplicationComponent.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import org.oppia.android.domain.platformparameter.PlatformParameterModule
4343
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
4444
import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule
4545
import org.oppia.android.domain.question.QuestionModule
46-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
4746
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
4847
import org.oppia.android.util.accessibility.AccessibilityProdModule
4948
import org.oppia.android.util.caching.AssetModule
@@ -82,7 +81,7 @@ import javax.inject.Singleton
8281
ImageParsingModule::class, HtmlParserEntityTypeModule::class, CachingModule::class,
8382
QuestionModule::class, AccessibilityProdModule::class, ImageClickInputModule::class,
8483
LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class,
85-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
84+
ExpirationMetaDataRetrieverModule::class,
8685
RatioInputModule::class, UncaughtExceptionLoggerModule::class,
8786
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
8887
WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class,

app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import org.oppia.android.domain.locale.LocaleController
3131
import org.oppia.android.domain.onboarding.AppStartupStateController
3232
import org.oppia.android.domain.onboarding.DeprecationController
3333
import org.oppia.android.domain.oppialogger.OppiaLogger
34-
import org.oppia.android.domain.topic.PrimeTopicAssetsController
3534
import org.oppia.android.domain.translation.TranslationController
3635
import org.oppia.android.util.data.AsyncResult
3736
import org.oppia.android.util.data.DataProvider
@@ -56,7 +55,6 @@ class SplashActivityPresenter @Inject constructor(
5655
private val activity: AppCompatActivity,
5756
private val oppiaLogger: OppiaLogger,
5857
private val appStartupStateController: AppStartupStateController,
59-
private val primeTopicAssetsController: PrimeTopicAssetsController,
6058
private val translationController: TranslationController,
6159
private val localeController: LocaleController,
6260
private val deprecationController: DeprecationController,
@@ -77,8 +75,6 @@ class SplashActivityPresenter @Inject constructor(
7775
isOnBetaFlavor = currentBuildFlavor == BuildFlavor.BETA
7876
}
7977

80-
// Initiate download support before any additional processing begins.
81-
primeTopicAssetsController.downloadAssets(R.style.OppiaAlertDialogTheme)
8278
subscribeToOnboardingFlow()
8379
}
8480

app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModul
102102
import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule
103103
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
104104
import org.oppia.android.domain.question.QuestionModule
105-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
106105
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
107106
import org.oppia.android.testing.OppiaTestRule
108107
import org.oppia.android.testing.TestLogReportingModule
@@ -904,7 +903,7 @@ class AdministratorControlsActivityTest {
904903
GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class,
905904
HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class,
906905
AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class,
907-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
906+
ExpirationMetaDataRetrieverModule::class,
908907
ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class,
909908
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
910909
HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class,

app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModul
8484
import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule
8585
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
8686
import org.oppia.android.domain.question.QuestionModule
87-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
8887
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
8988
import org.oppia.android.testing.OppiaTestRule
9089
import org.oppia.android.testing.TestLogReportingModule
@@ -604,7 +603,7 @@ class AdministratorControlsFragmentTest {
604603
GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class,
605604
HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class,
606605
AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class,
607-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
606+
ExpirationMetaDataRetrieverModule::class,
608607
ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class,
609608
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
610609
HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class,

app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule
7676
import org.oppia.android.domain.platformparameter.PlatformParameterModule
7777
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
7878
import org.oppia.android.domain.question.QuestionModule
79-
import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
8079
import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
8180
import org.oppia.android.testing.OppiaTestRule
8281
import org.oppia.android.testing.TestLogReportingModule
@@ -293,7 +292,7 @@ class AppVersionActivityTest {
293292
GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class,
294293
HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class,
295294
AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class,
296-
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
295+
ExpirationMetaDataRetrieverModule::class,
297296
ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class,
298297
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
299298
HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class,

0 commit comments

Comments
 (0)