房间相册 列表,上传 数据对接

This commit is contained in:
wzq
2023-10-17 18:16:41 +08:00
parent bc718f26c6
commit ce5cc20ac4
8 changed files with 299 additions and 53 deletions

View File

@@ -0,0 +1,14 @@
package com.yizhuan.erban.avroom.bean
data class RoomAlbumPhotoInfo(
val giftId: Int,
val giftNum: Int,
val giftUrl: String,
val id: Int,
val photoUrl: String,
val roomUid: Int,
val status: Int,
val totalGoldPrice: Int,
val type: Int,
val uid: Int
)

View File

@@ -47,6 +47,8 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
normalColor = ContextCompat.getColor(context, R.color.color_767585)
selectedColor = ContextCompat.getColor(context, R.color.color_1F1B4F)
text = titles[index]
}.apply {
setOnClickListener { binding.vp.currentItem = index }
}
}
@@ -80,9 +82,9 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
ViewPagerHelper.bind(binding.indicator, binding.vp)
val fragments = listOf(
RoomAlbumFragment.newInstance(),
RoomAlbumFragment.newInstance(),
RoomAlbumFragment.newInstance()
RoomAlbumFragment.newInstance(RoomAlbumFragment.TYPE_MINE),
RoomAlbumFragment.newInstance(RoomAlbumFragment.TYPE_COMMON),
RoomAlbumFragment.newInstance(RoomAlbumFragment.TYPE_LOCKED)
)
binding.vp.adapter = object : FragmentStateAdapter(this) {
@@ -96,9 +98,12 @@ class RoomAlbumActivity : BaseViewBindingActivity<ActivityRoomAlbumBinding>() {
}
binding.tvUpload.setOnClickListener {
UploadRoomAlbumDialogFragment().show(supportFragmentManager, UploadRoomAlbumDialogFragment::class.java.simpleName)
UploadRoomAlbumDialogFragment().show(
supportFragmentManager,
UploadRoomAlbumDialogFragment::class.java.simpleName
)
}
}
}
companion object {
@JvmStatic

View File

@@ -1,20 +1,34 @@
package com.yizhuan.erban.avroom.room_album
import android.os.Bundle
import android.view.ViewGroup
import android.widget.ImageView
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chad.library.adapter.base.diff.BaseQuickDiffCallback
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.bean.RoomAlbumPhotoInfo
import com.yizhuan.erban.base.BaseViewBindingFragment
import com.yizhuan.erban.databinding.FragmentRoomAlbumBinding
import com.yizhuan.erban.ui.utils.ImageLoadUtils
import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
import com.yizhuan.erban.ui.widget.ButtonItem
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
import com.yizhuan.xchat_android_core.Constants
class RoomAlbumFragment : BaseViewBindingFragment<FragmentRoomAlbumBinding>() {
private val viewModel by activityViewModels<RoomAlbumViewModel>()
private val activityViewModel by activityViewModels<RoomAlbumViewModel>()
private val viewModel by viewModels<RoomAlbumFragmentViewModel>()
private val type: Int by lazy {
requireArguments().getInt("type")
}
private var page = 1
override fun init() {
binding.recyclerView.layoutManager = GridLayoutManager(context, 2)
@@ -26,49 +40,101 @@ class RoomAlbumFragment : BaseViewBindingFragment<FragmentRoomAlbumBinding>() {
true
)
)
binding.recyclerView.adapter =
object : BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_room_album) {
override fun convert(helper: BaseViewHolder, item: String) {
val adapter = object :
BaseQuickAdapter<RoomAlbumPhotoInfo, BaseViewHolder>(R.layout.item_room_album) {
override fun convert(helper: BaseViewHolder, item: RoomAlbumPhotoInfo) {
val ivPhoto = helper.getView<ImageView>(R.id.iv_pic)
if (item.status == 1) {
ImageLoadUtilsV2.loadImage(ivPhoto, item.photoUrl)
} else {
ImageLoadUtils.loadImageWithBlur(
context,
item,
helper.getView(R.id.iv_pic),
item.photoUrl,
ivPhoto,
25, 4
)
}
}
override fun onCreateDefViewHolder(
parent: ViewGroup?,
viewType: Int
): BaseViewHolder {
val holder = super.onCreateDefViewHolder(parent, viewType)
holder.addOnClickListener(R.id.v_action)
return holder
}
}.apply {
setEnableLoadMore(true)
setOnLoadMoreListener({
viewModel.loadPhotos(type, page++)
}, binding.recyclerView)
setOnItemChildClickListener { _, view, position ->
if (view.id == R.id.v_action) {
val buttonItems = listOf(
ButtonItem("發送到公屏", {}),
ButtonItem("刪除照片", {}),
ButtonItem("查看大圖", {})
)
dialogManager.showCommonPopupDialog(buttonItems)
override fun onCreateDefViewHolder(
parent: ViewGroup?,
viewType: Int
): BaseViewHolder {
val holder = super.onCreateDefViewHolder(parent, viewType)
holder.addOnClickListener(R.id.v_action)
return holder
}
}
}
}.apply {
binding.recyclerView.adapter = adapter
viewModel.myPhotosLiveData.observe(this@RoomAlbumFragment) {
setNewData(it)
}
binding.refreshLayout.setOnRefreshListener {
page = Constants.PAGE_START
viewModel.loadPhotos(type)
}
setOnItemChildClickListener { _, view, position ->
if (view.id == R.id.v_action) {
val buttonItems = listOf(
ButtonItem("發送到公屏", {}),
ButtonItem("刪除照片", {}),
ButtonItem("查看大圖", {})
)
dialogManager.showCommonPopupDialog(buttonItems)
viewModel.loadPhotos(type)
}
activityViewModel.uploadLiveData.observe(this) {
page = Constants.PAGE_START
viewModel.loadPhotos(type)
}
viewModel.myPhotosLiveData.observe(this@RoomAlbumFragment) {
it?.let { list ->
adapter.loadMoreComplete()
if (list.size - adapter.data.size < Constants.PAGE_SIZE) {
adapter.loadMoreEnd()
}
}
adapter.setNewDiffData(object : BaseQuickDiffCallback<RoomAlbumPhotoInfo>(it) {
override fun areItemsTheSame(
oldItem: RoomAlbumPhotoInfo,
newItem: RoomAlbumPhotoInfo
): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(
oldItem: RoomAlbumPhotoInfo,
newItem: RoomAlbumPhotoInfo
): Boolean {
return oldItem.photoUrl === newItem.photoUrl
}
})
binding.refreshLayout.finishRefresh()
}
}
companion object {
fun newInstance() = RoomAlbumFragment()
const val TYPE_MINE = 0
const val TYPE_COMMON = 1
const val TYPE_LOCKED = 2
fun newInstance(type: Int) = RoomAlbumFragment().apply {
arguments = Bundle().apply {
putInt("type", type)
}
}
}
}

View File

@@ -0,0 +1,28 @@
package com.yizhuan.erban.avroom.room_album
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yizhuan.erban.avroom.bean.RoomAlbumPhotoInfo
import com.yizhuan.erban.base.BaseViewModel
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
class RoomAlbumFragmentViewModel : BaseViewModel() {
private val _myPhotosLiveData = MutableLiveData<MutableList<RoomAlbumPhotoInfo>?>()
val myPhotosLiveData: LiveData<MutableList<RoomAlbumPhotoInfo>?> = _myPhotosLiveData
fun loadPhotos(type: Int, page: Int = 1) {
safeLaunch {
val myPhotos = RoomAlbumModel.loadPhotos(AvRoomDataManager.get().roomUid, type, page)
val value = _myPhotosLiveData.value
if (page == 1) {
_myPhotosLiveData.value = myPhotos!!.toMutableList()
return@safeLaunch
}
value?.addAll(myPhotos!!)
_myPhotosLiveData.value = value
}
}
}

View File

@@ -0,0 +1,48 @@
package com.yizhuan.erban.avroom.room_album
import com.yizhuan.erban.avroom.bean.RoomAlbumPhotoInfo
import com.yizhuan.xchat_android_core.Constants
import com.yizhuan.xchat_android_core.bean.response.ServiceResult
import com.yizhuan.xchat_android_core.utils.net.launchRequest
import com.yizhuan.xchat_android_library.net.rxnet.RxNet
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
object RoomAlbumModel {
private val api = RxNet.create(Api::class.java)
suspend fun loadPhotos(roomUid: Long, type: Int, page: Int): List<RoomAlbumPhotoInfo>? {
return launchRequest {
api.loadPhotos(roomUid, type, page, Constants.PAGE_SIZE)
}
}
suspend fun uploadPhotos(roomUid: Long, type: Int, photoUrls: String, giftId: Int?) : String? {
return launchRequest {
api.uploadPhotos(roomUid, type, photoUrls, giftId)
}
}
private interface Api {
@GET("roomAlbum/pagePhoto")
suspend fun loadPhotos(
@Query("roomUid") roomUid: Long,
@Query("type") type: Int,
@Query("page") page: Int,
@Query("pageSize") pageSize: Int,
): ServiceResult<List<RoomAlbumPhotoInfo>>
@FormUrlEncoded
@POST("roomAlbum/upload")
suspend fun uploadPhotos(
@Field("roomUid") roomUid: Long,
@Field("type") type: Int,
@Field("photoUrls") photoUrls: String,
@Field("giftId") giftId: Int?,
): ServiceResult<String>
}
}

View File

@@ -1,26 +1,48 @@
package com.yizhuan.erban.avroom.room_album
import android.annotation.SuppressLint
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yizhuan.erban.base.BaseViewModel
import com.yizhuan.erban.base.Event
import com.yizhuan.xchat_android_core.file.FileModel
import com.yizhuan.xchat_android_core.gift.bean.GiftInfo
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.utils.toast
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
class RoomAlbumViewModel : BaseViewModel() {
private val _myPhotosLiveData = MutableLiveData<MutableList<String>>()
val myPhotosLiveData: LiveData<MutableList<String>> = _myPhotosLiveData
init {
loadMyPhotos()
}
private val _uploadLiveData = MutableLiveData<Event<Boolean>>()
val uploadLiveData: LiveData<Event<Boolean>?> = _uploadLiveData
fun loadMyPhotos() {
safeLaunch {
val list = mutableListOf<String>()
for (i in 0 until 20) {
list.add("https://image.hfighting.com/FsElQzIALqAixbAT56riNMotkAZR")
@SuppressLint("CheckResult")
fun upload(list: MutableList<String>, type: Int, unlockedGift: GiftInfo?) {
Observable.fromIterable(list)
.flatMap {
FileModel.get().uploadFile(it).toObservable()
}
_myPhotosLiveData.value = list
}
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
safeLaunch(onError = {
_uploadLiveData.value = Event(false)
}, block = {
RoomAlbumModel.uploadPhotos(
AvRoomDataManager.get().roomUid,
type,
it.joinToString(),
unlockedGift?.giftId
)
_uploadLiveData.value = Event(true)
})
}, {
it.message.toast()
_uploadLiveData.value = Event(false)
})
}
}

View File

@@ -11,11 +11,14 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.hjq.toast.ToastUtils
import com.yizhuan.erban.R
import com.yizhuan.erban.common.widget.dialog.DialogManager
import com.yizhuan.erban.databinding.DialogRoomAlbumUploadBinding
import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
@@ -29,10 +32,16 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
private var _binding: DialogRoomAlbumUploadBinding? = null
private val binding get() = _binding!!
private val viewModel by activityViewModels<RoomAlbumViewModel>()
private lateinit var photoAdapter: BaseMultiItemQuickAdapter<PhotoItem, BaseViewHolder>
private var unlockedGift: GiftInfo? = null
val dialogManager by lazy {
DialogManager(context)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.ErbanBottomSheetDialog)
@@ -120,7 +129,12 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
unlockedGift = null
binding.vGift.isEnabled = false
binding.tvGiftLabel.setTextColor(ContextCompat.getColor(requireContext(), R.color.color_B3B3C3))
binding.tvGiftLabel.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.color_B3B3C3
)
)
} else {
binding.tvNoGift.visibility = View.VISIBLE
binding.tvNoGift.text =
@@ -128,7 +142,12 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
binding.groupGift.visibility = View.INVISIBLE
binding.vGift.isEnabled = true
binding.tvGiftLabel.setTextColor(ContextCompat.getColor(requireContext(), R.color.color_1F1B4F))
binding.tvGiftLabel.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.color_1F1B4F
)
)
}
}
@@ -151,6 +170,43 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
)
}
binding.slConfirm.setOnClickListener {
val list = mutableListOf<String>()
photoAdapter.data.forEach {
if (it.type == PhotoItem.TYPE_PHOTO) {
list.add(it.path)
}
}
if (list.size < 1) {
ToastUtils.show("未選擇圖片")
return@setOnClickListener
}
val type = if (binding.rgType.checkedRadioButtonId == binding.rbCommon.id) 1 else 2
if (type == 2 && unlockedGift == null) {
ToastUtils.show("未選擇解鎖禮物")
return@setOnClickListener
}
dialogManager.showProgressDialog(context)
viewModel.upload(
list,
type,
unlockedGift
)
}
viewModel.uploadLiveData.observe(this) {
it?.getContentIfNotHandled()?.let { success ->
dialogManager.hideProgressDialog()
if (success) {
dismiss()
}
}
}
binding.ivClose.setOnClickListener { dismiss() }
return binding.root

View File

@@ -1,8 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler_view"
<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="vertical"
android:fadingEdgeLength="@dimen/dp_60"
android:requiresFadingEdge="vertical" />
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="vertical"
android:fadingEdgeLength="@dimen/dp_60"
android:requiresFadingEdge="vertical" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>