안드로이드 설정에서 빌드번호를 연타하면 개발자 모드를 진입 하듯이, 나도 어떤 히든 부분을 몇초안에 일정 횟수를 연타 했을 때 관리자 모드로 진입하게 하고 싶었다.
나는 1초 안에 5번을 클릭하면 설정모드로 진입하게 구현하려 한다.
클릭 횟수를 카운트해서 특정 코드를 실행하는 View.OnClickListener 추상클래스 파일을 생성해주었다.
abstract class OnClickCountListener : View.OnClickListener {
companion object {
// 지정한 시간이내에 지정횟수만큼 클릭 시에만 카운트
const val CLICK_INTERVAL:Long = 1000L
const val CLICK_NUMBER = 5
}
}
1초안에 5번을 클릭 했을 떄 실행할 추상메소드를 선언해준다.
private var lastClickedTime: Long = 0L // 새로 클릭한 시간
var count = 0 // 클릭 카운트
abstract fun onCountClick(view: View)
5번을 1초 안에 클릭시에만 실행할 추상메소드도 선언해준다.
뷰를 클릭 시 isClickedTime() 로 CLICK_INTERVAL 시간 이내로 클릭했을 때만 카운트를 올려준다.
1초가 지난 후 클릭 시에는 카운트를 0으로 초기화 해줌.
// CLICK_INTERVAL 시간 이내로 클릭했는 지
private fun isClickedTime() = System.currentTimeMillis() - lastClickedTime
override fun onClick(v: View) {
// CLICK_INTERVAL 시간 이내로 안누르면 카운트 초기화
if (isClickedTime() > CLICK_INTERVAL) {
count = 0
}
lastClickedTime = System.currentTimeMillis()
count += 1
if (count == CLICK_NUMBER) { // 5번 클릭 시에만 추상메소드 실행
onCountClick(v)
count = 0 // 카운트 초기화
}
}
이제 적용할 뷰에 클릭 리스너를 달아준다.
imageView.setOnClickListener(object : OnClickCountListener() {
override fun onCountClick(view: View) {
Utils.Toast(mContext,"관리자모드 실행")
val intent = Intent(mContext, SettingActivity::class.java)
startActivity(intent)
}
})
맞게 동작하는지 코드 중간중간 로그를 찍어보면 isClickedTime 이 CLICK_INTERVAL 을 넘어가면 카운트가 초기화 되는 걸 확인할 수 있다.
// CLICK_INTERVAL 시간 이내로 클릭했는 지
private fun isClickedTime() = System.currentTimeMillis() - lastClickedTime
override fun onClick(v: View) {
Log.d(TAG,"count 1 => $count")
// CLICK_INTERVAL 시간 이내로 안누르면 카운트 초기화
if (isClickedTime() > CLICK_INTERVAL) {
count = 0
}
Log.d(TAG,"count 2 => $count")
Log.d(TAG,"isClickedTime => ${isClickedTime()}")
lastClickedTime = System.currentTimeMillis()
Log.d(TAG,"lastClickedTime => $lastClickedTime")
count += 1
Log.d(TAG,"count 3 => $count")
if (count == CLICK_NUMBER) { // 5번 클릭 시에만 추상메소드 실행
onCountClick(v)
count = 0 // 카운트 초기화
}
}