Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 1 addition & 19 deletions app/src/main/java/com/example/slowclock/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,15 @@ package com.example.slowclock

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.pm.PackageManager
import android.media.AudioAttributes
import android.media.RingtoneManager
import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.getValue
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
Expand Down Expand Up @@ -136,7 +133,7 @@ class MainActivity : ComponentActivity() {
} catch (e: Exception) {
Log.e("MAIN", "onCreate 실패", e)
}
requestNotificationPermission()
// 알림은 메인의 설명을 읽고 설정 버튼을 누른 뒤 허용한다. 로그인 위로 권한창을 띄우지 않는다.
// 정확한 알람 권한은 메인 화면이 이유를 설명한 뒤 사용자가 원할 때 요청한다(#83).
createNotificationChannel() // ← 반드시 호출 필요
}
Expand Down Expand Up @@ -166,21 +163,6 @@ class MainActivity : ComponentActivity() {
notificationManager.createNotificationChannel(channel)
}

// POST_NOTIFICATIONS 는 API 33 에 생겼다. minSdk 32 기기는 설치 시점에 알림 권한을 갖는다.
private fun requestNotificationPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
if (ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.POST_NOTIFICATIONS,
) != PackageManager.PERMISSION_GRANTED
) {
requestPermissions(
arrayOf(android.Manifest.permission.POST_NOTIFICATIONS),
1001,
)
}
}

private fun saveFcmTokenToFirestore() {
lifecycleScope.launch {
if (userRepository.saveCurrentUserFcmToken()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,41 @@ class MainViewModelTest {
every { alarmScheduler.canShowAlarmControls() } returns true
viewModel.onIntent(MainIntent.ScreenResumed)
assertTrue(viewModel.uiState.value.alarmControlsAvailable)
assertNull(viewModel.uiState.value.openNotificationSettings)
}

@Test
fun `알림 차단 상태로 로그인하고 복귀해도 설정을 자동으로 열지 않는다`() =
runTest {
val uid = MutableStateFlow<String?>(null)
every { authRepository.currentUid } answers { uid.value }
every { authRepository.observeCurrentUid() } returns uid
every { alarmScheduler.canShowAlarmControls() } returns false
val viewModel = createViewModel()
assertNull(viewModel.uiState.value.openNotificationSettings)

uid.value = "uid-1"
viewModel.onIntent(MainIntent.ScreenResumed)

assertFalse(viewModel.uiState.value.alarmControlsAvailable)
assertNull(viewModel.uiState.value.openNotificationSettings)
}

@Test
fun `알림을 허용하지 않고 설정에서 돌아오면 안내를 유지하고 다시 누를 수 있다`() =
runTest {
every { alarmScheduler.canShowAlarmControls() } returns false
val viewModel = createViewModel()
viewModel.onIntent(MainIntent.OpenNotificationSettings)
assertNotNull(viewModel.uiState.value.openNotificationSettings)
viewModel.onIntent(MainIntent.ConsumeNotificationSettingsRequest)

viewModel.onIntent(MainIntent.ScreenResumed)

assertFalse(viewModel.uiState.value.alarmControlsAvailable)
assertNull(viewModel.uiState.value.openNotificationSettings)
viewModel.onIntent(MainIntent.OpenNotificationSettings)
assertNotNull(viewModel.uiState.value.openNotificationSettings)
}

private fun createViewModel() = MainViewModel(scheduleRepository, userRepository, authRepository, settingsRepository, alarmScheduler)
Expand Down
Loading