├── 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 |
4 |
5 |
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 |
8 |
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 |
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 |
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 |
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 |
14 |
15 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeSubtopic.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 Subtopic model
8 | * https://github.com/oppia/oppia/blob/b33aa9/core/controllers/subtopic_viewer.py#L31
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeSubtopic(
12 |
13 | @Json(name = "subtopic_title") val subtopicTitle: String?,
14 | @Json(name = "page_contents") val pageContents: GaeSubtopicPageContents?
15 |
16 | )
17 |
--------------------------------------------------------------------------------
/domain/src/main/assets/GJ2rLXRKD5hw_2.json:
--------------------------------------------------------------------------------
1 | {
2 | "subtopic_title":"Fractions of a group",
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 |
--------------------------------------------------------------------------------
/model/src/main/proto/translation.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 TranslationMapping {
9 | // Mapping from language_code to Translation
10 | map translation_mapping = 1;
11 | }
12 |
13 | // Structure for a single translation
14 | // Maps from: data/src/main/java/org/oppia/android/android/data/backends/gae/model/GaeWrittenTranslation.kt
15 | message Translation {
16 | string html = 1;
17 | bool needs_update = 2;
18 | }
19 |
--------------------------------------------------------------------------------
/testing/src/main/java/org/oppia/android/testing/TestAccessibilityModule.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.testing
2 |
3 | import dagger.Binds
4 | import dagger.Module
5 | import org.oppia.android.util.accessibility.CustomAccessibilityManager
6 | import org.oppia.android.util.accessibility.FakeAccessibilityManager
7 |
8 | /** Provides fake accessible status for testing. */
9 | @Module
10 | interface TestAccessibilityModule {
11 |
12 | @Binds
13 | fun bindFakeAccessibilityManager(
14 | fakeAccessibilityManager: FakeAccessibilityManager
15 | ): CustomAccessibilityManager
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_refresh_white_24dp.xml:
--------------------------------------------------------------------------------
1 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/api/ExplorationService.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.data.backends.gae.api
2 |
3 | import org.oppia.android.data.backends.gae.model.GaeExplorationContainer
4 | import retrofit2.Call
5 | import retrofit2.http.GET
6 | import retrofit2.http.Path
7 |
8 | /** Service that provides access to exploration endpoints. */
9 | interface ExplorationService {
10 |
11 | @GET("explorehandler/init/{exploration_id}")
12 | fun getExplorationById(
13 | @Path("exploration_id") explorationId: String
14 | ): Call
15 | }
16 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeWrittenTranslations.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 WrittenTranslations model
8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L803
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeWrittenTranslations(
12 |
13 | @Json(name = "translations_mapping")
14 | val translationsMapping: Map>?
15 |
16 | )
17 |
--------------------------------------------------------------------------------
/domain/src/main/java/org/oppia/android/domain/onboarding/testing/ExpirationMetaDataRetrieverTestModule.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.domain.onboarding.testing
2 |
3 | import dagger.Binds
4 | import dagger.Module
5 | import org.oppia.android.domain.onboarding.ExpirationMetaDataRetriever
6 |
7 | /** Module for providing a fake [ExpirationMetaDataRetriever] implementation. */
8 | @Module
9 | interface ExpirationMetaDataRetrieverTestModule {
10 | @Binds
11 | fun bindExpirationMetadataRetriever(
12 | impl: FakeExpirationMetaDataRetriever
13 | ): ExpirationMetaDataRetriever
14 | }
15 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/gcsresource/GcsResourceModule.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.gcsresource
2 |
3 | import dagger.Module
4 | import dagger.Provides
5 |
6 | /** Provides GCS resource bucket names. */
7 | @Module
8 | class GcsResourceModule {
9 | @Provides
10 | @DefaultResourceBucketName
11 | fun provideDefaultGcsResource(): String {
12 | return "oppiaserver-resources"
13 | }
14 |
15 | @Provides
16 | @QuestionResourceBucketName
17 | fun provideQuestionResourceBucketName(): String {
18 | return "oppiatestserver-resources"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_edit.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_show_eye_icon.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-land/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 3
4 | 3
5 | 2
6 | 3
7 | 3
8 | 3
9 | 3
10 | 3
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/utility/RatioExtensions.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.utility
2 |
3 | import android.content.Context
4 | import org.oppia.android.R
5 | import org.oppia.android.app.model.RatioExpression
6 |
7 | /**
8 | * Returns an accessibly readable string representation of this [RatioExpression].
9 | * E.g. [1, 2, 3] will yield to 1 to 2 to 3
10 | */
11 | fun RatioExpression.toAccessibleAnswerString(context: Context): String {
12 | return ratioComponentList.joinToString(
13 | context.getString(R.string.ratio_content_description_separator)
14 | )
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_edit_18.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/model/src/main/proto/voiceover.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 VoiceoverMapping {
9 | // Mapping from language_code to a VoiceOver
10 | map voiceover_mapping = 1;
11 | }
12 |
13 | // Structure for a single voiceover
14 | // Maps from: data/src/main/java/org/oppia/android/android/data/backends/gae/model/GaeVoiceover.kt
15 | message Voiceover {
16 | int64 file_size_bytes = 1;
17 | bool needs_update = 2;
18 | string file_name = 3;
19 | }
20 |
--------------------------------------------------------------------------------
/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.testing
2 |
3 | import dagger.Binds
4 | import dagger.Module
5 | import org.oppia.android.util.logging.EventLogger
6 | import org.oppia.android.util.logging.ExceptionLogger
7 |
8 | /** Provides fake log reporting dependencies. */
9 | @Module
10 | interface TestLogReportingModule {
11 |
12 | @Binds
13 | fun bindFakeExceptionLogger(fakeExceptionLogger: FakeExceptionLogger): ExceptionLogger
14 |
15 | @Binds
16 | fun bindFakeEventLogger(fakeEventLogger: FakeEventLogger): EventLogger
17 | }
18 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/logging/ExceptionLogger.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.logging
2 |
3 | import java.lang.Exception
4 |
5 | /**
6 | * Logger for tracking caught exceptions.
7 | * Note that this utility may later upload the exceptions to remote services
8 | * or log the exception to a file on disk.
9 | */
10 | interface ExceptionLogger {
11 |
12 | /**
13 | * Logs exceptions to remote services or log them to a file on disk.
14 | *
15 | * @param exception: non-fatal exception to be logged
16 | */
17 | fun logException(exception: Exception)
18 | }
19 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/logging/LoggingAnnotations.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.logging
2 |
3 | import javax.inject.Qualifier
4 |
5 | /** Corresponds to a singleton boolean of whether console (logcat) logging is enabled. */
6 | @Qualifier annotation class EnableConsoleLog
7 |
8 | /** Corresponds to a singleton boolean of whether logs are saved to a file. */
9 | @Qualifier annotation class EnableFileLog
10 |
11 | /** Corresponds to a singleton [LogLevel] determining the minimum severity of logs that should be kept. */
12 | @Qualifier annotation class GlobalLogLevel
13 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/application/ApplicationInjectorProvider.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.application
2 |
3 | import org.oppia.android.util.data.DataProvidersInjector
4 | import org.oppia.android.util.data.DataProvidersInjectorProvider
5 |
6 | /** Provider for [ApplicationInjector]. The application context will implement this interface. */
7 | interface ApplicationInjectorProvider : DataProvidersInjectorProvider {
8 | fun getApplicationInjector(): ApplicationInjector
9 |
10 | override fun getDataProvidersInjector(): DataProvidersInjector = getApplicationInjector()
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout-land/toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/audio_seekbar_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
8 |
9 | -
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/domain/src/main/java/org/oppia/android/domain/classify/GenericInteractionClassifier.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.domain.classify
2 |
3 | /** A general-purpose [InteractionClassifier] that utilizes a Dagger-bound [RuleClassifier] map. */
4 | internal class GenericInteractionClassifier(
5 | private val ruleClassifiers: Map
6 | ) : InteractionClassifier {
7 | override fun getRuleTypes(): Set {
8 | return ruleClassifiers.keys
9 | }
10 |
11 | override fun getRuleClassifier(ruleType: String): RuleClassifier? {
12 | return ruleClassifiers[ruleType]
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeSubtopicSummary.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 Subtopic summary model
8 | * https://github.com/oppia/oppia/blob/b33aa9/core/domain/topic_domain.py#L297
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeSubtopicSummary(
12 |
13 | @Json(name = "id") val subtopicId: String?,
14 | @Json(name = "title") val title: String?,
15 | @Json(name = "skill_ids") val skillIds: List?
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/api/SubtopicService.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.data.backends.gae.api
2 |
3 | import org.oppia.android.data.backends.gae.model.GaeSubtopic
4 | import retrofit2.Call
5 | import retrofit2.http.GET
6 | import retrofit2.http.Path
7 |
8 | /** Service that provides access to subtopic endpoints. */
9 | interface SubtopicService {
10 |
11 | @GET("subtopic_data_handler/{topic_name}/{subtopic_id}")
12 | fun getSubtopic(
13 | @Path("topic_name") topicName: String,
14 | @Path("subtopic_id") subtopicId: String
15 | ): Call
16 | }
17 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeVoiceover.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 Voiceover model
8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/state_domain.py#L651
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeVoiceover(
12 |
13 | @Json(name = "file_size_bytes") val fileSizeBytes: Long?,
14 | @Json(name = "needs_update") val isUpdateNeeded: Boolean?,
15 | @Json(name = "filename") val filename: String?
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/accessibility/AndroidAccessibilityManager.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.accessibility
2 |
3 | import android.view.accessibility.AccessibilityManager
4 |
5 | /** Accessibility Manager for providing [AccessibilityManager]. */
6 | class AndroidAccessibilityManager(
7 | private val accessibilityManager: AccessibilityManager
8 | ) : CustomAccessibilityManager {
9 |
10 | /** return the current status of accessibility whether it is enabled or not. */
11 | override fun isScreenReaderEnabled(): Boolean {
12 | return accessibilityManager.isEnabled
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestViewModel.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.player.state.testing
2 |
3 | import androidx.databinding.ObservableField
4 | import androidx.lifecycle.ViewModel
5 | import org.oppia.android.app.activity.ActivityScope
6 | import org.oppia.android.app.viewmodel.ObservableViewModel
7 | import javax.inject.Inject
8 |
9 | /** [ViewModel] for [StateFragmentTestActivity]. */
10 | @ActivityScope
11 | class StateFragmentTestViewModel @Inject constructor() : ObservableViewModel() {
12 | val hasExplorationStarted = ObservableField(false)
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeStorySummary.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 story summary model with minimum details
8 | * https://github.com/oppia/oppia/blob/b33aa9/core/domain/story_domain.py#L1118
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeStorySummary(
12 |
13 | @Json(name = "id") val storyId: String?,
14 | @Json(name = "title") val title: String?,
15 | @Json(name = "description") val description: String?
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerModule.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.domain.oppialogger.loguploader
2 |
3 | import dagger.Binds
4 | import dagger.Module
5 | import dagger.multibindings.IntoSet
6 | import org.oppia.android.domain.oppialogger.ApplicationStartupListener
7 |
8 | /** Provides [LogUploadWorker] related dependencies. */
9 | @Module
10 | interface LogUploadWorkerModule {
11 |
12 | @Binds
13 | @IntoSet
14 | fun bindLogUploadWorkRequest(
15 | logUploadWorkManagerInitializer: LogUploadWorkManagerInitializer
16 | ): ApplicationStartupListener
17 | }
18 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/api/QuestionPlayerService.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.data.backends.gae.api
2 |
3 | import org.oppia.android.data.backends.gae.model.GaeQuestionPlayer
4 | import retrofit2.Call
5 | import retrofit2.http.GET
6 | import retrofit2.http.Query
7 |
8 | /** Service that provides access to question-player endpoints. */
9 | interface QuestionPlayerService {
10 |
11 | @GET("question_player_handler")
12 | fun getQuestionPlayerBySkillIds(
13 | @Query("skill_ids") skillIds: String,
14 | @Query("question_count") questionCount: Int
15 | ): Call
16 | }
17 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/api/StoryService.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.data.backends.gae.api
2 |
3 | import org.oppia.android.data.backends.gae.model.GaeStory
4 | import retrofit2.Call
5 | import retrofit2.http.GET
6 | import retrofit2.http.Path
7 | import retrofit2.http.Query
8 |
9 | /** Service that provides access to story endpoints. */
10 | interface StoryService {
11 |
12 | @GET("story_data_handler/{story_id}")
13 | fun getStory(
14 | @Path("story_id") storyId: String,
15 | @Query("user_id") userId: String?,
16 | @Query("user") user: String?
17 | ): Call
18 | }
19 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeStory.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 Story model
8 | * https://github.com/oppia/oppia/blob/b56a20/core/controllers/story_viewer.py#L47
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeStory(
12 |
13 | @Json(name = "story_title") val storyTitle: String?,
14 | @Json(name = "story_description") val storyDescription: String?,
15 | @Json(name = "story_nodes") val storyNodes: List?
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/caching/CachingModule.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.caching
2 |
3 | import dagger.Module
4 | import dagger.Provides
5 |
6 | private const val FRACTIONS_TOPIC = "GJ2rLXRKD5hw"
7 | private const val RATIOS_TOPIC = "omzF4oqgeTXd"
8 |
9 | /** Provides dependencies corresponding to the app's caching policies. */
10 | @Module
11 | class CachingModule {
12 | @Provides
13 | @CacheAssetsLocally
14 | fun provideCacheAssetsLocally(): Boolean = false
15 |
16 | @Provides
17 | @TopicListToCache
18 | fun provideTopicListToCache() = listOf(FRACTIONS_TOPIC, RATIOS_TOPIC)
19 | }
20 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/mydownloads/MyDownloadsTab.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.mydownloads
2 |
3 | /** Enum to store the tabs of [MyDownloadsFragment] and get tab by position. */
4 | enum class MyDownloadsTab(private var position: Int) {
5 | DOWNLOADS(position = 0),
6 | UPDATES(position = 1);
7 |
8 | companion object {
9 | fun getTabForPosition(position: Int): MyDownloadsTab {
10 | val ordinal = checkNotNull(values().map(MyDownloadsTab::position)[position]) {
11 | "No tab corresponding to position: $position"
12 | }
13 | return values()[ordinal]
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeParamChange.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 ParamChange model
8 | * https://github.com/oppia/oppia/blob/15516a/core/domain/param_domain.py#L149
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeParamChange(
12 |
13 | @Json(name = "generator_id") val generatorId: String?,
14 | @Json(name = "name") val name: String?,
15 | @Json(name = "customization_args") val customizationArgs: GaeCustomizationArgs?
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/administratorcontrols/administratorcontrolsitemviewmodel/AdministratorControlsItemViewModel.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.administratorcontrols.administratorcontrolsitemviewmodel
2 |
3 | import androidx.databinding.ObservableField
4 | import org.oppia.android.app.viewmodel.ObservableViewModel
5 |
6 | /** Super-class for generalising different views for the recyclerView in [AdministratorControlsFragment] */
7 | abstract class AdministratorControlsItemViewModel : ObservableViewModel() {
8 | val isMultipane = ObservableField(false)
9 | val itemIndex = ObservableField()
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/onboarding/OnboardingViewModel.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.onboarding
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 [OnboardingFragment]. */
9 | class OnboardingViewModel @Inject constructor() : ObservableViewModel() {
10 | val slideNumber = ObservableField(0)
11 | val totalNumberOfSlides = TOTAL_NUMBER_OF_SLIDES
12 |
13 | fun slideChanged(slideIndex: Int) {
14 | slideNumber.set(slideIndex)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/utility/OnClickableAreaClickedListener.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.utility
2 |
3 | /** Listener for an image when it is clicked which have a [ClickableAreasImage] attached to the view. */
4 | interface OnClickableAreaClickedListener {
5 | /**
6 | * @param region the name of the region which is selected
7 | *
8 | * For an specified region it will be called with [NamedRegionClickedEvent] with region name.
9 | * For an unspecified region it will be called with [DefaultRegionClickedEvent].
10 | *
11 | */
12 | fun onClickableAreaTouched(region: RegionClickedEvent)
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/radio_button_drawable.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/utility/ContextExtensions.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.utility
2 |
3 | import android.content.Context
4 |
5 | // Extension functions for Context that act as getters for PackageManager.
6 |
7 | /** Returns the current app version name. */
8 | fun Context.getVersionName(): String {
9 | return this.packageManager.getPackageInfo(this.packageName, /* flags=*/ 0).versionName
10 | }
11 |
12 | /** Returns the time at which the app was last updated. */
13 | fun Context.getLastUpdateTime(): Long {
14 | return this.packageManager.getPackageInfo(this.packageName, /* flags= */ 0).lastUpdateTime
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.topic
2 |
3 | /** Enum to store the tabs of [TopicFragment] and get tab by position. */
4 | enum class TopicTab(private var position: Int) {
5 | INFO(position = 0),
6 | LESSONS(position = 1),
7 | PRACTICE(position = 2),
8 | REVISION(position = 3);
9 |
10 | companion object {
11 | fun getTabForPosition(position: Int): TopicTab {
12 | val ordinal = checkNotNull(values().map(TopicTab::position)[position]) {
13 | "No tab corresponding to position: $position"
14 | }
15 | return values()[ordinal]
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/topic/practice/SubtopicSelector.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.topic.practice
2 |
3 | /** Interface to update the selectedSubtopicList in [TopicPracticeFragmentPresenter]. */
4 | interface SubtopicSelector {
5 | /** This subtopic and skill will get added to selectedSubtopicList in [TopicPracticeFragmentPresenter]. */
6 | fun subtopicSelected(subtopicId: Int, skillIdList: MutableList)
7 |
8 | /** This subtopic and skill will get removed from selectedSubtopicList in [TopicPracticeFragmentPresenter]. */
9 | fun subtopicUnselected(subtopicId: Int, skillIdList: MutableList)
10 | }
11 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeStateClassifier.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 StateClassifier model
8 | * https://github.com/oppia/oppia/blob/15516a/core/controllers/reader.py#L239
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeStateClassifier(
12 |
13 | @Json(name = "algorithm_id") val algorithmId: String?,
14 | @Json(name = "classifier_data") val classifierData: Any?,
15 | @Json(name = "data_schema_version") val dataSchemaVersion: Int?
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/player/exploration/DefaultFontSizeStateListener.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.player.exploration
2 |
3 | import org.oppia.android.app.model.ReadingTextSize
4 |
5 | /**
6 | * To set the font-size correctly we need to fetch it before loading the `ExplorationFragment` and
7 | * therefore this listener listens to the default reading text size in `ExplorationManagerFragment` and
8 | * passes the information to `ExplorationActivity` which eventually loads the `ExplorationFragment`.
9 | */
10 | interface DefaultFontSizeStateListener {
11 | fun onDefaultFontSizeLoaded(readingTextSize: ReadingTextSize)
12 | }
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp-land/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 9
4 | 4
5 | 4
6 | 4
7 | 4
8 | 4
9 | 4
10 | 4
11 | 4
12 |
13 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/extensions/LiveDataExt.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.extensions
2 |
3 | import androidx.lifecycle.LifecycleOwner
4 | import androidx.lifecycle.LiveData
5 | import androidx.lifecycle.Observer
6 |
7 | /** Used to observe LiveData once. After the first callback, the observer is removed. */
8 | fun LiveData.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer) {
9 | observe(
10 | lifecycleOwner,
11 | object : Observer {
12 | override fun onChanged(t: T?) {
13 | observer.onChanged(t)
14 | removeObserver(this)
15 | }
16 | }
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/onboarding/ViewPagerSlide.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.onboarding
2 |
3 | /** Enum to store the slides of [OnboardingFragment] and get slide by position. */
4 | enum class ViewPagerSlide(private var position: Int) {
5 | SLIDE_0(position = 0),
6 | SLIDE_1(position = 1),
7 | SLIDE_2(position = 2);
8 |
9 | companion object {
10 | fun getSlideForPosition(position: Int): ViewPagerSlide {
11 | val ordinal = checkNotNull(values().map(ViewPagerSlide::position)[position]) {
12 | "No tab corresponding to position: $position"
13 | }
14 | return values()[ordinal]
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/PreviousButtonViewModel.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.player.state.itemviewmodel
2 |
3 | import org.oppia.android.app.player.state.listener.PreviousNavigationButtonListener
4 |
5 | /**
6 | * [StateItemViewModel] for navigating to a previous state. Unlike other navigation buttons, this model only represents
7 | * backward navigation.
8 | */
9 | class PreviousButtonViewModel(
10 | val hasConversationView: Boolean,
11 | val previousNavigationButtonListener: PreviousNavigationButtonListener,
12 | val isSplitView: Boolean
13 | ) : StateItemViewModel(ViewType.PREVIOUS_NAVIGATION_BUTTON)
14 |
--------------------------------------------------------------------------------
/app/src/main/java/org/oppia/android/app/testing/HomeTestActivity.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.app.testing
2 |
3 | import android.os.Bundle
4 | import org.oppia.android.app.activity.InjectableAppCompatActivity
5 | import javax.inject.Inject
6 |
7 | /** The activity for testing [HomeFragment]. */
8 | class HomeTestActivity : InjectableAppCompatActivity() {
9 |
10 | @Inject
11 | lateinit var homeTestActivityPresenter: HomeTestActivityPresenter
12 |
13 | override fun onCreate(savedInstanceState: Bundle?) {
14 | super.onCreate(savedInstanceState)
15 | activityComponent.inject(this)
16 | homeTestActivityPresenter.handleOnCreate()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_hint_bulb_white_24dp.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/data/src/main/java/org/oppia/android/data/backends/gae/model/GaeQuestion.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 Question model
8 | * https://github.com/oppia/oppia/blob/b33aa9/core/domain/question_domain.py#L144
9 | */
10 | @JsonClass(generateAdapter = true)
11 | data class GaeQuestion(
12 |
13 | @Json(name = "id") val id: String?,
14 | @Json(name = "question_state_data") val state: GaeState?,
15 | @Json(name = "version") val version: Int?,
16 | @Json(name = "linked_skill_ids") val linkedSkillIds: List?
17 |
18 | )
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/concept_card_fragment_test_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/test_text_view_for_string_with_data_binding.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 |
11 |
17 |
18 |
--------------------------------------------------------------------------------
/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseExceptionLogger.kt:
--------------------------------------------------------------------------------
1 | package org.oppia.android.util.logging.firebase
2 |
3 | import com.google.firebase.crashlytics.FirebaseCrashlytics
4 | import org.oppia.android.util.logging.ExceptionLogger
5 |
6 | /** Logger for providing custom crash reporting to Firebase Crashlytics. */
7 | class FirebaseExceptionLogger(
8 | private var firebaseCrashlytics: FirebaseCrashlytics
9 | ) : ExceptionLogger {
10 |
11 | /** Logs a custom non-fatal exception to Firebase Crashlytics. */
12 | override fun logException(exception: Exception) {
13 | firebaseCrashlytics.recordException(exception)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------