From ce5cc20ac4907c83876960100738220190fefdb3 Mon Sep 17 00:00:00 2001 From: wzq Date: Tue, 17 Oct 2023 18:16:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=BF=E9=97=B4=E7=9B=B8=E5=86=8C=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8,=E4=B8=8A=E4=BC=A0=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/bean/RoomAlbumPhotoInfo.kt | 14 ++ .../avroom/room_album/RoomAlbumActivity.kt | 15 ++- .../avroom/room_album/RoomAlbumFragment.kt | 120 ++++++++++++++---- .../room_album/RoomAlbumFragmentViewModel.kt | 28 ++++ .../erban/avroom/room_album/RoomAlbumModel.kt | 48 +++++++ .../avroom/room_album/RoomAlbumViewModel.kt | 48 +++++-- .../UploadRoomAlbumDialogFragment.kt | 60 ++++++++- .../main/res/layout/fragment_room_album.xml | 19 ++- 8 files changed, 299 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/avroom/bean/RoomAlbumPhotoInfo.kt create mode 100644 app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragmentViewModel.kt create mode 100644 app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumModel.kt diff --git a/app/src/main/java/com/yizhuan/erban/avroom/bean/RoomAlbumPhotoInfo.kt b/app/src/main/java/com/yizhuan/erban/avroom/bean/RoomAlbumPhotoInfo.kt new file mode 100644 index 000000000..1632e0df4 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/bean/RoomAlbumPhotoInfo.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumActivity.kt b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumActivity.kt index 2aea1cc81..52c768e97 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumActivity.kt @@ -47,6 +47,8 @@ class RoomAlbumActivity : BaseViewBindingActivity() { 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() { 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() { } binding.tvUpload.setOnClickListener { - UploadRoomAlbumDialogFragment().show(supportFragmentManager, UploadRoomAlbumDialogFragment::class.java.simpleName) + UploadRoomAlbumDialogFragment().show( + supportFragmentManager, + UploadRoomAlbumDialogFragment::class.java.simpleName + ) } - } + } companion object { @JvmStatic diff --git a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragment.kt b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragment.kt index 7865f294f..715566b7a 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragment.kt @@ -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() { - private val viewModel by activityViewModels() + private val activityViewModel by activityViewModels() + private val viewModel by viewModels() + + 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() { true ) ) - binding.recyclerView.adapter = - object : BaseQuickAdapter(R.layout.item_room_album) { - override fun convert(helper: BaseViewHolder, item: String) { + val adapter = object : + BaseQuickAdapter(R.layout.item_room_album) { + override fun convert(helper: BaseViewHolder, item: RoomAlbumPhotoInfo) { + val ivPhoto = helper.getView(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(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) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragmentViewModel.kt b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragmentViewModel.kt new file mode 100644 index 000000000..0ffc96f94 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumFragmentViewModel.kt @@ -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?>() + val myPhotosLiveData: LiveData?> = _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 + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumModel.kt b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumModel.kt new file mode 100644 index 000000000..9f14fc4ce --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumModel.kt @@ -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? { + 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> + + @FormUrlEncoded + @POST("roomAlbum/upload") + suspend fun uploadPhotos( + @Field("roomUid") roomUid: Long, + @Field("type") type: Int, + @Field("photoUrls") photoUrls: String, + @Field("giftId") giftId: Int?, + ): ServiceResult + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumViewModel.kt b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumViewModel.kt index f5685b73c..20e5cbd5d 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumViewModel.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/room_album/RoomAlbumViewModel.kt @@ -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>() - val myPhotosLiveData: LiveData> = _myPhotosLiveData - init { - loadMyPhotos() - } + private val _uploadLiveData = MutableLiveData>() + val uploadLiveData: LiveData?> = _uploadLiveData - fun loadMyPhotos() { - safeLaunch { - val list = mutableListOf() - for (i in 0 until 20) { - list.add("https://image.hfighting.com/FsElQzIALqAixbAT56riNMotkAZR") + @SuppressLint("CheckResult") + fun upload(list: MutableList, 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) + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/room_album/UploadRoomAlbumDialogFragment.kt b/app/src/main/java/com/yizhuan/erban/avroom/room_album/UploadRoomAlbumDialogFragment.kt index ba709db23..5d3959c50 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/room_album/UploadRoomAlbumDialogFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/room_album/UploadRoomAlbumDialogFragment.kt @@ -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() + private lateinit var photoAdapter: BaseMultiItemQuickAdapter 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() + 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 diff --git a/app/src/main/res/layout/fragment_room_album.xml b/app/src/main/res/layout/fragment_room_album.xml index 82945830a..5cd70728e 100644 --- a/app/src/main/res/layout/fragment_room_album.xml +++ b/app/src/main/res/layout/fragment_room_album.xml @@ -1,8 +1,15 @@ - \ No newline at end of file + android:layout_height="match_parent"> + + + + \ No newline at end of file