메시지 상세 페이지 추가

This commit is contained in:
klaus 2023-08-02 17:38:48 +09:00
parent cc8fab76b0
commit ce35be9688
3 changed files with 243 additions and 0 deletions

View File

@ -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 {

View File

@ -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>(
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()
}
}
}
}

View File

@ -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<String?>()
val toastLiveData: LiveData<String?>
get() = _toastLiveData
private var _isLoading = MutableLiveData(false)
val isLoading: LiveData<Boolean>
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
}
)
)
}
}