-를 추가하는게 좋을 것 같다고 하셔서, 원래 숫자만 입력가능하게 했던 정규식을 Regex("^([0-9]{2,4})-\\d{3,4}-\\d{4}\$") 으로 고쳤다. 숫자2~4자리수 - 숫자3~4자리수-숫자4자리수 의 형식을 유지하도록했다. 핸드폰 번호 부터 지역번호, 배달의민족 번호, 인터넷전화 번호 등등 여러 가게들을 직접 검색해서 실제 값들이 잘 들어가는지 최종 확인하였다.문자열을 strings.xml에서 관리하는건 기본사항이자 기본사항인가보다. 상의하고 말것도 없이 당연히 집어 넣는 분위기라서 물어본게 살짝 뻘쭘했다.ㅎㅎ 기본적인건 아무리 귀찮아도 무조건 지켜야하는데.. 여튼 그래서 xml을 비롯한 유효성 검사에서 사용하던 하드코딩문자열들을 모두 strings.xml에 넣어두었다.
...
private fun setMessageValidPhoto(): String = if (profileImage == null) {
getString(R.string.valid_photo)
} else getString(R.string.valid_pass)
private fun setMessageValidName(): String = if (binding.addContactEtStoreName.text.toString().isBlank()) {
getString(R.string.valid_name)
} else getString(R.string.valid_pass)
private fun setMessageValidPhone(): String {
val phone = binding.addContactEtStorePhone.text.toString()
return if (phone.isBlank()) {
getString(R.string.valid_phone)
} else if (!validatePhoneNumber(phone)) {
getString(R.string.valid_phoneFormat)
} else getString(R.string.valid_pass)
}
private fun setMessageValidAddress(): String = if (binding.addContactEtStoreAddress.text.toString().isBlank()) {
getString(R.string.valid_address)
} else getString(R.string.valid_pass)
private fun setMessageValidInsta(): String {
val instaID = binding.addContactEtStoreInsta.text.toString()
return if (instaID.isBlank()) {
getString(R.string.valid_insta)
} else if (!validateInstaID(instaID)) {
getString(R.string.valid_instaFormat)
} else getString(R.string.valid_pass)
}
...
그래서 getString()을 사용하여 문자열을 가져오도록 수정을 마쳤다.
Event 시간에 맞춰 Notification 표시 기능을 만들어보기로 했다....
fun eventNotification() {
val manager = activity?.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val builder: NotificationCompat.Builder
val channelId = "one-channel"
val channelName = "My Channel One"
val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT).apply {
description = "My Channel One Description"
setShowBadge(true)
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
setSound(uri, audioAttributes)
enableVibration(true)
}
manager.createNotificationChannel(channel)
builder = NotificationCompat.Builder(requireContext(), channelId)
val intent = Intent(requireContext(), MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
val pendingIntent = PendingIntent.getActivity(requireContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE)
builder.run {
setSmallIcon(R.mipmap.ic_launcher)
setWhen(System.currentTimeMillis())
setContentTitle("연락처 알림")
setContentText("설정한 알림이 도착했습니다!!")
setContentIntent(pendingIntent)
setAutoCancel(true)
}
manager.notify(11, builder.build())
}
...
사실은.. 이번에도.. 개인과제 애플마켓에서.. 했던 코드를 많이 재활용했다. 근데 어짜피 배운게 이것 뿐이라 배운 코드가 이 코드이긴 하다.ㅎㅎ 여튼, 대신에 이번에는 푸시 알람을 클릭했을 때, 다시 어플로 이동하게 만들어야 해서 intent와 pendingIntent를 추가로 붙여주었다.
intent 변수를 선언하여 메인액티비티로 이동하도록 코드를 작성했다.intent.flags에 notification에서 액티비티를 시작하기 위해 FLAG_ACTIVITY_NEW_TASK를 작성한다. FLAG_ACTIVITY_CLEAR_TASK는 실행 액티비티 외의 것들을 모두 제거한다.pendingIntent 를 통해 다른 앱이 프로세스를 점유하고 있을 때 Intent를 수행하게 해준다. 이때, FLAG_CANCEL_CURRENT는 이전에 생성된 PendingIntent를 취소하고 새로만들고, FLAG_IMMUTABLE로 생성된 펜딩 인텐트가 변경되지 않도록 한다. (특별한 경우가 아니면 보통 FLAG_IMMUTABLE를 사용해야한다.)setContentIntent(pendingIntent)으로 pendingIntent를 사용한다.setAutoCancel(true)를 주어서 알람을 클릭하면 푸시메시지가 자동으로 사라지도록 하면 완성이다!이렇게 만든 알람을, chip을 통해서 몇 분 알람을 줄 것인지 조정을 하려고 했는데, 무슨 일인지 밑의 코드에서 chekedId가 혼자서 따로 놀았다. 사실 밑의 코드를 사용하는 것이 맞는지도 긴가민가했는데, 여튼 checkedId는 말그대로 Id를 참조하는 것이라 뷰바인딩 값이랑 비교가 안되서 작동이 일체 안되는 것이였다. (로그를 일일이 찍어보며 알아냈다..)
val handler = Handler(Looper.getMainLooper())
addContactChipGroup.setOnCheckedStateChangeListener { group, checkedId ->
when (checkedId) {
addContactChip5m -> {
handler.postDelayed({ eventNotification() }, 1000)
}
addContactChip30m -> {
handler.postDelayed({ eventNotification() }, 3000)
}
addContactChip1h -> {
handler.postDelayed({ eventNotification() }, 5000)
}
}
}
R.id.addContact_chip_5m도 써보고 addContactChip5m.id도 써보고 따로 변수에 값을 담는 방법도 써봤는데 전부 다 빨간 밑 줄이 뜨면서 Inspection 'Constant conditions' has no quick-fixes for this problem. Click to edit inspection options, WILL suppress the warning, or disable the inspection completely. 이런 문구가 떴다. 이건 뭐 고쳐주는 것도 아니고.. 그냥 경고문이라서 어떻게 할 수 가 없어서 결국 이 방법을 포기했다.