diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 20d2ae0..b95e2f3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -86,6 +86,7 @@
+
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 5585e5a..4ab691a 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
@@ -72,6 +72,7 @@ import kr.co.vividnext.sodalive.mypage.auth.AuthRepository
import kr.co.vividnext.sodalive.mypage.can.CanApi
import kr.co.vividnext.sodalive.mypage.can.CanRepository
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeViewModel
+import kr.co.vividnext.sodalive.mypage.can.coupon.CanCouponViewModel
import kr.co.vividnext.sodalive.mypage.can.payment.CanPaymentViewModel
import kr.co.vividnext.sodalive.mypage.can.status.CanStatusViewModel
import kr.co.vividnext.sodalive.mypage.profile.ProfileUpdateViewModel
@@ -223,6 +224,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { CreatorCommunityCommentListViewModel(get()) }
viewModel { CreatorCommunityWriteViewModel(get()) }
viewModel { CreatorCommunityModifyViewModel(get()) }
+ viewModel { CanCouponViewModel(get()) }
}
private val repositoryModule = module {
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt
index c1a4b8e..aa2e9b1 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt
@@ -31,6 +31,7 @@ import kr.co.vividnext.sodalive.mypage.auth.Auth
import kr.co.vividnext.sodalive.mypage.auth.AuthVerifyRequest
import kr.co.vividnext.sodalive.mypage.auth.BootpayResponse
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
+import kr.co.vividnext.sodalive.mypage.can.coupon.CanCouponActivity
import kr.co.vividnext.sodalive.mypage.can.status.CanStatusActivity
import kr.co.vividnext.sodalive.mypage.profile.ProfileUpdateActivity
import kr.co.vividnext.sodalive.mypage.service_center.ServiceCenterActivity
@@ -131,6 +132,15 @@ class MyPageFragment : BaseFragment(FragmentMyBinding::inflat
)
}
+ binding.rlCoupon.setOnClickListener {
+ startActivity(
+ Intent(
+ requireActivity(),
+ CanCouponActivity::class.java
+ )
+ )
+ }
+
binding.llReservationLive.setOnClickListener {
startActivity(
Intent(
@@ -207,8 +217,10 @@ class MyPageFragment : BaseFragment(FragmentMyBinding::inflat
viewModel.myPageLiveData.observe(viewLifecycleOwner) {
if (it.isAuth) {
binding.tvAuth.visibility = View.GONE
+ binding.rlCoupon.visibility = View.VISIBLE
} else {
binding.tvAuth.visibility = View.VISIBLE
+ binding.rlCoupon.visibility = View.GONE
}
binding.ivProfile.load(it.profileUrl) {
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt
index a3ce8c7..f15e2b7 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanApi.kt
@@ -6,6 +6,7 @@ import kr.co.vividnext.sodalive.mypage.can.charge.CanResponse
import kr.co.vividnext.sodalive.mypage.can.charge.ChargeRequest
import kr.co.vividnext.sodalive.mypage.can.charge.ChargeResponse
import kr.co.vividnext.sodalive.mypage.can.charge.VerifyRequest
+import kr.co.vividnext.sodalive.mypage.can.coupon.UseCanCouponRequest
import kr.co.vividnext.sodalive.mypage.can.status.GetCanStatusResponse
import kr.co.vividnext.sodalive.mypage.can.status.charge.GetCanChargeStatusResponseItem
import kr.co.vividnext.sodalive.mypage.can.status.use.GetCanUseStatusResponseItem
@@ -56,4 +57,10 @@ interface CanApi {
@Query("container") container: String = "aos",
@Header("Authorization") authHeader: String
): Single>>
+
+ @POST("/can/coupon/use")
+ fun useCanCoupon(
+ @Body request: UseCanCouponRequest,
+ @Header("Authorization") authHeader: String
+ ): Single>
}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt
index 37ddf6d..fab03e9 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/CanRepository.kt
@@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.mypage.can
import kr.co.vividnext.sodalive.mypage.can.charge.ChargeRequest
import kr.co.vividnext.sodalive.mypage.can.charge.VerifyRequest
+import kr.co.vividnext.sodalive.mypage.can.coupon.UseCanCouponRequest
import java.util.TimeZone
class CanRepository(private val api: CanApi) {
@@ -40,4 +41,9 @@ class CanRepository(private val api: CanApi) {
size = pageSize,
authHeader = token
)
+
+ fun useCanCoupon(couponNumber: String, token: String) = api.useCanCoupon(
+ request = UseCanCouponRequest(couponNumber),
+ authHeader = token
+ )
}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/CanCouponActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/CanCouponActivity.kt
new file mode 100644
index 0000000..99aaa45
--- /dev/null
+++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/CanCouponActivity.kt
@@ -0,0 +1,66 @@
+package kr.co.vividnext.sodalive.mypage.can.coupon
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.InputFilter
+import android.text.SpannableStringBuilder
+import android.text.Spanned
+import android.widget.Toast
+import kr.co.vividnext.sodalive.base.BaseActivity
+import kr.co.vividnext.sodalive.common.LoadingDialog
+import kr.co.vividnext.sodalive.databinding.ActivityCanCouponBinding
+import kr.co.vividnext.sodalive.mypage.can.status.CanStatusActivity
+import org.koin.android.ext.android.inject
+
+class CanCouponActivity : BaseActivity(
+ ActivityCanCouponBinding::inflate
+) {
+
+ private val viewModel: CanCouponViewModel by inject()
+
+ private lateinit var loadingDialog: LoadingDialog
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ bindData()
+ }
+
+ override fun setupView() {
+ loadingDialog = LoadingDialog(this, layoutInflater)
+
+ binding.toolbar.tvBack.text = "쿠폰등록"
+ binding.toolbar.tvBack.setOnClickListener { finish() }
+
+ val uppercaseAndDigitsFilter = InputFilter { source, _, _, _, _, _ ->
+ val filtered = source.filter { it.isUpperCase() || it.isDigit() }
+ if (source is Spanned) {
+ return@InputFilter SpannableStringBuilder(filtered)
+ } else {
+ return@InputFilter filtered
+ }
+ }
+ binding.etCouponNumber.filters = arrayOf(uppercaseAndDigitsFilter)
+
+ binding.tvRegistration.setOnClickListener {
+ val couponNumber = binding.etCouponNumber.text.toString()
+ viewModel.useCoupon(couponNumber) {
+ finish()
+ startActivity(Intent(applicationContext, CanStatusActivity::class.java))
+ }
+ }
+ }
+
+ private fun bindData() {
+ viewModel.toastLiveData.observe(this) {
+ it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
+ }
+
+ viewModel.isLoading.observe(this) {
+ if (it) {
+ loadingDialog.show(screenWidth)
+ } else {
+ loadingDialog.dismiss()
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/CanCouponViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/CanCouponViewModel.kt
new file mode 100644
index 0000000..14610b7
--- /dev/null
+++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/CanCouponViewModel.kt
@@ -0,0 +1,59 @@
+package kr.co.vividnext.sodalive.mypage.can.coupon
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import com.orhanobut.logger.Logger
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+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.mypage.can.CanRepository
+
+class CanCouponViewModel(private val repository: CanRepository) : BaseViewModel() {
+ private var _isLoading = MutableLiveData(false)
+ val isLoading: LiveData
+ get() = _isLoading
+
+ private val _toastLiveData = MutableLiveData()
+ val toastLiveData: LiveData
+ get() = _toastLiveData
+
+ fun useCoupon(couponNumber: String, onSuccess: () -> Unit) {
+ _isLoading.value = true
+ compositeDisposable.add(
+ repository.useCanCoupon(
+ couponNumber = couponNumber,
+ token = "Bearer ${SharedPreferenceManager.token}"
+ )
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(
+ {
+ _isLoading.value = false
+ if (it.success && it.data != null) {
+ _toastLiveData.postValue("해당 쿠폰의 캔이 충전되었습니다.")
+ onSuccess()
+ } else {
+ if (it.message != null) {
+ _toastLiveData.postValue(it.message)
+ } else {
+ _toastLiveData.postValue(
+ "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
+ )
+ }
+ }
+ },
+ {
+ _isLoading.value = false
+ if (it.message != null) {
+ _toastLiveData.postValue(it.message)
+ Logger.e(it.message!!)
+ } else {
+ _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
+ }
+
+ }
+ )
+ )
+ }
+}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/UseCanCouponRequest.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/UseCanCouponRequest.kt
new file mode 100644
index 0000000..abe8b85
--- /dev/null
+++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/coupon/UseCanCouponRequest.kt
@@ -0,0 +1,7 @@
+package kr.co.vividnext.sodalive.mypage.can.coupon
+
+import com.google.gson.annotations.SerializedName
+
+data class UseCanCouponRequest(
+ @SerializedName("couponNumber") val couponNumber: String
+)
diff --git a/app/src/main/res/drawable-xxhdpi/ic_coupon.png b/app/src/main/res/drawable-xxhdpi/ic_coupon.png
new file mode 100644
index 0000000..0ced128
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_coupon.png differ
diff --git a/app/src/main/res/layout/activity_can_coupon.xml b/app/src/main/res/layout/activity_can_coupon.xml
new file mode 100644
index 0000000..972b7cf
--- /dev/null
+++ b/app/src/main/res/layout/activity_can_coupon.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_my.xml b/app/src/main/res/layout/fragment_my.xml
index 7351098..b7c230f 100644
--- a/app/src/main/res/layout/fragment_my.xml
+++ b/app/src/main/res/layout/fragment_my.xml
@@ -180,7 +180,7 @@
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:textColor="@color/color_eeeeee"
- android:textSize="18.3sp"
+ android:textSize="16sp"
tools:text="23,000" />
+
+
+
+
+
+
+
+
+