Skip to content

Commit

Permalink
ALTAPPS-1031: Android FillBlanks onboarding animation (#746)
Browse files Browse the repository at this point in the history
Implement FillBlanks onboarding animation
  • Loading branch information
XanderZhu authored Nov 15, 2023
1 parent 1e96025 commit eb45649
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 83 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package org.hyperskill.app.android.step_quiz.view.dialog

import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RawRes
import by.kirich1409.viewbindingdelegate.viewBinding
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.hyperskill.app.android.R
import org.hyperskill.app.android.core.extensions.argument
import org.hyperskill.app.android.databinding.FragmentStepQuizProblemOnboardingBinding
import org.hyperskill.app.android.view.base.ui.extension.wrapWithTheme
import org.hyperskill.app.step_quiz.presentation.StepQuizFeature
import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksMode

class ProblemOnboardingBottomSheetDialogFragment : BottomSheetDialogFragment() {

companion object {
const val TAG = "ProblemOnboardingBottomSheetDialogFragment"

fun newInstance(
modalType: StepQuizFeature.ProblemOnboardingModal
): ProblemOnboardingBottomSheetDialogFragment =
ProblemOnboardingBottomSheetDialogFragment().apply {
this.modalType = modalType
}
}

private var modalType: StepQuizFeature.ProblemOnboardingModal by argument(
StepQuizFeature.ProblemOnboardingModal.serializer()
)

private val viewBinding: FragmentStepQuizProblemOnboardingBinding by viewBinding(
FragmentStepQuizProblemOnboardingBinding::bind
)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.TopCornersRoundedBottomSheetDialog)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
BottomSheetDialog(requireContext(), theme).also { dialog ->
dialog.setOnShowListener {
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
if (savedInstanceState == null) {
(parentFragment as? Callback)?.problemOnboardingShown(modalType)
}
}
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? =
inflater.wrapWithTheme(requireActivity())
.inflate(
R.layout.fragment_step_quiz_problem_onboarding,
container,
false
)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
with(viewBinding) {
parsonsOnboardingAnimation.setAnimation(getAnimation(modalType))
parsonsOnboardingDescription.text =
getDescription(requireContext(), modalType)
}
}

override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
(parentFragment as? Callback)?.problemOnboardingHidden(modalType)
}

@RawRes
private fun getAnimation(modalType: StepQuizFeature.ProblemOnboardingModal): Int =
when (modalType) {
StepQuizFeature.ProblemOnboardingModal.Parsons -> R.raw.parsons_problem_onboarding_animation
is StepQuizFeature.ProblemOnboardingModal.FillBlanks -> when (modalType.mode) {
FillBlanksMode.INPUT -> R.raw.fill_blanks_input_onboarding_animation
FillBlanksMode.SELECT -> R.raw.fill_blanks_select_onboarding_animation
}
}

private fun getDescription(
context: Context,
modalType: StepQuizFeature.ProblemOnboardingModal
): String =
context.getString(
when (modalType) {
StepQuizFeature.ProblemOnboardingModal.Parsons ->
org.hyperskill.app.R.string.step_quiz_problem_onboarding_modal_parsons_description
is StepQuizFeature.ProblemOnboardingModal.FillBlanks ->
org.hyperskill.app.R.string.step_quiz_problem_onboarding_modal_fill_blanks_description
}
)

