فهرست منبع

房间信息编辑

DoggyZhang 2 هفته پیش
والد
کامیت
d005a1f8e2

+ 6 - 0
app/src/main/res/drawable/room_input_edit_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/color_1AFFFFFF" />
+    <corners android:radius="12dp" />
+</shape>

+ 123 - 0
module/room/src/main/java/com/adealink/weparty/room/create/EditRoomDialog.kt

@@ -0,0 +1,123 @@
+package com.adealink.weparty.room.create
+
+import android.annotation.SuppressLint
+import androidx.fragment.app.viewModels
+import com.adealink.frame.base.Rlt
+import com.adealink.frame.mvvm.view.viewBinding
+import com.adealink.frame.util.onClick
+import com.adealink.weparty.commonui.mediapicker.imageselect.clip.ClipParamData
+import com.adealink.weparty.commonui.mediapicker.imageselect.comp.TakeFromAlbumComp
+import com.adealink.weparty.commonui.mediapicker.imageselect.model.MediaType
+import com.adealink.weparty.commonui.toast.util.showFailedToast
+import com.adealink.weparty.commonui.toast.util.showToast
+import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.commonui.widget.switchbutton.SwitchButton.OnCheckChangedListener
+import com.adealink.weparty.constant.ROOM_NAME_MAX_LENGTH
+import com.adealink.weparty.room.R
+import com.adealink.weparty.room.create.viewmodel.EditRoomViewModel
+import com.adealink.weparty.room.databinding.DialogEditRoomBinding
+import io.trtc.tuikit.atomicxcore.api.live.LiveListStore
+
+class EditRoomDialog : BottomDialogFragment(R.layout.dialog_edit_room) {
+    private val binding by viewBinding(DialogEditRoomBinding::bind)
+
+    private val viewModel by viewModels<EditRoomViewModel>()
+
+    private lateinit var takePhotoAlbumComp: TakeFromAlbumComp
+
+    override fun initViews() {
+        super.initViews()
+        binding.clRoomCover.onClick {
+            takePhotoAlbumComp.takeFromAlbum()
+        }
+        binding.tvRoomName.onClick {
+            showNameEditDialog()
+        }
+        binding.btnSave.onClick {
+            saveRoom()
+        }
+        binding.vMicMuteSwitch.checkChangedListener = object : OnCheckChangedListener {
+            override fun onChecked(isChecked: Boolean, fromUser: Boolean) {
+                if (fromUser) {
+                    viewModel.micMute(isChecked)
+                }
+            }
+        }
+    }
+
+    override fun loadData() {
+        super.loadData()
+        viewModel.setRoomInfo(LiveListStore.shared().liveState.currentLive.value)
+    }
+
+    override fun initComponents() {
+        super.initComponents()
+        TakeFromAlbumComp(
+            this,
+            clipParamData = ClipParamData(0, 1.0, true),
+            onSelect = { path, uri ->
+                viewModel.changeCover(path, uri)
+            },
+            mediaType = MediaType.IMAGE,
+            source = "SelectRoomCover"
+        ).also {
+            takePhotoAlbumComp = it
+        }.attach()
+    }
+
+    @SuppressLint("SetTextI18n")
+    override fun observeViewModel() {
+        super.observeViewModel()
+        viewModel.roomCoverLD.observe(viewLifecycleOwner) { cover ->
+            if (cover == null || cover.isNull()) {
+                return@observe
+            }
+            if (cover.isLocal()) {
+                binding.ivRoomCover.setImageURI(cover.uri)
+            } else {
+                binding.ivRoomCover.setImageUrl(cover.url)
+            }
+        }
+        viewModel.roomNameLD.observe(viewLifecycleOwner) { name ->
+            binding.tvRoomName.text = name
+            binding.tvRoomNameCount.text = "${name?.length ?: 0}/${ROOM_NAME_MAX_LENGTH}"
+        }
+    }
+
+    private fun showNameEditDialog() {
+        EditRoomNameDialog().apply {
+            setRoomName(binding.tvRoomName.text?.toString() ?: "")
+            setCallback(object : EditRoomNameDialog.IEditNameCallback {
+                override fun onEditName(name: String) {
+                    viewModel.updateRoomName(name)
+                }
+            })
+        }.show(childFragmentManager, "showNameEditDialog")
+    }
+
+    private fun saveRoom() {
+        val cover = viewModel.roomCoverLD.value
+        if (cover == null || cover.isNull()) {
+            showToast(R.string.room_cover_emtpy)
+            return
+        }
+        val roomName = viewModel.roomNameLD.value
+        if (roomName.isNullOrEmpty()) {
+            showToast(R.string.room_edit_room_name_empty)
+            return
+        }
+        showLoading()
+        viewModel.updateRoom().observe(viewLifecycleOwner) { rlt ->
+            dismissLoading()
+            when (rlt) {
+                is Rlt.Failed -> {
+                    showFailedToast(rlt)
+                }
+
+                is Rlt.Success -> {
+                    dismiss()
+                }
+            }
+        }
+    }
+}

