diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/AudioContentUploadActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/AudioContentUploadActivity.kt index fc37cd2..d7e4c24 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/AudioContentUploadActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/AudioContentUploadActivity.kt @@ -2,6 +2,8 @@ package kr.co.vividnext.sodalive.audio_content.upload import android.Manifest import android.annotation.SuppressLint +import android.app.DatePickerDialog +import android.app.TimePickerDialog import android.content.Intent import android.net.Uri import android.os.Build @@ -28,9 +30,15 @@ import kr.co.vividnext.sodalive.common.RealPathUtil import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.ActivityAudioContentUploadBinding import kr.co.vividnext.sodalive.dialog.LiveDialog +import kr.co.vividnext.sodalive.dialog.SodaLiveTimePickerDialog +import kr.co.vividnext.sodalive.extensions.convertDateFormat import kr.co.vividnext.sodalive.extensions.dpToPx import org.koin.android.ext.android.inject import java.io.File +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.Locale class AudioContentUploadActivity : BaseActivity( ActivityAudioContentUploadBinding::inflate @@ -111,6 +119,26 @@ class AudioContentUploadActivity : BaseActivity + viewModel.releaseDate = String.format("%d-%02d-%02d", year, monthOfYear + 1, dayOfMonth) + viewModel.setReservationDate( + String.format( + "%d.%02d.%02d", + year, + monthOfYear + 1, + dayOfMonth + ) + ) + } + + private val timePickerDialogListener = + TimePickerDialog.OnTimeSetListener { _, hourOfDay, minute -> + val timeString = String.format("%02d:%02d", hourOfDay, minute) + viewModel.releaseTime = timeString + viewModel.setReservationTime(timeString.convertDateFormat("HH:mm", "a hh:mm")) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) checkPermissions() @@ -173,6 +201,8 @@ class AudioContentUploadActivity : BaseActivity get() = _isPriceFreeLiveData + private val _isActiveReservationLiveData = MutableLiveData(false) + val isActiveReservationLiveData: LiveData + get() = _isActiveReservationLiveData + + private val _reservationDateLiveData = MutableLiveData("날짜를 선택해주세요") + val reservationDateLiveData: LiveData + get() = _reservationDateLiveData + + private val _reservationTimeLiveData = MutableLiveData("시간을 설정해주세요") + val reservationTimeLiveData: LiveData + get() = _reservationTimeLiveData + lateinit var getRealPathFromURI: (Uri) -> String? var title = "" var detail = "" var tags = "" var price = 0 + var releaseDate = "" + var releaseTime = "" var theme: GetAudioContentThemeResponse? = null var coverImageUri: Uri? = null var contentUri: Uri? = null @@ -81,6 +96,10 @@ class AudioContentUploadViewModel( _isOnlyRentalLiveData.postValue(isOnlyRental) } + fun setActiveReservation(isActiveReservation: Boolean) { + _isActiveReservationLiveData.postValue(isActiveReservation) + } + fun uploadAudioContent(onSuccess: () -> Unit) { if (!_isLoading.value!! && validateData()) { _isLoading.postValue(true) @@ -90,6 +109,12 @@ class AudioContentUploadViewModel( detail = detail, tags = tags, price = price, + releaseDate = if (_isActiveReservationLiveData.value!!) { + "$releaseDate $releaseTime" + } else { + null + }, + timezone = TimeZone.getDefault().id, themeId = theme!!.id, isAdult = _isAdultLiveData.value!!, isOnlyRental = _isOnlyRentalLiveData.value!!, @@ -281,6 +306,14 @@ class AudioContentUploadViewModel( return false } + if ( + _isActiveReservationLiveData.value!! && + (releaseDate.isBlank() || releaseTime.isBlank()) + ) { + _toastLiveData.postValue("예약날짜와 시간을 선택해주세요.") + return false + } + return true } @@ -307,4 +340,12 @@ class AudioContentUploadViewModel( return 0 } } + + fun setReservationDate(dateString: String) { + _reservationDateLiveData.postValue(dateString) + } + + fun setReservationTime(timeString: String) { + _reservationTimeLiveData.postValue(timeString) + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/CreateAudioContentRequest.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/CreateAudioContentRequest.kt index 70f95ec..8f3b9a1 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/CreateAudioContentRequest.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/upload/CreateAudioContentRequest.kt @@ -7,10 +7,12 @@ data class CreateAudioContentRequest( @SerializedName("detail") val detail: String, @SerializedName("tags") val tags: String, @SerializedName("price") val price: Int, + @SerializedName("releaseDate") val releaseDate: String?, + @SerializedName("timezone") val timezone: String, @SerializedName("themeId") val themeId: Long, @SerializedName("isAdult") val isAdult: Boolean, @SerializedName("isOnlyRental") val isOnlyRental: Boolean, @SerializedName("isCommentAvailable") val isCommentAvailable: Boolean, @SerializedName("previewStartTime") val previewStartTime: String? = null, - @SerializedName("previewEndTime") val previewEndTime: String? = null + @SerializedName("previewEndTime") val previewEndTime: String? = null, ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/dialog/SodaLiveTimePickerDialog.kt b/app/src/main/java/kr/co/vividnext/sodalive/dialog/SodaLiveTimePickerDialog.kt new file mode 100644 index 0000000..d8a9542 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/dialog/SodaLiveTimePickerDialog.kt @@ -0,0 +1,45 @@ +package kr.co.vividnext.sodalive.dialog + +import android.app.TimePickerDialog +import android.content.Context +import android.widget.TimePicker + +class SodaLiveTimePickerDialog( + context: Context, + themeResId: Int, + private val onTimeSetListener: OnTimeSetListener, + hourOfDay: Int, + minute: Int, + is24HourView: Boolean +) : TimePickerDialog(context, themeResId, null, hourOfDay, minute, is24HourView) { + private var timePicker: TimePicker? = null + + init { + this.setTitle("Select Time") + setOnShowListener { + timePicker = window?.findViewById( + context.resources.getIdentifier( + "android:id/timePicker", + null, + null + ) + ) + timePicker?.apply { + setIs24HourView(is24HourView) + setOnTimeChangedListener { _, _, minute -> + // Snap minute to nearest quarter (0, 15, 30, 45) + val snappedMinute = minute / 15 * 15 + if (snappedMinute != minute) { + this.minute = snappedMinute + } + } + } + getButton(BUTTON_POSITIVE).setOnClickListener { + timePicker?.let { picker -> + onTimeSetListener.onTimeSet(picker, picker.hour, picker.minute) + } + dismiss() + } + } + } +} diff --git a/app/src/main/res/layout/activity_audio_content_upload.xml b/app/src/main/res/layout/activity_audio_content_upload.xml index d6447e2..6f5325f 100644 --- a/app/src/main/res/layout/activity_audio_content_upload.xml +++ b/app/src/main/res/layout/activity_audio_content_upload.xml @@ -534,6 +534,111 @@ android:textSize="13.3sp" /> + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + - + tools:text="2021.08.04" /> + - + tools:text="오후 08 : 30" />