Skip to content

Commit

Permalink
Merge pull request #1 from oppia/develop
Browse files Browse the repository at this point in the history
Develop (fork) Branch Update
  • Loading branch information
subhajitxyz authored Jul 23, 2024
2 parents 1c4b17a + 4b49cd8 commit d819e70
Show file tree
Hide file tree
Showing 115 changed files with 2,856 additions and 2,036 deletions.
4 changes: 4 additions & 0 deletions .github/workflows/static_checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ jobs:
run: |
bash /home/runner/work/oppia-android/oppia-android/scripts/ktlint_lint_check.sh $HOME
- name: Feature flag checks
run: |
bash /home/runner/work/oppia-android/oppia-android/scripts/feature_flags_check.sh $HOME
- name: Protobuf lint check
run: |
bash /home/runner/work/oppia-android/oppia-android/scripts/buf_lint_check.sh $HOME
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import org.oppia.android.app.model.ProfileId
import org.oppia.android.app.model.RecentlyPlayedActivityParams
import org.oppia.android.app.model.RecentlyPlayedActivityTitle
import org.oppia.android.app.model.ScreenName.CLASSROOM_LIST_ACTIVITY
import org.oppia.android.app.topic.TopicActivity
import org.oppia.android.app.topic.TopicActivity.Companion.createTopicActivityIntent
import org.oppia.android.app.topic.TopicActivity.Companion.createTopicPlayStoryActivityIntent
import org.oppia.android.app.translation.AppLanguageResourceHandler
import org.oppia.android.util.logging.CurrentAppScreenNameIntentDecorator.decorateWithScreenName
import org.oppia.android.util.profile.CurrentUserProfileIdIntentDecorator.decorateWithUserProfileId
Expand Down Expand Up @@ -98,15 +99,23 @@ 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(
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(
createTopicPlayStoryActivityIntent(
this,
internalProfileId,
classroomId,
topicId,
storyId
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -40,6 +41,7 @@ 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
Expand All @@ -48,10 +50,14 @@ 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
Expand All @@ -75,6 +81,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
Expand All @@ -92,6 +100,8 @@ class ClassroomListFragmentPresenter @Inject constructor(

internalProfileId = profileId.internalId

logHomeActivityEvent()

classroomListViewModel = ClassroomListViewModel(
activity,
fragment,
Expand Down Expand Up @@ -144,13 +154,16 @@ class ClassroomListFragmentPresenter @Inject constructor(
}
)

logAppOnboardedEvent()

return binding.root
}

/** Routes to the play story view for the first story in the given topic summary. */
fun onTopicSummaryClicked(topicSummary: TopicSummary) {
routeToTopicPlayStoryListener.routeToTopicPlayStory(
internalProfileId,
topicSummary.classroomId,
topicSummary.topicId,
topicSummary.firstStoryId
)
Expand Down Expand Up @@ -225,6 +238,45 @@ class ClassroomListFragmentPresenter @Inject constructor(
}
}
}

private fun logAppOnboardedEvent() {
val startupStateProvider = appStartupStateController.getAppStartupState()
val liveData = startupStateProvider.toLiveData()
liveData.observe(
activity,
object : Observer<AsyncResult<AppStartupState>> {
override fun onChanged(startUpStateResult: AsyncResult<AppStartupState>?) {
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. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,24 @@ 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
)
Expand Down
14 changes: 11 additions & 3 deletions app/src/main/java/org/oppia/android/app/home/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -87,11 +89,17 @@ 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
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ class HomeFragmentPresenter @Inject constructor(
fun onTopicSummaryClicked(topicSummary: TopicSummary) {
routeToTopicPlayStoryListener.routeToTopicPlayStory(
internalProfileId,
topicSummary.classroomId,
topicSummary.topicId,
topicSummary.firstStoryId
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import org.oppia.android.app.model.ProfileId
interface RouteToExplorationListener {
fun routeToExploration(
profileId: ProfileId,
classroomId: String,
topicId: String,
storyId: String,
explorationId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ class PromotedStoryViewModel(
fun clickOnStoryTile() {
routeToTopicPlayStoryListener.routeToTopicPlayStory(
internalProfileId,
promotedStory.classroomId,
promotedStory.topicId,
promotedStory.storyId
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class RecentlyPlayedActivity :

override fun routeToExploration(
profileId: ProfileId,
classroomId: String,
topicId: String,
storyId: String,
explorationId: String,
Expand All @@ -72,6 +73,7 @@ class RecentlyPlayedActivity :
ExplorationActivity.createExplorationActivityIntent(
this,
profileId,
classroomId,
topicId,
storyId,
explorationId,
Expand All @@ -83,6 +85,7 @@ class RecentlyPlayedActivity :

override fun routeToResumeLesson(
profileId: ProfileId,
classroomId: String,
topicId: String,
storyId: String,
explorationId: String,
Expand All @@ -93,6 +96,7 @@ class RecentlyPlayedActivity :
ResumeLessonActivity.createResumeLessonActivityIntent(
this,
profileId,
classroomId,
topicId,
storyId,
explorationId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor(
explorationCheckpointLiveData.removeObserver(this)
routeToResumeLessonListener.routeToResumeLesson(
profileId,
promotedStory.classroomId,
promotedStory.topicId,
promotedStory.storyId,
promotedStory.explorationId,
Expand All @@ -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,
Expand All @@ -128,6 +130,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor(
)
} else {
playExploration(
promotedStory.classroomId,
promotedStory.topicId,
promotedStory.storyId,
promotedStory.explorationId,
Expand Down Expand Up @@ -162,6 +165,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor(
}

private fun playExploration(
classroomId: String,
topicId: String,
storyId: String,
explorationId: String,
Expand All @@ -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 ->
Expand All @@ -192,6 +196,7 @@ class RecentlyPlayedFragmentPresenter @Inject constructor(
oppiaLogger.d("RecentlyPlayedFragment", "Successfully loaded exploration")
routeToExplorationListener.routeToExploration(
profileId,
classroomId,
topicId,
storyId,
explorationId,
Expand Down
Loading

0 comments on commit d819e70

Please sign in to comment.