Skip to content

Commit 3852d66

Browse files
committed
Feat: 권한 요청 로직 추가
1 parent be45cbc commit 3852d66

5 files changed

Lines changed: 111 additions & 1 deletion

File tree

core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/block/BitnagilAlertDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fun BitnagilAlertDialog(
2929
confirmButtonText: String,
3030
onDismiss: () -> Unit,
3131
onConfirm: () -> Unit,
32-
modifier: Modifier = Modifier
32+
modifier: Modifier = Modifier,
3333
) {
3434
BasicAlertDialog(
3535
modifier = modifier,

gradle/libs.versions.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ javax = "1"
5555
kakaoLogin = "2.21.4"
5656
lottie-compose = "6.6.0"
5757
coil = "3.3.0"
58+
accompanist = "0.37.3"
5859

5960
[libraries]
6061
## Android Gradle Plugin
@@ -127,6 +128,8 @@ material = { group = "com.google.android.material", name = "material", version.r
127128
kakao-v2-user = { group = "com.kakao.sdk", name = "v2-user", version.ref = "kakaoLogin" }
128129
lottie-compose = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "lottie-compose" }
129130

131+
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
132+
130133
[bundles]
131134
androidx-core = [
132135
"androidx-core-ktx",

presentation/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
implementation(libs.kotlinx.serialization.json)
2121
implementation(libs.lottie.compose)
2222
implementation(libs.bundles.coil)
23+
implementation(libs.accompanist.permissions)
2324

2425
testImplementation(libs.junit)
2526
testImplementation(libs.kotlin.coroutines.test)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.threegap.bitnagil.presentation.common.premission
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.Stable
5+
6+
@Stable
7+
interface PermissionHandler {
8+
val isGranted: Boolean
9+
10+
fun requestPermission()
11+
12+
@Composable
13+
fun PermissionDialogs()
14+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package com.threegap.bitnagil.presentation.common.premission
2+
3+
import android.content.Intent
4+
import android.net.Uri
5+
import android.provider.Settings
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.runtime.getValue
8+
import androidx.compose.runtime.mutableIntStateOf
9+
import androidx.compose.runtime.mutableStateOf
10+
import androidx.compose.runtime.remember
11+
import androidx.compose.runtime.saveable.rememberSaveable
12+
import androidx.compose.runtime.setValue
13+
import androidx.compose.ui.platform.LocalContext
14+
import com.google.accompanist.permissions.ExperimentalPermissionsApi
15+
import com.google.accompanist.permissions.isGranted
16+
import com.google.accompanist.permissions.rememberPermissionState
17+
import com.google.accompanist.permissions.shouldShowRationale
18+
import com.threegap.bitnagil.designsystem.component.block.BitnagilAlertDialog
19+
20+
@OptIn(ExperimentalPermissionsApi::class)
21+
@Composable
22+
fun rememberPermissionHandler(
23+
permission: String,
24+
dialogDescription: String,
25+
onGranted: () -> Unit,
26+
): PermissionHandler {
27+
val context = LocalContext.current
28+
var showSettingsDialog by remember { mutableStateOf(false) }
29+
var permissionRequestCount by rememberSaveable { mutableIntStateOf(0) }
30+
31+
val permissionState = rememberPermissionState(
32+
permission = permission,
33+
onPermissionResult = { isGranted ->
34+
if (isGranted) {
35+
permissionRequestCount = 0
36+
onGranted()
37+
} else {
38+
permissionRequestCount++
39+
}
40+
},
41+
)
42+
43+
val handler = remember(context) {
44+
object : PermissionHandler {
45+
override val isGranted: Boolean
46+
get() = permissionState.status.isGranted
47+
48+
override fun requestPermission() {
49+
when {
50+
permissionState.status.isGranted -> {
51+
onGranted()
52+
}
53+
54+
permissionState.status.shouldShowRationale -> {
55+
permissionState.launchPermissionRequest()
56+
}
57+
58+
else -> {
59+
if (permissionRequestCount == 0) {
60+
permissionState.launchPermissionRequest()
61+
} else {
62+
showSettingsDialog = true
63+
}
64+
}
65+
}
66+
}
67+
68+
@Composable
69+
override fun PermissionDialogs() {
70+
if (showSettingsDialog) {
71+
BitnagilAlertDialog(
72+
title = "권한 설정이 필요합니다.",
73+
description = dialogDescription,
74+
dismissButtonText = "닫기",
75+
confirmButtonText = "설정으로 이동",
76+
onConfirm = {
77+
showSettingsDialog = false
78+
val intent = Intent(
79+
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
80+
Uri.fromParts("package", context.packageName, null),
81+
)
82+
context.startActivity(intent)
83+
},
84+
onDismiss = { showSettingsDialog = false },
85+
)
86+
}
87+
}
88+
}
89+
}
90+
91+
return handler
92+
}

0 commit comments

Comments
 (0)