v1.0.8 - 시스템 권한 설정 토글 시 앱 자동 즉시 복귀, 달력 상단 근무 텍스트 컬러화 및 최신 버전 확인 아이콘 개편
This commit is contained in:
@@ -17,9 +17,42 @@ import androidx.activity.ComponentActivity
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
object AlarmPermissionUtil {
|
||||
|
||||
private var monitorJob: Job? = null
|
||||
|
||||
/**
|
||||
* 시스템 설정 화면에서 사용자가 권한을 허용했을 때 뒤로가기를 누르지 않아도 앱으로 즉시 자동 복귀시킵니다.
|
||||
*/
|
||||
fun monitorAndAutoReturn(activity: Activity, isGrantedCheck: () -> Boolean) {
|
||||
monitorJob?.cancel()
|
||||
monitorJob = CoroutineScope(Dispatchers.Main).launch {
|
||||
var count = 0
|
||||
while (count < 150 && isActive) { // 최대 60초간 400ms 주기로 체크
|
||||
delay(400)
|
||||
count++
|
||||
if (isGrantedCheck()) {
|
||||
try {
|
||||
val returnIntent = Intent(activity, SettingsActivity::class.java).apply {
|
||||
flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or Intent.FLAG_ACTIVITY_SINGLE_TOP
|
||||
}
|
||||
activity.startActivity(returnIntent)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun cancelAutoReturn() {
|
||||
monitorJob?.cancel()
|
||||
monitorJob = null
|
||||
}
|
||||
|
||||
/**
|
||||
* 전체 권한 상태를 확인하고 필요한 경우 통합 안내 다이얼로그를 표시합니다.
|
||||
*/
|
||||
|
||||
@@ -193,6 +193,7 @@ class FragmentSettingsBasic : Fragment() {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
AlarmPermissionUtil.cancelAutoReturn()
|
||||
updatePermissionStatuses()
|
||||
}
|
||||
|
||||
@@ -233,6 +234,9 @@ class FragmentSettingsBasic : Fragment() {
|
||||
|
||||
binding.btnBatteryOptimize.setOnClickListener {
|
||||
AlarmPermissionUtil.requestBatteryOptimization(requireActivity())
|
||||
AlarmPermissionUtil.monitorAndAutoReturn(requireActivity()) {
|
||||
AlarmPermissionUtil.getBatteryOptimizationStatus(requireContext())
|
||||
}
|
||||
}
|
||||
|
||||
binding.btnExactAlarm.setOnClickListener {
|
||||
@@ -241,15 +245,24 @@ class FragmentSettingsBasic : Fragment() {
|
||||
data = Uri.parse("package:${requireContext().packageName}")
|
||||
}
|
||||
requireActivity().startActivity(intent)
|
||||
AlarmPermissionUtil.monitorAndAutoReturn(requireActivity()) {
|
||||
AlarmPermissionUtil.getExactAlarmStatus(requireContext())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.btnOverlayPermission.setOnClickListener {
|
||||
AlarmPermissionUtil.requestOverlayPermission(requireActivity())
|
||||
AlarmPermissionUtil.monitorAndAutoReturn(requireActivity()) {
|
||||
AlarmPermissionUtil.getOverlayStatus(requireContext())
|
||||
}
|
||||
}
|
||||
|
||||
binding.btnFullScreenIntent.setOnClickListener {
|
||||
AlarmPermissionUtil.requestFullScreenIntentPermission(requireActivity())
|
||||
AlarmPermissionUtil.monitorAndAutoReturn(requireActivity()) {
|
||||
AlarmPermissionUtil.getFullScreenIntentStatus(requireContext())
|
||||
}
|
||||
}
|
||||
|
||||
binding.btnPermissionSettings.setOnClickListener {
|
||||
@@ -257,6 +270,9 @@ class FragmentSettingsBasic : Fragment() {
|
||||
data = Uri.parse("package:${requireContext().packageName}")
|
||||
}
|
||||
requireActivity().startActivity(intent)
|
||||
AlarmPermissionUtil.monitorAndAutoReturn(requireActivity()) {
|
||||
AlarmPermissionUtil.isAllPermissionsGranted(requireContext())
|
||||
}
|
||||
}
|
||||
|
||||
binding.btnCheckUpdate.setOnClickListener {
|
||||
|
||||
@@ -347,13 +347,46 @@ class MainActivity : AppCompatActivity() {
|
||||
|
||||
// Update Header Status Text with Permission Warning if needed
|
||||
val shiftForViewingTeam = withContext(Dispatchers.IO) { repo.getShift(today, currentViewTeam, factory) }
|
||||
val teamSuffix = if (currentViewTeam == selectedTeam) " (내 반)" else " (${currentViewTeam}반)"
|
||||
val teamSuffix = if (currentViewTeam == selectedTeam) "" else " (${currentViewTeam}반)"
|
||||
|
||||
if (currentViewTeam == selectedTeam && !AlarmPermissionUtil.getExactAlarmStatus(this@MainActivity)) {
|
||||
binding.todayStatusText.text = "⚠️ 정확한 알람 권한이 필요합니다 (설정 필요)"
|
||||
binding.todayStatusText.setTextColor(androidx.core.content.ContextCompat.getColor(this@MainActivity, R.color.warning_red))
|
||||
} else {
|
||||
binding.todayStatusText.text = "오늘의 근무: $shiftForViewingTeam$teamSuffix"
|
||||
val prefix = "오늘의 근무: "
|
||||
val fullText = "$prefix$shiftForViewingTeam$teamSuffix"
|
||||
val spannable = android.text.SpannableStringBuilder(fullText)
|
||||
|
||||
val shiftColorRes = when (shiftForViewingTeam) {
|
||||
"주간", "주" -> R.color.shift_ju
|
||||
"석간", "석" -> R.color.shift_seok
|
||||
"야간", "야" -> R.color.shift_ya
|
||||
"주간 맞교대" -> R.color.shift_jumat
|
||||
"야간 맞교대" -> R.color.shift_yamat
|
||||
"휴무", "휴가" -> R.color.shift_off
|
||||
"월차", "연차" -> R.color.secondary
|
||||
"반월", "반년" -> R.color.shift_red
|
||||
"교육" -> R.color.primary
|
||||
else -> R.color.text_primary
|
||||
}
|
||||
val shiftColor = androidx.core.content.ContextCompat.getColor(this@MainActivity, shiftColorRes)
|
||||
val startIndex = prefix.length
|
||||
val endIndex = startIndex + shiftForViewingTeam.length
|
||||
|
||||
spannable.setSpan(
|
||||
android.text.style.ForegroundColorSpan(shiftColor),
|
||||
startIndex,
|
||||
endIndex,
|
||||
android.text.Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
spannable.setSpan(
|
||||
android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
|
||||
startIndex,
|
||||
endIndex,
|
||||
android.text.Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
|
||||
binding.todayStatusText.text = spannable
|
||||
binding.todayStatusText.setTextColor(androidx.core.content.ContextCompat.getColor(this@MainActivity, R.color.text_secondary))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user