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 ecb0b09..0e2d137 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 @@ -25,6 +25,7 @@ import kr.co.vividnext.sodalive.main.MainViewModel import kr.co.vividnext.sodalive.message.MessageApi import kr.co.vividnext.sodalive.message.MessageRepository import kr.co.vividnext.sodalive.message.SelectMessageRecipientViewModel +import kr.co.vividnext.sodalive.message.text.TextMessageDetailViewModel import kr.co.vividnext.sodalive.message.text.TextMessageViewModel import kr.co.vividnext.sodalive.message.text.TextMessageWriteViewModel import kr.co.vividnext.sodalive.message.voice.VoiceMessageViewModel @@ -142,6 +143,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { viewModel { EventViewModel(get()) } viewModel { NotificationSettingsViewModel(get()) } viewModel { SettingsViewModel(get()) } + viewModel { TextMessageDetailViewModel(get()) } } private val repositoryModule = module { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/message/text/TextMessageDetailActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/message/text/TextMessageDetailActivity.kt index fb76600..3a72144 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/message/text/TextMessageDetailActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/message/text/TextMessageDetailActivity.kt @@ -1,11 +1,152 @@ package kr.co.vividnext.sodalive.message.text +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.core.content.IntentCompat +import coil.load +import coil.transform.RoundedCornersTransformation +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.ActivityTextMessageDetailBinding +import kr.co.vividnext.sodalive.extensions.convertDateFormat +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.message.GetTextMessageResponse +import kr.co.vividnext.sodalive.message.MessageBox +import org.koin.android.ext.android.inject class TextMessageDetailActivity : BaseActivity( ActivityTextMessageDetailBinding::inflate ) { + private val viewModel: TextMessageDetailViewModel by inject() + + private var messageItem: GetTextMessageResponse.TextMessageItem? = null + + private lateinit var loadingDialog: LoadingDialog + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + bindData() + } + override fun setupView() { + loadingDialog = LoadingDialog(this, layoutInflater) + + messageItem = IntentCompat.getParcelableExtra( + intent, + Constants.EXTRA_TEXT_MESSAGE, + GetTextMessageResponse.TextMessageItem::class.java + ) + + val messageBox = intent.getStringExtra(Constants.EXTRA_MESSAGE_BOX) + + if (messageItem == null || messageBox == null) { + Toast.makeText(applicationContext, R.string.retry, Toast.LENGTH_LONG).show() + finish() + } + + viewModel.messageId = messageItem!!.messageId + + when { + messageBox!! == MessageBox.RECEIVE.name -> { + binding.toolbar.tvBack.text = "받은 메시지 상세" + binding.tvKeep.visibility = View.VISIBLE + binding.tvReply.visibility = View.VISIBLE + binding.tvDelete.visibility = View.VISIBLE + } + + messageBox == MessageBox.KEEP.name -> { + binding.toolbar.tvBack.text = "저장한 메시지 상세" + binding.tvKeep.visibility = View.GONE + binding.tvReply.visibility = View.GONE + binding.tvDelete.visibility = View.VISIBLE + } + + else -> { + binding.toolbar.tvBack.text = "보낸 메시지 상세" + binding.tvKeep.visibility = View.GONE + binding.tvReply.visibility = View.GONE + binding.tvDelete.visibility = View.VISIBLE + } + } + + binding.toolbar.tvBack.setOnClickListener { finish() } + binding.tvReply.setOnClickListener { + val intent = Intent(applicationContext, TextMessageWriteActivity::class.java) + intent.putExtra(Constants.EXTRA_USER_ID, messageItem!!.senderId) + intent.putExtra(Constants.EXTRA_NICKNAME, messageItem!!.senderNickname) + startActivity(intent) + } + + binding.tvKeep.setOnClickListener { + if (messageItem!!.isKept) { + Toast.makeText( + applicationContext, + "이미 보관된 메시지 입니다.", + Toast.LENGTH_LONG + ).show() + return@setOnClickListener + } + + viewModel.keepTextMessage() + } + binding.tvDelete.setOnClickListener { + viewModel.deleteMessage { + Toast.makeText( + applicationContext, + "메시지가 삭제되었습니다.", + Toast.LENGTH_LONG + ).show() + + setResult(RESULT_OK) + finish() + } + } + + setData() + } + + private fun setData() { + if (SharedPreferenceManager.nickname == messageItem?.recipientNickname) { + binding.ivProfile.load(messageItem?.senderProfileImageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(13.3f.dpToPx())) + } + + binding.tvNickname.text = messageItem?.senderNickname + } else { + binding.ivProfile.load(messageItem?.recipientProfileImageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(13.3f.dpToPx())) + } + + binding.tvNickname.text = messageItem?.recipientNickname + } + + binding.tvMessage.text = messageItem?.textMessage + binding.tvDate.text = messageItem?.date!!.convertDateFormat( + from = "yyyy-MM-dd hh:mm:ss", + to = "yyyy년 MM월 dd일 E요일 HH:mm" + ) + } + + 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/message/text/TextMessageDetailViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/message/text/TextMessageDetailViewModel.kt new file mode 100644 index 0000000..bc4243a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/message/text/TextMessageDetailViewModel.kt @@ -0,0 +1,100 @@ +package kr.co.vividnext.sodalive.message.text + +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.message.MessageRepository + +class TextMessageDetailViewModel(private val repository: MessageRepository) : BaseViewModel() { + var messageId: Long = 0 + + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData + get() = _toastLiveData + + private var _isLoading = MutableLiveData(false) + val isLoading: LiveData + get() = _isLoading + + fun keepTextMessage() { + if (messageId <= 0) { + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + return + } + + _isLoading.value = true + compositeDisposable.add( + repository.keepTextMessage( + messageId = messageId, + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + if (it.success) { + _toastLiveData.postValue( + "보관되었습니다." + ) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _isLoading.value = false + } + ) + ) + } + + fun deleteMessage(onSuccess: () -> Unit) { + if (messageId <= 0) { + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + return + } + + _isLoading.value = true + compositeDisposable.add( + repository.deleteMessage( + messageId = messageId, + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + if (it.success) { + onSuccess() + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _isLoading.value = false + } + ) + ) + } +}