Skip to content

Commit

Permalink
Android rearrange home screen (#710)
Browse files Browse the repository at this point in the history
^ALTAPPS-1005
  • Loading branch information
XanderZhu authored Oct 13, 2023
1 parent 11c9fde commit 38839e2
Show file tree
Hide file tree
Showing 21 changed files with 54 additions and 235 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import com.google.android.material.appbar.AppBarLayout
import org.hyperskill.app.android.R
import org.hyperskill.app.android.databinding.LayoutGamificationToolbarBinding
import org.hyperskill.app.android.main.view.ui.navigation.MainScreenRouter
import org.hyperskill.app.android.profile.view.navigation.ProfileScreen
import org.hyperskill.app.android.main.view.ui.navigation.Tabs
import org.hyperskill.app.android.main.view.ui.navigation.switch
import org.hyperskill.app.android.progress.navigation.ProgressScreen
import org.hyperskill.app.android.view.base.ui.extension.setElevationOnCollapsed
import org.hyperskill.app.gamification_toolbar.presentation.GamificationToolbarFeature
Expand Down Expand Up @@ -88,7 +89,7 @@ class GamificationToolbarDelegate(
) {
when (action) {
is GamificationToolbarFeature.Action.ViewAction.ShowProfileTab ->
mainScreenRouter.switch(ProfileScreen(isInitCurrent = true))
mainScreenRouter.switch(Tabs.PROFILE)
GamificationToolbarFeature.Action.ViewAction.ShowProgressScreen ->
router.navigateTo(ProgressScreen)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,14 @@ import org.hyperskill.app.android.core.view.ui.updateIsRefreshing
import org.hyperskill.app.android.databinding.FragmentHomeBinding
import org.hyperskill.app.android.gamification_toolbar.view.ui.delegate.GamificationToolbarDelegate
import org.hyperskill.app.android.main.view.ui.navigation.MainScreenRouter
import org.hyperskill.app.android.next_learning_activity.view.delegate.NextLearningActivityDelegate
import org.hyperskill.app.android.problem_of_day.view.delegate.ProblemOfDayCardFormDelegate
import org.hyperskill.app.android.problems_limit.view.ui.delegate.ProblemsLimitDelegate
import org.hyperskill.app.android.stage_implementation.view.dialog.UnsupportedStageBottomSheet
import org.hyperskill.app.android.step.view.screen.StepScreen
import org.hyperskill.app.android.topics_repetitions.view.delegate.TopicsRepetitionCardFormDelegate
import org.hyperskill.app.android.topics_repetitions.view.screen.TopicsRepetitionScreen
import org.hyperskill.app.core.view.mapper.SharedDateFormatter
import org.hyperskill.app.home.presentation.HomeFeature
import org.hyperskill.app.home.presentation.HomeViewModel
import org.hyperskill.app.problems_limit.domain.model.ProblemsLimitScreen
import org.hyperskill.app.problems_limit.view.mapper.ProblemsLimitViewStateMapper
import org.hyperskill.app.step.domain.model.StepRoute
import ru.nobird.android.view.base.ui.delegate.ViewStateDelegate
import ru.nobird.android.view.redux.ui.extension.reduxViewModel
Expand All @@ -50,9 +46,6 @@ class HomeFragment :
private val homeViewModel: HomeViewModel by reduxViewModel(this) { viewModelFactory }
private val homeViewStateDelegate: ViewStateDelegate<HomeFeature.HomeState> = ViewStateDelegate()

private var problemsLimitDelegate: ProblemsLimitDelegate? = null
private var problemsLimitViewStateMapper: ProblemsLimitViewStateMapper? = null

private val problemOfDayCardFormDelegate: ProblemOfDayCardFormDelegate by lazy(LazyThreadSafetyMode.NONE) {
ProblemOfDayCardFormDelegate(
onCardClicked = ::onProblemOfDayCardActionButtonClicked,
Expand All @@ -65,14 +58,6 @@ class HomeFragment :
TopicsRepetitionCardFormDelegate()
}

private val nextLearningActivityDelegate: NextLearningActivityDelegate by lazy(LazyThreadSafetyMode.NONE) {
NextLearningActivityDelegate(requireContext()) { nextLearningActivityMessage ->
homeViewModel.onNewMessage(
HomeFeature.Message.NextLearningActivityWidgetMessage(nextLearningActivityMessage)
)
}
}

private var gamificationToolbarDelegate: GamificationToolbarDelegate? = null

private val onForegroundObserver =
Expand All @@ -96,9 +81,7 @@ class HomeFragment :
super.onViewCreated(view, savedInstanceState)
initViewStateDelegate()
initGamificationToolbarDelegate()
initProblemsLimitDelegate()
problemOfDayCardFormDelegate.setup(viewBinding.homeScreenProblemOfDayCard)
nextLearningActivityDelegate.setup(requireContext(), viewBinding.homeNextLearningActivity)
with(viewBinding) {
homeScreenSwipeRefreshLayout.setHyperskillColors()
homeScreenSwipeRefreshLayout.setOnRefreshListener {
Expand All @@ -120,8 +103,6 @@ class HomeFragment :
override fun onDestroyView() {
super.onDestroyView()
gamificationToolbarDelegate = null
problemsLimitDelegate?.cleanup()
problemsLimitDelegate = null
}

override fun onDestroy() {
Expand All @@ -132,9 +113,7 @@ class HomeFragment :
private fun injectComponents() {
val homeComponent = HyperskillApp.graph().buildHomeComponent()
val platformHomeComponent = HyperskillApp.graph().buildPlatformHomeComponent(homeComponent)
val problemsLimitComponent = HyperskillApp.graph().buildProblemsLimitComponent(ProblemsLimitScreen.HOME)
viewModelFactory = platformHomeComponent.reduxViewModelFactory
problemsLimitViewStateMapper = problemsLimitComponent.problemsLimitViewStateMapper
dateFormatter = HyperskillApp.graph().commonComponent.dateFormatter
}

Expand Down Expand Up @@ -174,16 +153,6 @@ class HomeFragment :
}
}

private fun initProblemsLimitDelegate() {
problemsLimitDelegate = ProblemsLimitDelegate(
viewBinding = viewBinding.homeProblemsLimit,
onNewMessage = {
homeViewModel.onNewMessage(HomeFeature.Message.ProblemsLimitMessage(it))
}
)
problemsLimitDelegate?.setup()
}

override fun onAction(action: HomeFeature.Action.ViewAction) {
when (action) {
is HomeFeature.Action.ViewAction.NavigateTo.TopicsRepetitionsScreen -> {
Expand All @@ -200,15 +169,6 @@ class HomeFragment :
StepScreen(action.stepRoute)
)
}
is HomeFeature.Action.ViewAction.ProblemsLimitViewAction -> {
// no op
}
is HomeFeature.Action.ViewAction.NextLearningActivityWidgetViewAction -> {
nextLearningActivityDelegate.handleAction(
fragment = this,
action = action.viewAction
)
}
}
}

Expand All @@ -224,10 +184,6 @@ class HomeFragment :
}

gamificationToolbarDelegate?.render(state.toolbarState)
problemsLimitViewStateMapper?.let { mapper ->
problemsLimitDelegate?.render(mapper.mapState(state.problemsLimitState))
}
nextLearningActivityDelegate.render(state.nextLearningActivityWidgetState)
}

private fun renderSwipeRefresh(state: HomeFeature.State) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import com.github.terrakok.cicerone.androidx.FragmentScreen
import org.hyperskill.app.android.home.view.ui.fragment.HomeFragment
import org.hyperskill.app.android.main.view.ui.navigation.Tabs

object HomeScreen : FragmentScreen {
override val screenKey: String = Tabs.HOME.name
object TrainingScreen : FragmentScreen {
override val screenKey: String = Tabs.TRAINING.name

override fun createFragment(factory: FragmentFactory): Fragment =
HomeFragment.newInstance()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,6 @@ class MainActivity :
router.newRootScreen(OnboardingScreen)
is AppFeature.Action.ViewAction.NavigateTo.AuthScreen ->
router.newRootScreen(AuthScreen())
is AppFeature.Action.ViewAction.NavigateTo.HomeScreen ->
router.newRootScreen(MainScreen())
is AppFeature.Action.ViewAction.NavigateTo.TrackSelectionScreen ->
router.newRootScreen(
TrackSelectionListScreen(
Expand Down Expand Up @@ -274,9 +272,9 @@ class MainActivity :
router.newRootScreen(
FirstProblemOnboardingScreen(action.isNewUserMode)
)
is AppFeature.Action.ViewAction.NavigateTo.HomeScreenWithStep ->
is AppFeature.Action.ViewAction.NavigateTo.StudyPlanWithStep ->
router.newRootChain(
MainScreen(),
MainScreen(Tabs.STUDY_PLAN),
StepScreen(action.stepRoute)
)
AppFeature.Action.ViewAction.NavigateTo.StudyPlan ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ class MainFragment : Fragment(R.layout.fragment_main) {
onScreenChanged = { screenKey ->
viewBinding.mainBottomNavigation.selectedItemId =
when (Tabs.valueOf(screenKey)) {
Tabs.HOME ->
R.id.home_tab
Tabs.TRAINING ->
R.id.training_tab
Tabs.STUDY_PLAN ->
R.id.study_plan_tab
Tabs.PROFILE ->
Expand Down Expand Up @@ -93,8 +93,8 @@ class MainFragment : Fragment(R.layout.fragment_main) {
}

when (item.itemId) {
R.id.home_tab -> {
localCicerone.router.switch(Tabs.HOME)
R.id.training_tab -> {
localCicerone.router.switch(Tabs.TRAINING)
}
R.id.profile_tab -> {
localCicerone.router.switch(Tabs.PROFILE)
Expand Down Expand Up @@ -136,7 +136,7 @@ class MainFragment : Fragment(R.layout.fragment_main) {
itemId: Int
): AppClickedBottomNavigationItemHyperskillAnalyticEvent.NavigationItem? =
when (itemId) {
R.id.home_tab -> AppClickedBottomNavigationItemHyperskillAnalyticEvent.NavigationItem.HOME
R.id.training_tab -> AppClickedBottomNavigationItemHyperskillAnalyticEvent.NavigationItem.HOME
R.id.study_plan_tab -> AppClickedBottomNavigationItemHyperskillAnalyticEvent.NavigationItem.STUDY_PLAN
R.id.profile_tab -> AppClickedBottomNavigationItemHyperskillAnalyticEvent.NavigationItem.PROFILE
R.id.debug_tab -> AppClickedBottomNavigationItemHyperskillAnalyticEvent.NavigationItem.DEBUG
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import org.hyperskill.app.android.main.view.ui.fragment.MainFragment
* Represent the main screen with the bottom app bar.
* @param initialTab means the tab which will be opened during the first screen show
*/
data class MainScreen(private val initialTab: Tabs = Tabs.HOME) : FragmentScreen {
data class MainScreen(private val initialTab: Tabs = Tabs.STUDY_PLAN) : FragmentScreen {
override fun createFragment(factory: FragmentFactory): Fragment =
MainFragment.newInstance(initialTab)
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.hyperskill.app.android.main.view.ui.navigation

import org.hyperskill.app.android.debug.DebugScreen
import org.hyperskill.app.android.home.view.ui.screen.HomeScreen
import org.hyperskill.app.android.home.view.ui.screen.TrainingScreen
import org.hyperskill.app.android.profile.view.navigation.ProfileScreen
import org.hyperskill.app.android.study_plan.screen.StudyPlanScreen
import ru.nobird.android.view.navigation.router.RetainedRouter
Expand All @@ -10,7 +10,7 @@ typealias MainScreenRouter = RetainedRouter

fun MainScreenRouter.switch(tab: Tabs) {
val tabScreen = when (tab) {
Tabs.HOME -> HomeScreen
Tabs.TRAINING -> TrainingScreen
Tabs.STUDY_PLAN -> StudyPlanScreen
Tabs.PROFILE -> ProfileScreen(isInitCurrent = true)
Tabs.DEBUG -> DebugScreen
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.hyperskill.app.android.main.view.ui.navigation

enum class Tabs {
HOME,
TRAINING,
STUDY_PLAN,
PROFILE,
DEBUG
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ object NotificationClickHandlingDelegate {
navigateTo: NotificationClickHandlingFeature.Action.ViewAction.NavigateTo
) {
when (navigateTo) {
NotificationClickHandlingFeature.Action.ViewAction.NavigateTo.Home ->
router.newRootScreen(MainScreen(initialTab = Tabs.HOME))
NotificationClickHandlingFeature.Action.ViewAction.NavigateTo.Profile ->
router.newRootScreen(MainScreen(initialTab = Tabs.PROFILE))
NotificationClickHandlingFeature.Action.ViewAction.NavigateTo.StudyPlan ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import androidx.fragment.app.FragmentManager
import org.hyperskill.app.android.core.extensions.openUrl
import org.hyperskill.app.android.core.view.ui.dialog.LoadingProgressDialogFragment
import org.hyperskill.app.android.core.view.ui.dialog.dismissDialogFragmentIfExists
import org.hyperskill.app.android.home.view.ui.screen.HomeScreen
import org.hyperskill.app.android.main.view.ui.navigation.MainScreenRouter
import org.hyperskill.app.android.main.view.ui.navigation.Tabs
import org.hyperskill.app.android.main.view.ui.navigation.switch
import org.hyperskill.app.android.profile.view.dialog.BadgeDetailsDialogFragment
import org.hyperskill.app.android.profile.view.dialog.StreakFreezeDialogFragment
import org.hyperskill.app.android.view.base.ui.extension.snackbar
Expand Down Expand Up @@ -49,8 +50,8 @@ object ProfileViewActionDelegate {
ProfileFeature.Action.ViewAction.ShowStreakFreezeBuyingStatus.Error ->
view.snackbar(org.hyperskill.app.R.string.streak_freeze_bought_error)

ProfileFeature.Action.ViewAction.NavigateTo.HomeScreen -> {
mainScreenRouter.switch(HomeScreen)
ProfileFeature.Action.ViewAction.NavigateTo.StudyPlan -> {
mainScreenRouter.switch(Tabs.STUDY_PLAN)
}
is ProfileFeature.Action.ViewAction.ShowBadgeDetailsModal -> {
BadgeDetailsDialogFragment.newInstance(action.details)
Expand Down
Loading

0 comments on commit 38839e2

Please sign in to comment.