Skip to content

Commit

Permalink
refactor(#322): 스페이스 추가 구현(그 외 이벤트 처리 미완성)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaehan4707 committed Feb 18, 2024
1 parent f7bc2ea commit 619c876
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 91 deletions.
Original file line number Diff line number Diff line change
@@ -1,70 +1,58 @@
package boostcamp.and07.mindsync.ui.space.generate

import android.content.pm.PackageManager
import android.net.Uri
import androidx.activity.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import boostcamp.and07.mindsync.R
import boostcamp.and07.mindsync.databinding.ActivityAddSpaceBinding
import boostcamp.and07.mindsync.ui.base.BaseActivity
import boostcamp.and07.mindsync.ui.base.BaseActivityViewModel
import boostcamp.and07.mindsync.ui.space.SpaceUiEvent
import boostcamp.and07.mindsync.ui.util.ImagePickerHandler
import boostcamp.and07.mindsync.ui.util.setClickEvent
import androidx.compose.runtime.Composable
import boostcamp.and07.mindsync.ui.base.BaseComposeActivity
import boostcamp.and07.mindsync.ui.theme.MindSyncTheme
import boostcamp.and07.mindsync.ui.util.toAbsolutePath
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.io.File

@AndroidEntryPoint
class AddSpaceActivity : BaseActivity<ActivityAddSpaceBinding>(R.layout.activity_add_space) {
class AddSpaceActivity : BaseComposeActivity() {
private val addSpaceViewModel: AddSpaceViewModel by viewModels()
private val imagePickerHandler =
ImagePickerHandler(this) { uri ->
createImage(uri)
}

override fun init() {
setBinding()
setBackBtn()
collectSpaceEvent()
setClickEventThrottle()
}

override fun getViewModel(): BaseActivityViewModel {
return addSpaceViewModel
}

private fun setBinding() {
binding.vm = addSpaceViewModel
}
// override fun init() {
// //setBinding()
// setBackBtn()
// collectSpaceEvent()
// //setClickEventThrottle()
// }

private fun setClickEventThrottle() {
binding.imgbtnUpdateSpaceThumbnail.setClickEvent(lifecycleScope) {
imagePickerHandler.checkPermissionsAndLaunchImagePicker()
}
}
// override fun getViewModel(): BaseActivityViewModel {
// return addSpaceViewModel
// }
//
// private fun setBinding() {
// binding.vm = addSpaceViewModel
// }
//
// private fun setClickEventThrottle() {
// binding.imgbtnUpdateSpaceThumbnail.setClickEvent(lifecycleScope) {
// imagePickerHandler.checkPermissionsAndLaunchImagePicker()
// }
// }

private fun collectSpaceEvent() {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
addSpaceViewModel.event.collectLatest { spaceEvent ->
when (spaceEvent) {
is SpaceUiEvent.SuccessAdd -> {
finish()
}
is SpaceUiEvent.ShowMessage -> { // 에러일 경우가 잇나?
showMessage(spaceEvent.message)
}
else -> {}
}
}
}
}
}
// private fun collectSpaceEvent() {
// lifecycleScope.launch {
// repeatOnLifecycle(Lifecycle.State.STARTED) {
// addSpaceViewModel.event.collectLatest { spaceEvent ->
// when (spaceEvent) {
// is SpaceUiEvent.SuccessAdd -> {
// finish()
// }
//
// is SpaceUiEvent.ShowMessage -> { // 에러일 경우가 잇나?
// showMessage(spaceEvent.message)
// }
//
// else -> {}
// }
// }
// }
// }
// }

private fun createImage(uri: Uri?) {
uri?.let { uri ->
Expand All @@ -74,22 +62,29 @@ class AddSpaceActivity : BaseActivity<ActivityAddSpaceBinding>(R.layout.activity
}
}

private fun setBackBtn() {
binding.imgbtnAddSpaceBack.setOnClickListener {
finish()
@Composable
override fun Content() {
MindSyncTheme {
AddSpaceScreen(
onBackClicked = { this.finish() },
addSpaceViewModel = addSpaceViewModel,
createSpace = { addSpaceViewModel.addSpace(it) },
updateSpaceName = { addSpaceViewModel.onSpaceNameChanged(it, 0, 0, 0) },
createImage = { createImage(it) },
)
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray,
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == ImagePickerHandler.REQUEST_CODE_PERMISSIONS &&
grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
imagePickerHandler.launchImagePicker()
}
}
// override fun onRequestPermissionsResult(
// requestCode: Int,
// permissions: Array<out String>,
// grantResults: IntArray,
// ) {
// super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// if (requestCode == ImagePickerHandler.REQUEST_CODE_PERMISSIONS &&
// grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED
// ) {
// imagePickerHandler.launchImagePicker()
// }
// }
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
package boostcamp.and07.mindsync.ui.space.generate

import android.util.Log
import android.net.Uri
import androidx.activity.compose.ManagedActivityResultLauncher
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.IconButton
Expand All @@ -24,6 +31,8 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.TextFieldValue
Expand All @@ -33,25 +42,31 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import boostcamp.and07.mindsync.R
import boostcamp.and07.mindsync.ui.space.SpaceUiState
import boostcamp.and07.mindsync.ui.theme.Blue1
import coil.compose.AsyncImage

@Composable
fun AddSpaceScreen(
addSpaceViewModel: AddSpaceViewModel,
onBackClicked: () -> Unit,
createSpace: (String) -> Unit,
updateSpaceName: (String) -> Unit,
createImage: (Uri) -> Unit,
) {
val uiState by addSpaceViewModel.uiState.collectAsStateWithLifecycle()
val imageLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.PickVisualMedia(),
onResult = { uri ->
uri?.let { imageThumbnail ->
addSpaceViewModel.setSpaceThumbnail(imageThumbnail.toString())
createImage(imageThumbnail)
}
},
)
AddSpaceContent(
onBackClicked = onBackClicked,
uiState,
imageLauncher,
uiState = uiState,
imageLauncher = imageLauncher,
createSpace = createSpace,
updateSpaceName = updateSpaceName,
)
}

Expand All @@ -60,6 +75,8 @@ fun AddSpaceContent(
onBackClicked: () -> Unit = { },
uiState: SpaceUiState = SpaceUiState(),
imageLauncher: ManagedActivityResultLauncher<PickVisualMediaRequest, Uri?>,
createSpace: (String) -> Unit = {},
updateSpaceName: (String) -> Unit = {},
) {
AddSpaceTopBar(onBackClicked)
Row(
Expand All @@ -84,15 +101,15 @@ fun AddSpaceContent(
.padding(top = 250.dp),
horizontalArrangement = Arrangement.Center,
) {
InputSpaceNameField()
InputSpaceNameField(uiState, updateSpaceName)
}
Row(
modifier = Modifier
.padding(top = 400.dp)
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center,
) {
SpaceNameInputButton()
SpaceNameInputButton(createSpace)
}
}

Expand Down Expand Up @@ -163,32 +180,35 @@ fun AddSpaceThumbnail(
}

@Composable
fun InputSpaceNameField() {
fun InputSpaceNameField(
uiState: SpaceUiState,
updateSpaceName: (String) -> Unit,
) {
val spaceHint = stringResource(id = R.string.space_name_hint)
var value by remember { mutableStateOf("") }
var spaceName by remember {
mutableStateOf(
TextFieldValue(
text = uiState.spaceName,
),
)
}
TextField(
value = value,
value = spaceName,
onValueChange = {
Log.d("compose", "value: ${value.isEmpty()}")
value = it
spaceName = it
updateSpaceName(it.text)
},
maxLines = 2,
modifier = Modifier.padding(20.dp),
placeholder = { Text(spaceHint) },
)
}

@Composable
fun SpaceNameInputButton() {
Button(onClick = {}, Modifier.width(264.dp)) {
fun SpaceNameInputButton(createSpace: (String) -> Unit) {
val icon = stringResource(id = R.string.space_image_name)
Button(onClick = {
createSpace(icon)
}, Modifier.width(264.dp)) {
Text(text = stringResource(id = R.string.check_message))
}
}

@Preview(showSystemUi = true, showBackground = true)
@Composable
private fun AddSpaceScreenPreview() {
MindSyncTheme {
AddSpaceScreen()
}
}

0 comments on commit 619c876

Please sign in to comment.