├── app └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── oppia │ │ │ └── android │ │ │ └── app │ │ │ ├── home │ │ │ ├── UserAppHistoryViewModel.kt │ │ │ ├── RouteToTopicListener.kt │ │ │ ├── RouteToRecentlyPlayedListener.kt │ │ │ ├── topiclist │ │ │ │ ├── AllTopicsViewModel.kt │ │ │ │ └── TopicSummaryClickListener.kt │ │ │ ├── HomeItemViewModel.kt │ │ │ ├── RouteToTopicPlayStoryListener.kt │ │ │ ├── recentlyplayed │ │ │ │ ├── OngoingStoryClickListener.kt │ │ │ │ ├── SectionTitleViewModel.kt │ │ │ │ └── RecentlyPlayedItemViewModel.kt │ │ │ ├── WelcomeViewModel.kt │ │ │ └── RouteToExplorationListener.kt │ │ │ ├── hintsandsolution │ │ │ ├── HintsDividerViewModel.kt │ │ │ ├── HintsAndSolutionListener.kt │ │ │ ├── RevealSolutionInterface.kt │ │ │ ├── HintsAndSolutionItemViewModel.kt │ │ │ └── RevealHintListener.kt │ │ │ ├── help │ │ │ ├── HelpItems.kt │ │ │ ├── RouteToFAQListListener.kt │ │ │ └── faq │ │ │ │ ├── faqItemViewModel │ │ │ │ ├── FAQHeaderViewModel.kt │ │ │ │ └── FAQItemViewModel.kt │ │ │ │ └── RouteToFAQSingleListener.kt │ │ │ ├── application │ │ │ ├── ApplicationContext.kt │ │ │ ├── ApplicationInjector.kt │ │ │ ├── ApplicationStartupListenerModule.kt │ │ │ ├── ActivityComponentFactory.kt │ │ │ └── ApplicationInjectorProvider.kt │ │ │ ├── profile │ │ │ ├── RouteToAdminPinListener.kt │ │ │ ├── AdminAuthEnum.kt │ │ │ ├── ProfileRouteDialogInterface.kt │ │ │ ├── ResetPinViewModel.kt │ │ │ └── AdminSettingsViewModel.kt │ │ │ ├── view │ │ │ └── ViewScope.kt │ │ │ ├── walkthrough │ │ │ ├── end │ │ │ │ ├── WalkthroughEndPageChanger.kt │ │ │ │ ├── WalkthroughFinalListener.kt │ │ │ │ └── WalkthroughFinalViewModel.kt │ │ │ ├── WalkthroughPages.kt │ │ │ ├── WalkthroughFragmentChangeListener.kt │ │ │ ├── topiclist │ │ │ │ ├── WalkthroughTopicItemViewModel.kt │ │ │ │ └── topiclistviewmodel │ │ │ │ │ └── WalkthroughTopicHeaderViewModel.kt │ │ │ ├── WalkthroughPageChanger.kt │ │ │ ├── welcome │ │ │ │ └── WalkthroughWelcomeViewModel.kt │ │ │ ├── WalkthroughViewModel.kt │ │ │ └── WalkthroughActivityListener.kt │ │ │ ├── player │ │ │ ├── state │ │ │ │ ├── listener │ │ │ │ │ ├── ReplayButtonListener.kt │ │ │ │ │ ├── NextNavigationButtonListener.kt │ │ │ │ │ ├── SubmitNavigationButtonListener.kt │ │ │ │ │ ├── PreviousNavigationButtonListener.kt │ │ │ │ │ ├── ContinueNavigationButtonListener.kt │ │ │ │ │ ├── StateKeyboardButtonListener.kt │ │ │ │ │ ├── ReturnToTopicNavigationButtonListener.kt │ │ │ │ │ ├── PreviousResponsesHeaderClickListener.kt │ │ │ │ │ ├── RouteToHintsAndSolutionListener.kt │ │ │ │ │ └── ShowHintAvailabilityListener.kt │ │ │ │ ├── hintsandsolution │ │ │ │ │ ├── DelayShowInitialHintMillis.kt │ │ │ │ │ ├── DelayShowAdditionalHintsMillis.kt │ │ │ │ │ └── DelayShowAdditionalHintsFromWrongAnswerMillis.kt │ │ │ │ ├── itemviewmodel │ │ │ │ │ ├── ContentViewModel.kt │ │ │ │ │ ├── FeedbackViewModel.kt │ │ │ │ │ ├── ReplayButtonViewModel.kt │ │ │ │ │ └── PreviousButtonViewModel.kt │ │ │ │ └── testing │ │ │ │ │ └── StateFragmentTestViewModel.kt │ │ │ ├── stopplaying │ │ │ │ ├── RestartPlayingSessionListener.kt │ │ │ │ └── StopStatePlayingSessionListener.kt │ │ │ └── exploration │ │ │ │ ├── HintsAndSolutionExplorationManagerListener.kt │ │ │ │ └── DefaultFontSizeStateListener.kt │ │ │ ├── drawer │ │ │ ├── ExitProfileDialogInterface.kt │ │ │ ├── RouteToProfileProgressListener.kt │ │ │ └── NavigationDrawerFooterViewModel.kt │ │ │ ├── onboarding │ │ │ ├── RouteToProfileListListener.kt │ │ │ ├── OnboardingNavigationListener.kt │ │ │ ├── OnboardingViewModel.kt │ │ │ └── ViewPagerSlide.kt │ │ │ ├── activity │ │ │ ├── ActivityScope.kt │ │ │ └── ActivityModule.kt │ │ │ ├── administratorcontrols │ │ │ ├── LoadAppVersionListener.kt │ │ │ ├── LoadProfileListListener.kt │ │ │ ├── RouteToAppVersionListener.kt │ │ │ ├── RouteToProfileListListener.kt │ │ │ └── administratorcontrolsitemviewmodel │ │ │ │ ├── AdministratorControlsGeneralViewModel.kt │ │ │ │ └── AdministratorControlsItemViewModel.kt │ │ │ ├── fragment │ │ │ ├── FragmentScope.kt │ │ │ └── FragmentModule.kt │ │ │ ├── options │ │ │ ├── LoadAppLanguageListListener.kt │ │ │ ├── LoadReadingTextSizeListener.kt │ │ │ ├── LoadAudioLanguageListListener.kt │ │ │ ├── RouteToAppLanguageListListener.kt │ │ │ ├── RouteToAudioLanguageListListener.kt │ │ │ ├── RouteToReadingTextSizeListener.kt │ │ │ └── OptionsItemViewModel.kt │ │ │ ├── profileprogress │ │ │ ├── ProfilePictureClickListener.kt │ │ │ ├── RouteToOngoingTopicListListener.kt │ │ │ ├── RouteToCompletedStoryListListener.kt │ │ │ ├── ProfilePictureDialogInterface.kt │ │ │ ├── ProfileProgressItemViewModel.kt │ │ │ └── ProfilePictureActivityViewModel.kt │ │ │ ├── topic │ │ │ ├── RouteToConceptCardListener.kt │ │ │ ├── lessons │ │ │ │ ├── TopicLessonsTitleViewModel.kt │ │ │ │ ├── StorySummarySelector.kt │ │ │ │ ├── TopicLessonsItemViewModel.kt │ │ │ │ ├── ChapterSummarySelector.kt │ │ │ │ ├── ExpandedChapterListIndexListener.kt │ │ │ │ └── StorySummaryViewModel.kt │ │ │ ├── RouteToQuestionPlayerListener.kt │ │ │ ├── revisioncard │ │ │ │ └── ReturnToTopicClickListener.kt │ │ │ ├── RouteToStoryListener.kt │ │ │ ├── practice │ │ │ │ ├── practiceitemviewmodel │ │ │ │ │ ├── TopicPracticeFooterViewModel.kt │ │ │ │ │ ├── TopicPracticeHeaderViewModel.kt │ │ │ │ │ ├── TopicPracticeSubtopicViewModel.kt │ │ │ │ │ └── TopicPracticeItemViewModel.kt │ │ │ │ └── SubtopicSelector.kt │ │ │ ├── RouteToRevisionCardListener.kt │ │ │ ├── conceptcard │ │ │ │ └── ConceptCardListener.kt │ │ │ ├── revision │ │ │ │ └── RevisionSubtopicSelector.kt │ │ │ ├── questionplayer │ │ │ │ └── HintsAndSolutionQuestionManagerListener.kt │ │ │ └── TopicTab.kt │ │ │ ├── shim │ │ │ ├── ViewBindingShimModule.kt │ │ │ ├── IntentFactoryShimModule.kt │ │ │ └── ViewComponentFactory.kt │ │ │ ├── story │ │ │ ├── storyitemviewmodel │ │ │ │ ├── StoryHeaderViewModel.kt │ │ │ │ └── StoryItemViewModel.kt │ │ │ ├── StoryFragmentScroller.kt │ │ │ └── ExplorationSelectionListener.kt │ │ │ ├── deprecation │ │ │ └── DeprecationNoticeExitAppListener.kt │ │ │ ├── recyclerview │ │ │ └── OnDragEndedListener.kt │ │ │ ├── testing │ │ │ ├── HomeTestActivityPresenter.kt │ │ │ └── HomeTestActivity.kt │ │ │ ├── settings │ │ │ └── profile │ │ │ │ └── ProfileRenameViewModel.kt │ │ │ ├── utility │ │ │ ├── RatioExtensions.kt │ │ │ ├── OnClickableAreaClickedListener.kt │ │ │ └── ContextExtensions.kt │ │ │ └── mydownloads │ │ │ └── MyDownloadsTab.kt │ ├── ic_launcher-web.png │ ├── res │ │ ├── drawable │ │ │ ├── topic_ratios_01.png │ │ │ ├── dummy_place_holder.png │ │ │ ├── review_placeholder.png │ │ │ ├── testing_fraction.png │ │ │ ├── topic_fractions_01.png │ │ │ ├── topic_fractions_02.png │ │ │ ├── topic_fractions_03.png │ │ │ ├── topic_fractions_04.png │ │ │ ├── topic_fractions_05.png │ │ │ ├── topic_fractions_06.png │ │ │ ├── topic_fractions_07.png │ │ │ ├── topic_fractions_08.png │ │ │ ├── lesson_thumbnail_default.xml │ │ │ ├── drag_drop_white_background.xml │ │ │ ├── rounded_rect_background.xml │ │ │ ├── rounded_rect_white_background.xml │ │ │ ├── transparent_background.xml │ │ │ ├── divider.xml │ │ │ ├── seekbar_background.xml │ │ │ ├── seekbar_progress.xml │ │ │ ├── onboarding_dot_active.xml │ │ │ ├── primary_rounded_button.xml │ │ │ ├── rectangle_background.xml │ │ │ ├── profile_chooser_divider.xml │ │ │ ├── hints_background.xml │ │ │ ├── reveal_solution_brown_background.xml │ │ │ ├── reveal_hint_button_blue_background.xml │ │ │ ├── general_item_background_border.xml │ │ │ ├── state_button_primary_background.xml │ │ │ ├── divider_dotted.xml │ │ │ ├── state_button_inactive_background.xml │ │ │ ├── general_item_background_border_light.xml │ │ │ ├── selected_region_background.xml │ │ │ ├── toolbar_drop_shadow.xml │ │ │ ├── general_item_background_border_cyan.xml │ │ │ ├── ic_arrow_down_grey_24dp.xml │ │ │ ├── radio_unchecked.xml │ │ │ ├── thumbnail_gradient.xml │ │ │ ├── rounded_rect_grey_border_white_background.xml │ │ │ ├── state_button_blue_background.xml │ │ │ ├── feedback_background.xml │ │ │ ├── edit_text_black_border.xml │ │ │ ├── ic_arrow_right_grey_24dp.xml │ │ │ ├── ic_home_icon_grey_24dp.xml │ │ │ ├── selector_checkbox.xml │ │ │ ├── edit_text_background_border.xml │ │ │ ├── grey_card_rounded_border.xml │ │ │ ├── previous_next_state_image_view_background.xml │ │ │ ├── reading_text_size_seekbar_thumb.xml │ │ │ ├── state_button_orange_background.xml │ │ │ ├── bottom_rounded_rect_background.xml │ │ │ ├── ic_arrow_drop_up_black_24dp.xml │ │ │ ├── ic_arrow_up_black_24dp.xml │ │ │ ├── top_rounded_rect_background.xml │ │ │ ├── ic_arrow_drop_down_black_24dp.xml │ │ │ ├── ic_dot_yellow_24dp.xml │ │ │ ├── ic_file_download_primary_24dp.xml │ │ │ ├── ic_keyboard_arrow_up_black_24dp.xml │ │ │ ├── admin_controls_gradient.xml │ │ │ ├── bottom_left_rounded_rect_primary_background.xml │ │ │ ├── bottom_rounded_rect_white_background.xml │ │ │ ├── ic_keyboard_arrow_down_black_24dp.xml │ │ │ ├── profile_chooser_gradient.xml │ │ │ ├── submitted_answer_background.xml │ │ │ ├── bg_white_card.xml │ │ │ ├── ic_arrow_back_white_24dp.xml │ │ │ ├── dashed_divider.xml │ │ │ ├── ic_check_24dp.xml │ │ │ ├── audio_background.xml │ │ │ ├── content_blue_background.xml │ │ │ ├── seekbar_style.xml │ │ │ ├── bg_blue_card.xml │ │ │ ├── interaction_read_only_white_background.xml │ │ │ ├── ic_arrow_forward_black_24dp.xml │ │ │ ├── ic_check_box_unchecked.xml │ │ │ ├── edit_text_background.xml │ │ │ ├── add_profile_edit_text_background.xml │ │ │ ├── ic_close_white_24dp.xml │ │ │ ├── ic_arrow_back_oppia_dark_blue_24dp.xml │ │ │ ├── ic_arrow_forward_oppia_dark_blue_24dp.xml │ │ │ ├── start_button_transparent_background.xml │ │ │ ├── ic_play_circle_filled_white_24dp.xml │ │ │ ├── ic_check_circle_primary_24dp.xml │ │ │ ├── ic_folder_open_24dp.xml │ │ │ ├── edit_text_red_border.xml │ │ │ ├── ic_check_box_checked.xml │ │ │ ├── ic_available_offline_primary_24dp.xml │ │ │ ├── ic_pause_circle_filled_white_24dp.xml │ │ │ ├── ic_available_offline_icon_white_12dp.xml │ │ │ ├── ic_info_icon_24dp.xml │ │ │ ├── ic_info_icon.xml │ │ │ ├── ic_options_icon_grey_24dp.xml │ │ │ ├── ic_check_primary.xml │ │ │ ├── ic_audio_streaming_on_24dp.xml │ │ │ ├── rounded_rect_grey_border_gradient_white_background.xml │ │ │ ├── ic_info_icon_gray_24dp.xml │ │ │ ├── ic_merge_icon_24.xml │ │ │ ├── icon_search_white_24dp.xml │ │ │ ├── ic_refresh_white_24dp.xml │ │ │ ├── ic_edit.xml │ │ │ ├── ic_show_eye_icon.xml │ │ │ ├── ic_edit_18.xml │ │ │ ├── audio_seekbar_background.xml │ │ │ ├── radio_button_drawable.xml │ │ │ └── ic_hint_bulb_white_24dp.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values-sw600dp │ │ │ ├── booleans.xml │ │ │ └── integers.xml │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values-v21 │ │ │ └── integers.xml │ │ ├── values-hdpi │ │ │ └── booleans.xml │ │ ├── values-land-hdpi │ │ │ └── integers.xml │ │ ├── values-land-ldpi │ │ │ └── integers.xml │ │ ├── values-land-mdpi │ │ │ └── integers.xml │ │ ├── values-land-xhdpi │ │ │ └── integers.xml │ │ ├── values-land-xxhdpi │ │ │ └── integers.xml │ │ ├── values-land-xxxhdpi │ │ │ └── integers.xml │ │ ├── values-xxhdpi │ │ │ └── booleans.xml │ │ ├── values-xxxhdpi │ │ │ └── booleans.xml │ │ ├── values-sw600dp-land-hdpi │ │ │ └── integers.xml │ │ ├── values-sw600dp-land-mdpi │ │ │ └── integers.xml │ │ ├── values-sw600dp-land-xhdpi │ │ │ └── integers.xml │ │ ├── values-sw600dp-land-xxhdpi │ │ │ └── integers.xml │ │ ├── values-sw600dp-land-xxxhdpi │ │ │ └── integers.xml │ │ ├── values │ │ │ ├── booleans.xml │ │ │ ├── attrs.xml │ │ │ └── ids.xml │ │ ├── values-xhdpi │ │ │ └── dimens.xml │ │ ├── color │ │ │ ├── tab_icon_color_selector.xml │ │ │ └── drawer_item.xml │ │ ├── layout │ │ │ ├── profile_list_activity.xml │ │ │ ├── app_language_activity.xml │ │ │ ├── reading_text_size_activity.xml │ │ │ ├── audio_language_activity.xml │ │ │ ├── hints_divider.xml │ │ │ ├── reveal_solution_dialog.xml │ │ │ ├── test_activity.xml │ │ │ ├── home_test_activity.xml │ │ │ ├── splash_activity.xml │ │ │ ├── topic_activity.xml │ │ │ ├── downloads_tab_fragment.xml │ │ │ ├── story_activity.xml │ │ │ ├── updates_tab_fragment.xml │ │ │ ├── my_downloads_activity.xml │ │ │ ├── onboarding_activity.xml │ │ │ ├── topic_revision_test_activity.xml │ │ │ ├── audio_fragment_test_activity.xml │ │ │ ├── profile_chooser_activity.xml │ │ │ ├── profile_test_activity.xml │ │ │ ├── recently_played_activity.xml │ │ │ ├── test_text_view_for_int_no_data_binding.xml │ │ │ ├── test_text_view_for_string_no_data_binding.xml │ │ │ ├── ongoing_topic_list_activity.xml │ │ │ ├── completed_story_list_activity.xml │ │ │ ├── test_html_parser_activity.xml │ │ │ ├── test_url_parser_activity.xml │ │ │ ├── drag_drop_test_activity.xml │ │ │ ├── exploration_test_activity.xml │ │ │ ├── toolbar.xml │ │ │ ├── concept_card_fragment_test_activity.xml │ │ │ └── test_text_view_for_string_with_data_binding.xml │ │ ├── color-sw600dp-land │ │ │ └── tab_icon_color_selector.xml │ │ ├── color-sw600dp-port │ │ │ └── tab_icon_color_selector.xml │ │ ├── anim │ │ │ ├── shake.xml │ │ │ ├── fade_in.xml │ │ │ ├── slide_down.xml │ │ │ ├── slide_up.xml │ │ │ ├── slide_up_audio.xml │ │ │ ├── slide_down_audio.xml │ │ │ ├── fade_out.xml │ │ │ ├── slide_out_left.xml │ │ │ └── slide_in_right.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── menu │ │ │ ├── menu_faq_list_activity.xml │ │ │ ├── menu_administrator_controls_activity.xml │ │ │ └── menu_reading_options.xml │ │ ├── values-land │ │ │ ├── dimens.xml │ │ │ └── integers.xml │ │ ├── layout-land │ │ │ ├── ongoing_topic_list_activity.xml │ │ │ ├── completed_story_list_activity.xml │ │ │ └── toolbar.xml │ │ ├── values-sw600dp-land │ │ │ ├── dimens.xml │ │ │ └── integers.xml │ │ └── values-sw600dp-port │ │ │ └── dimens.xml │ ├── AppAndroidManifest.xml │ ├── DatabindingAdaptersManifest.xml │ ├── DatabindingResourcesManifest.xml │ ├── RecyclerviewAdaptersManifest.xml │ ├── ViewModelManifest.xml │ ├── ViewsManifest.xml │ └── ViewModelsManifest.xml │ ├── test │ ├── resources │ │ └── robolectric.properties │ └── AndroidManifest.xml │ └── sharedTest │ └── java │ └── org │ └── oppia │ └── android │ └── app │ └── utility │ └── MockitoKotlinHelper.kt ├── data └── src │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── org │ │ └── oppia │ │ └── android │ │ └── data │ │ ├── Constants.kt │ │ └── backends │ │ └── gae │ │ ├── model │ │ ├── GaeParamSpec.kt │ │ ├── GaeHint.kt │ │ ├── GaeQuestionPlayer.kt │ │ ├── GaeConceptCard.kt │ │ ├── GaeRuleSpec.kt │ │ ├── GaeSubtitledHtml.kt │ │ ├── GaeClassroom.kt │ │ ├── GaeRecordedVoiceovers.kt │ │ ├── GaeCustomizationArgs.kt │ │ ├── GaeWrittenTranslation.kt │ │ ├── GaeSubtopic.kt │ │ ├── GaeWrittenTranslations.kt │ │ ├── GaeSubtopicSummary.kt │ │ ├── GaeVoiceover.kt │ │ ├── GaeStorySummary.kt │ │ ├── GaeStory.kt │ │ ├── GaeParamChange.kt │ │ ├── GaeStateClassifier.kt │ │ └── GaeQuestion.kt │ │ └── api │ │ ├── TopicService.kt │ │ ├── ClassroomService.kt │ │ ├── ConceptCardService.kt │ │ ├── ExplorationService.kt │ │ ├── SubtopicService.kt │ │ ├── QuestionPlayerService.kt │ │ └── StoryService.kt │ └── test │ ├── assets │ └── api_mocks │ │ ├── dummy_response_with_xssi_prefix.json │ │ └── dummy_response_without_xssi_prefix.json │ └── resources │ └── robolectric.properties ├── settings.gradle ├── testing └── src │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── org │ │ └── oppia │ │ └── android │ │ └── testing │ │ ├── IsOnRobolectric.kt │ │ ├── TestDispatchers.kt │ │ ├── TestAccessibilityModule.kt │ │ └── TestLogReportingModule.kt │ └── test │ ├── resources │ └── robolectric.properties │ └── AndroidManifest.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .idea ├── encodings.xml ├── codeStyles │ └── codeStyleConfig.xml ├── misc.xml └── runConfigurations.xml ├── .editorconfig ├── .github └── CONTRIBUTING.md ├── domain └── src │ ├── main │ ├── assets │ │ ├── topics.json │ │ ├── GJ2rLXRKD5hw_3.json │ │ ├── GJ2rLXRKD5hw_4.json │ │ └── GJ2rLXRKD5hw_2.json │ ├── AndroidManifest.xml │ └── java │ │ └── org │ │ └── oppia │ │ └── android │ │ └── domain │ │ ├── oppialogger │ │ ├── ApplicationStartupListener.kt │ │ └── loguploader │ │ │ └── LogUploadWorkerModule.kt │ │ ├── classify │ │ ├── rules │ │ │ └── RuleClassifierProvider.kt │ │ ├── RuleClassifier.kt │ │ └── GenericInteractionClassifier.kt │ │ ├── onboarding │ │ ├── ExpirationMetaDataRetrieverModule.kt │ │ └── testing │ │ │ └── ExpirationMetaDataRetrieverTestModule.kt │ │ └── question │ │ └── QuestionTrainingConstantsProvider.kt │ └── test │ ├── resources │ └── robolectric.properties │ └── AndroidManifest.xml ├── utility └── src │ ├── test │ ├── resources │ │ └── robolectric.properties │ └── AndroidManifest.xml │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── org │ │ └── oppia │ │ └── android │ │ └── util │ │ ├── accessibility │ │ ├── CustomAccessibilityManager.kt │ │ ├── FakeAccessibilityManager.kt │ │ └── AndroidAccessibilityManager.kt │ │ ├── caching │ │ ├── TopicListToCache.kt │ │ ├── CacheAssetsLocally.kt │ │ └── CachingModule.kt │ │ ├── threading │ │ ├── BlockingDispatcher.kt │ │ └── BackgroundDispatcher.kt │ │ ├── data │ │ ├── DataProvidersInjector.kt │ │ └── DataProvidersInjectorProvider.kt │ │ ├── parser │ │ ├── GlideImageLoaderModule.kt │ │ ├── ImageAssetFetcher.kt │ │ └── ImageParsingAnnotations.kt │ │ ├── logging │ │ ├── LogLevel.kt │ │ ├── firebase │ │ │ ├── FirebaseLogUploaderModule.kt │ │ │ └── FirebaseExceptionLogger.kt │ │ ├── EventLogger.kt │ │ ├── ExceptionLogger.kt │ │ └── LoggingAnnotations.kt │ │ ├── gcsresource │ │ ├── GcsResouceAnnotations.kt │ │ └── GcsResourceModule.kt │ │ └── extensions │ │ └── LiveDataExt.kt │ └── res │ └── values │ ├── strings.xml │ └── dimens.xml ├── model └── src │ └── main │ └── proto │ ├── subtitled_html.proto │ ├── example.proto │ ├── subtitled_unicode.proto │ ├── translation.proto │ └── voiceover.proto ├── tools └── android │ └── BUILD.bazel └── .gitignore /app/src/main/java/org/oppia/android/app/home/UserAppHistoryViewModel.kt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':model', ':utility', ':domain', ':data', ':testing' 2 | -------------------------------------------------------------------------------- /testing/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /data/src/test/assets/api_mocks/dummy_response_with_xssi_prefix.json: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"is_valid_response": true} 3 | -------------------------------------------------------------------------------- /data/src/test/assets/api_mocks/dummy_response_without_xssi_prefix.json: -------------------------------------------------------------------------------- 1 | { 2 | "is_valid_response": true 3 | } 4 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_ratios_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_ratios_01.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dummy_place_holder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/dummy_place_holder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/review_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/review_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/testing_fraction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/testing_fraction.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_01.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_02.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_03.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_04.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_05.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_06.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_07.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/topic_fractions_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/drawable/topic_fractions_08.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 300 4 | 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{kt,kts}] 2 | # possible values: number (e.g. 2), "unset" (makes ktlint ignore indentation completely) 3 | indent_size=2 4 | kotlin_imports_layout=idea 5 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Please see [this link](https://github.com/oppia/oppia-android/wiki) for instructions on how to contribute code to the Oppia Android project. Thanks! 2 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/values-hdpi/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-land-hdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-land-ldpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-land-mdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | 5 | -------------------------------------------------------------------------------- /domain/src/main/assets/topics.json: -------------------------------------------------------------------------------- 1 | { 2 | "topic_id_list": [ 3 | "test_topic_id_0", 4 | "test_topic_id_1", 5 | "GJ2rLXRKD5hw", 6 | "omzF4oqgeTXd" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/oppia-android/develop/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/values-land-xhdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-land-xxhdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-land-xxxhdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-xxhdpi/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-xxxhdpi/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-land-hdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-land-mdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-land-xhdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-land-xxhdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 5 | -------------------------------------------------------------------------------- /app/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | # app/src/test/resources/robolectric.properties 2 | # TODO(#1794): Remove the need for this file & use SDK 29 at the project level. 3 | sdk=28 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-land-xxxhdpi/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | 5 | -------------------------------------------------------------------------------- /data/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | # data/src/test/resources/robolectric.properties 2 | # TODO(#1794): Remove the need for this file & use SDK 29 at the project level. 3 | sdk=28 4 | -------------------------------------------------------------------------------- /domain/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | # domain/src/test/resources/robolectric.properties 2 | # TODO(#1794): Remove the need for this file & use SDK 29 at the project level. 3 | sdk=28 4 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/hintsandsolution/HintsDividerViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.hintsandsolution 2 | 3 | class HintsDividerViewModel : HintsAndSolutionItemViewModel() 4 | -------------------------------------------------------------------------------- /testing/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | # testing/src/test/resources/robolectric.properties 2 | # TODO(#1794): Remove the need for this file & use SDK 29 at the project level. 3 | sdk=28 4 | -------------------------------------------------------------------------------- /utility/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | # utility/src/test/resources/robolectric.properties 2 | # TODO(#1794): Remove the need for this file & use SDK 29 at the project level. 3 | sdk=28 4 | -------------------------------------------------------------------------------- /utility/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/booleans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | false 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/help/HelpItems.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.help 2 | 3 | /** Enum class containing the items for the Recycler view of [HelpActivity]. */ 4 | enum class HelpItems { 5 | FAQ; 6 | } 7 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/accessibility/CustomAccessibilityManager.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.accessibility 2 | 3 | interface CustomAccessibilityManager { 4 | fun isScreenReaderEnabled(): Boolean 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-xhdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 120dp 4 | 120dp 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/AppAndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/test/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /testing/src/test/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /utility/src/test/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/lesson_thumbnail_default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /domain/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/help/RouteToFAQListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.help 2 | 3 | /** Listener for when a selection should result to [FAQListActivity]. */ 4 | interface RouteToFAQListListener { 5 | fun onRouteToFAQList() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/DatabindingAdaptersManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/DatabindingResourcesManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/help/faq/faqItemViewModel/FAQHeaderViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.help.faq.faqItemViewModel 2 | 3 | /** Header view model for the recycler view in [FAQFragment]. */ 4 | class FAQHeaderViewModel : FAQItemViewModel() 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/drag_drop_white_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_rect_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_rect_white_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/application/ApplicationContext.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.application 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** Qualifier for injecting the application context. */ 6 | @Qualifier 7 | annotation class ApplicationContext 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profile/RouteToAdminPinListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profile 2 | 3 | /** Listener for when an activity should route to Administrator Controls. */ 4 | interface RouteToAdminPinListener { 5 | fun routeToAdminPin() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/view/ViewScope.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.view 2 | 3 | import javax.inject.Scope 4 | 5 | /** A custom scope corresponding to dependencies that should be recreated for each view. */ 6 | @Scope 7 | annotation class ViewScope 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughEndPageChanger.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough.end 2 | 3 | /** Listener for when an activity should go back a page. */ 4 | interface WalkthroughEndPageChanger { 5 | 6 | fun goBack() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/Constants.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data 2 | 3 | /** An object that contains constants for data module */ 4 | object Constants { 5 | 6 | /** Constant which defines successful API call */ 7 | const val HTTP_OK = 200 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/RecyclerviewAdaptersManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/ReplayButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the replay button is clicked. */ 4 | interface ReplayButtonListener { 5 | fun onReplayButtonClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/drawer/ExitProfileDialogInterface.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.drawer 2 | 3 | /** Interface to handle option selection in [ExitProfileDialogFragment]. */ 4 | interface ExitProfileDialogInterface { 5 | fun markHomeMenuCloseDrawer() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/RouteToTopicListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home 2 | 3 | /** Listener for when an activity should route to a topic. */ 4 | interface RouteToTopicListener { 5 | fun routeToTopic(internalProfileId: Int, topicId: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/onboarding/RouteToProfileListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.onboarding 2 | 3 | /** Listener for when an activity should route to [ProfileActivity]. */ 4 | interface RouteToProfileListListener { 5 | fun routeToProfileList() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough.end 2 | 3 | /** Listener for when an activity should change a fragment position. */ 4 | interface WalkthroughFinalListener { 5 | 6 | fun goBack() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/seekbar_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/RouteToRecentlyPlayedListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home 2 | 3 | /** Listener for when an activity should route to [RecentlyPlayedActivity]. */ 4 | interface RouteToRecentlyPlayedListener { 5 | fun routeToRecentlyPlayed() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/seekbar_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /domain/src/test/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /model/src/main/proto/subtitled_html.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package model; 4 | 5 | option java_package = "org.oppia.android.app.model"; 6 | option java_multiple_files = true; 7 | 8 | message SubtitledHtml { 9 | string html = 1; 10 | string content_id = 2; 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/activity/ActivityScope.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.activity 2 | 3 | import javax.inject.Scope 4 | 5 | /** A custom scope corresponding to dependencies that should be recreated for each activity. */ 6 | @Scope 7 | annotation class ActivityScope 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/administratorcontrols/LoadAppVersionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.administratorcontrols 2 | 3 | /** Listener for when an activity should load [AppVersionFragment]. */ 4 | interface LoadAppVersionListener { 5 | fun loadAppVersion() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/fragment/FragmentScope.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.fragment 2 | 3 | import javax.inject.Scope 4 | 5 | /** A custom scope corresponding to dependencies that should be recreated for each fragment. */ 6 | @Scope 7 | annotation class FragmentScope 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughPages.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough 2 | 3 | /** Represents current state of [WalkthroughActivity]. */ 4 | enum class WalkthroughPages(val value: Int) { 5 | WELCOME(0), 6 | TOPIC_LIST(1), 7 | FINAL(2) 8 | } 9 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Mar 29 11:36:23 IST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/administratorcontrols/LoadProfileListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.administratorcontrols 2 | 3 | /** Listener for when an activity should load [ProfileListFragment]. */ 4 | interface LoadProfileListListener { 5 | fun loadProfileList() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/administratorcontrols/RouteToAppVersionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.administratorcontrols 2 | 3 | /** Listener for when an activity should route to App Version. */ 4 | interface RouteToAppVersionListener { 5 | fun routeToAppVersion() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/color/tab_icon_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/onboarding_dot_active.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/primary_rounded_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rectangle_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/profile_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/administratorcontrols/RouteToProfileListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.administratorcontrols 2 | 3 | /** Listener for when an activity should route to a exploration. */ 4 | interface RouteToProfileListListener { 5 | fun routeToProfileList() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/fragment/FragmentModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.fragment 2 | 3 | import dagger.Module 4 | import org.oppia.android.app.view.ViewComponent 5 | 6 | /** Root fragment module. */ 7 | @Module(subcomponents = [ViewComponent::class]) 8 | class FragmentModule 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/LoadAppLanguageListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | /** Listener for when an activity should load a [AppLanguageFragment]. */ 4 | interface LoadAppLanguageListListener { 5 | fun loadAppLanguageFragment(appLanguage: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/NextNavigationButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the 'next' navigation button is clicked. */ 4 | interface NextNavigationButtonListener { 5 | fun onNextButtonClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profileprogress/ProfilePictureClickListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profileprogress 2 | 3 | /** Listener interface for when profile picture is clicked in the UI. */ 4 | interface ProfilePictureClickListener { 5 | fun onProfilePictureClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/RouteToConceptCardListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic 2 | 3 | /** Listener for when an [TopicActivity] should route to a [ConceptCardFragment]. */ 4 | interface RouteToConceptCardListener { 5 | fun routeToConceptCard(skillId: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/lessons/TopicLessonsTitleViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.lessons 2 | 3 | import androidx.lifecycle.ViewModel 4 | 5 | /** [ViewModel] for title in [TopicLessonsFragment]. */ 6 | class TopicLessonsTitleViewModel : TopicLessonsItemViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/color/drawer_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/caching/TopicListToCache.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.caching 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** Corresponds to an injectable list of topic IDs to cache if [CacheAssetsLocaly] is true. */ 6 | @Qualifier annotation class TopicListToCache 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/drawer/RouteToProfileProgressListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.drawer 2 | 3 | /** Listener for when an activity should route to [ProfileProgressActivity]. */ 4 | interface RouteToProfileProgressListener { 5 | fun routeToProfileProgress(profileId: Int) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/help/faq/RouteToFAQSingleListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.help.faq 2 | 3 | /** Listener for when a selection should result to [FAQSingleActivity]. */ 4 | interface RouteToFAQSingleListener { 5 | fun onRouteToFAQSingle(question: String, answer: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/LoadReadingTextSizeListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | /** Listener for when an activity should load a [ReadingTextSizeFragment]. */ 4 | interface LoadReadingTextSizeListener { 5 | fun loadReadingTextSizeFragment(textSize: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/SubmitNavigationButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the answer submit button is clicked. */ 4 | interface SubmitNavigationButtonListener { 5 | fun onSubmitButtonClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/stopplaying/RestartPlayingSessionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.stopplaying 2 | 3 | /** Listener for when the current state playing session should be restarted. */ 4 | interface RestartPlayingSessionListener { 5 | fun restartSession() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profile/AdminAuthEnum.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profile 2 | 3 | /** Represents different activities from which AdminPinActivity can be opened. */ 4 | enum class AdminAuthEnum(val value: Int) { 5 | PROFILE_ADMIN_CONTROLS(0), 6 | PROFILE_ADD_PROFILE(1); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_language_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/reading_text_size_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/activity/ActivityModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.activity 2 | 3 | import dagger.Module 4 | import org.oppia.android.app.fragment.FragmentComponent 5 | 6 | /** Root activity module. */ 7 | @Module(subcomponents = [FragmentComponent::class]) 8 | class ActivityModule 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/LoadAudioLanguageListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | /** Listener for when an activity should load a [AudioLanguageFragment]. */ 4 | interface LoadAudioLanguageListListener { 5 | fun loadAudioLanguageFragment(audioLanguage: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/RouteToAppLanguageListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | /** Listener for when an activity should route to a [AppLanguageActivity]. */ 4 | interface RouteToAppLanguageListListener { 5 | fun routeAppLanguageList(appLanguage: String?) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profileprogress/RouteToOngoingTopicListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profileprogress 2 | 3 | /** Listener for when an activity should route to [OngoingTopicListActivity]. */ 4 | interface RouteToOngoingTopicListListener { 5 | fun routeToOngoingTopic() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/RouteToQuestionPlayerListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic 2 | 3 | /** Listener for when an activity should route to a Question Player. */ 4 | interface RouteToQuestionPlayerListener { 5 | fun routeToQuestionPlayer(skillIdList: ArrayList) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/revisioncard/ReturnToTopicClickListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.revisioncard 2 | 3 | /** Listener to route to [TopicActivity] when clicked on Return to Topic button. */ 4 | interface ReturnToTopicClickListener { 5 | fun onReturnToTopicClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/color-sw600dp-land/tab_icon_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color-sw600dp-port/tab_icon_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/profile_chooser_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/audio_language_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /utility/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Good morning, 5 | Good afternoon, 6 | Good evening, 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/PreviousNavigationButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the 'previous' navigation button is clicked. */ 4 | interface PreviousNavigationButtonListener { 5 | fun onPreviousButtonClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/RouteToStoryListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic 2 | 3 | /** Listener for when an [TopicActivity] should route to a [StoryActivity]. */ 4 | interface RouteToStoryListener { 5 | fun routeToStory(internalProfileId: Int, topicId: String, storyId: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/hints_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/hints_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/RouteToAudioLanguageListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | /** Listener for when an activity should route to a [AudioLanguageActivity]. */ 4 | interface RouteToAudioLanguageListListener { 5 | fun routeAudioLanguageList(audioLanguage: String?) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/RouteToReadingTextSizeListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | /** Listener for when an activity should route to a [ReadingTextSizeActivity]. */ 4 | interface RouteToReadingTextSizeListener { 5 | fun routeReadingTextSize(readingTextSize: String?) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/ContinueNavigationButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the non-interaction 'Continue' button is clicked. */ 4 | interface ContinueNavigationButtonListener { 5 | fun onContinueButtonClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profileprogress/RouteToCompletedStoryListListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profileprogress 2 | 3 | /** Listener for when an activity should route to [CompletedStoryListActivity]. */ 4 | interface RouteToCompletedStoryListListener { 5 | fun routeToCompletedStory() 6 | } 7 | -------------------------------------------------------------------------------- /domain/src/main/java/org/oppia/android/domain/oppialogger/ApplicationStartupListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.domain.oppialogger 2 | 3 | /** Listener that gets created at application startup. */ 4 | interface ApplicationStartupListener { 5 | 6 | /** Gets called at application creation. */ 7 | fun onCreate() 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/practice/practiceitemviewmodel/TopicPracticeFooterViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.practice.practiceitemviewmodel 2 | 3 | /** Footer view model for the recycler view in [TopicPracticeFragment]. */ 4 | class TopicPracticeFooterViewModel : TopicPracticeItemViewModel() 5 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/practice/practiceitemviewmodel/TopicPracticeHeaderViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.practice.practiceitemviewmodel 2 | 3 | /** Header view model for the recycler view in [TopicPracticeFragment]. */ 4 | class TopicPracticeHeaderViewModel : TopicPracticeItemViewModel() 5 | -------------------------------------------------------------------------------- /app/src/main/res/anim/shake.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/caching/CacheAssetsLocally.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.caching 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** 6 | * Corresponds to an injectable boolean indicating whether lesson assets should be cached locally. 7 | */ 8 | @Qualifier annotation class CacheAssetsLocally 9 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/threading/BlockingDispatcher.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.threading 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** Qualifier for injecting a coroutine executor that can be used for isolated, short blocking operations. */ 6 | @Qualifier annotation class BlockingDispatcher 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/StateKeyboardButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** This interface helps to know when a keyboard action done button has been clicked. */ 4 | interface StateKeyboardButtonListener { 5 | fun onEditorAction(actionCode: Int) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/threading/BackgroundDispatcher.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.threading 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** Qualifier for injecting a coroutine executor that can be used for executing arbitrary background tasks. */ 6 | @Qualifier annotation class BackgroundDispatcher 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/topiclist/AllTopicsViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home.topiclist 2 | 3 | import androidx.lifecycle.ViewModel 4 | import org.oppia.android.app.home.HomeItemViewModel 5 | 6 | /** [ViewModel] all topics text in [HomeFragment]. */ 7 | class AllTopicsViewModel : HomeItemViewModel() 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/shim/ViewBindingShimModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.shim 2 | 3 | import dagger.Binds 4 | import dagger.Module 5 | 6 | @Module 7 | interface ViewBindingShimModule { 8 | 9 | @Binds 10 | fun provideViewBindingShim(viewBindingShim: ViewBindingShimImpl): ViewBindingShim 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/reveal_solution_brown_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/reveal_solution_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/ViewModelManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/ViewsManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/ReturnToTopicNavigationButtonListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the 'return to topic' navigation button is clicked. */ 4 | interface ReturnToTopicNavigationButtonListener { 5 | fun onReturnToTopicButtonClicked() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/story/storyitemviewmodel/StoryHeaderViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.story.storyitemviewmodel 2 | 3 | /** Header view model for the recycler view in [StoryFragment]. */ 4 | class StoryHeaderViewModel( 5 | val completedChapters: Int, 6 | val totalChapters: Int 7 | ) : StoryItemViewModel() 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_up_audio.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/reveal_hint_button_blue_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/HomeItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** The root [ViewModel] for all individual items that may be displayed in home fragment recycler view. */ 6 | abstract class HomeItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/RouteToTopicPlayStoryListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home 2 | 3 | /** Listener for when an activity should route to a story-item in TopicPlay tab. */ 4 | interface RouteToTopicPlayStoryListener { 5 | fun routeToTopicPlayStory(internalProfileId: Int, topicId: String, storyId: String) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/stopplaying/StopStatePlayingSessionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.stopplaying 2 | 3 | /** Listener for when the current state playing session should be stop and the user navigated back to the topic. */ 4 | interface StopStatePlayingSessionListener { 5 | fun stopSession() 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/shim/IntentFactoryShimModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.shim 2 | 3 | import dagger.Binds 4 | import dagger.Module 5 | 6 | @Module 7 | interface IntentFactoryShimModule { 8 | 9 | @Binds 10 | fun provideIntentFactoryShim(intentFactoryShim: IntentFactoryShimImpl): IntentFactoryShim 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/story/StoryFragmentScroller.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.story 2 | 3 | interface StoryFragmentScroller { 4 | /** 5 | * Scrolls smoothly (with animation) to the specified vertical pixel position in 6 | * [StoryFragment]. 7 | * */ 8 | fun smoothScrollToPosition(position: Int) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/RouteToRevisionCardListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic 2 | 3 | /** Listener for when an [TopicActivity] should route to a [RevisionCardFragment]. */ 4 | interface RouteToRevisionCardListener { 5 | fun routeToRevisionCard(internalProfileId: Int, topicId: String, subtopicId: Int) 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/conceptcard/ConceptCardListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.conceptcard 2 | 3 | /** Allows parent activity to dismiss the [ConceptCardFragment] */ 4 | interface ConceptCardListener { 5 | /** Called when the concept card dialog should be dismissed. */ 6 | fun dismissConceptCard() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_down_audio.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/general_item_background_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/state_button_primary_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/ViewModelsManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/deprecation/DeprecationNoticeExitAppListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.deprecation 2 | 3 | /** Listener for when the app deprecation dialog is closed. */ 4 | interface DeprecationNoticeExitAppListener { 5 | /** Called when the deprecation dialog was closed. */ 6 | fun onCloseAppButtonClicked() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profileprogress/ProfilePictureDialogInterface.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profileprogress 2 | 3 | /** Interface to handle option selection in [ProfilePictureEditDialogFragment]. */ 4 | interface ProfilePictureDialogInterface { 5 | fun showProfilePicture() 6 | fun showGalleryForProfilePicture() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider_dotted.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/state_button_inactive_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/hintsandsolution/HintsAndSolutionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.hintsandsolution 2 | 3 | /** Allows parent activity to dismiss the [HintsAndSolutionFragmentt] */ 4 | interface HintsAndSolutionListener { 5 | /** Called when the hints and solution dialog should be dismissed. */ 6 | fun dismiss() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/revision/RevisionSubtopicSelector.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.revision 2 | 3 | import org.oppia.android.app.model.Subtopic 4 | 5 | /** Listener for when a subtopic is selected for revision. */ 6 | interface RevisionSubtopicSelector { 7 | fun onTopicRevisionSummaryClicked(subtopic: Subtopic) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/general_item_background_border_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selected_region_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/toolbar_drop_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/general_item_background_border_cyan.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_down_grey_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/help/faq/faqItemViewModel/FAQItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.help.faq.faqItemViewModel 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** Super-class for generalising different views for the recyclerView in [FAQFragment]. */ 6 | abstract class FAQItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radio_unchecked.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/thumbnail_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/story/storyitemviewmodel/StoryItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.story.storyitemviewmodel 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** Super-class for generalising different views for the recyclerView in [StoryFragment] */ 6 | abstract class StoryItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_rect_grey_border_white_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/state_button_blue_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/topiclist/TopicSummaryClickListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home.topiclist 2 | 3 | import org.oppia.android.app.model.TopicSummary 4 | 5 | /** Listener interface for when topic summaries are clicked in the UI. */ 6 | interface TopicSummaryClickListener { 7 | fun onTopicSummaryClicked(topicSummary: TopicSummary) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/lessons/StorySummarySelector.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.lessons 2 | 3 | import org.oppia.android.app.model.StorySummary 4 | 5 | /** Interface to transfer the selected story summary to [TopicLessonsFragmentPresenter]. */ 6 | interface StorySummarySelector { 7 | fun selectStorySummary(storySummary: StorySummary) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/feedback_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/home_test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /testing/src/main/java/org/oppia/android/testing/IsOnRobolectric.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.testing 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** 6 | * Qualifier that corresponds to an injectable boolean indicating whether the current test is 7 | * running on Robolectric (true) or Espresso (false). 8 | */ 9 | @Qualifier 10 | annotation class IsOnRobolectric 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profileprogress/ProfileProgressItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profileprogress 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** Super-class for generalising different views for the recyclerView in [ProfileProgressFragment] */ 6 | abstract class ProfileProgressItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughFragmentChangeListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough 2 | 3 | /** Listener for when an activity should change a fragment position. */ 4 | interface WalkthroughFragmentChangeListener { 5 | 6 | fun currentPage(walkthroughPage: Int) 7 | fun pageWithTopicId(walkthroughPage: Int, topicId: String) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit_text_black_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_right_grey_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_icon_grey_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_checkbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/recentlyplayed/OngoingStoryClickListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home.recentlyplayed 2 | 3 | import org.oppia.android.app.model.PromotedStory 4 | 5 | /** Listener interface for when ongoing story is clicked in the UI. */ 6 | interface OngoingStoryClickListener { 7 | fun onOngoingStoryClicked(promotedStory: PromotedStory) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/recentlyplayed/SectionTitleViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home.recentlyplayed 2 | 3 | import androidx.lifecycle.ViewModel 4 | 5 | /** [ViewModel] for section title in [RecentlyPlayedFragment]. */ 6 | class SectionTitleViewModel(val sectionTitleText: String, val isDividerVisible: Boolean) : 7 | RecentlyPlayedItemViewModel() 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/exploration/HintsAndSolutionExplorationManagerListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.exploration 2 | 3 | import org.oppia.android.app.model.State 4 | 5 | /** Listener for fetching current exploration state data. */ 6 | interface HintsAndSolutionExplorationManagerListener { 7 | fun onExplorationStateLoaded(state: State) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/PreviousResponsesHeaderClickListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when the previous response header is clicked. */ 4 | interface PreviousResponsesHeaderClickListener { 5 | /** Called when the user clicks on the response header. */ 6 | fun onResponsesHeaderClicked() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/shim/ViewComponentFactory.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.shim 2 | 3 | import android.view.View 4 | import org.oppia.android.app.view.ViewComponent 5 | 6 | interface ViewComponentFactory { 7 | /** 8 | * Returns a new [ViewComponent] for the specified view. 9 | */ 10 | fun createViewComponent(view: View): ViewComponent 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/lessons/TopicLessonsItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.lessons 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** The root [ViewModel] for all individual items that may be displayed in [TopicLessonsFragment] recycler view. */ 6 | abstract class TopicLessonsItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit_text_background_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/grey_card_rounded_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/previous_next_state_image_view_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/reading_text_size_seekbar_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/splash_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/topic_activity.xml: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /model/src/main/proto/example.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package model; 4 | 5 | option java_package = "org.oppia.android.app.model"; 6 | option java_multiple_files = true; 7 | 8 | message TestMessage { 9 | int32 version = 1; 10 | } 11 | 12 | message TestModel { 13 | oneof model_type { 14 | string str_value = 1; 15 | int32 int_value = 2; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/questionplayer/HintsAndSolutionQuestionManagerListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.questionplayer 2 | 3 | import org.oppia.android.app.model.State 4 | 5 | /** Listener for fetching current Question state data. */ 6 | interface HintsAndSolutionQuestionManagerListener { 7 | 8 | fun onQuestionStateLoaded(state: State) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/state_button_orange_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/downloads_tab_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/story_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/updates_tab_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/data/DataProvidersInjector.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.data 2 | 3 | /** Injector for [DataProviders]. Implemented by a generated Dagger application component. */ 4 | interface DataProvidersInjector { 5 | /** Returns the [DataProviders] corresponding to the current application context. */ 6 | fun getDataProviders(): DataProviders 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/administratorcontrols/administratorcontrolsitemviewmodel/AdministratorControlsGeneralViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.administratorcontrols.administratorcontrolsitemviewmodel 2 | 3 | /** [ViewModel] for the recycler view in [AdministratorControlsFragment]. */ 4 | class AdministratorControlsGeneralViewModel : AdministratorControlsItemViewModel() 5 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/onboarding/OnboardingNavigationListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.onboarding 2 | 3 | /** Listener for buttons in OnboardingFragment */ 4 | interface OnboardingNavigationListener { 5 | 6 | /** Skips onboarding slide. */ 7 | fun clickOnSkip() 8 | 9 | /** Moves the user to the next onboarding slide. */ 10 | fun clickOnNext() 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_rounded_rect_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /domain/src/main/java/org/oppia/android/domain/classify/rules/RuleClassifierProvider.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.domain.classify.rules 2 | 3 | import org.oppia.android.domain.classify.RuleClassifier 4 | 5 | /** Provider for [RuleClassifier]s. */ 6 | interface RuleClassifierProvider { 7 | /** Returns a new [RuleClassifier]. */ 8 | fun createRuleClassifier(): RuleClassifier 9 | } 10 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/parser/GlideImageLoaderModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.parser 2 | 3 | import dagger.Binds 4 | import dagger.Module 5 | 6 | /** Provides image loading dependencies. */ 7 | @Module 8 | abstract class GlideImageLoaderModule { 9 | 10 | @Binds 11 | abstract fun provideGlideImageLoader(impl: GlideImageLoader): ImageLoader 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profile/ProfileRouteDialogInterface.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profile 2 | 3 | /** Interface to route dialogs in user Forgot Password flow. */ 4 | interface ProfileRouteDialogInterface { 5 | /** Shows [ResetPinDialogFragment]. */ 6 | fun routeToResetPinDialog() 7 | 8 | /** Shows Success Dialog. */ 9 | fun routeToSuccessDialog() 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/topiclist/WalkthroughTopicItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough.topiclist 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** Super-class for generalising different views for the recyclerView in [WalkthroughTopicListFragment] */ 6 | abstract class WalkthroughTopicItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_up_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/top_rounded_rect_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/sharedTest/java/org/oppia/android/app/utility/MockitoKotlinHelper.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.utility 2 | 3 | import org.mockito.ArgumentCaptor 4 | 5 | /** 6 | * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException 7 | * when null is returned. 8 | */ 9 | fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture() 10 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/logging/LogLevel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.logging 2 | 3 | import android.util.Log 4 | 5 | /** Corresponds to different severities of logs. */ 6 | enum class LogLevel constructor(internal val logLevel: Int) { 7 | VERBOSE(Log.VERBOSE), 8 | DEBUG(Log.DEBUG), 9 | INFO(Log.INFO), 10 | WARNING(Log.WARN), 11 | ERROR(Log.ERROR) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/hintsandsolution/RevealSolutionInterface.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.hintsandsolution 2 | 3 | /** Interface to check the preference regarding alert for [HintsAndSolutionDialogFragment]. */ 4 | interface RevealSolutionInterface { 5 | /** 6 | * Show solution and save preference do not show dialog again. 7 | */ 8 | fun revealSolution() 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_yellow_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_download_primary_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_arrow_up_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/hintsandsolution/HintsAndSolutionItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.hintsandsolution 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** The root [ViewModel] for all individual items that may be displayed in [HintsAndSolutionDialogFragment] recycler view. */ 6 | abstract class HintsAndSolutionItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/lessons/ChapterSummarySelector.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.lessons 2 | 3 | import org.oppia.android.app.model.ChapterSummary 4 | 5 | /** Interface to transfer the selected chapter summary to [TopicLessonsFragmentPresenter]. */ 6 | interface ChapterSummarySelector { 7 | fun selectChapterSummary(storyId: String, chapterSummary: ChapterSummary) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/practice/practiceitemviewmodel/TopicPracticeSubtopicViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.practice.practiceitemviewmodel 2 | 3 | import org.oppia.android.app.model.Subtopic 4 | 5 | /** Subtopic view model for the recycler view in [TopicPracticeFragment]. */ 6 | class TopicPracticeSubtopicViewModel(val subtopic: Subtopic) : TopicPracticeItemViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/admin_controls_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_left_rounded_rect_primary_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_rounded_rect_white_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_arrow_down_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/profile_chooser_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/submitted_answer_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_white_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/my_downloads_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/onboarding_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/topic_revision_test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/WelcomeViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home 2 | 3 | import androidx.databinding.ObservableField 4 | import androidx.lifecycle.ViewModel 5 | 6 | /** [ViewModel] for welcome text in home screen. */ 7 | class WelcomeViewModel : HomeItemViewModel() { 8 | val profileName = ObservableField("") 9 | val greeting = ObservableField("") 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/practice/practiceitemviewmodel/TopicPracticeItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.practice.practiceitemviewmodel 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** Super-class for generalising different views for the recyclerView in [TopicPracticeFragment] */ 6 | abstract class TopicPracticeItemViewModel : ObservableViewModel() 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dashed_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/audio_fragment_test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/profile_chooser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_faq_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/RouteToExplorationListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home 2 | 3 | /** Listener for when an activity should route to a exploration. */ 4 | interface RouteToExplorationListener { 5 | fun routeToExploration( 6 | internalProfileId: Int, 7 | topicId: String, 8 | storyId: String, 9 | explorationId: String, 10 | backflowScreen: Int? 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughPageChanger.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough 2 | 3 | /** 4 | * Listener for when an activity should change pages during the app walkthrough flow's welcome 5 | * fragment. 6 | */ 7 | interface WalkthroughPageChanger { 8 | 9 | /** Navigates user to the next page in a walkthrough flow's welcome fragment. */ 10 | fun changePage() 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/audio_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/content_blue_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/seekbar_style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/data/DataProvidersInjectorProvider.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.data 2 | 3 | /** Provider for [DataProvidersInjector]s. To be implemented by the application class. */ 4 | interface DataProvidersInjectorProvider { 5 | /** Returns the [DataProvidersInjector] corresponding to the current application context. */ 6 | fun getDataProvidersInjector(): DataProvidersInjector 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/hintsandsolution/DelayShowInitialHintMillis.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.hintsandsolution 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** 6 | * Qualifier for a [Long] representing how many milliseconds to initially wait before showing hints 7 | * to potentially stuck users. 8 | */ 9 | @Qualifier 10 | annotation class DelayShowInitialHintMillis 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/lessons/ExpandedChapterListIndexListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.lessons 2 | 3 | /** 4 | * Interface to keep track of story-index for which ChapterList is visible/expanded. 5 | * This mainly helps to maintain the state during configuration change. 6 | */ 7 | interface ExpandedChapterListIndexListener { 8 | fun onExpandListIconClicked(index: Int?) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_blue_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/interaction_read_only_white_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/profile_test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/recently_played_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/test_text_view_for_int_no_data_binding.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/test_text_view_for_string_no_data_binding.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_administrator_controls_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/RouteToHintsAndSolutionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | /** Listener for when an [ExplorationActivity] should route to a [HintsAndSolution]. */ 4 | interface RouteToHintsAndSolutionListener { 5 | fun routeToHintsAndSolution( 6 | id: String, 7 | newAvailableHintIndex: Int, 8 | allHintsExhausted: Boolean 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/ongoing_topic_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 72dp 4 | 72dp 5 | 72dp 6 | 36dp 7 | 72dp 8 | 36dp 9 | 10 | -------------------------------------------------------------------------------- /tools/android/BUILD.bazel: -------------------------------------------------------------------------------- 1 | ''' 2 | Imports required data-binding annotation processor. 3 | ''' 4 | java_plugin( 5 | name = "compiler_annotation_processor", 6 | processor_class = "android.databinding.annotationprocessor.ProcessDataBinding", 7 | visibility = ["//visibility:public"], 8 | deps = [ 9 | "@bazel_tools//src/tools/android/java/com/google/devtools/build/android:all_android_tools", 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.home.recentlyplayed 2 | 3 | import org.oppia.android.app.viewmodel.ObservableViewModel 4 | 5 | /** 6 | * The root [ObservableViewModel] for all individual items that may be displayed in recently-played 7 | * fragment recycler view. 8 | */ 9 | abstract class RecentlyPlayedItemViewModel : ObservableViewModel() 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_box_unchecked.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/ongoing_topic_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/completed_story_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 96dp 4 | 96dp 5 | 96dp 6 | 64dp 7 | 96dp 8 | 64dp 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit_text_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/completed_story_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/test_html_parser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/test_url_parser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp-port/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 120dp 4 | 120dp 5 | 120dp 6 | 60dp 7 | 120dp 8 | 60dp 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/add_profile_edit_text_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough.end 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.viewmodel.ObservableViewModel 5 | 6 | /** [ViewModel] for displaying topic name in walkthrough final fragment. */ 7 | class WalkthroughFinalViewModel : ObservableViewModel() { 8 | val topicTitle = ObservableField("") 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_oppia_dark_blue_24dp.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_forward_oppia_dark_blue_24dp.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/ContentViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.itemviewmodel 2 | 3 | /** [StateItemViewModel] for content-card state. */ 4 | class ContentViewModel( 5 | val htmlContent: CharSequence, 6 | val gcsEntityId: String, 7 | val hasConversationView: Boolean, 8 | val isSplitView: Boolean, 9 | val supportsConceptCards: Boolean 10 | ) : StateItemViewModel(ViewType.CONTENT) 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FeedbackViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.itemviewmodel 2 | 3 | /** [StateItemViewModel] for feedback blurbs. */ 4 | class FeedbackViewModel( 5 | val htmlContent: CharSequence, 6 | val gcsEntityId: String, 7 | val hasConversationView: Boolean, 8 | val isSplitView: Boolean, 9 | val supportsConceptCards: Boolean 10 | ) : StateItemViewModel(ViewType.FEEDBACK) 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/drag_drop_test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /testing/src/main/java/org/oppia/android/testing/TestDispatchers.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.testing 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** Corresponds to the [TestCoroutineDispatcher] that's used for background task execution. */ 6 | @Qualifier annotation class BackgroundTestDispatcher 7 | 8 | /** Corresponds to the [TestCoroutineDispatcher] that's used for blocking task execution. */ 9 | @Qualifier annotation class BlockingTestDispatcher 10 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/gcsresource/GcsResouceAnnotations.kt: -------------------------------------------------------------------------------- 1 | // ktlint-disable filename 2 | package org.oppia.android.util.gcsresource 3 | 4 | import javax.inject.Qualifier 5 | 6 | /** Corresponds to the default GCS resource bucket name. */ 7 | @Qualifier annotation class DefaultResourceBucketName 8 | 9 | /** Corresponds to the GCS resource bucket name for questions. */ 10 | @Qualifier annotation class QuestionResourceBucketName 11 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/parser/ImageAssetFetcher.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.parser 2 | 3 | /** Fetcher for image assets from the app's local asset repository. */ 4 | internal interface ImageAssetFetcher { 5 | /** Fetches an image asset. Must be called on a background thread. */ 6 | fun fetchImage(): ByteArray 7 | 8 | /** Returns the identifier corresponding to this image. */ 9 | fun getImageIdentifier(): String 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | /.idea/jarRepositories.xml 11 | /.idea/vcs.xml 12 | app/build 13 | data/build 14 | domain/build 15 | model/build 16 | testing/build 17 | utility/build 18 | .DS_Store 19 | /build 20 | /captures 21 | .externalNativeBuild 22 | gradle 23 | gradlew 24 | gradlew.bat 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/hintsandsolution/DelayShowAdditionalHintsMillis.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.hintsandsolution 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** 6 | * Qualifier for a [Long] representing how many milliseconds to wait before showing subsequent hints 7 | * if the user has no activity other than seeing the previous hint. 8 | */ 9 | @Qualifier 10 | annotation class DelayShowAdditionalHintsMillis 11 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/start_button_transparent_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/topiclist/topiclistviewmodel/WalkthroughTopicHeaderViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough.topiclist.topiclistviewmodel 2 | 3 | import androidx.lifecycle.ViewModel 4 | import org.oppia.android.app.walkthrough.topiclist.WalkthroughTopicItemViewModel 5 | 6 | /** [ViewModel] What do want to learn text in [WalkthroughTopicListFragment]. */ 7 | class WalkthroughTopicHeaderViewModel : WalkthroughTopicItemViewModel() 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_circle_filled_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseLogUploaderModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.logging.firebase 2 | 3 | import dagger.Binds 4 | import dagger.Module 5 | import org.oppia.android.util.logging.LogUploader 6 | 7 | /** Provides Log Uploader related dependencies. */ 8 | @Module 9 | interface FirebaseLogUploaderModule { 10 | @Binds 11 | fun bindFirebaseLogUploader(firebaseLogUploader: FirebaseLogUploader): LogUploader 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/welcome/WalkthroughWelcomeViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough.welcome 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.viewmodel.ObservableViewModel 5 | 6 | /** [ViewModel] for displaying user profile details in walkthrough welcome fragment. */ 7 | class WalkthroughWelcomeViewModel : ObservableViewModel() { 8 | val profileName = ObservableField("") 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_circle_primary_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder_open_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /utility/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4dp 4 | 16dp 5 | 2dp 6 | 24dp 7 | 24dp 8 | 48dp 9 | 200dp 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/options/OptionsItemViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.options 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.viewmodel.ObservableViewModel 5 | 6 | /** Option items view model for the recyclerView in [OptionsFragment] */ 7 | abstract class OptionsItemViewModel : ObservableViewModel() { 8 | val isMultipane = ObservableField(false) 9 | val itemIndex = ObservableField() 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit_text_red_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_box_checked.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/listener/ShowHintAvailabilityListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.listener 2 | 3 | import org.oppia.android.app.model.HelpIndex 4 | 5 | /** Callback interface for when hints can be made available to the learner. */ 6 | interface ShowHintAvailabilityListener { 7 | /** Called when a hint is available to be shown, or null if all hints have been revealed. */ 8 | fun onHintAvailable(helpIndex: HelpIndex) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_available_offline_primary_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_circle_filled_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_reading_options.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeParamSpec.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for ParamSpec model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/param_domain.py#L47 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeParamSpec( 12 | 13 | @Json(name = "obj_type") val objType: String? 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough 2 | 3 | import androidx.databinding.ObservableField 4 | import androidx.lifecycle.ViewModel 5 | import org.oppia.android.app.viewmodel.ObservableViewModel 6 | import javax.inject.Inject 7 | 8 | /** [ViewModel] for [WalkthroughActivity]. */ 9 | class WalkthroughViewModel @Inject constructor() : ObservableViewModel() { 10 | val currentProgress = ObservableField(0) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_available_offline_icon_white_12dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_icon_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeHint.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for Hint model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L163 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeHint( 12 | 13 | @Json(name = "hint_content") val hintContent: GaeSubtitledHtml? 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /domain/src/main/java/org/oppia/android/domain/onboarding/ExpirationMetaDataRetrieverModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.domain.onboarding 2 | 3 | import dagger.Binds 4 | import dagger.Module 5 | 6 | /** Module for providing a real [ExpirationMetaDataRetriever] implementation. */ 7 | @Module 8 | interface ExpirationMetaDataRetrieverModule { 9 | @Binds 10 | fun bindExpirationMetadataRetriever( 11 | impl: ExpirationMetaDataRetrieverImpl 12 | ): ExpirationMetaDataRetriever 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profileprogress/ProfilePictureActivityViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profileprogress 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.model.ProfileAvatar 5 | import org.oppia.android.app.viewmodel.ObservableViewModel 6 | 7 | /** [ViewModel] for displaying user image in Activity. */ 8 | class ProfilePictureActivityViewModel : ObservableViewModel() { 9 | val profileAvatar = ObservableField() 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/story/ExplorationSelectionListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.story 2 | 3 | /** Listener for cases when the user taps on a specific chapter/exploration to play. */ 4 | interface ExplorationSelectionListener { 5 | /** Called when an exploration has been selected by the user. */ 6 | fun selectExploration( 7 | internalProfileId: Int, 8 | topicId: String, 9 | storyId: String, 10 | explorationId: String, 11 | backflowId: Int? 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/api/TopicService.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.api 2 | 3 | import org.oppia.android.data.backends.gae.model.GaeTopic 4 | import retrofit2.Call 5 | import retrofit2.http.GET 6 | import retrofit2.http.Path 7 | 8 | /** Service that provides access to topic endpoints. */ 9 | interface TopicService { 10 | 11 | @GET("topic_data_handler/{topic_name}") 12 | fun getTopicByName(@Path("topic_name") topicName: String): Call 13 | } 14 | -------------------------------------------------------------------------------- /model/src/main/proto/subtitled_unicode.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package model; 4 | 5 | option java_package = "org.oppia.android.app.model"; 6 | option java_multiple_files = true; 7 | 8 | // Corresponds to a textual value that can be translated or spoken. 9 | message SubtitledUnicode { 10 | // Textual value which will be shown to the user and/or spoken. 11 | string unicode_str = 1; 12 | // Content ID associating the text with translations or voiceovers. 13 | string content_id = 2; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/application/ApplicationInjector.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.application 2 | 3 | import org.oppia.android.app.profile.ProfileInputView 4 | import org.oppia.android.util.data.DataProvidersInjector 5 | 6 | /** Injector for application-level dependencies that can't be directly injected where needed. */ 7 | interface ApplicationInjector : DataProvidersInjector { 8 | 9 | // TODO(#1619): Remove post-modularization. 10 | fun inject(profileInputView: ProfileInputView) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/recyclerview/OnDragEndedListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.recyclerview 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | 5 | /** Listener when drag is end for an item of [RecyclerView] that have a [DragAndDropItemFacilitator]. */ 6 | interface OnDragEndedListener { 7 | /** 8 | * @param adapter the adapter of the [RecyclerView] whose item was recently dragged 9 | */ 10 | fun onDragEnded(adapter: RecyclerView.Adapter) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughActivityListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.walkthrough 2 | 3 | /** Listener for when an activity should move to a previous page during a walkthrough flow. */ 4 | interface WalkthroughActivityListener { 5 | 6 | /** 7 | * Navigates user to the previous page in a [WalkthroughActivity]. 8 | * 9 | * @param currentProgress Integer describing the current page a user is on. 10 | */ 11 | fun moveToPreviousPage(currentProgress: Int) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_options_icon_grey_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeQuestionPlayer.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class model for Questions List 8 | * https://github.com/oppia/oppia/blob/b33aa9/core/controllers/reader.py#L1008 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeQuestionPlayer( 12 | 13 | @Json(name = "question_dicts") val questions: List? 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /domain/src/main/java/org/oppia/android/domain/classify/RuleClassifier.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.domain.classify 2 | 3 | import org.oppia.android.app.model.InteractionObject 4 | 5 | /** An answer classifier for a specific interaction rule. */ 6 | interface RuleClassifier { 7 | /** 8 | * Returns whether the specified answer matches the rule's parameter inputs per this rule's classification strategy. 9 | */ 10 | fun matches(answer: InteractionObject, inputs: Map): Boolean 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/hintsandsolution/DelayShowAdditionalHintsFromWrongAnswerMillis.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.hintsandsolution 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** 6 | * Qualifier for a [Long] representing how many milliseconds to wait before showing hints after the 7 | * user submits one wrong answer (subsequent wrong answers will immediately show the next hint). 8 | */ 9 | @Qualifier 10 | annotation class DelayShowAdditionalHintsFromWrongAnswerMillis 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_primary.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/parser/ImageParsingAnnotations.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.parser 2 | 3 | import javax.inject.Qualifier 4 | 5 | /** Corresponds to the default Gcs Prefix. */ 6 | @Qualifier annotation class DefaultGcsPrefix 7 | 8 | /** Corresponds to the default Image Download Url Template. */ 9 | @Qualifier annotation class ImageDownloadUrlTemplate 10 | 11 | /** Corresponds to the default Thumbnail Download Url Template. */ 12 | @Qualifier annotation class ThumbnailDownloadUrlTemplate 13 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/ReplayButtonViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.player.state.itemviewmodel 2 | 3 | import org.oppia.android.app.player.state.listener.ReplayButtonListener 4 | 5 | /** [StateItemViewModel] for replaying the current lesson experience. */ 6 | class ReplayButtonViewModel( 7 | val hasConversationView: Boolean, 8 | val replayButtonListener: ReplayButtonListener, 9 | val isSplitView: Boolean 10 | ) : StateItemViewModel(ViewType.REPLAY_NAVIGATION_BUTTON) 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_audio_streaming_on_24dp.xml: -------------------------------------------------------------------------------- 1 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/application/ApplicationStartupListenerModule.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.application 2 | 3 | import dagger.Module 4 | import dagger.multibindings.Multibinds 5 | import org.oppia.android.domain.oppialogger.ApplicationStartupListener 6 | 7 | /** Binds multiple dependencies that implement [ApplicationStartupListener] into a set. */ 8 | @Module 9 | interface ApplicationStartupListenerModule { 10 | 11 | @Multibinds 12 | fun bindStartupListenerSet(): Set 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_rect_grey_border_gradient_white_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_icon_gray_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeConceptCard.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for ConceptCard model 8 | * https://github.com/oppia/oppia/blob/b33aa9/core/controllers/concept_card_viewer.py#L30 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeConceptCard( 12 | 13 | @Json(name = "concept_card_dicts") val conceptCardDicts: List? 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/api/ClassroomService.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.api 2 | 3 | import org.oppia.android.data.backends.gae.model.GaeClassroom 4 | import retrofit2.Call 5 | import retrofit2.http.GET 6 | import retrofit2.http.Path 7 | 8 | /** Service that provides access to classroom endpoints. */ 9 | interface ClassroomService { 10 | 11 | @GET("classroom_data_handler/{classroom_name}") 12 | fun getClassroom(@Path("classroom_name") classroomName: String): Call 13 | } 14 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/logging/EventLogger.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.logging 2 | 3 | import org.oppia.android.app.model.EventLog 4 | 5 | /** 6 | * Logger for tracking events. 7 | * Note that this utility may later upload them to remote services 8 | */ 9 | interface EventLogger { 10 | 11 | /** 12 | * Logs events to remote services. 13 | * 14 | * @param eventLog: refers to the log object which contains all the relevant data to be reported. 15 | */ 16 | fun logEvent(eventLog: EventLog) 17 | } 18 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeRuleSpec.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for RuleSpec model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L1113 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeRuleSpec( 12 | 13 | @Json(name = "inputs") val inputs: Map?, 14 | @Json(name = "rule_type") val ruleType: String? 15 | 16 | ) 17 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeSubtitledHtml.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for SubtitledHtml model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L1243 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeSubtitledHtml( 12 | 13 | @Json(name = "html") val html: String?, 14 | @Json(name = "content_id") val contentId: String? 15 | 16 | ) 17 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeClassroom.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for Classroom model containing full information 8 | * https://github.com/oppia/oppia/blob/77d6fd/core/controllers/classroom.py#L49 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeClassroom( 12 | 13 | @Json(name = "topic_summary_dicts") val topicSummaryDicts: List? 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /domain/src/main/java/org/oppia/android/domain/question/QuestionTrainingConstantsProvider.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.domain.question 2 | 3 | import javax.inject.Inject 4 | import javax.inject.Singleton 5 | 6 | const val QUESTION_COUNT_PER_TRAINING_SESSION = 10 7 | 8 | /** Provider to return any constants required during the training session. */ 9 | @Singleton 10 | class QuestionTrainingConstantsProvider @Inject constructor() { 11 | fun getQuestionCountPerTrainingSession(): Int { 12 | return QUESTION_COUNT_PER_TRAINING_SESSION 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /utility/src/main/java/org/oppia/android/util/accessibility/FakeAccessibilityManager.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.util.accessibility 2 | 3 | import javax.inject.Inject 4 | import javax.inject.Singleton 5 | 6 | @Singleton 7 | class FakeAccessibilityManager @Inject constructor() : CustomAccessibilityManager { 8 | private var talkbackEnabled = false 9 | 10 | override fun isScreenReaderEnabled(): Boolean { 11 | return talkbackEnabled 12 | } 13 | 14 | fun setTalkbackEnabled(status: Boolean) { 15 | talkbackEnabled = status 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/hintsandsolution/RevealHintListener.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.hintsandsolution 2 | 3 | /** Interface to check the preference regarding alert for [HintsAndSolutionDialogFragment]. */ 4 | interface RevealHintListener { 5 | /** 6 | * If saveUserChoice is true, show solution and save preference do not show dialog again. 7 | * If saveUserChoice is false, show solution and do not save preference and show this dialog next time too. 8 | */ 9 | fun revealHint(saveUserChoice: Boolean, hintIndex: Int) 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profile/ResetPinViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profile 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.fragment.FragmentScope 5 | import org.oppia.android.app.viewmodel.ObservableViewModel 6 | import javax.inject.Inject 7 | 8 | /** The ViewModel for [ResetPinDialogFragment]. */ 9 | @FragmentScope 10 | class ResetPinViewModel @Inject constructor() : ObservableViewModel() { 11 | val inputPin = ObservableField("") 12 | val errorMessage = ObservableField("") 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/application/ActivityComponentFactory.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.application 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import org.oppia.android.app.activity.ActivityComponent 5 | 6 | interface ActivityComponentFactory { 7 | /** 8 | * Returns a new [ActivityComponent] for the specified activity. This should only be used by 9 | * [org.oppia.android.app.activity.InjectableAppCompatActivity]. 10 | */ 11 | fun createActivityComponent(activity: AppCompatActivity): ActivityComponent 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFooterViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.drawer 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.viewmodel.ObservableViewModel 5 | import javax.inject.Inject 6 | 7 | /** [ViewModel] for displaying Administrator Controls option. */ 8 | class NavigationDrawerFooterViewModel @Inject constructor() : ObservableViewModel() { 9 | val isAdmin = ObservableField(false) 10 | val isAdministratorControlsSelected = ObservableField(false) 11 | } 12 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeRecordedVoiceovers.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for RecordedVoiceovers model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L967 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeRecordedVoiceovers( 12 | 13 | @Json(name = "voiceovers_mapping") val voiceoversMapping: Map>? 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_merge_icon_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/profile/AdminSettingsViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.profile 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.fragment.FragmentScope 5 | import org.oppia.android.app.viewmodel.ObservableViewModel 6 | import javax.inject.Inject 7 | 8 | /** The ViewModel for [AdminSettingsDialogFragment]. */ 9 | @FragmentScope 10 | class AdminSettingsViewModel @Inject constructor() : ObservableViewModel() { 11 | val inputPin = ObservableField("") 12 | val errorMessage = ObservableField("") 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/topic/lessons/StorySummaryViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.topic.lessons 2 | 3 | import androidx.lifecycle.ViewModel 4 | import org.oppia.android.app.model.StorySummary 5 | 6 | /** [ViewModel] for displaying a story summary. */ 7 | class StorySummaryViewModel( 8 | val storySummary: StorySummary, 9 | private val storySummarySelector: StorySummarySelector 10 | ) : TopicLessonsItemViewModel() { 11 | 12 | fun clickOnStorySummaryTitle() { 13 | storySummarySelector.selectStorySummary(storySummary) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_search_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/api/ConceptCardService.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.api 2 | 3 | import org.oppia.android.data.backends.gae.model.GaeConceptCard 4 | import retrofit2.Call 5 | import retrofit2.http.GET 6 | import retrofit2.http.Query 7 | 8 | /** Service that provides access to concept-card endpoints. */ 9 | interface ConceptCardService { 10 | 11 | @GET("concept_card_handler/{comma_separated_skill_ids}") 12 | fun getSkillContents(@Query("comma_separated_skill_ids") skillIds: String): Call 13 | } 14 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeCustomizationArgs.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for CustomizationArgs model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/param_domain.py#L99 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeCustomizationArgs( 12 | 13 | @Json(name = "parse_with_jinja") val isParseWithJinja: Boolean?, 14 | @Json(name = "value") val value: Any? 15 | 16 | ) 17 | -------------------------------------------------------------------------------- /data/src/main/java/org/oppia/android/data/backends/gae/model/GaeWrittenTranslation.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.data.backends.gae.model 2 | 3 | import com.squareup.moshi.Json 4 | import com.squareup.moshi.JsonClass 5 | 6 | /** 7 | * Data class for WrittenTranslation model 8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L749 9 | */ 10 | @JsonClass(generateAdapter = true) 11 | data class GaeWrittenTranslation( 12 | 13 | @Json(name = "html") val html: String?, 14 | @Json(name = "needs_update") val isUpdateNeeded: Boolean? 15 | 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/testing/HomeTestActivityPresenter.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.testing 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import org.oppia.android.R 5 | import org.oppia.android.app.activity.ActivityScope 6 | import javax.inject.Inject 7 | 8 | /** The presenter for [HomeTestActivity]. */ 9 | @ActivityScope 10 | class HomeTestActivityPresenter @Inject constructor( 11 | private val activity: AppCompatActivity 12 | ) { 13 | fun handleOnCreate() { 14 | activity.setContentView(R.layout.home_test_activity) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /domain/src/main/assets/GJ2rLXRKD5hw_3.json: -------------------------------------------------------------------------------- 1 | { 2 | "subtopic_title":"Mixed Numbers", 3 | "topic_id": "GJ2rLXRKD5hw", 4 | "page_contents":{ 5 | "subtitled_html":{ 6 | "content_id":"content", 7 | "html":"\u003cp\u003eDescription of subtopic is here.\u003c/p\u003e" 8 | }, 9 | "written_translations":{ 10 | "translations_mapping":{ 11 | "content":{ 12 | 13 | } 14 | } 15 | }, 16 | "recorded_voiceovers":{ 17 | "voiceovers_mapping":{ 18 | "content":{ 19 | } 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /domain/src/main/assets/GJ2rLXRKD5hw_4.json: -------------------------------------------------------------------------------- 1 | { 2 | "subtopic_title":"Adding Fractions", 3 | "topic_id": "GJ2rLXRKD5hw", 4 | "page_contents":{ 5 | "subtitled_html":{ 6 | "content_id":"content", 7 | "html":"\u003cp\u003eDescription of subtopic is here.\u003c/p\u003e" 8 | }, 9 | "written_translations":{ 10 | "translations_mapping":{ 11 | "content":{ 12 | 13 | } 14 | } 15 | }, 16 | "recorded_voiceovers":{ 17 | "voiceovers_mapping":{ 18 | "content":{ 19 | } 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameViewModel.kt: -------------------------------------------------------------------------------- 1 | package org.oppia.android.app.settings.profile 2 | 3 | import androidx.databinding.ObservableField 4 | import org.oppia.android.app.activity.ActivityScope 5 | import org.oppia.android.app.viewmodel.ObservableViewModel 6 | import javax.inject.Inject 7 | 8 | /** The ViewModel for [ProfileRenameActivity]. */ 9 | @ActivityScope 10 | class ProfileRenameViewModel @Inject constructor() : ObservableViewModel() { 11 | val inputName = ObservableField("") 12 | val nameErrorMsg = ObservableField("") 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/exploration_test_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |