diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/GenderRestriction.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/GenderRestriction.kt new file mode 100644 index 00000000..9241e491 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/GenderRestriction.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.live.room + +import com.google.gson.annotations.SerializedName + +enum class GenderRestriction { + @SerializedName("ALL") ALL, + @SerializedName("MALE_ONLY") MALE_ONLY, + @SerializedName("FEMALE_ONLY") FEMALE_ONLY +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/CreateLiveRoomRequest.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/CreateLiveRoomRequest.kt index 570c245e..fa2ff548 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/CreateLiveRoomRequest.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/CreateLiveRoomRequest.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.room.create import androidx.annotation.Keep import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.live.room.LiveRoomType @Keep @@ -11,6 +12,7 @@ data class CreateLiveRoomRequest( @SerializedName("content") val content: String, @SerializedName("coverImageUrl") val coverImageUrl: String? = null, @SerializedName("isAdult") val isAdult: Boolean, + @SerializedName("genderRestriction") val genderRestriction: GenderRestriction = GenderRestriction.ALL, @SerializedName("tags") val tags: List, @SerializedName("numberOfPeople") val numberOfPeople: Int, @SerializedName("beginDateTimeString") val beginDateTimeString: String? = null, diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/GetRecentRoomInfoResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/GetRecentRoomInfoResponse.kt index 40760ff0..2c729a76 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/GetRecentRoomInfoResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/GetRecentRoomInfoResponse.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.room.create import androidx.annotation.Keep import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.live.room.GenderRestriction @Keep data class GetRecentRoomInfoResponse( @@ -9,5 +10,7 @@ data class GetRecentRoomInfoResponse( @SerializedName("notice") val notice: String, @SerializedName("coverImageUrl") val coverImageUrl: String, @SerializedName("coverImagePath") val coverImagePath: String, - @SerializedName("numberOfPeople") val numberOfPeople: Int + @SerializedName("numberOfPeople") val numberOfPeople: Int, + @SerializedName("genderRestriction") + val genderRestriction: GenderRestriction = GenderRestriction.ALL ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateActivity.kt index d35651bc..abda3ac4 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateActivity.kt @@ -33,6 +33,7 @@ import kr.co.vividnext.sodalive.databinding.ActivityLiveRoomCreateBinding import kr.co.vividnext.sodalive.databinding.ItemLiveTagSelectedBinding import kr.co.vividnext.sodalive.extensions.convertDateFormat import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.live.room.LiveRoomType import kr.co.vividnext.sodalive.live.room.tag.LiveTagFragment import kr.co.vividnext.sodalive.settings.notification.MemberRole @@ -592,6 +593,18 @@ class LiveRoomCreateActivity : BaseActivity( viewModel.setAdult(true) } + binding.llGenderAll.setOnClickListener { + viewModel.setGenderRestriction(GenderRestriction.ALL) + } + + binding.llGenderMaleOnly.setOnClickListener { + viewModel.setGenderRestriction(GenderRestriction.MALE_ONLY) + } + + binding.llGenderFemaleOnly.setOnClickListener { + viewModel.setGenderRestriction(GenderRestriction.FEMALE_ONLY) + } + viewModel.isAdultLiveData.observe(this) { if (it) { binding.ivAgeAll.visibility = View.GONE @@ -630,6 +643,16 @@ class LiveRoomCreateActivity : BaseActivity( ) ) } + + binding.llGenderRestriction.visibility = if (it) { + View.VISIBLE + } else { + View.GONE + } + } + + viewModel.genderRestrictionLiveData.observe(this) { restriction -> + updateGenderRestrictionSelection(restriction) } } @@ -850,4 +873,51 @@ class LiveRoomCreateActivity : BaseActivity( ) ) } + + private fun updateGenderRestrictionSelection(restriction: GenderRestriction) { + setGenderRestrictionSelected( + isSelected = restriction == GenderRestriction.ALL, + imageView = binding.ivGenderAll, + container = binding.llGenderAll, + textView = binding.tvGenderAll + ) + setGenderRestrictionSelected( + isSelected = restriction == GenderRestriction.MALE_ONLY, + imageView = binding.ivGenderMaleOnly, + container = binding.llGenderMaleOnly, + textView = binding.tvGenderMaleOnly + ) + setGenderRestrictionSelected( + isSelected = restriction == GenderRestriction.FEMALE_ONLY, + imageView = binding.ivGenderFemaleOnly, + container = binding.llGenderFemaleOnly, + textView = binding.tvGenderFemaleOnly + ) + } + + private fun setGenderRestrictionSelected( + isSelected: Boolean, + imageView: ImageView, + container: LinearLayout, + textView: TextView + ) { + imageView.visibility = if (isSelected) View.VISIBLE else View.GONE + container.setBackgroundResource( + if (isSelected) { + R.drawable.bg_round_corner_6_7_3bb9f1 + } else { + R.drawable.bg_round_corner_6_7_13181b + } + ) + textView.setTextColor( + ContextCompat.getColor( + applicationContext, + if (isSelected) { + R.color.color_eeeeee + } else { + R.color.color_3bb9f1 + } + ) + ) + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateViewModel.kt index 959208cf..7201f4c8 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateViewModel.kt @@ -13,6 +13,7 @@ import kr.co.vividnext.sodalive.common.UiText import kr.co.vividnext.sodalive.common.UiText.DynamicString import kr.co.vividnext.sodalive.common.UiText.StringResource import kr.co.vividnext.sodalive.live.LiveRepository +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.live.room.LiveRoomType import kr.co.vividnext.sodalive.live.room.menu.GetMenuPresetResponse import kr.co.vividnext.sodalive.R @@ -67,6 +68,10 @@ class LiveRoomCreateViewModel( val isAdultLiveData: LiveData get() = _isAdultLiveData + private val _genderRestrictionLiveData = MutableLiveData(GenderRestriction.ALL) + val genderRestrictionLiveData: LiveData + get() = _genderRestrictionLiveData + private val _selectedMenuLiveData = MutableLiveData() val selectedMenuLiveData: LiveData get() = _selectedMenuLiveData @@ -118,12 +123,18 @@ class LiveRoomCreateViewModel( fun createLiveRoom(onSuccess: (CreateLiveRoomResponse) -> Unit) { if (!_isLoading.value!! && validateData()) { _isLoading.postValue(true) + val normalizedGenderRestriction = if (_isAdultLiveData.value == true) { + _genderRestrictionLiveData.value!! + } else { + GenderRestriction.ALL + } val request = CreateLiveRoomRequest( title = title, price = _priceLiveData.value!!, content = content, coverImageUrl = coverImagePath, isAdult = _isAdultLiveData.value!!, + genderRestriction = normalizedGenderRestriction, tags = tags.toList(), numberOfPeople = numberOfPeople, beginDateTimeString = if ( @@ -262,6 +273,13 @@ class LiveRoomCreateViewModel( fun setAdult(isAdult: Boolean) { _isAdultLiveData.value = isAdult + if (!isAdult) { + _genderRestrictionLiveData.value = GenderRestriction.ALL + } + } + + fun setGenderRestriction(genderRestriction: GenderRestriction) { + _genderRestrictionLiveData.value = genderRestriction } fun setAvailableJoinCreator(isAvailableJoinCreator: Boolean) { @@ -279,6 +297,7 @@ class LiveRoomCreateViewModel( if (it.success && it.data != null) { coverImageFile = null coverImagePath = it.data.coverImagePath + _genderRestrictionLiveData.value = it.data.genderRestriction onSuccess(it.data!!) _toastLiveData.postValue( diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt index 7eab12ff..e48d29b3 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.live.room.detail import android.os.Parcelable import androidx.annotation.Keep import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kotlinx.parcelize.Parcelize @Parcelize @@ -14,6 +15,8 @@ data class GetRoomDetailResponse( @SerializedName("notice") val notice: String, @SerializedName("isPaid") val isPaid: Boolean, @SerializedName("isAdult") val isAdult: Boolean, + @SerializedName("genderRestriction") + val genderRestriction: GenderRestriction = GenderRestriction.ALL, @SerializedName("isPrivateRoom") val isPrivateRoom: Boolean, @SerializedName("password") val password: Int?, @SerializedName("tags") val tags: List, diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/EditLiveRoomInfoRequest.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/EditLiveRoomInfoRequest.kt index 30436744..e6b203f8 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/EditLiveRoomInfoRequest.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/EditLiveRoomInfoRequest.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.room.update import androidx.annotation.Keep import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.live.room.GenderRestriction @Keep data class EditLiveRoomInfoRequest( @@ -13,5 +14,6 @@ data class EditLiveRoomInfoRequest( @SerializedName("menuPanId") val menuPanId: Long = 0, @SerializedName("menuPan") val menuPan: String = "", @SerializedName("isActiveMenuPan") val isActiveMenuPan: Boolean? = null, - @SerializedName("isAdult") val isAdult: Boolean? = null + @SerializedName("isAdult") val isAdult: Boolean? = null, + @SerializedName("genderRestriction") val genderRestriction: GenderRestriction? = null ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditActivity.kt index 7d8be4c1..97c4cd29 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditActivity.kt @@ -7,8 +7,10 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import android.view.MotionEvent +import android.view.View import android.widget.Toast import androidx.core.content.IntentCompat +import androidx.core.content.ContextCompat import com.jakewharton.rxbinding4.widget.textChanges import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers @@ -16,8 +18,10 @@ 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.LoadingDialog +import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.ActivityLiveRoomEditBinding import kr.co.vividnext.sodalive.extensions.convertDateFormat +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailResponse import org.koin.android.ext.android.inject import java.text.SimpleDateFormat @@ -170,6 +174,32 @@ class LiveRoomEditActivity : BaseActivity( } false } + + if (SharedPreferenceManager.isAuth) { + binding.llSetAdult.visibility = View.VISIBLE + } else { + binding.llSetAdult.visibility = View.GONE + } + + binding.llAgeAll.setOnClickListener { + viewModel.setAdult(false) + } + + binding.llAge19.setOnClickListener { + viewModel.setAdult(true) + } + + binding.llGenderAll.setOnClickListener { + viewModel.setGenderRestriction(GenderRestriction.ALL) + } + + binding.llGenderMaleOnly.setOnClickListener { + viewModel.setGenderRestriction(GenderRestriction.MALE_ONLY) + } + + binding.llGenderFemaleOnly.setOnClickListener { + viewModel.setGenderRestriction(GenderRestriction.FEMALE_ONLY) + } } private fun bindData() { @@ -233,5 +263,102 @@ class LiveRoomEditActivity : BaseActivity( viewModel.reservationTimeLiveData.observe(this) { binding.tvReservationTime.text = it } + + viewModel.isAdultLiveData.observe(this) { + if (it) { + binding.ivAgeAll.visibility = View.GONE + binding.llAgeAll.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b) + binding.tvAgeAll.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_3bb9f1 + ) + ) + + binding.ivAge19.visibility = View.VISIBLE + binding.llAge19.setBackgroundResource(R.drawable.bg_round_corner_6_7_3bb9f1) + binding.tvAge19.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_eeeeee + ) + ) + } else { + binding.ivAge19.visibility = View.GONE + binding.llAge19.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b) + binding.tvAge19.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_3bb9f1 + ) + ) + + binding.ivAgeAll.visibility = View.VISIBLE + binding.llAgeAll.setBackgroundResource(R.drawable.bg_round_corner_6_7_3bb9f1) + binding.tvAgeAll.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_eeeeee + ) + ) + } + + binding.llGenderRestriction.visibility = if (it) { + View.VISIBLE + } else { + View.GONE + } + } + + viewModel.genderRestrictionLiveData.observe(this) { restriction -> + updateGenderRestrictionSelection(restriction) + } + } + + private fun updateGenderRestrictionSelection(restriction: GenderRestriction) { + setGenderRestrictionSelected( + isSelected = restriction == GenderRestriction.ALL, + imageView = binding.ivGenderAll, + container = binding.llGenderAll, + textView = binding.tvGenderAll + ) + setGenderRestrictionSelected( + isSelected = restriction == GenderRestriction.MALE_ONLY, + imageView = binding.ivGenderMaleOnly, + container = binding.llGenderMaleOnly, + textView = binding.tvGenderMaleOnly + ) + setGenderRestrictionSelected( + isSelected = restriction == GenderRestriction.FEMALE_ONLY, + imageView = binding.ivGenderFemaleOnly, + container = binding.llGenderFemaleOnly, + textView = binding.tvGenderFemaleOnly + ) + } + + private fun setGenderRestrictionSelected( + isSelected: Boolean, + imageView: android.widget.ImageView, + container: android.widget.LinearLayout, + textView: android.widget.TextView + ) { + imageView.visibility = if (isSelected) View.VISIBLE else View.GONE + container.setBackgroundResource( + if (isSelected) { + R.drawable.bg_round_corner_6_7_3bb9f1 + } else { + R.drawable.bg_round_corner_6_7_13181b + } + ) + textView.setTextColor( + ContextCompat.getColor( + applicationContext, + if (isSelected) { + R.color.color_eeeeee + } else { + R.color.color_3bb9f1 + } + ) + ) } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditViewModel.kt index cbadd151..b30f41d2 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/update/LiveRoomEditViewModel.kt @@ -6,18 +6,18 @@ import com.google.gson.Gson import com.orhanobut.logger.Logger 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.BaseViewModel +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder import kr.co.vividnext.sodalive.common.UiText import kr.co.vividnext.sodalive.common.UiText.DynamicString import kr.co.vividnext.sodalive.common.UiText.StringResource -import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.extensions.convertDateFormat import kr.co.vividnext.sodalive.live.LiveRepository +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailResponse -import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.settings.language.LanguageManager -import kr.co.vividnext.sodalive.settings.language.LocaleHelper -import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.toRequestBody import java.util.Locale @@ -39,6 +39,14 @@ class LiveRoomEditViewModel( val toastLiveData: LiveData get() = _toastLiveData + private val _isAdultLiveData = MutableLiveData(false) + val isAdultLiveData: LiveData + get() = _isAdultLiveData + + private val _genderRestrictionLiveData = MutableLiveData(GenderRestriction.ALL) + val genderRestrictionLiveData: LiveData + get() = _genderRestrictionLiveData + private var _isLoading = MutableLiveData(false) val isLoading: LiveData get() = _isLoading @@ -51,6 +59,8 @@ class LiveRoomEditViewModel( var beginDate = "" var beginTime = "" var beginDateTimeStr = "" + var isAdultValue = false + var genderRestrictionValue = GenderRestriction.ALL fun setReservationDate(dateString: String) { _reservationDateLiveData.postValue(dateString) @@ -63,6 +73,11 @@ class LiveRoomEditViewModel( fun updateLiveRoom(onSuccess: () -> Unit) { if (!_isLoading.value!! && validateData()) { _isLoading.value = true + val normalizedGenderRestriction = if (isAdultValue) { + genderRestrictionValue + } else { + GenderRestriction.ALL + } val request = EditLiveRoomInfoRequest( title = if (title != roomDetail.title) { title @@ -84,14 +99,28 @@ class LiveRoomEditViewModel( } else { null }, - timezone = TimeZone.getDefault().id + timezone = TimeZone.getDefault().id, + isAdult = if (isAdultValue != roomDetail.isAdult) { + isAdultValue + } else { + null + }, + genderRestriction = if (!isAdultValue) { + GenderRestriction.ALL + } else if (normalizedGenderRestriction != roomDetail.genderRestriction) { + normalizedGenderRestriction + } else { + null + } ) if ( request.title == null && request.notice == null && request.numberOfPeople == null && - request.beginDateTimeString == null + request.beginDateTimeString == null && + request.isAdult == null && + request.genderRestriction == null ) { _toastLiveData.value = StringResource(R.string.msg_live_room_edit_no_changes) _isLoading.value = false @@ -170,6 +199,16 @@ class LiveRoomEditViewModel( ) beginDateTimeStr = "$beginDate $beginTime" + + isAdultValue = roomDetail.isAdult + genderRestrictionValue = if (roomDetail.isAdult) { + roomDetail.genderRestriction + } else { + GenderRestriction.ALL + } + + _isAdultLiveData.value = isAdultValue + _genderRestrictionLiveData.value = genderRestrictionValue } private fun validateData(): Boolean { @@ -196,4 +235,17 @@ class LiveRoomEditViewModel( return true } + + fun setAdult(isAdult: Boolean) { + isAdultValue = isAdult + _isAdultLiveData.value = isAdult + if (!isAdult) { + setGenderRestriction(GenderRestriction.ALL) + } + } + + fun setGenderRestriction(genderRestriction: GenderRestriction) { + genderRestrictionValue = genderRestriction + _genderRestrictionLiveData.value = genderRestriction + } } diff --git a/app/src/main/res/layout/activity_live_room_create.xml b/app/src/main/res/layout/activity_live_room_create.xml index f4a94e7b..0712d53d 100644 --- a/app/src/main/res/layout/activity_live_room_create.xml +++ b/app/src/main/res/layout/activity_live_room_create.xml @@ -848,6 +848,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 6606eb37..e720b21c 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -615,6 +615,10 @@ Not allowed Age limit All ages + Gender restriction + All + Male only + Female only Ticket price Free 100 cans diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3779af26..d937e1c3 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -615,6 +615,10 @@ 不可 年齢制限 全年齢 + 性別制限 + 全体 + 男性のみ + 女性のみ チケット価格 無料 100CAN diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 195838a5..b789f29e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -614,6 +614,10 @@ 불가능 연령 제한 전체 연령 + 성별 제한 + 전체 + 남자만 + 여자만 티켓 가격 무료 100 캔