Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature/challenge frame drop]: 프레임 버벅임 수정 #288

Merged
merged 7 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,3 @@ class FragmentViewBindingDelegate<F : Fragment, T : ViewBinding>(

fun <T : ViewBinding> Fragment.viewBinding(viewBinder: (View) -> T) =
FragmentViewBindingDelegate(this, viewBinder)

fun Boolean.mapBooleanToVisibility(): Int = when (this) {
true -> View.VISIBLE
false -> View.INVISIBLE
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -34,7 +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.mapBooleanToVisibility
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
Expand All @@ -54,8 +55,25 @@ class ChallengeFragment : Fragment() {
private val binding by viewBinding(FragmentChallengeBinding::bind)
private val activityViewModel by activityViewModels<MainViewModel>()
private val viewModel by viewModels<ChallengeViewModel>()
private lateinit var appSelectionResultLauncher: ActivityResultLauncher<Intent>
private lateinit var newChallengeResultLauncher: ActivityResultLauncher<Intent>
private val appSelectionResultLauncher: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
addSelectedApps(result)
}
}
private val newChallengeResultLauncher: ActivityResultLauncher<Intent> =
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
Expand Down Expand Up @@ -85,8 +103,6 @@ class ChallengeFragment : Fragment() {
savedInstanceState: Bundle?,
) {
super.onViewCreated(view, savedInstanceState)
initAppSelectionResultLauncher()
initNewChallengeResultLauncher()
initViews()
collectMainStateAndProcess()
collectChallengeStateAndProcess()
Expand Down Expand Up @@ -168,14 +184,25 @@ 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()
}
}

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")
Expand Down Expand Up @@ -204,21 +231,19 @@ class ChallengeFragment : Fragment() {
private fun initViews() {
initModifierButton()
initPointButton()
initAppAddButton()
initChallengeCreateButton()
initChallengeGoalsRecyclerView()
initChallengeCalendarRecyclerView()
initChallengeCalendar()
}

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<ChallengeUsageGoal>) {
Expand Down Expand Up @@ -253,31 +278,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
Expand Down Expand Up @@ -318,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 -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ data class ChallengeState(
val usageGoalsAndModifiers: List<ChallengeUsageGoal>
get() = usageStatusAndGoals.apps.map {
ChallengeUsageGoal(it, modifierState)
} + ChallengeUsageGoal(UsageStatusAndGoal.App(), modifierState)
}
}

data class ChallengeUsageGoal(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ChallengeUsageGoal, ChallengeViewHolder>(
ItemDiffCallback(
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
}
}
}

}

24 changes: 20 additions & 4 deletions feature/challenge/src/main/res/layout/fragment_challenge.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -141,7 +142,6 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />


<TextView
android:id="@+id/tv_app_lock"
android:layout_width="wrap_content"
Expand All @@ -151,6 +151,7 @@
android:text="@string/app_lock"
android:textAppearance="?textAppearanceTitleSmall"
android:textColor="@color/gray1"
app:layout_constraintBottom_toTopOf="@id/rv_app_usage_goals"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_calendar_toggle" />

Expand All @@ -171,12 +172,27 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_app_usage_goals"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="300dp"
android:layout_marginBottom="14dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/bt_goal_add"
app:layout_constraintEnd_toEndOf="@id/tv_modifier_button"
app:layout_constraintStart_toStartOf="@id/tv_app_lock"
app:layout_constraintTop_toBottomOf="@id/tv_modifier_button" />
app:layout_constraintTop_toBottomOf="@id/tv_app_lock" />

<ImageView
android:id="@+id/bt_goal_add"
android:layout_width="0dp"
android:layout_height="72dp"
android:layout_marginHorizontal="20dp"
android:layout_marginBottom="24dp"
android:background="@drawable/shape_background_radius4_gray8"
android:contentDescription="@string/all_plus_img"
android:padding="20dp"
android:src="@drawable/ic_plus_gray_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rv_app_usage_goals" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
20 changes: 0 additions & 20 deletions feature/challenge/src/main/res/layout/item_goal_add.xml

This file was deleted.

Loading