+ 132 - 0
module/room/src/main/java/com/adealink/weparty/room/create/viewmodel/EditRoomViewModel.kt

@@ -0,0 +1,132 @@
+package com.adealink.weparty.room.create.viewmodel
+
+import androidx.lifecycle.LiveData
+import com.adealink.frame.base.CommonDataNullError
+import com.adealink.frame.base.Rlt
+import com.adealink.frame.base.fastLazy
+import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
+import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.weparty.App
+import com.adealink.weparty.module.image.data.PhotoData
+import com.adealink.weparty.module.room.data.MyRoomInfo
+import com.adealink.weparty.room.data.CreateRoomReq
+import com.adealink.weparty.room.data.UpdateRoomInfoReq
+import com.adealink.weparty.room.datasource.remote.RoomHttpService
+import com.adealink.weparty.room.manager.roomManager
+import com.adealink.weparty.room.sdk.service.roomService
+import com.adealink.weparty.util.uploadPhoto
+import io.trtc.tuikit.atomicxcore.api.live.LiveInfo
+import kotlinx.coroutines.launch
+import kotlin.getValue
+
+class EditRoomViewModel : BaseViewModel() {
+
+    private val roomHttpService by fastLazy {
+        App.instance.networkService.getHttpService(RoomHttpService::class.java)
+    }
+
+    var roomCover: PhotoData? = null
+    val roomCoverLD = ExtMutableLiveData<PhotoData?>()
+
+    var roomName: String? = null
+    val roomNameLD = ExtMutableLiveData<String?>()
+
+    private var forbidAudio: Boolean = true
+
+    val forbidAudioLD = ExtMutableLiveData<Boolean>()
+
+    private var liveInfo: LiveInfo? = null
+
+    fun setRoomInfo(liveInfo: LiveInfo) {
+        this.liveInfo = liveInfo
+        updateRoomInfo(liveInfo)
+    }
+
+    private fun updateRoomInfo(roomInfo: LiveInfo?) {
+        roomName = roomInfo?.liveName
+        roomNameLD.send(roomName)
+
+        roomCover = PhotoData(roomInfo?.coverURL, null, null)
+        roomCoverLD.send(roomCover)
+
+//        forbidAudio = roomInfo?.forbidAudio ?: false
+//        forbidAudioLD.send(forbidAudio)
+    }
+
+    fun changeCover(path: String?, uri: String?) {
+        viewModelScope.launch {
+            val data = PhotoData(null, path, uri)
+            roomCover = data
+            roomCoverLD.send(data)
+        }
+    }
+
+    fun updateRoomName(name: String?) {
+        this.roomName = name
+        roomNameLD.send(name)
+    }
+
+    fun micMute(mute: Boolean) {
+        forbidAudio = mute
+
+    }
+
+    fun updateRoom(): LiveData<Rlt<Any>> {
+        val liveData = OnceMutableLiveData<Rlt<Any>>()
+        viewModelScope.launch {
+            val roomId = roomService.joinController.getJoinedRoomId()
+            if (roomId.isNullOrEmpty()) {
+                liveData.send(Rlt.Failed(CommonDataNullError()))
+                return@launch
+            }
+
+            val roomName = roomName
+            if (roomName.isNullOrEmpty()) {
+                liveData.send(Rlt.Failed(CommonDataNullError()))
+                return@launch
+            }
+
+            val roomCover = roomCover
+            if (roomCover == null || roomCover.isNull()) {
+                liveData.send(Rlt.Failed(CommonDataNullError()))
+                return@launch
+            }
+            when (val uploadRlt = uploadRoomCover(roomCover)) {
+                is Rlt.Failed -> {
+                    liveData.send(uploadRlt)
+                    return@launch
+                }
+
+                is Rlt.Success -> {
+                    //Ntd.
+                }
+            }
+
+            val rlt = roomHttpService.updateRoomInfo(
+                UpdateRoomInfoReq(
+                    roomId, roomName, roomCover.url ?: ""
+                )
+            )
+            liveData.send(rlt)
+        }
+        return liveData
+    }
+
+    private suspend fun uploadRoomCover(cover: PhotoData): Rlt<PhotoData> {
+        when (val rlt = uploadPhoto(cover)) {
+            is Rlt.Failed -> {
+                return rlt
+            }
+
+            is Rlt.Success -> {
+                val photoData = rlt.data.firstOrNull()
+                if (photoData == null || photoData.isNull()) {
+                    return Rlt.Failed(CommonDataNullError())
+                }
+                return Rlt.Success(photoData)
+            }
+        }
+    }
+
+}

