-
Notifications
You must be signed in to change notification settings - Fork 499
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix #4224 and #4306, part of #1051: Expand written translations support to titles & descriptions #4555
Conversation
This simplifies application component management significantly and allows individual build flavors to have their own unique module lists.
This also introduces dedicated beta & GA build flavors which is a necessary prerequisite. It also introduces an extra beta, alpha, and dev mode labels for the splash screen (the latter 2 were extra) with 2 second minimum wait timers for beta and alpha to ensure they are seen. A 5-second safety timer was added to ensure the splash screen can always be passed even if something goes wrong at the domain level (since there are now quite a few moving pieces to determine the user's current onboarding state).
To ensure that the new dynamic DataProvider can't result in a soft lock if in-memory cache-backed providers (such as PersistentCacheStore) circularly reference each other (since they depend on a single thread), InMemoryBlockingCache was updated to use the standard background in conjunction with an actor channel. This ensures the lockless synchronization mechanism can continue without cross-cache contention occurring due to using a shared test. This commit also subsequently updates all blocking caches to use the same actor model, instead, and outright removes the blocking dispatcher to ensure these situations can never occur in the future.
One test needed to be ignored due to the Kotlin coroutines update, so follow-up work will be needed to address this. Note that this commit also restricts access to the Kotlin reflection library (since it shouldn't be used broadly). This commit also updates Gradle to use Kotlin 1.6 (though only the app build has been verified). Proguard building support hasn't yet been verified.
…oduce-beta-ga-notices
Tests broken due to changes to the app startup experience haven't yet been fixed.
This commit replaces coroutine dispatchers with lower-level executors that perform the actual state management and coordination for all multi-threaded task handling in the app. This is actually a major simplification as it allows for: - Proper threading resource sharing between the app and its libraries (such as OkHttp) - Proper thread synchronization between executors and coroutines in tests without leveraging the extremely complicated CoroutineExecutorService - Less custom coroutine infrastructure which can be difficult to maintain
…upgrade-to-kotlin16 Conflicts: WORKSPACE testing/src/main/java/org/oppia/android/testing/threading/CoroutineExecutorService.kt testing/src/main/java/org/oppia/android/testing/threading/TestCoroutineDispatcherEspressoImpl.kt testing/src/main/java/org/oppia/android/testing/threading/TestCoroutineDispatcherRobolectricImpl.kt testing/src/main/java/org/oppia/android/testing/threading/TestCoroutineDispatchersRobolectricImpl.kt testing/src/main/java/org/oppia/android/testing/threading/TestDispatcherModule.kt testing/src/test/java/org/oppia/android/testing/threading/CoroutineExecutorServiceTest.kt testing/src/test/java/org/oppia/android/testing/threading/TestCoroutineDispatcherRobolectricImplTest.kt testing/src/test/java/org/oppia/android/testing/threading/TestCoroutineDispatcherTest.kt testing/src/test/java/org/oppia/android/testing/threading/TestCoroutineDispatcherTestBase.kt third_party/BUILD.bazel third_party/maven_install.json third_party/versions.bzl
…ic-transforms Conflicts: scripts/assets/test_file_exemptions.textproto testing/src/main/java/org/oppia/android/testing/threading/TestCoroutineDispatchersEspressoImpl.kt testing/src/main/java/org/oppia/android/testing/threading/TestCoroutineDispatchersRobolectricImpl.kt testing/src/main/java/org/oppia/android/testing/threading/TestDispatcherModule.kt utility/src/main/java/org/oppia/android/util/threading/DispatcherModule.kt
Does not include new tests that need to be added, or lint fixes.
This also includes fixing some core issues in AsyncDataSubscriptionManager and InMemoryBlockingCache that went previously unnoticed. More tests still need to be added yet.
(This is an in-progress commit that's needed so that I can transfer changes to a different machine).
There's a bunch left to do here, this is mainly needed so that I can transfer changes to a different machine.
Correct typos.
Conflicts: build_flavors.bzl scripts/assets/test_file_exemptions.textproto
…oduce-beta-ga-notices Conflicts: .github/workflows/build_tests.yml build_flavors.bzl scripts/assets/test_file_exemptions.textproto version.bzl
This also removes temporary debug code and TODOs, and finishes the tests for SplashActivity.
Conflicts: app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/parser/CustomBulletSpanTest.kt app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt
Conflicts: app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt
…/oppia-android into add-strings-checks-and-fix-strings
This commit allows the PR to be "rebased" back onto develop so that it can be prepped for merging.
Just completed a self-review on the PR and I didn't find anything majorly broken. |
Once the PR has completed CI checks it should be ready for merging. |
Since this PR is part of broader urgent work for the Beta MR1 release, I'm force-merging this without review. I've self-reviewed it and found no major issues. Furthermore, #4567 is tracking ensuring that this does get reviewed by someone else later after it's been merged. |
Explanation
Fixes #4224
Fixes #4306
Fixes part of #1051
This PR introduces expanded support for translating content strings. In particular, previous support for written content translations only extended as far as exploration state content and interactions. Now, all topics, stories, chapters, exploration, and revision cards titles and descriptions now also support translations. When considered in conjunction with app string translations, this now means that nearly the entire app is translatable.
Technical approach
At a high-level, this PR expands the existing pattern for content translations for titles and descriptions for structures: explorations, topics, revision cards (subtopics), stories, and chapters (story nodes). This required changing existing structures (and corresponding test assets) to use
SubtitledHtml
instead of raw strings for their titles and descriptions, and to now include written translation tables. New ephemeral structures have been introduced to compute the translations that can be consumed by the UI to ensure the correct string is displayed.Note that the test JSON assets have not been updated since it was a bit easier to just translate the title/description strings into
SubtitledHtml
s during parsing time (which seems like a reasonable stopgap since the JSON loading pipeline is temporary and only developer-facing).Due to new ephemeral structures needing to be computed in a bunch of places, profile ID now needs to be passed in more places. This has led to some minor refactoring to push more UI components over to passing around the
ProfileId
structure rather than the internal integer ID.This PR also fixes part of #1051 by migrating more fragment presenters over to injecting their view models rather than retrieving them from Jetpack's view model provider (which means each of these changed presenters no longer expose potential
memory leaks in the corresponding view model).
Caveats
This PR doesn't technically directly address #4224 and #4306, but it does indirectly. The new structures are linked to the assets download script which has been subsequently updated to cross-reference the translations for topics, stories, chapters, and subtopics from Oppia web's repository (which has temporary hardcoded translations for many of the titles and descriptions). This means that:
Another caveat is that this PR further reveals the specific need to be able to compute a
DataProvider
based on the result of another. This is a limitation that the currentDataProviders
utility methods cannot handle, and the workaround is to callretrieveData()
on the computedDataProvider
directly which has updating inconsistency issues. Some of the providers modified as part of this PR should be updated to leverage a new dynamic transform method (see #4564 for the tracking issue). This was unfortunately dropped from the project due to limited time, but #4484 is the WIP PR.Test changes (or lack thereof)
Due to this PR being especially high priority, tests have been omitted from this PR in favor of merging it faster. Instead, tests will be added in a follow-up PR (#4567 is tracking to make sure that this happens). The changes have been manually tested, and will be tested more prior to many users interacting with the new functionality.
Essential Checklist
For UI-specific PRs only
While this PR is highly end user-facing, for the sake of time screenshots and video demonstrations have been omitted from the PR. They will be added at a later date (after the PR is merged), and #4567 is tracking the work item to make sure that this happens.