Skip to content

Commit babe5d8

Browse files
committed
[feat] #62 uses-permission galley & video
1 parent 06ad28d commit babe5d8

File tree

6 files changed

+99
-112
lines changed

6 files changed

+99
-112
lines changed

app/src/main/AndroidManifest.xml

-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
xmlns:tools="http://schemas.android.com/tools">
44

55
<uses-permission android:name="android.permission.INTERNET"/>
6-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
7-
android:maxSdkVersion="32" />
86
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33" />
97
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" />
108

core/designsystem/src/main/java/com/record/designsystem/component/textfield/RecordyBasicTextField.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import androidx.compose.foundation.interaction.collectIsFocusedAsState
77
import androidx.compose.foundation.layout.Arrangement
88
import androidx.compose.foundation.layout.Box
99
import androidx.compose.foundation.layout.Column
10-
import androidx.compose.foundation.layout.fillMaxHeight
1110
import androidx.compose.foundation.layout.fillMaxWidth
12-
import androidx.compose.foundation.layout.height
1311
import androidx.compose.foundation.layout.heightIn
1412
import androidx.compose.foundation.layout.padding
1513
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -34,7 +32,6 @@ import androidx.compose.ui.text.style.TextOverflow
3432
import androidx.compose.ui.tooling.preview.Preview
3533
import androidx.compose.ui.unit.Dp
3634
import androidx.compose.ui.unit.dp
37-
import androidx.compose.ui.unit.min
3835
import com.record.designsystem.theme.Alert
3936
import com.record.designsystem.theme.Black
4037
import com.record.designsystem.theme.Gray01
@@ -80,7 +77,7 @@ fun RecordyBasicTextField(
8077
}
8178