+ 6 - 0
module/room/src/main/java/com/adealink/weparty/room/data/RoomData.kt

@@ -56,4 +56,10 @@ data class AcceptApplyMicReq(
     @SerializedName("roomId") val roomId: String,
     @SerializedName("applyId") val applyId: String,
     @SerializedName("pass") val pass: Boolean,
+)
+
+data class UpdateRoomInfoReq(
+    @SerializedName("roomId") val roomId: String,
+    @SerializedName("roomTitle") val roomTitle: String,
+    @SerializedName("roomCover") val roomCover: String,
 )

+ 4 - 0
module/room/src/main/java/com/adealink/weparty/room/datasource/remote/RoomHttpService.kt

@@ -10,6 +10,7 @@ import com.adealink.weparty.room.data.CheckCreateRoomPermissionRes
 import com.adealink.weparty.room.data.ClearApplyMicListReq
 import com.adealink.weparty.room.data.CreateRoomReq
 import com.adealink.weparty.room.data.CreateRoomRes
+import com.adealink.weparty.room.data.UpdateRoomInfoReq
 import retrofit2.http.Body
 import retrofit2.http.Core
 import retrofit2.http.POST
@@ -39,4 +40,7 @@ interface RoomHttpService {
     @POST("live/mic/apply/clear")
     suspend fun clearApplyMicList(@Body req: ClearApplyMicListReq): Rlt<Res<Any>>
 
+    @POST("live/room/update")
+    suspend fun updateRoomInfo(@Body req: UpdateRoomInfoReq): Rlt<Res<Any>>
+
 }

+ 2 - 1
module/room/src/main/java/com/adealink/weparty/room/setting/RoomSettingDialog.kt

@@ -5,6 +5,7 @@ import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.room.R
+import com.adealink.weparty.room.create.EditRoomDialog
 import com.adealink.weparty.room.databinding.DialogRoomSettingBinding
 import com.adealink.weparty.room.sdk.service.roomService
 import kotlinx.coroutines.CoroutineScope
