Skip to content

Commit 03168ec

Browse files
authored
Merge pull request #44 from Richter3766/Feat/issue-#43
Feat/issue #43 - 알림 권한 설정
2 parents f347b77 + adff628 commit 03168ec

File tree

12 files changed

+97
-25
lines changed

12 files changed

+97
-25
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
4+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
45

56
<application
67
android:name=".NotiManager"

app/src/main/java/com/example/notimanager/data/repository/NotificationPermissionRepository.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.example.notimanager.data.repository
22

3+
import android.Manifest
34
import android.content.Context
45
import android.content.Intent
6+
import android.content.pm.PackageManager
7+
import android.os.Build
58
import android.provider.Settings
69
import com.example.notimanager.domain.repository.NotificationPermissionRepositoryInterface
710
import javax.inject.Inject
@@ -15,9 +18,17 @@ class NotificationPermissionRepository @Inject constructor(
1518
return flat != null && flat.contains(pkgName)
1619
}
1720

18-
override fun requestPermission() {
21+
override fun requestNotificationListenerPermission() {
1922
val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")
2023
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
2124
appContext.startActivity(intent)
2225
}
26+
27+
override fun isNotificationPermissionGranted(): Boolean {
28+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
29+
appContext.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
30+
} else {
31+
true
32+
}
33+
}
2334
}

app/src/main/java/com/example/notimanager/di/AppModule.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.example.notimanager.di
22

33
import com.example.notimanager.domain.usecase.NotificationPermissionUseCase
4-
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
4+
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
55
import dagger.Module
66
import dagger.Provides
77
import dagger.hilt.InstallIn
@@ -15,7 +15,7 @@ class AppModule {
1515
@Singleton
1616
fun provideNotificationPermissionViewModel(
1717
notificationPermissionUseCase: NotificationPermissionUseCase
18-
): NotificationPermissionViewModel {
19-
return NotificationPermissionViewModel(notificationPermissionUseCase)
18+
): NotificationServicePermissionViewModel {
19+
return NotificationServicePermissionViewModel(notificationPermissionUseCase)
2020
}
2121
}

app/src/main/java/com/example/notimanager/domain/repository/NotificationPermissionRepositoryInterface.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ package com.example.notimanager.domain.repository
22

33
interface NotificationPermissionRepositoryInterface {
44
fun isNotificationServiceEnabled(): Boolean
5-
fun requestPermission()
5+
fun requestNotificationListenerPermission()
6+
fun isNotificationPermissionGranted(): Boolean
67
}