8279
BasicTextField(
83-
modifier =modifier.fillMaxWidth(),
80+
modifier = modifier.fillMaxWidth(),
8481
value = value,
8582
onValueChange = { newValue ->
8683
if (newValue.replace(" ", "").length <= maxLength) onValueChange(newValue)

feature/navigator/src/main/java/com/record/navigator/MainNavigator.kt

+9
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ internal class MainNavigator(
9090
navController.popBackStack()
9191
}
9292
}
93+
fun navigateSelectedKeyword() {
94+
navController.navigateSelectedKeyword()
95+
}
96+
fun navigateDefinedContent() {
97+
navController.navigateDefinedContent()
98+
}
99+
fun navigateCompletedUpload() {
100+
navController.navigateCompletedUpload()
101+
}
93102

94103
private fun isSameCurrentDestination(route: String) =
95104
navController.currentDestination?.route == route

feature/upload/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ android {
77
}
88

99
dependencies {
10+
implementation("com.google.accompanist:accompanist-permissions:0.34.0")
1011
implementation(projects.domain.upload)
1112
}

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

+40-41
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.record.upload
22

33
import android.content.ContentUris
44
import android.content.Context
5-
import android.database.Cursor
65
import android.net.Uri
76
import android.provider.MediaStore
87
import android.util.Log
@@ -11,26 +10,27 @@ import androidx.compose.foundation.background
1110
import androidx.compose.foundation.layout.Box
1211
import androidx.compose.foundation.layout.Column
1312
import androidx.compose.foundation.layout.PaddingValues
14-
import androidx.compose.foundation.layout.aspectRatio
1513
import androidx.compose.foundation.layout.fillMaxSize
1614
import androidx.compose.foundation.layout.fillMaxWidth
1715
import androidx.compose.foundation.layout.padding
16+
import androidx.compose.foundation.layout.size
17+
import androidx.compose.foundation.lazy.grid.GridCells
18+
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
19+
import androidx.compose.foundation.lazy.grid.items
1820
import androidx.compose.material3.Text
1921
import androidx.compose.runtime.Composable
20-
import androidx.compose.runtime.remember
2122
import androidx.compose.ui.Alignment
2223
import androidx.compose.ui.Modifier
24+
import androidx.compose.ui.draw.clip
25+
import androidx.compose.ui.graphics.RectangleShape
26+
import androidx.compose.ui.layout.ContentScale
2327
import androidx.compose.ui.platform.LocalContext
24-
import androidx.compose.ui.semantics.Role.Companion.Image
25-
import androidx.compose.ui.text.intl.Locale
2628
import androidx.compose.ui.text.style.TextAlign
2729
import androidx.compose.ui.tooling.preview.Preview
2830
import androidx.compose.ui.unit.dp
2931
import coil.ImageLoader
3032
import coil.compose.rememberAsyncImagePainter
31-
import coil.compose.rememberImagePainter
3233
import coil.decode.VideoFrameDecoder
33-
import coil.size.Scale
3434
import com.record.designsystem.component.button.RecordyButton
3535
import com.record.designsystem.component.navbar.TopNavigationBar
3636
import com.record.designsystem.theme.Background
@@ -48,8 +48,9 @@ fun SelectedVideoRoute(
4848
@Composable
4949
fun SelectedVideoScreen(
5050
navigateDefinedContent: () -> Unit,
51-
) { Log.d("images","${getAllVideos(10, null, LocalContext.current)}")
52-
val a =getAllVideos(10, null, LocalContext.current)
51+
) {
52+
Log.d("images", "${getAllVideos(10, null, LocalContext.current)}")
53+
val a = getAllVideos(10, null, LocalContext.current)
5354
Box(
5455
modifier = Modifier
5556
.fillMaxSize()
@@ -68,7 +69,14 @@ fun SelectedVideoScreen(
6869
modifier = Modifier.fillMaxWidth(),
6970
textAlign = TextAlign.Center,
7071
)
71-
VideoThumbnail(video = a[0])
72+
LazyVerticalGrid(
73+
columns = GridCells.Fixed(4),
74+
modifier = Modifier.padding(8.dp),
75+
) {
76+
items(a) { video ->
77+
VideoThumbnail(video = video)
78+
}
79+
}
7280
}
7381
RecordyButton(
7482
modifier = Modifier.align(Alignment.BottomCenter),
@@ -77,45 +85,39 @@ fun SelectedVideoScreen(
7785
onClick = {},
7886
)
7987
}
80-
8188
}
8289

83-
8490
@Composable
8591
fun VideoThumbnail(video: GalleryVideo) {
8692
val context = LocalContext.current
8793
val imageLoader = ImageLoader.Builder(context)
8894
.components {
8995
add(VideoFrameDecoder.Factory())
90-
}.crossfade(true)
96+
}
97+
.crossfade(true)
9198
.build()
9299

93100
val painter = rememberAsyncImagePainter(
94101
model = video.filepath,
95-
imageLoader = imageLoader,)
96-
97-
Box(modifier = Modifier
98-
.padding(8.dp)
99-
.fillMaxWidth()) {
100-
// val painter = rememberImagePainter(
101-
// data = video.uri,
102-
// imageLoader = imageLoader,
103-
// builder = {
104-
// crossfade(true)
105-
// scale(Scale.FILL)
106-
// }
107-
// )
102+
imageLoader = imageLoader,
103+
)
108104

105+
Box(
106+
modifier = Modifier
107+
.padding(8.dp)
108+
.size(85.dp),
109+
) {
109110
Image(
110111
painter = painter,
111112
contentDescription = "Video Thumbnail",
113+
contentScale = ContentScale.Crop,
112114
modifier = Modifier
113-
.fillMaxWidth()
114-
.aspectRatio(16 / 9f)
115+
.fillMaxSize()
116+
.clip(RectangleShape),
115117
)
116-
117118
}
118119
}
120+
119121
@Preview
120122
@Composable
121123
fun SelectedVideoScreenPreview() {
@@ -127,19 +129,17 @@ fun SelectedVideoScreenPreview() {
127129
fun getAllVideos(
128130
loadSize: Int,
129131
currentLocation: String?,
130-
context: Context
132+
context: Context,
131133
): MutableList<GalleryVideo> {
132134
val galleryVideoList = mutableListOf<GalleryVideo>()
133-
// 외장 메모리에 있는 비디오 파일의 URI를 받도록 함
134135
val uriExternal: Uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
135-
// 커서에 가져올 정보에 대해서 지정한다.
136136
val projection = arrayOf(
137137
MediaStore.Video.VideoColumns.DATA,
138138
MediaStore.Video.VideoColumns.DISPLAY_NAME, // 이름
139139
MediaStore.Video.VideoColumns.SIZE, // 크기
140140
MediaStore.Video.VideoColumns.DATE_TAKEN,
141141
MediaStore.Video.VideoColumns.DATE_ADDED, // 추가된 날짜
142-
MediaStore.Video.VideoColumns._ID
142+
MediaStore.Video.VideoColumns._ID,
143143
)
144144
val resolver = context.contentResolver
145145

@@ -151,15 +151,14 @@ fun getAllVideos(
151151
projection,
152152
selection,
153153
selectionArgs,
154-
"${MediaStore.Video.VideoColumns.DATE_ADDED} DESC"
154+
"${MediaStore.Video.VideoColumns.DATE_ADDED} DESC",
155155
)
156156

157157
query?.use { cursor ->
158-
Log.d("gallery cursor", "Cursor count: ${cursor.count}.")
159-
160158
if (cursor.moveToFirst()) {
161159
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.VideoColumns._ID)
162-
val nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.VideoColumns.DISPLAY_NAME)
160+
val nameColumn =
161+
cursor.getColumnIndexOrThrow(MediaStore.Video.VideoColumns.DISPLAY_NAME)
163162
val filePathColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.VideoColumns.DATA)
164163
val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.VideoColumns.SIZE)
165164
val dateColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.VideoColumns.DATE_TAKEN)
@@ -180,8 +179,8 @@ fun getAllVideos(
180179
uri = contentUri,
181180
name = name,
182181
date = date ?: "",
183-
size = size
184-
)
182+
size = size,
183+
),
185184
)
186185
} while (cursor.moveToNext())
187186
}
@@ -196,5 +195,5 @@ data class GalleryVideo(
196195
val uri: Uri,
197196
val name: String,
198197
val date: String,
199-
val size: Int
200-
)
198+
val size: Int,
199+
)

0 commit comments

Comments
 (0)