Skip to content

Commit c8d69f4

Browse files
authored
Merge pull request #167 from hellokitty-coding-club/chore/avoid-double-click
[CHORE] 중복 클릭 방지를 위한 throttle click 설정 (#166)
2 parents 090ccf2 + 520e234 commit c8d69f4

File tree

36 files changed

+136
-69
lines changed

36 files changed

+136
-69
lines changed

common-ui/src/main/java/com/lgtm/android/common_ui/adapter/ParticipantAdapter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.recyclerview.widget.RecyclerView
77
import com.lgtm.android.common_ui.databinding.ItemDashboardParticipantBinding
88
import com.lgtm.android.common_ui.model.MemberMissionStatusUI
99
import com.lgtm.android.common_ui.util.ItemDiffCallback
10+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
1011

1112

1213
class ParticipantAdapter(
@@ -35,7 +36,7 @@ class ParticipantViewHolder(
3536
) : RecyclerView.ViewHolder(binding.root) {
3637
fun onBind(item: MemberMissionStatusUI) {
3738
binding.data = item
38-
binding.clProgress.setOnClickListener { onProcessStateClickListener(item.memberId) }
39-
binding.btnReviewMission.setOnClickListener { onCodeReviewClickListener(item.githubPrUrl) }
39+
binding.clProgress.setOnThrottleClickListener { onProcessStateClickListener(item.memberId) }
40+
binding.btnReviewMission.setOnThrottleClickListener { onCodeReviewClickListener(item.githubPrUrl) }
4041
}
4142
}

common-ui/src/main/java/com/lgtm/android/common_ui/ui/LgtmConfirmationDialog.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.databinding.DataBindingUtil
99
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
1010
import com.lgtm.android.common_ui.R
1111
import com.lgtm.android.common_ui.databinding.DialogLgtmConfirmationBinding
12+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
1213

1314
class LgtmConfirmationDialog(
1415
private val title: String,
@@ -54,11 +55,11 @@ class LgtmConfirmationDialog(
5455
}
5556

5657
private fun onClickCancelListener() {
57-
binding.btnCancel.setOnClickListener { dismiss() }
58+
binding.btnCancel.setOnThrottleClickListener { dismiss() }
5859
}
5960

6061
private fun onClickConfirmListener() {
61-
binding.btnConfirm.setOnClickListener {
62+
binding.btnConfirm.setOnThrottleClickListener {
6263
dismiss()
6364
doAfterConfirm()
6465
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.lgtm.android.common_ui.util
2+
3+
import android.content.ContentValues.TAG
4+
import android.util.Log
5+
import android.view.View
6+
7+
8+
class OnThrottleClickListener(
9+
private val onClickListener: View.OnClickListener,
10+
private val interval: Long = 300L,
11+
) : View.OnClickListener {
12+
13+
private var clickable = true
14+
15+
override fun onClick(v: View?) {
16+
if (clickable) {
17+
clickable = false
18+
v?.run {
19+
postDelayed({ clickable = true }, interval)
20+
onClickListener.onClick(v)
21+
}
22+
} else {
23+
Log.d(TAG, "onClick : operating setOnThrottleClickListener")
24+
}
25+
}
26+
}
27+
28+
fun View.setOnThrottleClickListener(action: (v: View) -> Unit) {
29+
setOnClickListener(OnThrottleClickListener(action))
30+
}
31+
32+
fun View.setOnThrottleClickListener(action: (v: View) -> Unit, interval: Long) {
33+
setOnClickListener(OnThrottleClickListener(action, interval))
34+
}

common-ui/src/main/java/com/lgtm/android/common_ui/util/TechTagChipGroup.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class TechTagChipGroup(private val chipGroup: ChipGroup, private val theme: Tech
5454
setChipIconResource(techTagUI.defaultIcon)
5555
setTextAppearance(R.style.Body2)
5656
setTextColor(textStateList) // (순서 중요) textAppearance 후에 배치
57-
setOnClickListener { onChipSelected(this, techTagUI) }
57+
setOnThrottleClickListener { onChipSelected(this, techTagUI) }
5858
if (selectedTagList.value?.contains(this.text) == true) {
5959
isSelected = true
6060
}

common-ui/src/main/java/com/lgtm/android/common_ui/viewholder/ProfileGlanceViewHolder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.lgtm.android.common_ui.viewholder
22

33
import com.lgtm.android.common_ui.databinding.ItemProfileGlanceBinding
44
import com.lgtm.android.common_ui.model.mapper.toUiModel
5+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
56
import com.lgtm.domain.profile.Profile
67
import com.lgtm.domain.profile.profileViewType.ProfileGlance
78

@@ -18,6 +19,6 @@ class ProfileGlanceViewHolder(
1819
override fun bind(data: Profile) {
1920
val profileGlanceData: ProfileGlance = data as ProfileGlance
2021
binding.data = profileGlanceData.toUiModel()
21-
binding.btnGithub.setOnClickListener { onClickGithubButton() }
22+
binding.btnGithub.setOnThrottleClickListener { onClickGithubButton() }
2223
}
2324
}

common-ui/src/main/java/com/lgtm/android/common_ui/viewholder/ProfileMissionViewHolder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.lgtm.android.common_ui.viewholder
22

33
import com.lgtm.android.common_ui.databinding.ItemSduiItemBinding
4+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
45
import com.lgtm.domain.profile.Profile
56
import com.lgtm.domain.server_drive_ui.SectionItemVO
67

@@ -15,6 +16,6 @@ class ProfileMissionViewHolder(
1516

1617
override fun bind(data: Profile) {
1718
binding.data = data as SectionItemVO
18-
binding.clMission.setOnClickListener { navigateToMissionDetail(data.missionId) }
19+
binding.clMission.setOnThrottleClickListener { navigateToMissionDetail(data.missionId) }
1920
}
2021
}

common-ui/src/main/java/com/lgtm/android/common_ui/viewholder/SduiItemViewHolder.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.lgtm.android.common_ui.viewholder
22

33
import com.lgtm.android.common_ui.databinding.ItemSduiItemBinding
4+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
45
import com.lgtm.domain.server_drive_ui.SduiContent
56
import com.lgtm.domain.server_drive_ui.SduiTheme
67
import com.lgtm.domain.server_drive_ui.SectionItemVO
@@ -13,12 +14,12 @@ class SduiItemViewHolder(
1314
override fun bind(theme: SduiTheme, viewContent: SduiContent) {
1415
binding.data = viewContent as SectionItemVO
1516
binding.theme = theme
16-
binding.clMission.setOnClickListener { navigateToMissionDetail(viewContent.missionId) }
17+
binding.clMission.setOnThrottleClickListener { navigateToMissionDetail(viewContent.missionId) }
1718

1819
if (viewContent.isScraped != null) {
1920
binding.bookmarkButton.isBookmarked = viewContent.isScraped == true
2021
binding.bookmarkButton.bookmarkNum = viewContent.scrapCount ?: 0
21-
binding.bookmarkButton.btnBookmark.setOnClickListener {
22+
binding.bookmarkButton.btnBookmark.setOnThrottleClickListener {
2223
// todo bookmark api 연동
2324
}
2425
}

feature/auth/src/main/java/com/lgtm/android/auth/ui/SignInActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.lgtm.android.auth.ui.github.GithubBottomSheet
1313
import com.lgtm.android.auth.ui.signup.SignUpActivity
1414
import com.lgtm.android.common_ui.base.BaseActivity
1515
import com.lgtm.android.common_ui.util.NetworkState
16+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
1617
import dagger.hilt.android.AndroidEntryPoint
1718

1819
@AndroidEntryPoint
@@ -39,7 +40,7 @@ class SignInActivity : BaseActivity<ActivitySignInBinding>(R.layout.activity_sig
3940
}
4041

4142
private fun initClickListener() {
42-
binding.clGithub.setOnClickListener {
43+
binding.clGithub.setOnThrottleClickListener {
4344
showGithubLoginBottomSheet()
4445
}
4546
}

feature/auth/src/main/java/com/lgtm/android/auth/ui/signup/common/ChooseRoleFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.lgtm.android.auth.R
88
import com.lgtm.android.auth.databinding.FragmentChooseRoleBinding
99
import com.lgtm.android.auth.ui.signup.SignUpViewModel
1010
import com.lgtm.android.common_ui.base.BaseFragment
11+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
1112
import com.lgtm.domain.constants.Role
1213
import dagger.hilt.android.AndroidEntryPoint
1314

@@ -35,7 +36,7 @@ class ChooseRoleFragment : BaseFragment<FragmentChooseRoleBinding>(R.layout.frag
3536
}
3637

3738
private fun setupNextButtonListener() {
38-
binding.btnNext.setOnClickListener {
39+
binding.btnNext.setOnThrottleClickListener {
3940
if (signUpViewModel.selectedRole.value == Role.REVIEWEE) {
4041
navigateToEducationStatusFragment()
4142
} else {

feature/auth/src/main/java/com/lgtm/android/auth/ui/signup/common/IntroductionFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.lgtm.android.auth.R
88
import com.lgtm.android.auth.databinding.FragmentIntroductionBinding
99
import com.lgtm.android.auth.ui.signup.SignUpViewModel
1010
import com.lgtm.android.common_ui.base.BaseFragment
11+
import com.lgtm.android.common_ui.util.setOnThrottleClickListener
1112
import dagger.hilt.android.AndroidEntryPoint
1213

1314
@AndroidEntryPoint
@@ -45,7 +46,7 @@ class IntroductionFragment :
4546

4647

4748
private fun setupNextButtonListener() {
48-
binding.btnNext.setOnClickListener {
49+
binding.btnNext.setOnThrottleClickListener {
4950
navigateToSelectRoleFragment()
5051
}
5152
}

0 commit comments

Comments
 (0)