부트캠프 최종 팀 프로젝트 기록 5
서론
이번에 구현할 기능은 앱에서 다른 허용 앱을 실행했을 때, 사용 시간을 카운트다운 타이머로 측정 후, 우리 앱으로 복귀하면 남은 시간을 fireStore에 업데이트하는 기능을 만들어 보았다.
fireStore 데이터 업데이트
fireStore 데이터를 불러오기 전에 먼저 카운트다운 타이머를 사용해서 앱의 사용 시간을 구해줄 것이다.
먼저 허용 앱을 실행하게 되면, 허용 앱을 여는 동시에 타이머를 작동시켜서 사용 시간을 측정한다. 초기 시작 시간은 각 허용 앱에 설정된 시간(제한 시간)으로 지정한다.
허용 앱을 사용하다가 우리 앱으로 돌아오게 되면, 타이머를 멈추고 타이머에 남은 시간을 fireStore에 업데이트한다.
허용 앱을 쓰는데 제한 시간이 종료되었는데 우리 앱으로 돌아오지 않으면, 즉시 우리 앱으로 돌아오도록 하고, fireStore에는 0으로 데이터를 업데이트한다.
CountDownTimer
카운트다운 타이머는 android에서 기본적으로 지원하는 CountDownTimer를 사용한다.
CountDownTimer는 앱이 background에 있어도 타이머가 작동하는 특징을 가지기 때문에, 이 기능에 넣기 안성맞춤이다.
countDownTimer = object: CountDownTimer(initTimer * 1000, 1000) {
override fun onTick(millisUntilFinished: Long) {
allowedAppViewModel.updateRemainTime((millisUntilFinished / 1000).toInt())
}
override fun onFinish() {
val toFrontIntent = context?.packageManager?.getLaunchIntentForPackage(requireContext().packageName)
?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
context?.startActivity(toFrontIntent)
allowedAppViewModel.updateLimitedTimeAllowApp(packageId, 0, failCallback = {})
}
}
countDownTimer?.start()
countDownTimer를 위 코드와 같이 구현할 수 있다. 첫 파라미터는 초기 시작 시간(millisecond)으로 시작하고, 두 번째 파라미터는 한 틱을 몇 초로 설정할 것인지 지정한다.(millisecond). 기본적으로는 1초로 지정하는 편이다.
onTick은 한 틱마다 호출되는 함수이다. millisUntilFinished(millisecond)로 남은 타이머 시간을 구할 수 있다.
onFinish에는 타이머가 종료(타이머가 0초가 됨)되었을 때 로직을 수행한다.
내 경우에는 타이머가 끝났을 때도 우리 앱에 들어와 있지 않으면 우리 앱으로 돌아오도록 설정해야 했기 때문에 그 기능을 하는 코드를 작성했다.
fireStore 데이터 업데이트
CountDownTimer에서 데이터를 업데이트하고, 허용 앱의 제한 시간이 끝나기 전에 돌아왔을 때는 timer를 멈추고, 남은 제한 시간을 fireStore에 업데이트해줘야 한다.
우선 fireStore를 업데이트하는 코드는 아래와 같다.
val fireStoreRef = fireStore.collection("users")
.document(firebaseAuth.currentUser?.uid ?: "test1")
.collection("apps")
.document(packageId)
fireStoreRef.update("limitedTime", remainTime).addOnCompleteListener { task ->
if (!task.isSuccessful) failCallback(task.exception?.cause)
}
update 함수에 변경할 필드 key, 변경할 value 순서대로 넣어 주면 쉽게 데이터를 수정할 수 있다.
구현 중 발생한 문제 상황
원래는 CountDownTimer가 background에서 작업이 불가능한 줄 알고 Service를 이용해 타이머를 작동시키려고 했다가, 데이터 전달 등의 문제로 많이 애먹었다. 하루를 날렸다.
그리고 "굳이 타이머를 써야 할까?" 해서 SharedPreferences를 이용해 허용 앱을 클릭한 시작 시간과 우리 앱으로 돌아온 종료 시간을 구해 각 시간의 차를 구해서 fireStore에 저장할 생각도 해봤다.
그런데 구현하다 보니 다시 이런 생각이 들었다.
"타이머를 사용하면 더 편하게 구현할 수 있을 것 같은데?"
그래서 다시 CountDownTimer로 돌아왔다. Fragment에서 사용하는 CountDownTimer로 기능 구현을 마무리 지을 수 있었다.
정리
제일 급한 기능은 구현했으나, 버그가 있을 수도 있기 때문에 예의주시해야 한다.
그리고 허용 앱을 실행 중일 때, 허용 앱이 아닌 다른 앱을 사용하는 경우도 따로 처리해야 한다.
이건 구현이 완료되는 대로 구현해 보겠다.
아마 이번에 구현해야 할 제일 어려운 기능이 될 것 같다.
'⛏️ | 개발 기록 > 🪐 | Cosmic Detox' 카테고리의 다른 글
[Android] 앱 서비스 출시를 위한 개인정보처리방침 및 이용약관 작성하기 (0) | 2024.09.09 |
---|---|
[Android] runnable, handler를 이용해 현재 열려 있는 앱 감지 (0) | 2024.09.05 |
[Android] clean architecture에 firebase 로직 적용하기 (0) | 2024.08.30 |
[Android] custom NumberPicker를 string array와 함께 사용하기 (0) | 2024.08.28 |
[Android] Android에서 BottomSheetDialogFragment의 높이를 최대 높이로 설정하기 (0) | 2024.08.27 |