From c34be4dd2a35682060996be580e0627328c85beb Mon Sep 17 00:00:00 2001 From: Kez Date: Sun, 19 Jan 2025 18:56:38 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix[challenge]:=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=EC=97=86=EB=8A=94=20binding=20function=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hmh/hamyeonham/common/view/Binding.kt | 5 -- .../hamyeonham/challenge/ChallengeFragment.kt | 70 ++++++++----------- .../calendar/ChallengeStatusViewHolder.kt | 7 +- 3 files changed, 32 insertions(+), 50 deletions(-) diff --git a/core/common/src/main/java/com/hmh/hamyeonham/common/view/Binding.kt b/core/common/src/main/java/com/hmh/hamyeonham/common/view/Binding.kt index 5e751e1a5..b28f9968e 100644 --- a/core/common/src/main/java/com/hmh/hamyeonham/common/view/Binding.kt +++ b/core/common/src/main/java/com/hmh/hamyeonham/common/view/Binding.kt @@ -58,8 +58,3 @@ class FragmentViewBindingDelegate( fun Fragment.viewBinding(viewBinder: (View) -> T) = FragmentViewBindingDelegate(this, viewBinder) - -fun Boolean.mapBooleanToVisibility(): Int = when (this) { - true -> View.VISIBLE - false -> View.INVISIBLE -} \ No newline at end of file diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt index 2c964ab99..a1a0c47be 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt @@ -10,6 +10,7 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat +import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -34,7 +35,6 @@ import com.hmh.hamyeonham.common.fragment.viewLifeCycleScope import com.hmh.hamyeonham.common.navigation.NavigationProvider import com.hmh.hamyeonham.common.view.VerticalSpaceItemDecoration import com.hmh.hamyeonham.common.view.dp -import com.hmh.hamyeonham.common.view.mapBooleanToVisibility import com.hmh.hamyeonham.common.view.viewBinding import com.hmh.hamyeonham.core.designsystem.R import com.hmh.hamyeonham.core.domain.usagegoal.model.ChallengeStatus @@ -54,8 +54,25 @@ class ChallengeFragment : Fragment() { private val binding by viewBinding(FragmentChallengeBinding::bind) private val activityViewModel by activityViewModels() private val viewModel by viewModels() - private lateinit var appSelectionResultLauncher: ActivityResultLauncher - private lateinit var newChallengeResultLauncher: ActivityResultLauncher + private val appSelectionResultLauncher: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + addSelectedApps(result) + } + } + private val newChallengeResultLauncher: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + val period = result.data?.getIntExtra(NewChallengeActivity.PERIOD, 0) + val goalTime = result.data?.getLongExtra(NewChallengeActivity.GOALTIME, 0) + activityViewModel.generateNewChallenge( + NewChallenge( + period = period ?: 0, + goalTime = goalTime ?: 0, + ), + ) + } + } @Inject lateinit var navigationProvider: NavigationProvider @@ -85,8 +102,6 @@ class ChallengeFragment : Fragment() { savedInstanceState: Bundle?, ) { super.onViewCreated(view, savedInstanceState) - initAppSelectionResultLauncher() - initNewChallengeResultLauncher() initViews() collectMainStateAndProcess() collectChallengeStateAndProcess() @@ -168,9 +183,12 @@ class ChallengeFragment : Fragment() { private fun initPointButton() { val pointButtonImg = - if (activityViewModel.isPointLeftToCollect) com.hmh.hamyeonham.common.R.drawable.ic_chellenge_point_exist_24 else com.hmh.hamyeonham.common.R.drawable.ic_chellenge_point_not_exist_24 + if (activityViewModel.isPointLeftToCollect) { + com.hmh.hamyeonham.common.R.drawable.ic_chellenge_point_exist_24 + } else { + com.hmh.hamyeonham.common.R.drawable.ic_chellenge_point_not_exist_24 + } binding.tvPointButton.setImageResource(pointButtonImg) - binding.tvPointButton.setOnClickListener { navigateToPointView() } @@ -211,14 +229,11 @@ class ChallengeFragment : Fragment() { } private fun setChallengeCalendarVisibility(isChallengeExist: Boolean) { - val challengeCreateVisibility = (!isChallengeExist).mapBooleanToVisibility() - val challengeInfoVisibility = (isChallengeExist).mapBooleanToVisibility() - - binding.btnChallengeCreate.visibility = challengeCreateVisibility - binding.tvChallengeCreateTitle.visibility = challengeCreateVisibility - binding.tvChallengeDay.visibility = challengeInfoVisibility - binding.tvChallengeStartDate.visibility = challengeInfoVisibility - binding.rvChallengeCalendar.visibility = challengeInfoVisibility + binding.btnChallengeCreate.isInvisible = isChallengeExist + binding.tvChallengeCreateTitle.isInvisible = !isChallengeExist + binding.tvChallengeDay.isInvisible = !isChallengeExist + binding.tvChallengeStartDate.isInvisible = !isChallengeExist + binding.rvChallengeCalendar.isInvisible = !isChallengeExist } private fun bindUsageGoals(challengeUsageGoalList: List) { @@ -253,31 +268,6 @@ class ChallengeFragment : Fragment() { initChallengeCalendar() } - private fun initAppSelectionResultLauncher() { - appSelectionResultLauncher = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - addSelectedApps(result) - } - } - } - - private fun initNewChallengeResultLauncher() { - newChallengeResultLauncher = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - val period = result.data?.getIntExtra(NewChallengeActivity.PERIOD, 0) - val goalTime = result.data?.getLongExtra(NewChallengeActivity.GOALTIME, 0) - activityViewModel.generateNewChallenge( - NewChallenge( - period = period ?: 0, - goalTime = goalTime ?: 0, - ), - ) - } - } - } - private fun initChallengeCalendar() { val period = activityViewModel.mainState.value.period val isPeriodOverTwoWeeks = period > 14 diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/calendar/ChallengeStatusViewHolder.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/calendar/ChallengeStatusViewHolder.kt index fdb0d0d2b..756317c14 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/calendar/ChallengeStatusViewHolder.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/calendar/ChallengeStatusViewHolder.kt @@ -2,8 +2,8 @@ package com.hmh.hamyeonham.challenge.calendar import android.content.Context import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView -import com.hmh.hamyeonham.common.view.mapBooleanToVisibility import com.hmh.hamyeonham.core.domain.usagegoal.model.ChallengeStatus import com.hmh.hamyeonham.feature.challenge.R import com.hmh.hamyeonham.feature.challenge.databinding.ItemChallengeStatusBinding @@ -17,13 +17,10 @@ class ChallengeStatusViewHolder( tvDate.text = date ivChallengeStatus.setImageResource(getDrawableResource(challenge)) tvDate.setTextColor(getColor(challenge)) - ivTodayMark.visibility = getChallengeStatusVisibility(challenge) + ivTodayMark.isVisible = challenge == ChallengeStatus.TODAY } } - private fun getChallengeStatusVisibility(challenge: ChallengeStatus) = - (challenge == ChallengeStatus.TODAY).mapBooleanToVisibility() - private fun getColor(challenge: ChallengeStatus?): Int { val colorId = when (challenge) { ChallengeStatus.UNEARNED -> com.hmh.hamyeonham.core.designsystem.R.color.gray2 From 38eb145f113b746eb1a8c79f5d712e7dffdf1f7d Mon Sep 17 00:00:00 2001 From: Kez Date: Sun, 19 Jan 2025 19:18:38 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix[challenge]:=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/challenge/src/main/res/layout/fragment_challenge.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/challenge/src/main/res/layout/fragment_challenge.xml b/feature/challenge/src/main/res/layout/fragment_challenge.xml index c2bee0c64..fa2c31fc9 100644 --- a/feature/challenge/src/main/res/layout/fragment_challenge.xml +++ b/feature/challenge/src/main/res/layout/fragment_challenge.xml @@ -2,6 +2,7 @@ Date: Sun, 19 Jan 2025 19:48:21 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix[challenge]:=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt | 2 +- feature/challenge/src/main/res/layout/fragment_challenge.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt index a1a0c47be..25801e6fa 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt @@ -230,7 +230,7 @@ class ChallengeFragment : Fragment() { private fun setChallengeCalendarVisibility(isChallengeExist: Boolean) { binding.btnChallengeCreate.isInvisible = isChallengeExist - binding.tvChallengeCreateTitle.isInvisible = !isChallengeExist + binding.tvChallengeCreateTitle.isInvisible = isChallengeExist binding.tvChallengeDay.isInvisible = !isChallengeExist binding.tvChallengeStartDate.isInvisible = !isChallengeExist binding.rvChallengeCalendar.isInvisible = !isChallengeExist diff --git a/feature/challenge/src/main/res/layout/fragment_challenge.xml b/feature/challenge/src/main/res/layout/fragment_challenge.xml index fa2c31fc9..66ab7b19d 100644 --- a/feature/challenge/src/main/res/layout/fragment_challenge.xml +++ b/feature/challenge/src/main/res/layout/fragment_challenge.xml @@ -2,7 +2,6 @@ Date: Sun, 19 Jan 2025 20:09:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix[challenge]:=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hamyeonham/challenge/ChallengeFragment.kt | 15 +++++--- .../challenge/ChallengeViewModel.kt | 2 +- .../goals/ChallengeUsageGoalsAdapter.kt | 37 ++++--------------- .../challenge/goals/ChallengeViewHolder.kt | 16 -------- .../main/res/layout/fragment_challenge.xml | 25 ++++++++++--- .../src/main/res/layout/item_goal_add.xml | 20 ---------- 6 files changed, 39 insertions(+), 76 deletions(-) delete mode 100644 feature/challenge/src/main/res/layout/item_goal_add.xml diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt index 25801e6fa..57a938172 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeFragment.kt @@ -35,6 +35,7 @@ import com.hmh.hamyeonham.common.fragment.viewLifeCycleScope import com.hmh.hamyeonham.common.navigation.NavigationProvider import com.hmh.hamyeonham.common.view.VerticalSpaceItemDecoration import com.hmh.hamyeonham.common.view.dp +import com.hmh.hamyeonham.common.view.setOnSingleClickListener import com.hmh.hamyeonham.common.view.viewBinding import com.hmh.hamyeonham.core.designsystem.R import com.hmh.hamyeonham.core.domain.usagegoal.model.ChallengeStatus @@ -194,6 +195,14 @@ class ChallengeFragment : Fragment() { } } + private fun initAppAddButton() { + binding.btGoalAdd.setOnSingleClickListener { + AmplitudeUtils.trackEventWithProperties("click_add_button") + val intent = Intent(requireContext(), AppAddActivity::class.java) + appSelectionResultLauncher.launch(intent) + } + } + private fun initChallengeCreateButton() { binding.btnChallengeCreate.setOnClickListener { AmplitudeUtils.trackEventWithProperties("click_newchallenge_button") @@ -222,6 +231,7 @@ class ChallengeFragment : Fragment() { private fun initViews() { initModifierButton() initPointButton() + initAppAddButton() initChallengeCreateButton() initChallengeGoalsRecyclerView() initChallengeCalendarRecyclerView() @@ -308,11 +318,6 @@ class ChallengeFragment : Fragment() { private fun initChallengeGoalsRecyclerView() { binding.rvAppUsageGoals.run { adapter = ChallengeUsageGoalsAdapter( - onAppListAddClicked = { - AmplitudeUtils.trackEventWithProperties("click_add_button") - val intent = Intent(requireContext(), AppAddActivity::class.java) - appSelectionResultLauncher.launch(intent) - }, onAppItemClicked = { challengeGoal -> when (viewModel.challengeState.value.modifierState) { ModifierState.EDIT -> { diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeViewModel.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeViewModel.kt index d96a3e19a..621a1905c 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeViewModel.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/ChallengeViewModel.kt @@ -26,7 +26,7 @@ data class ChallengeState( val usageGoalsAndModifiers: List get() = usageStatusAndGoals.apps.map { ChallengeUsageGoal(it, modifierState) - } + ChallengeUsageGoal(UsageStatusAndGoal.App(), modifierState) + } } data class ChallengeUsageGoal( diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeUsageGoalsAdapter.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeUsageGoalsAdapter.kt index 45da41e68..b55c38a37 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeUsageGoalsAdapter.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeUsageGoalsAdapter.kt @@ -5,11 +5,9 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import com.hmh.hamyeonham.challenge.ChallengeUsageGoal import com.hmh.hamyeonham.common.view.ItemDiffCallback -import com.hmh.hamyeonham.feature.challenge.databinding.ItemGoalAddBinding import com.hmh.hamyeonham.feature.challenge.databinding.ItemUsageGoalBinding class ChallengeUsageGoalsAdapter( - private val onAppListAddClicked: () -> Unit, private val onAppItemClicked: (ChallengeUsageGoal) -> Unit ) : ListAdapter( ItemDiffCallback( @@ -22,37 +20,18 @@ class ChallengeUsageGoalsAdapter( ) ) { - override fun getItemViewType(position: Int): Int { - return if (position == currentList.lastIndex) { - ChallengeViewHolder.ChallengeViewHolderType.GOAL_ADD.ordinal - } else { - ChallengeViewHolder.ChallengeViewHolderType.USAGE_GOALS.ordinal - } - } - override fun onCreateViewHolder( parent: ViewGroup, viewType: Int ): ChallengeViewHolder { - return when (viewType) { - ChallengeViewHolder.ChallengeViewHolderType.USAGE_GOALS.ordinal -> ChallengeViewHolder.UsageGoalsViewHolder( - ItemUsageGoalBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ), - onAppItemClicked = onAppItemClicked - ) - - else -> ChallengeViewHolder.GoalAddViewHolder( - ItemGoalAddBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ), - onAppListAddClicked = onAppListAddClicked - ) - } + return ChallengeViewHolder.UsageGoalsViewHolder( + ItemUsageGoalBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + onAppItemClicked = onAppItemClicked + ) } override fun onBindViewHolder(holder: ChallengeViewHolder, position: Int) { diff --git a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeViewHolder.kt b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeViewHolder.kt index bdb12cddf..405a84179 100644 --- a/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeViewHolder.kt +++ b/feature/challenge/src/main/java/com/hmh/hamyeonham/challenge/goals/ChallengeViewHolder.kt @@ -9,15 +9,10 @@ import com.hmh.hamyeonham.common.context.getAppIconFromPackageName import com.hmh.hamyeonham.common.context.getAppNameFromPackageName import com.hmh.hamyeonham.common.time.convertTimeToString import com.hmh.hamyeonham.feature.challenge.R -import com.hmh.hamyeonham.feature.challenge.databinding.ItemGoalAddBinding import com.hmh.hamyeonham.feature.challenge.databinding.ItemUsageGoalBinding sealed class ChallengeViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) { - enum class ChallengeViewHolderType { - USAGE_GOALS, GOAL_ADD - } - class UsageGoalsViewHolder( private val binding: ItemUsageGoalBinding, private val onAppItemClicked: (ChallengeUsageGoal) -> Unit @@ -76,16 +71,5 @@ sealed class ChallengeViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder ivTrash.setImageResource(trashIconId) } } - - class GoalAddViewHolder( - binding: ItemGoalAddBinding, private val onAppListAddClicked: () -> Unit - ) : ChallengeViewHolder(binding) { - init { - binding.root.setOnClickListener { - onAppListAddClicked() - } - } - } - } diff --git a/feature/challenge/src/main/res/layout/fragment_challenge.xml b/feature/challenge/src/main/res/layout/fragment_challenge.xml index 66ab7b19d..3b72cb331 100644 --- a/feature/challenge/src/main/res/layout/fragment_challenge.xml +++ b/feature/challenge/src/main/res/layout/fragment_challenge.xml @@ -81,6 +81,7 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="26dp" android:layout_marginTop="27dp" + android:nestedScrollingEnabled="false" app:layout_constraintBottom_toTopOf="@id/cl_locked_app_list" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -141,7 +142,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - @@ -171,13 +172,27 @@ + app:layout_constraintTop_toBottomOf="@id/tv_app_lock" /> + + diff --git a/feature/challenge/src/main/res/layout/item_goal_add.xml b/feature/challenge/src/main/res/layout/item_goal_add.xml deleted file mode 100644 index 541ee69f3..000000000 --- a/feature/challenge/src/main/res/layout/item_goal_add.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - From 59e265514b150e02ad08608eaedc06e4b7f34474 Mon Sep 17 00:00:00 2001 From: Kez Date: Wed, 29 Jan 2025 18:29:36 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix[viewPager]:=20=EA=B8=B0=EB=B3=B8=20tran?= =?UTF-8?q?saction=20=EC=9D=98=20Fragment=20=EC=A0=84=ED=99=98=EC=9D=84=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B3=A0=20Vie?= =?UTF-8?q?wPager=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EB=B2=84=EB=B2=85?= =?UTF-8?q?=EC=9E=84=20=ED=95=B4=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../hamyeonham/feature/main/MainActivity.kt | 44 +++++++++++++++---- .../hamyeonham/feature/main/MainAdapter.kt | 20 +++++++++ .../hmh/hamyeonham/feature/main/MainScreen.kt | 11 +++++ .../feature/main/home/UsageStaticsAdapter.kt | 5 +++ .../main/home/UsageStaticsTotalViewHolder.kt | 25 ++++++----- .../src/main/res/layout/activity_main.xml | 11 ++--- 7 files changed, 91 insertions(+), 26 deletions(-) create mode 100644 feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainAdapter.kt create mode 100644 feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainScreen.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a3483f2e9..97e7c1b35 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ android:allowBackup="false" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" + android:hardwareAccelerated="true" android:icon="@drawable/hmh_app_logo" android:label="@string/app_name" android:supportsRtl="true" diff --git a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainActivity.kt b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainActivity.kt index 3a484024e..ea5fae1da 100644 --- a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainActivity.kt @@ -5,8 +5,6 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.ui.setupWithNavController import com.hmh.hamyeonham.common.amplitude.AmplitudeUtils import com.hmh.hamyeonham.common.context.getAppNameFromPackageName import com.hmh.hamyeonham.common.context.hasNotificationPermission @@ -37,7 +35,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) - initNavHostFragment() + initViews() collectEffect() } @@ -62,11 +60,41 @@ class MainActivity : AppCompatActivity() { }.launchIn(lifecycleScope) } - private fun initNavHostFragment() { - val navHostFragment = - supportFragmentManager.findFragmentById(binding.fcvMain.id) as NavHostFragment - val navController = navHostFragment.navController - binding.bnvMain.setupWithNavController(navController) + private fun initViews() { + initViewPager() + initBottomNavigation() + } + + private fun initViewPager() { + binding.vpMain.apply { + isUserInputEnabled = false + adapter = MainAdapter(this@MainActivity) + setCurrentItem(MainScreen.HOME.ordinal, false) + + } + } + + private fun initBottomNavigation() { + binding.bnvMain.selectedItemId = R.id.home_dest + binding.bnvMain.setOnItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.challenge_dest -> binding.vpMain.setCurrentItem( + MainScreen.CHALLENGE.ordinal, + false + ) + + R.id.home_dest -> binding.vpMain.setCurrentItem( + MainScreen.HOME.ordinal, + false + ) + + R.id.my_page_dest -> binding.vpMain.setCurrentItem( + MainScreen.MY_PAGE.ordinal, + false + ) + } + true + } } private fun checkUnlockedPackage() { diff --git a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainAdapter.kt b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainAdapter.kt new file mode 100644 index 000000000..497de79ca --- /dev/null +++ b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainAdapter.kt @@ -0,0 +1,20 @@ +package com.hmh.hamyeonham.feature.main + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.hmh.hamyeonham.challenge.ChallengeFragment +import com.hmh.hamyeonham.feature.main.home.HomeFragment +import com.hmh.hamyeonham.mypage.MyPageFragment + +class MainAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) { + override fun getItemCount(): Int = MainScreen.entries.size + + override fun createFragment(position: Int): Fragment { + return when (MainScreen.fromPosition(position)) { + MainScreen.CHALLENGE -> ChallengeFragment() + MainScreen.HOME -> HomeFragment() + MainScreen.MY_PAGE -> MyPageFragment() + } + } +} \ No newline at end of file diff --git a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainScreen.kt b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainScreen.kt new file mode 100644 index 000000000..ccbfef6e0 --- /dev/null +++ b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/MainScreen.kt @@ -0,0 +1,11 @@ +package com.hmh.hamyeonham.feature.main + +enum class MainScreen { + CHALLENGE, + HOME, + MY_PAGE; + + companion object { + fun fromPosition(position: Int): MainScreen = entries[position] + } +} \ No newline at end of file diff --git a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsAdapter.kt b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsAdapter.kt index f117dd4b1..5c8608d2f 100644 --- a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsAdapter.kt +++ b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsAdapter.kt @@ -71,6 +71,11 @@ class UsageStaticsAdapter : ListAdapter( return HomeItemViewType.getOrdinal(itemType) } + override fun onViewRecycled(holder: RecyclerView.ViewHolder) { + super.onViewRecycled(holder) + if (holder is UsageStaticsTotalViewHolder) holder.unbind() + } + enum class HomeItemViewType { TOTAL_ITEM_TYPE, APP_ITEM_TYPE, diff --git a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsTotalViewHolder.kt b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsTotalViewHolder.kt index 2f7034422..bc4f75106 100644 --- a/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsTotalViewHolder.kt +++ b/feature/main/src/main/java/com/hmh/hamyeonham/feature/main/home/UsageStaticsTotalViewHolder.kt @@ -20,6 +20,10 @@ class UsageStaticsTotalViewHolder( binding.pbTotalUsage.setProgressWithAnimation(totalModel.totalPercentage) } + fun unbind() { + binding.lavBlackhole.cancelAnimation() + } + private fun bindUsageStaticsInfo(totalModel: HomeItem.TotalModel) { binding.run { val totalTimeLeft = @@ -47,18 +51,17 @@ class UsageStaticsTotalViewHolder( } private fun bindBlackHoleInfo(totalModel: HomeItem.TotalModel) { - val blackHoleInfo = - when { - // 챌린지 성공한 경우 - totalModel.challengeSuccess -> { - BlackHoleInfo.createByPercentage(totalModel.totalPercentage) - ?: BlackHoleInfo.LEVEL0 - } - // 챌린지 실패한 경우 - else -> { - BlackHoleInfo.LEVEL5 - } + val blackHoleInfo = when { + // 챌린지 성공한 경우 + totalModel.challengeSuccess -> { + BlackHoleInfo.createByPercentage(totalModel.totalPercentage) + ?: BlackHoleInfo.LEVEL0 } + // 챌린지 실패한 경우 + else -> { + BlackHoleInfo.LEVEL5 + } + } setBlackHoleAnimation(blackHoleInfo) bindBlackHoleDescription(blackHoleInfo) diff --git a/feature/main/src/main/res/layout/activity_main.xml b/feature/main/src/main/res/layout/activity_main.xml index 9de11c687..46163af14 100644 --- a/feature/main/src/main/res/layout/activity_main.xml +++ b/feature/main/src/main/res/layout/activity_main.xml @@ -6,17 +6,14 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - + app:layout_constraintTop_toTopOf="parent" />