Skip to content

Commit

Permalink
Merge branch 'develop' into feat/lock
Browse files Browse the repository at this point in the history
# Conflicts:
#	data/usagestats/src/main/java/com/hmh/hamyeonham/usagestats/di/UsageStatsModule.kt
#	data/usagestats/src/main/java/com/hmh/hamyeonham/usagestats/repository/DefaultUsageGoalsRepository.kt
#	feature/onboarding/build.gradle.kts
  • Loading branch information
kez-lab committed Jan 18, 2024
2 parents bbd2749 + 7b6a3ab commit 437cfa7
Show file tree
Hide file tree
Showing 29 changed files with 491 additions and 146 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.onboarding.OnBoardingActivity
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ fun SignRequestDomain.toSignUpRequest(): SignUpRequest {
averageUseTime = onboarding.averageUseTime,
problem = onboarding.problem,
),
socialPlatform = socialPlatform,
socialPlatform = "KAKAO",
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package com.hmh.hamyeonham.usagestats.di
import android.app.usage.UsageStatsManager
import android.content.Context
import com.hmh.hamyeonham.core.domain.usagegoal.repository.UsageGoalsRepository
import com.hmh.hamyeonham.core.network.usagegoal.UsageGoalService
import com.hmh.hamyeonham.usagestats.datasource.remote.UsageGoalsRemoteDataSource
import com.hmh.hamyeonham.usagestats.datasource.local.UsageStatusLocalDataSource
import com.hmh.hamyeonham.usagestats.datasource.local.UsageStatusLocalDataSourceImpl
import com.hmh.hamyeonham.usagestats.repository.DefaultUsageGoalsRepository
Expand All @@ -28,14 +26,6 @@ object UsageStatsModule {
return context.getSystemService(Context.USAGE_STATS_SERVICE) as? UsageStatsManager
}

@Provides
@Singleton
fun provideUsageGoalsDataSource(
usageGoalService: UsageGoalService
): UsageGoalsRemoteDataSource {
return UsageGoalsRemoteDataSource(usageGoalService)
}

