fix: 라이브 생성 이미지 선택

- 이미지 선택 및 Crop 방법 변경
This commit is contained in:
2025-09-17 18:49:36 +09:00
parent 93fa042522
commit 3c21b36e88
8 changed files with 250 additions and 70 deletions

View File

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
import android.os.Handler
import android.os.Looper
@@ -13,20 +14,19 @@ import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import coil.load
import coil.transform.RoundedCornersTransformation
import com.github.dhaval2404.imagepicker.ImagePicker
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.jakewharton.rxbinding4.widget.textChanges
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.ImagePickerCropper
import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.common.RealPathUtil
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ActivityLiveRoomCreateBinding
import kr.co.vividnext.sodalive.databinding.ItemLiveTagSelectedBinding
@@ -47,6 +47,7 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
private val viewModel: LiveRoomCreateViewModel by inject()
private lateinit var loadingDialog: LoadingDialog
private lateinit var cropper: ImagePickerCropper
private val handler = Handler(Looper.getMainLooper())
@@ -95,34 +96,8 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
}
}
private val imageResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val resultCode = result.resultCode
val data = result.data
if (resultCode == RESULT_OK) {
// Image Uri will not be null for RESULT_OK
val fileUri = data?.data!!
binding.ivCover.background = null
binding.ivCover.load(fileUri) {
crossfade(true)
placeholder(R.drawable.ic_place_holder)
transformations(RoundedCornersTransformation(13.3f.dpToPx()))
}
viewModel.coverImageUri = fileUri
viewModel.coverImagePath = null
} else if (resultCode == ImagePicker.RESULT_ERROR) {
Toast.makeText(this, ImagePicker.getError(data), Toast.LENGTH_SHORT).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.getRealPathFromURI = {
RealPathUtil.getRealPath(applicationContext, it)
}
bindData()
viewModel.setTimeNow(
@@ -132,25 +107,48 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
viewModel.getAllMenuPreset()
}
override fun onDestroy() {
cropper.cleanup()
super.onDestroy()
}
@SuppressLint("SetTextI18n", "ClickableViewAccessibility")
override fun setupView() {
loadingDialog = LoadingDialog(this, layoutInflater)
cropper = ImagePickerCropper(
caller = this,
context = this,
config = ImagePickerCropper.Config(
aspectX = 2f, aspectY = 3.8f,
maxWidth = 1080, maxHeight = 2052,
compressFormat = Bitmap.CompressFormat.JPEG,
compressQuality = 90
),
onSuccess = { file, uri ->
binding.ivCover.background = null
Glide.with(binding.ivCover.context)
.load(uri)
.placeholder(R.drawable.ic_place_holder)
.apply(
RequestOptions().transform(
RoundedCorners(
16f.dpToPx().toInt()
)
)
)
.into(binding.ivCover)
viewModel.coverImageFile = file
viewModel.coverImagePath = null
},
onError = { e ->
Toast.makeText(this, "${e.message}", Toast.LENGTH_SHORT).show()
}
)
binding.tvBack.setOnClickListener { finish() }
binding.ivPhotoPicker.setOnClickListener {
ImagePicker.with(this)
.crop()
.galleryOnly()
.galleryMimeTypes( // Exclude gif images
mimeTypes = arrayOf(
"image/png",
"image/jpg",
"image/jpeg"
)
)
.createIntent { imageResult.launch(it) }
}
binding.ivPhotoPicker.setOnClickListener { cropper.launch() }
binding.llOpen.setOnClickListener {
viewModel.setRoomType(LiveRoomType.OPEN)
@@ -239,6 +237,8 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
binding.tvMakeRoom.setOnClickListener {
binding.tvMakeRoom.isEnabled = false
viewModel.createLiveRoom {
cropper.cleanup()
val intent = Intent()
if (it.id != null) {
intent.putExtra(Constants.EXTRA_ROOM_ID, it.id)
@@ -283,11 +283,17 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
binding.etNotice.setText(it.notice)
binding.etNumberOfPeople.setText(it.numberOfPeople.toString())
binding.ivCover.background = null
binding.ivCover.load(it.coverImageUrl) {
crossfade(true)
placeholder(R.drawable.ic_place_holder)
transformations(RoundedCornersTransformation(13.3f.dpToPx()))
}
Glide.with(binding.ivCover.context)
.load(it.coverImageUrl)
.placeholder(R.drawable.ic_place_holder)
.apply(
RequestOptions().transform(
RoundedCorners(
16f.dpToPx().toInt()
)
)
)
.into(binding.ivCover)
}
}
@@ -631,7 +637,7 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
viewModel.selectedMenuLiveData.observe(this) {
deselectAllMenuPreset()
when(it) {
when (it) {
LiveRoomCreateViewModel.SelectedMenu.MENU_2 -> selectMenuPresetButton(
binding.ivSelectMenu2,
binding.llSelectMenu2,

View File

@@ -79,15 +79,13 @@ class LiveRoomCreateViewModel(
val menuLiveData: LiveData<String>
get() = _menuLiveData
lateinit var getRealPathFromURI: (Uri) -> String?
var title = ""
var content = ""
var numberOfPeople = 0
var tags = mutableSetOf<String>()
var beginDate = ""
var beginTime = ""
var coverImageUri: Uri? = null
var coverImageFile: File? = null
var coverImagePath: String? = null
var password: String? = null
@@ -157,8 +155,8 @@ class LiveRoomCreateViewModel(
val requestJson = Gson().toJson(request)
val coverImage = if (coverImageUri != null) {
val file = File(getRealPathFromURI(coverImageUri!!))
val coverImage = if (coverImageFile != null) {
val file = coverImageFile!!
MultipartBody.Part.createFormData(
"coverImage",
file.name,
@@ -226,7 +224,7 @@ class LiveRoomCreateViewModel(
return false
}
if (coverImageUri == null && coverImagePath == null) {
if (coverImageFile == null && coverImagePath == null) {
_toastLiveData.postValue("커버이미지를 선택해주세요.")
return false
}
@@ -273,7 +271,7 @@ class LiveRoomCreateViewModel(
.subscribe(
{
if (it.success && it.data != null) {
coverImageUri = null
coverImageFile = null
coverImagePath = it.data.coverImagePath
onSuccess(it.data!!)