Skip to content

Commit

Permalink
Merge pull request #145 from Team-HMH/fix/onboarding_all
Browse files Browse the repository at this point in the history
[fix/onboarding_all]: 온보딩 전반적인 이슈 수정
  • Loading branch information
kez-lab authored Jan 19, 2024
2 parents 63d9bcb + 90969f5 commit e711334
Show file tree
Hide file tree
Showing 18 changed files with 148 additions and 137 deletions.
1 change: 1 addition & 0 deletions app/src/main/java/com/hmh/hamyeonham/SampleActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import com.hmh.hamyeonham.common.view.viewBinding
import com.hmh.hamyeonham.databinding.ActivitySampleBinding
import com.hmh.hamyeonham.feature.login.LoginActivity
import com.hmh.hamyeonham.feature.main.MainActivity
import com.hmh.hamyeonham.feature.onboarding.OnBoardingActivity
import dagger.hilt.android.AndroidEntryPoint

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ import javax.inject.Inject

class GetInstalledAppUseCase @Inject constructor(
private val deviceRepository: DeviceRepository,
private val goalsRepository: UsageGoalsRepository
private val goalsRepository: UsageGoalsRepository,
) {
private val excludedAppName = "com.hmh.hamyeonham"
suspend operator fun invoke(): List<String> {
val installedAppList = deviceRepository.getInstalledApps()
val installedAppList = deviceRepository.getInstalledApps() - excludedAppName
val usageGoals = goalsRepository.getUsageGoals().firstOrNull()

val installedPackages = installedAppList.toSet()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,74 @@
package com.hmh.hamyeonham.challenge.appadd.appselection

import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.hmh.hamyeonham.common.context.getAppIconFromPackageName
import com.hmh.hamyeonham.common.context.getAppNameFromPackageName
import com.hmh.hamyeonham.common.view.ItemDiffCallback
import com.hmh.hamyeonham.feature.challenge.databinding.ItemAppBinding

class AppSelectionAdapter(
private val onAppCheckboxClicked: (String) -> Unit,
private val onAppCheckboxUnClicked: (String) -> Unit
private val onAppCheckboxUnClicked: (String) -> Unit,
) :
ListAdapter<String, AppSelectionViewHolder>(
ListAdapter<String, AppSelectionAdapter.AppSelectionViewHolder>(
ItemDiffCallback(onItemsTheSame = { oldItem, newItem ->
oldItem == newItem
}, onContentsTheSame = { oldItem, newItem ->
oldItem == newItem
})
}),
) {

private val checkBoxStatus = SparseBooleanArray()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppSelectionViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = ItemAppBinding.inflate(inflater, parent, false)
return AppSelectionViewHolder(
binding,
onAppCheckboxClicked = onAppCheckboxClicked,
onAppCheckboxUnClicked = onAppCheckboxUnClicked
onAppCheckboxUnClicked = onAppCheckboxUnClicked,
)
}

override fun onBindViewHolder(holder: AppSelectionViewHolder, position: Int) {
holder.onBind(currentList[position])
}

inner class AppSelectionViewHolder(
private val binding: ItemAppBinding,
private val onAppCheckboxClicked: (String) -> Unit,
private val onAppCheckboxUnClicked: (String) -> Unit,
) : RecyclerView.ViewHolder(binding.root) {
fun onBind(packageName: String) {
binding.run {
val context = binding.root.context
tvAppname.text = context.getAppNameFromPackageName(packageName)
ivAppicon.setImageDrawable(context.getAppIconFromPackageName(packageName))
cbApp.isClickable = false
cbApp.isChecked = checkBoxStatus[adapterPosition]
}
initAppSelectionListener(packageName)
binding.cbApp.isClickable = false
}

private fun initAppSelectionListener(packageName: String) {
binding.root.setOnClickListener {
if (adapterPosition != RecyclerView.NO_POSITION) {
if (binding.cbApp.isChecked) {
binding.cbApp.isChecked = false
onAppCheckboxUnClicked(packageName)
checkBoxStatus.put(adapterPosition, false)
} else {
binding.cbApp.isChecked = true
onAppCheckboxClicked(packageName)
checkBoxStatus.put(adapterPosition, true)
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,16 @@ class LoginActivity : AppCompatActivity() {
}

private fun moveToOnBoardingActivity(accessToken: String? = null) {
if (accessToken == null) {
toast(getString(R.string.empty_token_retry_login))
}

val intent = navigationProvider.toOnBoarding()
accessToken?.let {
intent.putExtra(OnBoardingActivity.EXTRA_ACCESS_TOKEN, it)
}
startActivity(intent)
finish()

if (accessToken != null) {
toast(getString(R.string.empty_token_retry_login))
}
}

private fun moveToMainActivity() {
Expand Down
2 changes: 0 additions & 2 deletions feature/login/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
<resources>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="iv_login_view_pager_item_description">Service detailed description</string>
<string name="kakao_login_button">카카오 로그인</string>
<string name="fail_kakao_login">로그인 실패</string>
Expand Down
3 changes: 2 additions & 1 deletion feature/onboarding/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
android:exported="false" />
<activity
android:name=".OnBoardingActivity"
android:exported="false" />
android:exported="false"
android:screenOrientation="portrait"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
package com.hmh.hamyeonham.feature.onboarding.adapter

import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.hmh.hamyeonham.common.context.getAppIconFromPackageName
import com.hmh.hamyeonham.common.context.getAppNameFromPackageName
import com.hmh.hamyeonham.common.view.ItemDiffCallback
import com.hmh.hamyeonham.feature.onboarding.databinding.ItemAddAppBinding

class OnBoardingAppSelectionAdapter(
private val onAppCheckboxClicked: (String) -> Unit,
private val onAppCheckboxUnClicked: (String) -> Unit,
) :
ListAdapter<String, OnBoardingAppSelectionViewHolder>(
ListAdapter<String, OnBoardingAppSelectionAdapter.OnBoardingAppSelectionViewHolder>(
ItemDiffCallback(onItemsTheSame = { oldItem, newItem ->
oldItem == newItem
}, onContentsTheSame = { oldItem, newItem ->
oldItem == newItem
}),
) {
private val checkBoxStatus = SparseBooleanArray()

override fun onCreateViewHolder(
parent: ViewGroup,
Expand All @@ -34,4 +39,37 @@ class OnBoardingAppSelectionAdapter(
override fun onBindViewHolder(holder: OnBoardingAppSelectionViewHolder, position: Int) {
holder.onBind(currentList[position])
}

inner class OnBoardingAppSelectionViewHolder(
private val binding: ItemAddAppBinding,
private val onAppCheckboxClicked: (String) -> Unit,
private val onAppCheckboxUnClicked: (String) -> Unit,
) : RecyclerView.ViewHolder(binding.root) {
fun onBind(packageName: String) {
binding.run {
val context = binding.root.context
tvAppname.text = context.getAppNameFromPackageName(packageName)
ivAppicon.setImageDrawable(context.getAppIconFromPackageName(packageName))
cbApp.isClickable = false
cbApp.isChecked = checkBoxStatus[adapterPosition]
}
setCheckBoxButtonListener(packageName)
}

private fun setCheckBoxButtonListener(packageName: String) {
binding.root.setOnClickListener {
if (adapterPosition != RecyclerView.NO_POSITION) {
if (binding.cbApp.isChecked) {
binding.cbApp.isChecked = false
onAppCheckboxUnClicked(packageName)
checkBoxStatus.put(adapterPosition, false)
} else {
binding.cbApp.isChecked = true
onAppCheckboxClicked(packageName)
checkBoxStatus.put(adapterPosition, true)
}
}
}
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package com.hmh.hamyeonham.feature.onboarding.fragment

import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.hmh.hamyeonham.common.context.getAppNameFromPackageName
import com.hmh.hamyeonham.common.view.viewBinding
import com.hmh.hamyeonham.feature.onboarding.R
import com.hmh.hamyeonham.feature.onboarding.adapter.OnBoardingAppSelectionAdapter
Expand All @@ -34,6 +37,7 @@ class OnBoardingAppAddSelectionFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews()
initSearchBar()
}

private fun initViews() {
Expand Down Expand Up @@ -65,6 +69,28 @@ class OnBoardingAppAddSelectionFragment : Fragment() {
activityViewModel.sendEvent(OnboardEvent.DeleteApp(packageName))
}

private fun initSearchBar() {
binding.etSearchbar.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
setRecyclerViewWithFilter(s.toString())
}

override fun afterTextChanged(s: Editable?) {}
})
}

private fun setRecyclerViewWithFilter(filter: String) {
val onboardingAppSelectionAdapter =
binding.rvAppSelection.adapter as? OnBoardingAppSelectionAdapter
val newAppList =
viewModel.getInstalledApps().filter {
(context?.getAppNameFromPackageName(it) ?: "").contains(filter)
}
onboardingAppSelectionAdapter?.submitList(newAppList)
}

override fun onResume() {
super.onResume()
activityViewModel.sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_select_done)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,29 @@ class OnBoardingSelectScreenTimeFragment : Fragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.npOnboardingScreentimeGoal.setupScreentimeGoalRange(2, 6)

binding.npOnboardingScreentimeGoal.descendantFocusability =
NumberPicker.FOCUS_BLOCK_DESCENDANTS
setNumberPicker()
}

binding.npOnboardingScreentimeGoal.setOnValueChangedListener { _, _, newTime ->
activityViewModel.sendEvent(OnboardEvent.UpdateScreenGoalTime(newTime))
private fun setNumberPicker() {
binding.run {
npOnboardingScreentimeGoal.setupScreentimeGoalRange(2, 6)
npOnboardingScreentimeGoal.descendantFocusability = NumberPicker.FOCUS_BLOCK_DESCENDANTS
npOnboardingScreentimeGoal.setOnValueChangedListener { _, _, newTime ->
activityViewModel.sendEvent(OnboardEvent.UpdateScreenGoalTime(newTime))
}
}
}

override fun onResume() {
super.onResume()
activityViewModel.updateState {
copy(isNextButtonActive = true)
activityViewModel.run {
val screenGoalTime = activityViewModel.onBoardingState.value.screenGoalTime

binding.npOnboardingScreentimeGoal.value = screenGoalTime

updateState { copy(isNextButtonActive = true) }
sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_next)))
sendEvent(OnboardEvent.visibleProgressbar(true))
}
activityViewModel.sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_next)))
activityViewModel.sendEvent(OnboardEvent.visibleProgressbar(true))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnboardEvent
class OnBoardingSelectUseTimeFragment : Fragment() {
private val binding by viewBinding(FragmentOnBoardingSelectUseTimeBinding::bind)
private val activityViewModel by activityViewModels<OnBoardingViewModel>()
private var useSelectTime: Long = 0L

override fun onCreateView(
inflater: LayoutInflater,
Expand Down Expand Up @@ -52,6 +51,11 @@ class OnBoardingSelectUseTimeFragment : Fragment() {
}
override fun onResume() {
super.onResume()
val selectedHour = activityViewModel.onBoardingState.value.appGoalTimeHour
val selectedMinute = activityViewModel.onBoardingState.value.appGoalTimeMinute

binding.npOnboardingUseTimeGoalHour.value = selectedHour
binding.npOnboardingUseTimeGoalMinute.value = selectedMinute
activityViewModel.sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_done)))
activityViewModel.sendEvent(OnboardEvent.visibleProgressbar(true))
}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading

0 comments on commit e711334

Please sign in to comment.