diff --git a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt index c34761d..58241a7 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt @@ -53,6 +53,7 @@ import kr.co.vividnext.sodalive.live.room.LiveRoomViewModel import kr.co.vividnext.sodalive.live.room.create.LiveRoomCreateViewModel import kr.co.vividnext.sodalive.live.room.detail.LiveRoomDetailViewModel import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessageViewModel +import kr.co.vividnext.sodalive.live.room.menu.MenuApi import kr.co.vividnext.sodalive.live.room.tag.LiveTagRepository import kr.co.vividnext.sodalive.live.room.tag.LiveTagViewModel import kr.co.vividnext.sodalive.live.room.update.LiveRoomEditViewModel @@ -151,6 +152,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { single { ApiBuilder().build(get(), CanApi::class.java) } single { ApiBuilder().build(get(), AuthApi::class.java) } single { ApiBuilder().build(get(), UserApi::class.java) } + single { ApiBuilder().build(get(), MenuApi::class.java) } single { ApiBuilder().build(get(), LiveApi::class.java) } single { ApiBuilder().build(get(), TermsApi::class.java) } single { ApiBuilder().build(get(), EventApi::class.java) } @@ -234,7 +236,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { private val repositoryModule = module { factory { UserRepository(get()) } factory { TermsRepository(get()) } - factory { LiveRepository(get(), get()) } + factory { LiveRepository(get(), get(), get()) } factory { EventRepository(get()) } factory { LiveRecommendRepository(get()) } factory { AuthRepository(get()) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt index c62b78d..b3c5314 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt @@ -15,6 +15,7 @@ import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailResponse import kr.co.vividnext.sodalive.live.room.donation.DeleteLiveRoomDonationMessage import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest +import kr.co.vividnext.sodalive.live.room.menu.MenuApi import kr.co.vividnext.sodalive.user.CreatorFollowRequestRequest import kr.co.vividnext.sodalive.user.UserApi import okhttp3.MultipartBody @@ -23,7 +24,8 @@ import java.util.TimeZone class LiveRepository( private val api: LiveApi, - private val userApi: UserApi + private val userApi: UserApi, + private val menuApi: MenuApi ) { fun roomList( dateString: String? = null, @@ -230,4 +232,9 @@ class LiveRepository( request: CancelLiveReservationRequest, token: String ) = api.cancelReservation(request, authHeader = token) + + fun getAllMenu(creatorId: Long, token: String) = menuApi.getAllMenu( + creatorId = creatorId, + authHeader = token + ) } 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 1a13005..fb15fda 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 @@ -14,5 +14,8 @@ data class CreateLiveRoomRequest( @SerializedName("beginDateTimeString") val beginDateTimeString: String? = null, @SerializedName("timezone") val timezone: String, @SerializedName("type") val type: LiveRoomType, - @SerializedName("password") val password: String? = null + @SerializedName("password") val password: String? = null, + @SerializedName("menuPanId") val menuPanId: Long = 0, + @SerializedName("menuPan") val menuPan: String = "", + @SerializedName("isActiveMenuPan") val isActiveMenuPan: Boolean = false ) 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 b707ac3..337210c 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 @@ -9,6 +9,7 @@ import android.os.Handler import android.os.Looper import android.view.MotionEvent import android.view.View +import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast @@ -127,6 +128,8 @@ class LiveRoomCreateActivity : BaseActivity( viewModel.setTimeNow( intent.getBooleanExtra(Constants.EXTRA_LIVE_TIME_NOW, true) ) + + viewModel.getAllMenuPreset() } @SuppressLint("SetTextI18n", "ClickableViewAccessibility") @@ -295,6 +298,22 @@ class LiveRoomCreateActivity : BaseActivity( } false } + + binding.ivSwitch.setOnClickListener { + viewModel.toggleIsActivateMenu() + } + + binding.llSelectMenu1.setOnClickListener { + viewModel.selectMenuPreset(LiveRoomCreateViewModel.SelectedMenu.MENU_1) + } + + binding.llSelectMenu2.setOnClickListener { + viewModel.selectMenuPreset(LiveRoomCreateViewModel.SelectedMenu.MENU_2) + } + + binding.llSelectMenu3.setOnClickListener { + viewModel.selectMenuPreset(LiveRoomCreateViewModel.SelectedMenu.MENU_3) + } } @SuppressLint("SetTextI18n") @@ -348,6 +367,15 @@ class LiveRoomCreateActivity : BaseActivity( } ) + compositeDisposable.add( + binding.etMenu.textChanges().skip(1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + viewModel.menu = it.toString() + } + ) + viewModel.toastLiveData.observe(this) { it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() } } @@ -573,6 +601,44 @@ class LiveRoomCreateActivity : BaseActivity( else -> binding.rlPrice.isSelected = true } } + + viewModel.isActivateMenuLiveData.observe(this) { + if (it) { + binding.llEditMenu.visibility = View.VISIBLE + binding.ivSwitch.setImageResource(R.drawable.btn_toggle_on_big) + } else { + binding.llEditMenu.visibility = View.GONE + binding.ivSwitch.setImageResource(R.drawable.btn_toggle_off_big) + } + } + + viewModel.selectedMenuLiveData.observe(this) { + deselectAllMenuPreset() + + when(it) { + LiveRoomCreateViewModel.SelectedMenu.MENU_2 -> selectMenuPresetButton( + binding.ivSelectMenu2, + binding.llSelectMenu2, + binding.tvSelectMenu2 + ) + + LiveRoomCreateViewModel.SelectedMenu.MENU_3 -> selectMenuPresetButton( + binding.ivSelectMenu3, + binding.llSelectMenu3, + binding.tvSelectMenu3 + ) + + else -> selectMenuPresetButton( + binding.ivSelectMenu1, + binding.llSelectMenu1, + binding.tvSelectMenu1 + ) + } + } + + viewModel.menuLiveData.observe(this) { + binding.etMenu.setText(it) + } } } @@ -613,4 +679,69 @@ class LiveRoomCreateActivity : BaseActivity( R.font.gmarket_sans_bold ) } + + private fun deselectAllMenuPreset() { + binding.ivSelectMenu1.visibility = View.GONE + binding.ivSelectMenu2.visibility = View.GONE + binding.ivSelectMenu3.visibility = View.GONE + + binding.llSelectMenu1.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b) + binding.tvSelectMenu1.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_3bb9f1 + ) + ) + + if (viewModel.menuList.size > 0) { + binding.llSelectMenu2.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b) + binding.tvSelectMenu2.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_3bb9f1 + ) + ) + } else { + binding.llSelectMenu2.setBackgroundResource(R.drawable.bg_round_corner_6_7_777777) + binding.tvSelectMenu2.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_555555 + ) + ) + } + + if (viewModel.menuList.size > 1) { + binding.llSelectMenu3.setBackgroundResource(R.drawable.bg_round_corner_6_7_13181b) + binding.tvSelectMenu3.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_3bb9f1 + ) + ) + } else { + binding.llSelectMenu3.setBackgroundResource(R.drawable.bg_round_corner_6_7_777777) + binding.tvSelectMenu3.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_555555 + ) + ) + } + } + + private fun selectMenuPresetButton( + ivSelectRoulette: ImageView, + llSelectRoulette: LinearLayout, + tvSelectRoulette: TextView + ) { + ivSelectRoulette.visibility = View.VISIBLE + llSelectRoulette.setBackgroundResource(R.drawable.bg_round_corner_6_7_3bb9f1) + tvSelectRoulette.setTextColor( + ContextCompat.getColor( + applicationContext, + R.color.color_eeeeee + ) + ) + } } 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 2c29da7..34bb20e 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 @@ -11,6 +11,7 @@ import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.live.LiveRepository import kr.co.vividnext.sodalive.live.room.LiveRoomType +import kr.co.vividnext.sodalive.live.room.menu.GetMenuResponse import okhttp3.MediaType.Companion.toMediaType import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody @@ -22,6 +23,10 @@ class LiveRoomCreateViewModel( private val repository: LiveRepository ) : BaseViewModel() { + enum class SelectedMenu { + MENU_1, MENU_2, MENU_3 + } + private val _roomTypeLiveData = MutableLiveData(LiveRoomType.OPEN) val roomTypeLiveData: LiveData get() = _roomTypeLiveData @@ -58,6 +63,18 @@ class LiveRoomCreateViewModel( val isAdultLiveData: LiveData get() = _isAdultLiveData + private val _selectedMenuLiveData = MutableLiveData() + val selectedMenuLiveData: LiveData + get() = _selectedMenuLiveData + + private val _isActivateMenuLiveData = MutableLiveData(false) + val isActivateMenuLiveData: LiveData + get() = _isActivateMenuLiveData + + private val _menuLiveData = MutableLiveData("") + val menuLiveData: LiveData + get() = _menuLiveData + lateinit var getRealPathFromURI: (Uri) -> String? var title = "" @@ -70,6 +87,10 @@ class LiveRoomCreateViewModel( var coverImagePath: String? = null var password: String? = null + private var menuId = 0L + var menu = "" + val menuList = mutableListOf() + fun setRoomType(roomType: LiveRoomType) { if (_roomTypeLiveData.value!! != roomType) { _roomTypeLiveData.postValue(roomType) @@ -115,7 +136,18 @@ class LiveRoomCreateViewModel( password } else { null - } + }, + menuPanId = if (_isActivateMenuLiveData.value!!) { + menuId + } else { + 0 + }, + menuPan = if (_isActivateMenuLiveData.value!!) { + menu + } else { + "" + }, + isActiveMenuPan = _isActivateMenuLiveData.value!! ) val requestJson = Gson().toJson(request) @@ -207,6 +239,11 @@ class LiveRoomCreateViewModel( return false } + if (_isActivateMenuLiveData.value!! && menu.isBlank()) { + _toastLiveData.postValue("메뉴판은 빈칸일 수 없습니다.") + return false + } + return true } @@ -252,4 +289,82 @@ class LiveRoomCreateViewModel( ) ) } + + fun selectMenuPreset(selectedMenuPreset: SelectedMenu) { + if ( + menuList.isEmpty() && + ( + selectedMenuPreset == SelectedMenu.MENU_2 || + selectedMenuPreset == SelectedMenu.MENU_3 + ) + ) { + _toastLiveData.value = "메뉴 1을 먼저 설정하세요" + return + } + + if (menuList.size == 1 && selectedMenuPreset == SelectedMenu.MENU_3) { + _toastLiveData.value = "메뉴 1과 메뉴 2를 먼저 설정하세요" + return + } + + if (_selectedMenuLiveData.value != selectedMenuPreset) { + _selectedMenuLiveData.value = selectedMenuPreset + + if (menuList.size > selectedMenuPreset.ordinal) { + val menuPreset = menuList[selectedMenuPreset.ordinal] + _menuLiveData.value = menuPreset.menu + + menu = menuPreset.menu + menuId = menuPreset.id + } else { + _menuLiveData.value = "" + + menu = "" + menuId = 0 + } + } + } + + fun toggleIsActivateMenu() { + _isActivateMenuLiveData.value = !_isActivateMenuLiveData.value!! + } + + fun getAllMenuPreset() { + _isLoading.value = true + + compositeDisposable.add( + repository.getAllMenu( + creatorId = SharedPreferenceManager.userId, + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success) { + val data = it.data + menuList.clear() + menuList.addAll(data ?: listOf()) + selectMenuPreset(SelectedMenu.MENU_1) + + Logger.e("data: $data") + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + _isLoading.value = false + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/menu/GetMenuResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/menu/GetMenuResponse.kt new file mode 100644 index 0000000..037afa1 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/menu/GetMenuResponse.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.live.room.menu + +import com.google.gson.annotations.SerializedName + +data class GetMenuResponse( + @SerializedName("id") val id: Long, + @SerializedName("menu") val menu: String +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/menu/MenuApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/menu/MenuApi.kt new file mode 100644 index 0000000..f17042f --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/menu/MenuApi.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.live.room.menu + +import io.reactivex.rxjava3.core.Single +import kr.co.vividnext.sodalive.common.ApiResponse +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface MenuApi { + @GET("/live/room/menu/all") + fun getAllMenu( + @Query("creatorId") creatorId: Long, + @Header("Authorization") authHeader: String + ): Single>> +} 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 50063c3..23d9030 100644 --- a/app/src/main/res/layout/activity_live_room_create.xml +++ b/app/src/main/res/layout/activity_live_room_create.xml @@ -111,6 +111,7 @@ android:id="@+id/et_title" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="13.3dp" android:background="@drawable/edittext_underline" android:fontFamily="@font/gmarket_sans_medium" android:hint="라이브 제목을 입력해주세요." @@ -175,6 +176,7 @@ android:id="@+id/et_notice" android:layout_width="match_parent" android:layout_height="200dp" + android:layout_marginTop="13.3dp" android:background="@drawable/bg_round_corner_6_7_222222" android:fontFamily="@font/gmarket_sans_medium" android:gravity="top" @@ -192,6 +194,169 @@ tools:ignore="LabelFor" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +