diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/RoulettePreview.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/RoulettePreview.kt new file mode 100644 index 0000000..9f3d5c9 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/RoulettePreview.kt @@ -0,0 +1,11 @@ +package kr.co.vividnext.sodalive.live.roulette + +data class RoulettePreview( + val can: Int, + val items: List +) + +data class RoulettePreviewItem( + val title: String, + val percent: String +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/RoulettePreviewDialog.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/RoulettePreviewDialog.kt new file mode 100644 index 0000000..b76a8e7 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/RoulettePreviewDialog.kt @@ -0,0 +1,88 @@ +package kr.co.vividnext.sodalive.live.roulette + +import android.annotation.SuppressLint +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.LayoutInflater +import android.view.View +import android.view.Window +import android.view.WindowManager +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.FragmentActivity +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.DialogRoulettePreviewBinding +import kr.co.vividnext.sodalive.extensions.dpToPx + +class RoulettePreviewDialog( + private val activity: FragmentActivity, + private val preview: RoulettePreview, + private val title: String = "", + private val onClickSpin: (() -> Unit)? = null, + layoutInflater: LayoutInflater +) { + private val alertDialog: AlertDialog + private val dialogView = DialogRoulettePreviewBinding.inflate(layoutInflater) + + init { + val dialogBuilder = AlertDialog.Builder(activity) + dialogBuilder.setView(dialogView.root) + + alertDialog = dialogBuilder.create() + alertDialog.setCancelable(false) + alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + alertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + setupView() + } + + fun show() { + alertDialog.show() + + val lp = WindowManager.LayoutParams() + lp.copyFrom(alertDialog.window?.attributes) + lp.width = activity.resources.displayMetrics.widthPixels - (26.7f.dpToPx()).toInt() + lp.height = WindowManager.LayoutParams.WRAP_CONTENT + + alertDialog.window?.attributes = lp + } + + @SuppressLint("SetTextI18n") + private fun setupView() { + dialogView.tvCancel.setOnClickListener { alertDialog.dismiss() } + + dialogView.tvSpinRoulette.text = "${preview.can}캔으로 룰렛 돌리기" + dialogView.tvSpinRoulette.setOnClickListener { + if (onClickSpin != null) { + onClickSpin!!() + } + + alertDialog.dismiss() + } + + dialogView.tvTitle.text = title.ifBlank { "룰렛" } + + preview.items.forEachIndexed { index, item -> + dialogView.llRouletteOptionContainer.addView(createOptionView(index, item)) + } + } + + @SuppressLint("SetTextI18n") + private fun createOptionView(index: Int, item: RoulettePreviewItem): View { + val itemView = LayoutInflater + .from(activity) + .inflate( + R.layout.layout_roulette_preview_item, + dialogView.llRouletteOptionContainer, + false + ) + + val tvItemTitle = itemView.findViewById(R.id.tv_roulette_item_title) + val tvOrder = itemView.findViewById(R.id.tv_order) + + tvItemTitle.text = "${item.title} (${item.percent})" + tvOrder.text = "${index + 1}" + + return itemView + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsFragment.kt index f1f0e2d..0a23595 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsFragment.kt @@ -5,6 +5,8 @@ import android.app.Activity import android.app.Service import android.content.Intent import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.text.InputFilter import android.view.LayoutInflater import android.view.View @@ -20,6 +22,7 @@ import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.databinding.FragmentRouletteSettingsBinding +import kr.co.vividnext.sodalive.live.roulette.RoulettePreviewDialog import org.koin.android.ext.android.inject import java.util.concurrent.TimeUnit @@ -31,6 +34,8 @@ class RouletteSettingsFragment : BaseFragment( private lateinit var imm: InputMethodManager private lateinit var loadingDialog: LoadingDialog + private val handler = Handler(Looper.getMainLooper()) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -59,11 +64,16 @@ class RouletteSettingsFragment : BaseFragment( binding.ivAddOption.setOnClickListener { addOption() } binding.tvPreview.setOnClickListener { - + handler.postDelayed({ + imm.hideSoftInputFromWindow(view?.windowToken, 0) + }, 100) + viewModel.onClickPreview() } binding.tvSave.setOnClickListener { _ -> - imm.hideSoftInputFromWindow(view?.windowToken, 0) + handler.postDelayed({ + imm.hideSoftInputFromWindow(view?.windowToken, 0) + }, 100) viewModel.createOrUpdateRoulette { val resultIntent = Intent().apply { putExtra(Constants.EXTRA_RESULT_ROULETTE, it) } requireActivity().setResult(Activity.RESULT_OK, resultIntent) @@ -93,6 +103,15 @@ class RouletteSettingsFragment : BaseFragment( } } + viewModel.roulettePreviewLiveData.observe(viewLifecycleOwner) { + RoulettePreviewDialog( + activity = requireActivity(), + preview = it, + title = "룰렛 미리보기", + layoutInflater = layoutInflater + ).show() + } + compositeDisposable.add( binding.etSetPrice.textChanges().skip(1) .debounce(100, TimeUnit.MILLISECONDS) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsViewModel.kt index eaf9ede..2640860 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/roulette/config/RouletteSettingsViewModel.kt @@ -8,6 +8,8 @@ import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.live.roulette.RouletteItem +import kr.co.vividnext.sodalive.live.roulette.RoulettePreview +import kr.co.vividnext.sodalive.live.roulette.RoulettePreviewItem import kr.co.vividnext.sodalive.live.roulette.RouletteRepository class RouletteSettingsViewModel(private val repository: RouletteRepository) : BaseViewModel() { @@ -32,6 +34,10 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba val canLiveData: LiveData get() = _canLiveData + private val _roulettePreviewLiveData = MutableLiveData() + val roulettePreviewLiveData: LiveData + get() = _roulettePreviewLiveData + private val options = mutableListOf() var can = 5 var isActive = false @@ -73,6 +79,8 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba val updatedOptions = options.asSequence().map { option -> option.copy(percentage = (option.weight.toDouble() / totalWeight * 100).toInt()) }.toList() + + removeAllAndAddOptions(updatedOptions) _optionsLiveData.value = updatedOptions } @@ -81,6 +89,24 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba _isActiveLiveData.postValue(isActive) } + fun onClickPreview() { + _isLoading.value = true + + val items = mutableListOf() + for (option in options) { + if (option.title.trim().isEmpty()) { + _toastLiveData.value = "옵션은 빈칸을 할 수 없습니다." + _isLoading.value = false + return + } + + items.add(RoulettePreviewItem(option.title, "${option.percentage}%")) + } + + _roulettePreviewLiveData.postValue(RoulettePreview(can, items)) + _isLoading.value = false + } + fun createOrUpdateRoulette(onSuccess: (Boolean) -> Unit) { if (!_isLoading.value!!) { _isLoading.value = true diff --git a/app/src/main/res/layout/dialog_roulette_preview.xml b/app/src/main/res/layout/dialog_roulette_preview.xml new file mode 100644 index 0000000..d675b49 --- /dev/null +++ b/app/src/main/res/layout/dialog_roulette_preview.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_roulette_preview_item.xml b/app/src/main/res/layout/layout_roulette_preview_item.xml new file mode 100644 index 0000000..dc8aa26 --- /dev/null +++ b/app/src/main/res/layout/layout_roulette_preview_item.xml @@ -0,0 +1,27 @@ + + + + + + +