interface Callback {
fun problemOnboardingShown(modalType: StepQuizFeature.ProblemOnboardingModal)
fun problemOnboardingHidden(modalType: StepQuizFeature.ProblemOnboardingModal)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ import org.hyperskill.app.android.step.view.model.StepCompletionView
import org.hyperskill.app.android.step.view.screen.StepScreen
import org.hyperskill.app.android.step_quiz.view.delegate.StepQuizFeedbackBlocksDelegate
import org.hyperskill.app.android.step_quiz.view.delegate.StepQuizFormDelegate
import org.hyperskill.app.android.step_quiz.view.dialog.ProblemOnboardingBottomSheetDialogFragment
import org.hyperskill.app.android.step_quiz.view.factory.StepQuizViewStateDelegateFactory
import org.hyperskill.app.android.step_quiz.view.mapper.StepQuizFeedbackMapper
import org.hyperskill.app.android.step_quiz.view.model.StepQuizFeedbackState
import org.hyperskill.app.android.step_quiz_hints.delegate.StepQuizHintsDelegate
import org.hyperskill.app.android.step_quiz_parsons.view.dialog.ParsonsStepQuizOnboardingBottomSheetDialogFragment
import org.hyperskill.app.android.view.base.ui.extension.snackbar
import org.hyperskill.app.step.domain.model.BlockName
import org.hyperskill.app.step.domain.model.Step
Expand All @@ -66,7 +66,7 @@ abstract class DefaultStepQuizFragment :
ReduxView<StepQuizFeature.State, StepQuizFeature.Action.ViewAction>,
StepCompletionView,
MenuProvider,
ParsonsStepQuizOnboardingBottomSheetDialogFragment.Callback {
ProblemOnboardingBottomSheetDialogFragment.Callback {

private lateinit var viewModelFactory: ViewModelProvider.Factory

Expand Down Expand Up @@ -286,17 +286,11 @@ abstract class DefaultStepQuizFragment :
.showIfNotExists(childFragmentManager, ProblemsLimitReachedBottomSheet.TAG)
}
is StepQuizFeature.Action.ViewAction.ShowProblemOnboardingModal -> {
when (action.modalType) {
StepQuizFeature.ProblemOnboardingModal.Parsons ->
ParsonsStepQuizOnboardingBottomSheetDialogFragment.newInstance()
.showIfNotExists(
childFragmentManager,
ParsonsStepQuizOnboardingBottomSheetDialogFragment.TAG
)
is StepQuizFeature.ProblemOnboardingModal.FillBlanks -> {
// TODO: ALTAPPS-1031 Implement FillBlanks onboarding modal
}
}
ProblemOnboardingBottomSheetDialogFragment.newInstance(action.modalType)
.showIfNotExists(
childFragmentManager,
ProblemOnboardingBottomSheetDialogFragment.TAG
)
}
is StepQuizFeature.Action.ViewAction.StepQuizHintsViewAction -> {
stepQuizHintsDelegate?.onAction(action.viewAction)
Expand Down Expand Up @@ -423,19 +417,15 @@ abstract class DefaultStepQuizFragment :
}
}

override fun parsonsProblemOnboardingShown() {
override fun problemOnboardingShown(modalType: StepQuizFeature.ProblemOnboardingModal) {
stepQuizViewModel.onNewMessage(
StepQuizFeature.Message.ProblemOnboardingModalShownMessage(
modalType = StepQuizFeature.ProblemOnboardingModal.Parsons
)
StepQuizFeature.Message.ProblemOnboardingModalShownMessage(modalType)
)
}

override fun parsonsProblemOnboardingHidden() {
override fun problemOnboardingHidden(modalType: StepQuizFeature.ProblemOnboardingModal) {
stepQuizViewModel.onNewMessage(
StepQuizFeature.Message.ProblemOnboardingModalHiddenMessage(
modalType = StepQuizFeature.ProblemOnboardingModal.Parsons
)
StepQuizFeature.Message.ProblemOnboardingModalHiddenMessage(modalType)
)
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
android:id="@+id/parsonsOnboardingAnimation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:lottie_rawRes="@raw/parsons_problem_onboarding_animation"
app:lottie_loop="true"
app:lottie_autoPlay="true"
android:layout_marginTop="32dp"/>
android:layout_marginTop="32dp"
tools:lottie_rawRes="@raw/parsons_problem_onboarding_animation"/>

<TextView
android:id="@+id/parsonsOnboardingTitle"
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.hyperskill.app.step_quiz.presentation

import kotlinx.serialization.Serializable
import org.hyperskill.app.analytic.domain.model.AnalyticEvent
import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags
import org.hyperskill.app.step.domain.model.Step
Expand Down Expand Up @@ -41,8 +42,12 @@ interface StepQuizFeature {
) : SubmissionState
}

@Serializable
sealed interface ProblemOnboardingModal {
@Serializable
object Parsons : ProblemOnboardingModal

@Serializable
data class FillBlanks(val mode: FillBlanksMode) : ProblemOnboardingModal
}

Expand Down

0 comments on commit eb45649

Please sign in to comment.