app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ class NotiListenerService: NotificationListenerService() {
3636
val appName = NameGetter.getAppName(this, sbn)
3737
val title = notification.extras.getString("android.title") ?: ""
3838
val subText = notification.extras.getString("android.subText") ?: ""
39-
val content = notification.extras.getCharSequence("android.text").toString() ?: ""
39+
val content = notification.extras.getCharSequence("android.text")?.toString() ?: ""
4040
val postTime = sbn.postTime
4141

4242
CoroutineScope(Dispatchers.IO).launch {
43-
if (title == "" && content == "" && subText == "") return@launch
43+
if (title == "" && content == "") return@launch
4444

4545
val filteredList = filterRepository.getSpecificFilteredList(appName, title, subText)
4646
if (filteredList.isNotEmpty()) return@launch

app/src/main/java/com/example/notimanager/domain/usecase/NotificationPermissionUseCase.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.example.notimanager.domain.usecase
22

3+
import android.Manifest
4+
import android.app.Activity
5+
import android.os.Build
36
import com.example.notimanager.domain.repository.NotificationPermissionRepositoryInterface
47

58
class NotificationPermissionUseCase(
@@ -11,7 +14,26 @@ class NotificationPermissionUseCase(
1114

1215
fun requestPermission() {
1316
if (!repository.isNotificationServiceEnabled()) {
14-
repository.requestPermission()
17+
repository.requestNotificationListenerPermission()
1518
}
1619
}
20+
21+
fun isNotificationPermissionGranted(): Boolean{
22+
return repository.isNotificationPermissionGranted()
23+
}
24+
25+
fun requestPermission(activity: Activity) {
26+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
27+
activity.requestPermissions(
28+
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
29+
NOTIFICATION_PERMISSION_REQUEST_CODE
30+
)
31+
} else {
32+
// Android 12 이하에서는 별도 권한이 필요하지 않음
33+
}
34+
}
35+
36+
companion object {
37+
private const val NOTIFICATION_PERMISSION_REQUEST_CODE = 1
38+
}
1739
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.notimanager.presentation.stateholder.viewmodel
22

3+
import android.app.Activity
34
import androidx.lifecycle.LiveData
45
import androidx.lifecycle.MutableLiveData
56
import androidx.lifecycle.ViewModel
@@ -12,19 +13,18 @@ class NotificationPermissionViewModel @Inject constructor(
1213
private val notificationPermissionUseCase: NotificationPermissionUseCase
1314
) : ViewModel() {
1415

15-
private val _isPermissionGranted = MutableLiveData<Boolean>()
16-
val isPermissionGranted: LiveData<Boolean> get() = _isPermissionGranted
16+
private val _isNotificationPermissionGranted = MutableLiveData<Boolean>()
17+
val isNotificationPermissionGranted: LiveData<Boolean> get() = _isNotificationPermissionGranted
1718

1819
init {
1920
checkNotificationPermission()
2021
}
2122

2223
fun checkNotificationPermission() {
23-
_isPermissionGranted.value = notificationPermissionUseCase.isNotificationServiceEnabled()
24+
_isNotificationPermissionGranted.value = notificationPermissionUseCase.isNotificationPermissionGranted()
2425
}
2526

26-
fun requestPermission() {
27-
notificationPermissionUseCase.requestPermission()
28-
checkNotificationPermission()
27+
fun requestPermission(activity: Activity) {
28+
notificationPermissionUseCase.requestPermission(activity)
2929
}
3030
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.example.notimanager.presentation.stateholder.viewmodel
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.MutableLiveData
5+
import androidx.lifecycle.ViewModel
6+
import com.example.notimanager.domain.usecase.NotificationPermissionUseCase
7+
import dagger.hilt.android.lifecycle.HiltViewModel
8+
import javax.inject.Inject
9+
10+
@HiltViewModel
11+
class NotificationServicePermissionViewModel @Inject constructor(
12+
private val notificationPermissionUseCase: NotificationPermissionUseCase
13+
) : ViewModel() {
14+
15+
private val _isNotificationServiceEnabled = MutableLiveData<Boolean>()
16+
val isNotificationServiceEnabled: LiveData<Boolean> get() = _isNotificationServiceEnabled
17+
18+
init {
19+
checkNotificationServicePermission()
20+
}
21+
22+
fun checkNotificationServicePermission() {
23+
_isNotificationServiceEnabled.value = notificationPermissionUseCase.isNotificationServiceEnabled()
24+
}
25+
26+
fun requestServicePermission() {
27+
notificationPermissionUseCase.requestPermission()
28+
checkNotificationServicePermission()
29+
}
30+
}

app/src/main/java/com/example/notimanager/presentation/ui/activity/MainActivity.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,31 @@ import androidx.activity.compose.setContent
66
import androidx.activity.viewModels
77
import androidx.navigation.compose.rememberNavController
88
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
9+
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
910
import com.example.notimanager.presentation.ui.navigation.AppNavHost
1011
import dagger.hilt.android.AndroidEntryPoint
1112

1213
@AndroidEntryPoint
1314
class MainActivity : ComponentActivity() {
14-
15-
private val viewModel: NotificationPermissionViewModel by viewModels()
15+
private val serviceViewModel: NotificationServicePermissionViewModel by viewModels()
16+
private val notificationViewModel: NotificationPermissionViewModel by viewModels()
1617

1718
override fun onCreate(savedInstanceState: Bundle?) {
1819
super.onCreate(savedInstanceState)
1920

2021
setContent {
2122
AppNavHost(navController = rememberNavController())
2223
}
24+
25+
notificationViewModel.isNotificationPermissionGranted.observe(this) { isGranted ->
26+
if (!isGranted) {
27+
notificationViewModel.requestPermission(this)
28+
}
29+
}
2330
}
2431

2532
override fun onResume() {
2633
super.onResume()
27-
viewModel.checkNotificationPermission()
34+
serviceViewModel.checkNotificationServicePermission()
2835
}
29-
3036
}

app/src/main/java/com/example/notimanager/presentation/ui/component/PermissionDialog.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ import androidx.compose.runtime.mutableStateOf
1111
import androidx.compose.runtime.remember
1212
import androidx.hilt.navigation.compose.hiltViewModel
1313
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
14+
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
1415

1516
@Composable
16-
fun PermissionCheck(viewModel: NotificationPermissionViewModel = hiltViewModel()){
17-
val isPermissionGranted by viewModel.isPermissionGranted.observeAsState()
17+
fun PermissionCheck(viewModel: NotificationServicePermissionViewModel = hiltViewModel()){
18+
val isPermissionGranted by viewModel.isNotificationServiceEnabled.observeAsState()
1819

1920
if (isPermissionGranted == false) {
2021
SimplePermissionDialog(
2122
title = "알림 권한 필요",
2223
message = "알림을 받기 위해 알림 권한이 필요합니다.",
23-
onAllow = { viewModel.requestPermission() },
24+
onAllow = { viewModel.requestServicePermission() },
2425
)
2526
}
2627
}

0 commit comments

Comments
 (0)