Skip to content

Commit d886142

Browse files
lsakeeSangwook123
authored andcommitted
[feat] #62 permisson external gallery
1 parent 5fca311 commit d886142

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

app/src/main/AndroidManifest.xml

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
88
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
99
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
10-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1110
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
11+
<uses-permission
12+
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
13+
android:maxSdkVersion="28"
14+
tools:ignore="ScopedStorage" />
1215

1316
<application
1417
android:name=".RecordyApplication"

feature/upload/src/main/java/com/record/upload/UploadContract.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ data class UploadState(
1717
val thumbnailUrl: String = "",
1818
) : UiState
1919

20-
sealed interface UploadSideEffect : SideEffect{
20+
sealed interface UploadSideEffect : SideEffect {
2121
data object PopBackStack : UploadSideEffect
2222
}

feature/upload/src/main/java/com/record/upload/VideoPickerScreen.kt

+18-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.record.upload
33
import android.Manifest
44
import android.content.Context
55
import android.content.Intent
6+
import android.content.pm.PackageManager
67
import android.net.Uri
78
import android.os.Build
89
import android.provider.Settings
@@ -45,6 +46,7 @@ import androidx.compose.ui.res.painterResource
4546
import androidx.compose.ui.text.style.TextAlign
4647
import androidx.compose.ui.tooling.preview.Preview
4748
import androidx.compose.ui.unit.dp
49+
import androidx.core.content.ContextCompat
4850
import androidx.hilt.navigation.compose.hiltViewModel
4951
import androidx.lifecycle.compose.collectAsStateWithLifecycle
5052
import coil.ImageLoader
@@ -59,7 +61,6 @@ import com.record.designsystem.component.button.RecordyButton
5961
import com.record.designsystem.component.button.RecordyChipButton
6062
import com.record.designsystem.component.dialog.RecordyDialog
6163
import com.record.designsystem.component.navbar.TopNavigationBar
62-
import com.record.designsystem.component.snackbar.SnackBarType
6364
import com.record.designsystem.component.textfield.RecordyBasicTextField
6465
import com.record.designsystem.theme.Background
6566
import com.record.designsystem.theme.RecordyTheme
@@ -80,7 +81,6 @@ fun VideoPickerRoute(
8081
viewModel: UploadViewModel = hiltViewModel(),
8182
popBackStack: () -> Unit,
8283
) {
83-
8484
val state by viewModel.uiState.collectAsStateWithLifecycle()
8585
val context = LocalContext.current
8686
val coroutineScope = rememberCoroutineScope()
@@ -118,7 +118,7 @@ fun VideoPickerRoute(
118118
uploadVideoS3Bucket = {
119119
viewModel.uploadVideoToS3Bucket(context, it)
120120
},
121-
onClickBackStack = viewModel::popBackStack
121+
onClickBackStack = viewModel::popBackStack,
122122
)
123123
}
124124

@@ -145,7 +145,7 @@ fun VideoPickerScreen(
145145
) {
146146
val context = LocalContext.current
147147
val cameraPermissionState = rememberPermissionState(
148-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)Manifest.permission.READ_MEDIA_VIDEO else Manifest.permission.READ_EXTERNAL_STORAGE,
148+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) Manifest.permission.READ_MEDIA_VIDEO else Manifest.permission.READ_EXTERNAL_STORAGE,
149149
)
150150
val exampleVideoList = getAllVideos(10, null, context)
151151
val requestPermissionLauncher = rememberLauncherForActivityResult(
@@ -157,6 +157,14 @@ fun VideoPickerScreen(
157157
Timber.d("Handle permission denial")
158158
}
159159
}
160+
val permissionState = remember {
161+
mutableStateOf(
162+
ContextCompat.checkSelfPermission(
163+
context,
164+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) Manifest.permission.READ_MEDIA_VIDEO else Manifest.permission.READ_EXTERNAL_STORAGE,
165+
) == PackageManager.PERMISSION_GRANTED,
166+
)
167+
}
160168
var normalValue by remember {
161169
mutableStateOf("")
162170
}
@@ -207,7 +215,6 @@ fun VideoPickerScreen(
207215
.background(RecordyTheme.colors.gray08, shape = RoundedCornerShape(16.dp))
208216
.customClickable(
209217
onClick = {
210-
// showIsSelectedVideoSheetOpen()
211218
if (cameraPermissionState.status.isGranted) {
212219
showIsSelectedVideoSheetOpen()
213220
return@customClickable
@@ -217,7 +224,11 @@ fun VideoPickerScreen(
217224
return@customClickable
218225
}
219226
scope.launch {
220-
requestPermissionLauncher.launch(Manifest.permission.READ_MEDIA_VIDEO)
227+
if (!permissionState.value) {
228+
requestPermissionLauncher.launch(
229+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) Manifest.permission.READ_MEDIA_VIDEO else Manifest.permission.READ_EXTERNAL_STORAGE,
230+
)
231+
}
221232
}
222233
},
223234
),
@@ -367,7 +378,7 @@ fun VideoPickerScreen(
367378
negativeButtonLabel = "취소",
368379
positiveButtonLabel = "나가기",
369380
onDismissRequest = hideExitUploadDialog,
370-
onPositiveButtonClick = onClickBackStack
381+
onPositiveButtonClick = onClickBackStack,
371382
)
372383
}
373384
SelectedVideoBottomSheet(

0 commit comments

Comments
 (0)