@Module
@InstallIn(SingletonComponent::class)
interface Binder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.hmh.hamyeonham.login.model
data class SignRequestDomain(
val challenge: Challenge,
val onboarding: Onboarding,
val socialPlatform: String,
) {
data class Onboarding(
val averageUseTime: String,
Expand Down
5 changes: 3 additions & 2 deletions feature/onboarding/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ android {
dependencies {
implementation(projects.core.common)
implementation(projects.core.designsystem)
implementation(projects.core.network)
implementation(projects.core.network)

implementation(projects.feature.main)
implementation(projects.feature.lock)

implementation(projects.domain.login)

implementation(projects.core.network)
implementation(projects.domain.challenge)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.hmh.hamyeonham.feature.onboarding

import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
Expand All @@ -10,9 +11,10 @@ import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.widget.ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT
import com.hmh.hamyeonham.common.view.initAndStartProgressBarAnimation
import com.hmh.hamyeonham.common.view.viewBinding
import com.hmh.hamyeonham.feature.onboarding.adapter.OnBoardingFragmentStateAdapter
import com.hmh.hamyeonham.feature.onboarding.databinding.ActivityOnBoardingBinding
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnBoardingViewModel
import com.hmh.hamyeonham.feature.onboarding.viewmodel.SignUpEffect
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnboardEffect
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
Expand All @@ -34,8 +36,9 @@ class OnBoardingActivity : AppCompatActivity() {
setBackPressedCallback()
collectOnboardingState()
collectSignUpEffect()

changeOnBoardingButtonTextState()
updateAccessToken()
changeProgressbarVisibleState()
}

private fun updateAccessToken() {
Expand All @@ -48,12 +51,11 @@ class OnBoardingActivity : AppCompatActivity() {
private fun collectSignUpEffect() {
viewModel.onboardEffect.flowWithLifecycle(lifecycle).onEach {
when (it) {
is SignUpEffect.SignUpSuccess -> {
is OnboardEffect.OnboardSuccess -> {
moveToOnBoardingDoneSignUpActivity()
}

is SignUpEffect.SignUpFail -> {
}
is OnboardEffect.OnboardFail -> {}
}
}.launchIn(lifecycleScope)
}
Expand Down Expand Up @@ -114,6 +116,22 @@ class OnBoardingActivity : AppCompatActivity() {
}.launchIn(lifecycleScope)
}

private fun changeOnBoardingButtonTextState() {
viewModel.onBoardingState.flowWithLifecycle(lifecycle).onEach {
binding.btnOnboardingNext.text = it.buttonText
}.launchIn(lifecycleScope)
}

private fun changeProgressbarVisibleState() {
viewModel.onBoardingState.flowWithLifecycle(lifecycle).onEach {
if (it.progressbarVisible) {
binding.pbOnboarding.visibility = View.VISIBLE
} else {
binding.pbOnboarding.visibility = View.GONE
}
}.launchIn(lifecycleScope)
}

private fun setBackPressedCallback() {
onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.hmh.hamyeonham.feature.onboarding.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
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>(
ItemDiffCallback(onItemsTheSame = { oldItem, newItem ->
oldItem == newItem
}, onContentsTheSame = { oldItem, newItem ->
oldItem == newItem
}),
) {

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

override fun onBindViewHolder(holder: OnBoardingAppSelectionViewHolder, position: Int) {
holder.onBind(currentList[position])
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.hmh.hamyeonham.feature.onboarding.adapter

import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.hmh.hamyeonham.common.context.getAppIconFromPackageName
import com.hmh.hamyeonham.common.context.getAppNameFromPackageName
import com.hmh.hamyeonham.feature.onboarding.databinding.ItemAddAppBinding

class OnBoardingAppSelectionViewHolder(
private val binding: ItemAddAppBinding,
private val onAppCheckboxClicked: (String) -> Unit,
private val onAppCheckboxUnClicked: (String) -> Unit
) : ViewHolder(binding.root) {
fun onBind(packageName: String) {
binding.run {
val context = binding.root.context
tvAppname.text = context.getAppNameFromPackageName(packageName)
ivAppicon.setImageDrawable(context.getAppIconFromPackageName(packageName))
}
setCheckBoxButtonListener(packageName)
}

private fun setCheckBoxButtonListener(packageName: String) {
binding.cbApp.setOnClickListener {
if (adapterPosition != RecyclerView.NO_POSITION) {
if (binding.cbApp.isChecked) {
onAppCheckboxClicked(packageName)
} else {
onAppCheckboxUnClicked(packageName)
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.hmh.hamyeonham.feature.onboarding
package com.hmh.hamyeonham.feature.onboarding.adapter

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.hmh.hamyeonham.feature.onboarding.fragment.OnBoardingAppAddSelectionFragment
import com.hmh.hamyeonham.feature.onboarding.fragment.OnBoardingRequestPermissionFragment
import com.hmh.hamyeonham.feature.onboarding.fragment.OnBoardingSelectAppFragment
import com.hmh.hamyeonham.feature.onboarding.fragment.OnBoardingSelectDataFragment
Expand All @@ -16,6 +17,7 @@ enum class OnBoardingFragmentType {
SELECT_SCREEN_TIME_GOAL,
REQUEST_PERMISSION,
SELECT_APP,
SELECT_APP_VIEW,
SELECT_USE_TIME_GOAL,
}

Expand All @@ -42,6 +44,7 @@ class OnBoardingFragmentStateAdapter(fragmentActivity: FragmentActivity) :
OnBoardingFragmentType.SELECT_SCREEN_TIME_GOAL -> OnBoardingSelectScreenTimeFragment()
OnBoardingFragmentType.REQUEST_PERMISSION -> OnBoardingRequestPermissionFragment()
OnBoardingFragmentType.SELECT_APP -> OnBoardingSelectAppFragment()
OnBoardingFragmentType.SELECT_APP_VIEW -> OnBoardingAppAddSelectionFragment()
OnBoardingFragmentType.SELECT_USE_TIME_GOAL -> OnBoardingSelectUseTimeFragment()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.hmh.hamyeonham.feature.onboarding.fragment

import android.os.Bundle
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.view.viewBinding
import com.hmh.hamyeonham.feature.onboarding.R
import com.hmh.hamyeonham.feature.onboarding.adapter.OnBoardingAppSelectionAdapter
import com.hmh.hamyeonham.feature.onboarding.databinding.FragmentOnBoardingAppAddSelectionBinding
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnBoardingAppSelectionViewModel
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnBoardingViewModel
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnboardEvent
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class OnBoardingAppAddSelectionFragment : Fragment() {
private val binding by viewBinding(FragmentOnBoardingAppAddSelectionBinding::bind)
private val viewModel by viewModels<OnBoardingAppSelectionViewModel>()
private val activityViewModel by activityViewModels<OnBoardingViewModel>()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
return FragmentOnBoardingAppAddSelectionBinding.inflate(inflater, container, false).root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews()
}

private fun initViews() {
initAppSelectionRecyclerAdapter()
}

private fun initAppSelectionRecyclerAdapter() {
binding.rvAppSelection.run {
adapter = OnBoardingAppSelectionAdapter(
onAppCheckboxClicked = ::onAppCheckboxClicked,
onAppCheckboxUnClicked = ::onAppCheckboxUnClicked,
)
layoutManager = LinearLayoutManager(requireContext())
}
setViewPager()
}

private fun setViewPager() {
val onboardingAppSelectionAdapter =
binding.rvAppSelection.adapter as? OnBoardingAppSelectionAdapter
onboardingAppSelectionAdapter?.submitList(viewModel.getInstalledApps())
}

private fun onAppCheckboxClicked(packageName: String) {
activityViewModel.sendEvent(OnboardEvent.AddApps(packageName))
}

private fun onAppCheckboxUnClicked(packageName: String) {
activityViewModel.sendEvent(OnboardEvent.DeleteApp(packageName))
}

override fun onResume() {
super.onResume()
activityViewModel.sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_select_done)))
activityViewModel.sendEvent(OnboardEvent.visibleProgressbar(false))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.hmh.hamyeonham.feature.lock.LockAccessibilityService
import com.hmh.hamyeonham.feature.onboarding.R
import com.hmh.hamyeonham.feature.onboarding.databinding.FragmentOnBoardingRequestPermissionBinding
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnBoardingViewModel
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnboardEvent
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
Expand Down Expand Up @@ -71,6 +72,8 @@ class OnBoardingRequestPermissionFragment : Fragment() {
activityViewModel.updateState {
copy(isNextButtonActive = allPermissionIsGranted())
}
activityViewModel.sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_next)))
activityViewModel.sendEvent(OnboardEvent.visibleProgressbar(true))
}

private fun clickRequireAccessibilityButton() {
Expand Down Expand Up @@ -106,21 +109,16 @@ class OnBoardingRequestPermissionFragment : Fragment() {

private fun requestOverlayPermission() {
val packageUri = Uri.parse("package:" + requireContext().packageName)
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, packageUri)
startActivity(intent)
overlayPermissionLauncher.launch(intent)
overlayPermissionLauncher.launch(Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, packageUri))
}

private fun requestUsageAccessPermission() {
try {
val packageUri = Uri.parse("package:" + requireContext().packageName)
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS, packageUri)
startActivity(intent)
usageStatsPermissionLauncher.launch(intent)
} catch (e: Exception) {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
startActivity(intent)
usageStatsPermissionLauncher.launch(intent)
usageStatsPermissionLauncher.launch(Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.hmh.hamyeonham.common.view.viewBinding
import com.hmh.hamyeonham.feature.onboarding.R
import com.hmh.hamyeonham.feature.onboarding.databinding.FragmentOnBoardingSelectAppBinding
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnBoardingViewModel
import com.hmh.hamyeonham.feature.onboarding.viewmodel.OnboardEvent

class OnBoardingSelectAppFragment : Fragment() {
private val binding by viewBinding(FragmentOnBoardingSelectAppBinding::bind)
Expand All @@ -24,4 +26,10 @@ class OnBoardingSelectAppFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}

override fun onResume() {
super.onResume()
activityViewModel.sendEvent(OnboardEvent.changeActivityButtonText(getString(R.string.all_select_app)))
activityViewModel.sendEvent(OnboardEvent.visibleProgressbar(true))
}
}
Loading

0 comments on commit 437cfa7

Please sign in to comment.