From 7abdcb36bdb6c382b1668b800748069853271987 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 30 Jun 2024 09:43:03 +0530 Subject: [PATCH 01/21] Add existing event logs to new screen --- .../ClassroomListFragmentPresenter.kt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt index 7bc81fd5bdf..7bdebc7678b 100644 --- a/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.res.integerResource import androidx.compose.ui.unit.dp import androidx.databinding.ObservableList import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer import org.oppia.android.R import org.oppia.android.app.classroom.classroomlist.ClassroomList import org.oppia.android.app.classroom.promotedlist.PromotedStoryList @@ -40,18 +41,24 @@ import org.oppia.android.app.home.classroomlist.ClassroomSummaryViewModel import org.oppia.android.app.home.promotedlist.PromotedStoryListViewModel import org.oppia.android.app.home.topiclist.AllTopicsViewModel import org.oppia.android.app.home.topiclist.TopicSummaryViewModel +import org.oppia.android.app.model.AppStartupState import org.oppia.android.app.model.ClassroomSummary import org.oppia.android.app.model.LessonThumbnail import org.oppia.android.app.model.LessonThumbnailGraphic +import org.oppia.android.app.model.ProfileId import org.oppia.android.app.model.TopicSummary import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.datetime.DateTimeUtil import org.oppia.android.databinding.ClassroomListFragmentBinding import org.oppia.android.domain.classroom.ClassroomController +import org.oppia.android.domain.onboarding.AppStartupStateController import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.domain.oppialogger.analytics.AnalyticsController import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.domain.topic.TopicListController import org.oppia.android.domain.translation.TranslationController +import org.oppia.android.util.data.AsyncResult +import org.oppia.android.util.data.DataProviders.Companion.toLiveData import org.oppia.android.util.locale.OppiaLocale import org.oppia.android.util.parser.html.StoryHtmlParserEntityType import org.oppia.android.util.parser.html.TopicHtmlParserEntityType @@ -75,6 +82,8 @@ class ClassroomListFragmentPresenter @Inject constructor( private val dateTimeUtil: DateTimeUtil, private val translationController: TranslationController, private val machineLocale: OppiaLocale.MachineLocale, + private val appStartupStateController: AppStartupStateController, + private val analyticsController: AnalyticsController, ) { private val routeToTopicPlayStoryListener = activity as RouteToTopicPlayStoryListener private lateinit var binding: ClassroomListFragmentBinding @@ -92,6 +101,8 @@ class ClassroomListFragmentPresenter @Inject constructor( internalProfileId = profileId.internalId + logHomeActivityEvent() + classroomListViewModel = ClassroomListViewModel( activity, fragment, @@ -144,6 +155,8 @@ class ClassroomListFragmentPresenter @Inject constructor( } ) + logAppOnboardedEvent() + return binding.root } @@ -225,6 +238,45 @@ class ClassroomListFragmentPresenter @Inject constructor( } } } + + private fun logAppOnboardedEvent() { + val startupStateProvider = appStartupStateController.getAppStartupState() + val liveData = startupStateProvider.toLiveData() + liveData.observe( + activity, + object : Observer> { + override fun onChanged(startUpStateResult: AsyncResult?) { + when (startUpStateResult) { + null, is AsyncResult.Pending -> { + // Do nothing. + } + is AsyncResult.Success -> { + liveData.removeObserver(this) + + if (startUpStateResult.value.startupMode == + AppStartupState.StartupMode.USER_NOT_YET_ONBOARDED + ) { + analyticsController.logAppOnboardedEvent(profileId) + } + } + is AsyncResult.Failure -> { + oppiaLogger.e( + "ClassroomListFragment", + "Failed to retrieve app startup state" + ) + } + } + } + } + ) + } + + private fun logHomeActivityEvent() { + analyticsController.logImportantEvent( + oppiaLogger.createOpenHomeContext(), + profileId + ) + } } /** Adds a grid of items to a LazyListScope with specified arrangement and item content. */ From 53f030f6e5e1955d2b7853b69617f73f2742a676 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Mon, 1 Jul 2024 13:01:08 +0530 Subject: [PATCH 02/21] Add classroom_id to ExplorationContext object --- .../app/activity/ActivityIntentFactories.kt | 20 +- .../app/classroom/ClassroomListActivity.kt | 13 +- .../ClassroomListFragmentPresenter.kt | 1 + .../CompletedStoryItemViewModel.kt | 14 +- .../oppia/android/app/home/HomeActivity.kt | 13 +- .../android/app/home/HomeFragmentPresenter.kt | 1 + .../android/app/home/RouteToTopicListener.kt | 2 +- .../app/home/RouteToTopicPlayStoryListener.kt | 7 +- .../promotedlist/PromotedStoryViewModel.kt | 1 + .../recentlyplayed/RecentlyPlayedActivity.kt | 2 + .../RecentlyPlayedFragmentPresenter.kt | 8 +- .../OngoingTopicItemViewModel.kt | 5 +- .../player/exploration/ExplorationActivity.kt | 1 + .../ExplorationActivityPresenter.kt | 11 +- .../player/exploration/ExplorationFragment.kt | 2 + .../ExplorationFragmentPresenter.kt | 13 +- .../testing/StateFragmentTestActivity.kt | 2 + .../StateFragmentTestActivityPresenter.kt | 19 +- .../RecentlyPlayedStorySummaryViewModel.kt | 12 +- .../app/resumelesson/ResumeLessonActivity.kt | 3 + .../ResumeLessonActivityPresenter.kt | 2 + .../app/resumelesson/ResumeLessonFragment.kt | 3 + .../ResumeLessonFragmentPresenter.kt | 10 +- .../android/app/shim/IntentFactoryShim.kt | 2 + .../android/app/shim/IntentFactoryShimImpl.kt | 7 +- .../app/story/ExplorationSelectionListener.kt | 1 + .../oppia/android/app/story/StoryActivity.kt | 10 +- .../app/story/StoryActivityPresenter.kt | 9 +- .../oppia/android/app/story/StoryFragment.kt | 15 +- .../app/story/StoryFragmentPresenter.kt | 8 + .../oppia/android/app/story/StoryViewModel.kt | 6 + .../StoryChapterSummaryViewModel.kt | 4 + .../ExplorationTestActivityPresenter.kt | 3 + .../app/testing/HomeFragmentTestActivity.kt | 6 +- .../testing/NavigationDrawerTestActivity.kt | 13 +- .../android/app/testing/TopicTestActivity.kt | 10 +- .../app/testing/TopicTestActivityForStory.kt | 12 +- .../app/topic/RouteToResumeLessonListener.kt | 1 + .../android/app/topic/RouteToStoryListener.kt | 2 +- .../oppia/android/app/topic/TopicActivity.kt | 46 ++++- .../app/topic/TopicActivityPresenter.kt | 10 +- .../oppia/android/app/topic/TopicFragment.kt | 3 + .../app/topic/TopicFragmentPresenter.kt | 18 +- .../android/app/topic/ViewPagerAdapter.kt | 3 +- .../app/topic/lessons/TopicLessonsFragment.kt | 6 + .../lessons/TopicLessonsFragmentPresenter.kt | 16 +- .../classroom/ClassroomListFragmentTest.kt | 4 + .../CompletedStoryListActivityTest.kt | 3 + .../android/app/home/HomeActivityTest.kt | 4 + .../app/home/RecentlyPlayedFragmentTest.kt | 6 + .../OngoingTopicListActivityTest.kt | 11 +- .../exploration/ExplorationActivityTest.kt | 65 +++++++ .../app/player/state/StateFragmentTest.kt | 2 + .../ProfileProgressFragmentTest.kt | 2 + .../resumelesson/ResumeLessonActivityTest.kt | 2 + .../resumelesson/ResumeLessonFragmentTest.kt | 3 + .../android/app/story/StoryActivityTest.kt | 8 + .../android/app/story/StoryFragmentTest.kt | 4 + .../android/app/topic/TopicActivityTest.kt | 12 +- .../android/app/topic/TopicFragmentTest.kt | 100 +++++++--- .../app/topic/info/TopicInfoFragmentTest.kt | 18 ++ .../topic/lessons/TopicLessonsFragmentTest.kt | 178 ++++++++++++++---- .../practice/TopicPracticeFragmentTest.kt | 23 ++- .../revision/TopicRevisionFragmentTest.kt | 21 ++- .../activity/ActivityIntentFactoriesTest.kt | 9 +- .../ExplorationActivityLocalTest.kt | 10 + .../player/state/StateFragmentLocalTest.kt | 2 + .../app/story/StoryActivityLocalTest.kt | 5 +- .../state/StateFragmentAccessibilityTest.kt | 2 + .../topic/info/TopicInfoFragmentLocalTest.kt | 5 +- .../lessons/TopicLessonsFragmentLocalTest.kt | 7 +- .../exploration/ExplorationDataController.kt | 10 + .../domain/exploration/ExplorationProgress.kt | 1 + .../ExplorationProgressController.kt | 7 + .../android/domain/oppialogger/OppiaLogger.kt | 2 + .../analytics/LearnerAnalyticsLogger.kt | 4 + .../android/domain/topic/TopicController.kt | 104 ++++++++++ model/src/main/proto/arguments.proto | 30 +++ model/src/main/proto/oppia_logger.proto | 3 + model/src/main/proto/topic.proto | 6 + .../util/logging/EventBundleCreatorTest.kt | 3 + .../KenyaAlphaEventBundleCreatorTest.kt | 3 + 82 files changed, 901 insertions(+), 154 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/activity/ActivityIntentFactories.kt b/app/src/main/java/org/oppia/android/app/activity/ActivityIntentFactories.kt index ab6ab90bf77..078032aabcf 100644 --- a/app/src/main/java/org/oppia/android/app/activity/ActivityIntentFactories.kt +++ b/app/src/main/java/org/oppia/android/app/activity/ActivityIntentFactories.kt @@ -16,15 +16,23 @@ interface ActivityIntentFactories { * This must be injected within an activity context. */ interface TopicActivityIntentFactory { - /** Returns a new [Intent] to start the topic activity for the specified profile and topic. */ - fun createIntent(profileId: ProfileId, topicId: String): Intent + /** + * Returns a new [Intent] to start the topic activity for the specified profile, classroom + * and topic. + */ + fun createIntent(profileId: ProfileId, classroomId: String, topicId: String): Intent /** - * Returns a new [Intent] to start the topic activity for the specified profile, topic, and - * story (where the activity will automatically navigate to & expand the specified story in the - * topic). + * Returns a new [Intent] to start the topic activity for the specified profile, classroom, + * topic, and story (where the activity will automatically navigate to & expand the specified + * story in the topic). */ - fun createIntent(profileId: ProfileId, topicId: String, storyId: String): Intent + fun createIntent( + profileId: ProfileId, + classroomId: String, + topicId: String, + storyId: String + ): Intent } /** diff --git a/app/src/main/java/org/oppia/android/app/classroom/ClassroomListActivity.kt b/app/src/main/java/org/oppia/android/app/classroom/ClassroomListActivity.kt index 4ba06da7d58..764228588e7 100644 --- a/app/src/main/java/org/oppia/android/app/classroom/ClassroomListActivity.kt +++ b/app/src/main/java/org/oppia/android/app/classroom/ClassroomListActivity.kt @@ -98,15 +98,22 @@ class ClassroomListActivity : ) } - override fun routeToTopic(internalProfileId: Int, topicId: String) { - startActivity(TopicActivity.createTopicActivityIntent(this, internalProfileId, topicId)) + override fun routeToTopic(internalProfileId: Int, classroomId: String, topicId: String) { + startActivity( + TopicActivity.createTopicActivityIntent(this, internalProfileId, classroomId, topicId) + ) } - override fun routeToTopicPlayStory(internalProfileId: Int, topicId: String, storyId: String) { + override fun routeToTopicPlayStory( + internalProfileId: Int, + classroomId: String, + topicId: String, + storyId: String) { startActivity( TopicActivity.createTopicPlayStoryActivityIntent( this, internalProfileId, + classroomId, topicId, storyId ) diff --git a/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt index 7bdebc7678b..46ec5a2751d 100644 --- a/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/classroom/ClassroomListFragmentPresenter.kt @@ -164,6 +164,7 @@ class ClassroomListFragmentPresenter @Inject constructor( fun onTopicSummaryClicked(topicSummary: TopicSummary) { routeToTopicPlayStoryListener.routeToTopicPlayStory( internalProfileId, + topicSummary.classroomId, topicSummary.topicId, topicSummary.firstStoryId ) diff --git a/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryItemViewModel.kt b/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryItemViewModel.kt index 355389d59b5..b6dd4fef3b9 100644 --- a/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryItemViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryItemViewModel.kt @@ -31,13 +31,23 @@ class CompletedStoryItemViewModel( /** Called when user clicks on CompletedStoryItem. */ fun onCompletedStoryItemClicked() { - routeToTopicPlayStory(internalProfileId, completedStory.topicId, completedStory.storyId) + routeToTopicPlayStory( + internalProfileId, + completedStory.classroomId, + completedStory.topicId, + completedStory.storyId + ) } - override fun routeToTopicPlayStory(internalProfileId: Int, topicId: String, storyId: String) { + override fun routeToTopicPlayStory( + internalProfileId: Int, + classroomId: String, + topicId: String, + storyId: String) { val intent = intentFactoryShim.createTopicPlayStoryActivityIntent( activity.applicationContext, internalProfileId, + classroomId, topicId, storyId ) diff --git a/app/src/main/java/org/oppia/android/app/home/HomeActivity.kt b/app/src/main/java/org/oppia/android/app/home/HomeActivity.kt index 8d6f828abd0..b1f2c655fbd 100644 --- a/app/src/main/java/org/oppia/android/app/home/HomeActivity.kt +++ b/app/src/main/java/org/oppia/android/app/home/HomeActivity.kt @@ -67,8 +67,10 @@ class HomeActivity : homeActivityPresenter.handleOnRestart() } - override fun routeToTopic(internalProfileId: Int, topicId: String) { - startActivity(TopicActivity.createTopicActivityIntent(this, internalProfileId, topicId)) + override fun routeToTopic(internalProfileId: Int, classroomId: String, topicId: String) { + startActivity( + TopicActivity.createTopicActivityIntent(this, internalProfileId, classroomId, topicId) + ) } override fun onBackPressed() { @@ -87,11 +89,16 @@ class HomeActivity : dialogFragment.showNow(supportFragmentManager, TAG_SWITCH_PROFILE_DIALOG) } - override fun routeToTopicPlayStory(internalProfileId: Int, topicId: String, storyId: String) { + override fun routeToTopicPlayStory( + internalProfileId: Int, + classroomId: String, + topicId: String, + storyId: String) { startActivity( TopicActivity.createTopicPlayStoryActivityIntent( this, internalProfileId, + classroomId, topicId, storyId ) diff --git a/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt index 64d53c68009..b3ef5d04e3f 100644 --- a/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt @@ -197,6 +197,7 @@ class HomeFragmentPresenter @Inject constructor( fun onTopicSummaryClicked(topicSummary: TopicSummary) { routeToTopicPlayStoryListener.routeToTopicPlayStory( internalProfileId, + topicSummary.classroomId, topicSummary.topicId, topicSummary.firstStoryId ) diff --git a/app/src/main/java/org/oppia/android/app/home/RouteToTopicListener.kt b/app/src/main/java/org/oppia/android/app/home/RouteToTopicListener.kt index 36c7a1a1d94..361852084f5 100755 --- a/app/src/main/java/org/oppia/android/app/home/RouteToTopicListener.kt +++ b/app/src/main/java/org/oppia/android/app/home/RouteToTopicListener.kt @@ -2,5 +2,5 @@ package org.oppia.android.app.home /** Listener for when an activity should route to a topic. */ interface RouteToTopicListener { - fun routeToTopic(internalProfileId: Int, topicId: String) + fun routeToTopic(internalProfileId: Int,classroomId: String, topicId: String) } diff --git a/app/src/main/java/org/oppia/android/app/home/RouteToTopicPlayStoryListener.kt b/app/src/main/java/org/oppia/android/app/home/RouteToTopicPlayStoryListener.kt index aa7121f1c07..4d45619ede8 100755 --- a/app/src/main/java/org/oppia/android/app/home/RouteToTopicPlayStoryListener.kt +++ b/app/src/main/java/org/oppia/android/app/home/RouteToTopicPlayStoryListener.kt @@ -2,5 +2,10 @@ package org.oppia.android.app.home /** Listener for when an activity should route to a story-item in TopicPlay tab. */ interface RouteToTopicPlayStoryListener { - fun routeToTopicPlayStory(internalProfileId: Int, topicId: String, storyId: String) + fun routeToTopicPlayStory( + internalProfileId: Int, + classroomId: String, + topicId: String, + storyId: String + ) } diff --git a/app/src/main/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModel.kt b/app/src/main/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModel.kt index 6b300f6355d..dae19f0866e 100755 --- a/app/src/main/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModel.kt @@ -63,6 +63,7 @@ class PromotedStoryViewModel( fun clickOnStoryTile() { routeToTopicPlayStoryListener.routeToTopicPlayStory( internalProfileId, + promotedStory.classroomId, promotedStory.topicId, promotedStory.storyId ) diff --git a/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedActivity.kt b/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedActivity.kt index bf852642259..9d068eaf49a 100644 --- a/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedActivity.kt +++ b/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedActivity.kt @@ -83,6 +83,7 @@ class RecentlyPlayedActivity : override fun routeToResumeLesson( profileId: ProfileId, + classroomId: String, topicId: String, storyId: String, explorationId: String, @@ -93,6 +94,7 @@ class RecentlyPlayedActivity : ResumeLessonActivity.createResumeLessonActivityIntent( this, profileId, + classroomId, topicId, storyId, explorationId, diff --git a/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentPresenter.kt index fcd8a8b3c7c..d479eb9468c 100755 --- a/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentPresenter.kt @@ -108,6 +108,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor( explorationCheckpointLiveData.removeObserver(this) routeToResumeLessonListener.routeToResumeLesson( profileId, + promotedStory.classroomId, promotedStory.topicId, promotedStory.storyId, promotedStory.explorationId, @@ -117,6 +118,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor( } else if (it is AsyncResult.Failure) { explorationCheckpointLiveData.removeObserver(this) playExploration( + promotedStory.classroomId, promotedStory.topicId, promotedStory.storyId, promotedStory.explorationId, @@ -128,6 +130,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor( ) } else { playExploration( + promotedStory.classroomId, promotedStory.topicId, promotedStory.storyId, promotedStory.explorationId, @@ -162,6 +165,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor( } private fun playExploration( + classroomId: String, topicId: String, storyId: String, explorationId: String, @@ -174,13 +178,13 @@ class RecentlyPlayedFragmentPresenter @Inject constructor( // cases, lessons played from this fragment are known to be in progress, and that progress // can't be resumed here (hence the restart). explorationDataController.restartExploration( - profileId.internalId, topicId, storyId, explorationId + profileId.internalId, classroomId, topicId, storyId, explorationId ) } else { // The only lessons that can't have their progress saved are those that were already // completed. explorationDataController.replayExploration( - profileId.internalId, topicId, storyId, explorationId + profileId.internalId, classroomId, topicId, storyId, explorationId ) } startPlayingProvider.toLiveData().observe(fragment) { result -> diff --git a/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicItemViewModel.kt b/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicItemViewModel.kt index 2f8e6f9e84d..1b074ed6f1b 100644 --- a/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicItemViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicItemViewModel.kt @@ -27,7 +27,7 @@ class OngoingTopicItemViewModel( } fun onTopicItemClicked() { - routeToTopic(internalProfileId, topic.topicId) + routeToTopic(internalProfileId, topic.classroomId, topic.topicId) } fun computeStoryCountText(): String { @@ -36,10 +36,11 @@ class OngoingTopicItemViewModel( ) } - override fun routeToTopic(internalProfileId: Int, topicId: String) { + override fun routeToTopic(internalProfileId: Int, classroomId: String, topicId: String) { val intent = intentFactoryShim.createTopicActivityIntent( activity.applicationContext, internalProfileId, + classroomId, topicId ) activity.startActivity(intent) diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt index c657a4a35fb..61201523329 100755 --- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt +++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt @@ -56,6 +56,7 @@ class ExplorationActivity : explorationActivityPresenter.handleOnCreate( this, params.profileId, + params.classroomId, params.topicId, params.storyId, params.explorationId, diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt index e940dabb48c..7dde5e1fd68 100644 --- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt @@ -70,6 +70,7 @@ class ExplorationActivityPresenter @Inject constructor( private lateinit var explorationToolbar: Toolbar private lateinit var explorationToolbarTitle: TextView private lateinit var profileId: ProfileId + private lateinit var classroomId: String private lateinit var topicId: String private lateinit var storyId: String private lateinit var explorationId: String @@ -85,6 +86,7 @@ class ExplorationActivityPresenter @Inject constructor( fun handleOnCreate( context: Context, profileId: ProfileId, + classroomId: String, topicId: String, storyId: String, explorationId: String, @@ -125,6 +127,7 @@ class ExplorationActivityPresenter @Inject constructor( } this.profileId = profileId + this.classroomId = classroomId this.topicId = topicId this.storyId = storyId this.explorationId = explorationId @@ -187,6 +190,7 @@ class ExplorationActivityPresenter @Inject constructor( R.id.exploration_fragment_placeholder, ExplorationFragment.newInstance( profileId, + classroomId, topicId, storyId, explorationId, @@ -386,7 +390,12 @@ class ExplorationActivityPresenter @Inject constructor( ExplorationActivityParams.ParentScreen.UNRECOGNIZED -> { // Default to the topic activity. activity.startActivity( - TopicActivity.createTopicActivityIntent(context, profileId.internalId, topicId) + TopicActivity.createTopicActivityIntent( + context, + profileId.internalId, + classroomId, + topicId + ) ) activity.finish() } diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragment.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragment.kt index b72f2f0da61..93444cea525 100755 --- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragment.kt +++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragment.kt @@ -22,6 +22,7 @@ class ExplorationFragment : InjectableFragment() { /** Returns a new [ExplorationFragment] with the corresponding fragment parameters. */ fun newInstance( profileId: ProfileId, + classroomId: String, topicId: String, storyId: String, explorationId: String, @@ -29,6 +30,7 @@ class ExplorationFragment : InjectableFragment() { ): ExplorationFragment { val args = ExplorationFragmentArguments.newBuilder().apply { this.profileId = profileId + this.classroomId = classroomId this.topicId = topicId this.storyId = storyId this.explorationId = explorationId diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragmentPresenter.kt index 8796b96b672..87698c6951d 100755 --- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationFragmentPresenter.kt @@ -58,7 +58,7 @@ class ExplorationFragmentPresenter @Inject constructor( StateFragment.newInstance( args.profileId.internalId, args.topicId, args.storyId, args.explorationId ) - logPracticeFragmentEvent(args.topicId, args.storyId, args.explorationId) + logPracticeFragmentEvent(args.classroomId, args.topicId, args.storyId, args.explorationId) if (getStateFragment() == null) { fragment.childFragmentManager.beginTransaction().add( R.id.state_fragment_placeholder, @@ -146,9 +146,16 @@ class ExplorationFragmentPresenter @Inject constructor( ) as StateFragment? } - private fun logPracticeFragmentEvent(topicId: String, storyId: String, explorationId: String) { + private fun logPracticeFragmentEvent( + classroomId: String, + topicId: String, + storyId: String, + explorationId: String + ) { analyticsController.logImportantEvent( - oppiaLogger.createOpenExplorationActivityContext(topicId, storyId, explorationId), + oppiaLogger.createOpenExplorationActivityContext( + classroomId, topicId, storyId, explorationId + ), ProfileId.newBuilder().apply { internalId = internalProfileId }.build() ) } diff --git a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt index e8117516284..2fc44ad11f5 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt @@ -71,6 +71,7 @@ class StateFragmentTestActivity : fun createTestActivityIntent( context: Context, profileId: Int, + classroomId: String, topicId: String, storyId: String, explorationId: String, @@ -78,6 +79,7 @@ class StateFragmentTestActivity : ): Intent { val args = StateFragmentTestActivityParams.newBuilder().apply { this.internalProfileId = profileId + this.classroomId = classroomId this.topicId = topicId this.storyId = storyId this.explorationId = explorationId diff --git a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt index 3c52bb6e777..6beed9aaf21 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt @@ -12,6 +12,7 @@ import org.oppia.android.app.player.exploration.TAG_HINTS_AND_SOLUTION_EXPLORATI import org.oppia.android.app.player.state.StateFragment import org.oppia.android.app.player.state.testing.StateFragmentTestActivity.Companion.STATE_FRAGMENT_TEST_ACTIVITY_PARAMS_KEY import org.oppia.android.databinding.StateFragmentTestActivityBinding +import org.oppia.android.domain.classroom.TEST_CLASSROOM_ID_0 import org.oppia.android.domain.exploration.ExplorationDataController import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_2 @@ -34,6 +35,7 @@ class StateFragmentTestActivityPresenter @Inject constructor( ) { private var profileId: Int = 1 + private lateinit var classroomId: String private lateinit var topicId: String private lateinit var storyId: String private lateinit var explorationId: String @@ -54,6 +56,7 @@ class StateFragmentTestActivityPresenter @Inject constructor( StateFragmentTestActivityParams.getDefaultInstance() ) profileId = args?.internalProfileId ?: 1 + classroomId = args?.classroomId ?: TEST_CLASSROOM_ID_0 topicId = args?.topicId ?: TEST_TOPIC_ID_0 storyId = @@ -63,7 +66,14 @@ class StateFragmentTestActivityPresenter @Inject constructor( ?: TEST_EXPLORATION_ID_2 shouldSavePartialProgress = args?.shouldSavePartialProgress ?: false activity.findViewById