@@ -17,7 +18,7 @@ class RoomSettingDialog : BottomDialogFragment(R.layout.dialog_room_setting) {
     override fun initViews() {
         super.initViews()
         binding.btnSetting.onClick {
-
+            EditRoomDialog().show(childFragmentManager)
         }
         binding.btnClose.onClick {
             CoroutineScope(Dispatcher.UI).launch {

+ 195 - 0
module/room/src/main/res/layout/dialog_edit_room.xml

@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/room_bottom_dialog_bg"
+    android:paddingBottom="24dp">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_top"
+        android:layout_width="match_parent"
+        android:layout_height="52dp"
+        android:paddingHorizontal="16dp"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:fontFamily="@font/poppins_semibold"
+            android:includeFontPadding="false"
+            android:text="@string/room_setting_setting"
+            android:textColor="@color/white"
+            android:textSize="16sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_room_cover"
+        android:layout_width="105dp"
+        android:layout_height="105dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/cl_top">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/v_cover"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <com.adealink.frame.image.view.NetworkImageView
+                android:id="@+id/iv_room_cover"
+                style="@style/CommonNetworkImage"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:scaleType="centerCrop"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:roundedCornerRadius="12dp" />
+
+            <com.adealink.weparty.commonui.widget.UploadProgressView
+                android:id="@+id/v_upload_progress"
+                android:layout_width="32dp"
+                android:layout_height="32dp"
+                android:visibility="gone"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                tools:visibility="visible" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:layout_width="0dp"
+                android:layout_height="22dp"
+                android:background="@drawable/room_upload_cover_bg"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:singleLine="true"
+                android:text="@string/common_edit"
+                android:textColor="@color/white"
+                android:textSize="12sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_room_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:paddingHorizontal="16dp"
+        app:layout_constraintTop_toBottomOf="@id/cl_room_cover">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_room_name_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:singleLine="true"
+            android:text="@string/room_name"
+            android:textColor="@color/color_FFC9CDD4"
+            android:textSize="12sp"
+            app:fontFamily="@font/poppins_semibold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_room_name_count"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:singleLine="true"
+            android:text="@string/room_name"
+            android:textColor="@color/color_FFC9CDD4"
+            android:textSize="12sp"
+            app:layout_constraintBottom_toBottomOf="@id/tv_room_name_title"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="@id/tv_room_name_title"
+            tools:text="0/20" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_room_name"
+            android:layout_width="0dp"
+            android:layout_height="46dp"
+            android:layout_marginTop="8dp"
+            android:background="@drawable/room_input_edit_bg"
+            android:gravity="center_vertical|start"
+            android:hint="@string/room_name_input_hint"
+            android:includeFontPadding="false"
+            android:paddingHorizontal="12dp"
+            android:singleLine="true"
+            android:textColor="@color/color_FF4E5969"
+            android:textColorHint="@color/color_FFC9CDD4"
+            android:textSize="12sp"
+            app:fontFamily="@font/poppins_semibold"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_room_name_title" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_room_mic_setting"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="16dp"
+        app:layout_constraintTop_toBottomOf="@id/cl_room_name">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="12dp"
+            android:includeFontPadding="false"
+            android:text="@string/room_mic_setting_enter_room_mute"
+            android:textColor="@color/white"
+            app:fontFamily="@font/poppins_semibold"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintEnd_toStartOf="@id/v_mic_mute_switch"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <com.adealink.weparty.commonui.widget.switchbutton.SwitchButton
+            android:id="@+id/v_mic_mute_switch"
+            style="@style/CommonSwitchButton"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <com.adealink.weparty.commonui.widget.CommonButton
+        android:id="@+id/btn_save"
+        android:layout_width="0dp"
+        android:layout_height="@dimen/common_button_height"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/cl_room_mic_setting"
+        app:text="@string/common_save"
+        app:textColor="@color/white"
+        app:textSize="16sp" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>