DoggyZhang 5 napja
szülő
commit
2cce2d5285
18 módosított fájl, 214 hozzáadás és 124 törlés
  1. 8 0
      app/src/main/res/drawable/common_button_bg2.xml
  2. 0 15
      module/profile/src/main/java/com/adealink/weparty/profile/search/page/SearchAllFragment.kt
  3. 15 18
      module/profile/src/main/java/com/adealink/weparty/profile/search/page/SearchRoomFragment.kt
  4. 14 18
      module/profile/src/main/java/com/adealink/weparty/profile/search/page/SearchUserFragment.kt
  5. 10 2
      module/room/src/main/java/com/adealink/weparty/room/applymic/HostApplyListFragment.kt
  6. 0 5
      module/room/src/main/java/com/adealink/weparty/room/chatroom/page/dispatchcenter/DispatchRoomBottomOperateFragment.kt
  7. 15 18
      module/room/src/main/java/com/adealink/weparty/room/list/RoomHomeListFragment.kt
  8. 12 16
      module/room/src/main/java/com/adealink/weparty/room/micseat/decor/NameDecorView.kt
  9. 1 1
      module/room/src/main/java/com/adealink/weparty/room/micseat/dispatcenter/DispatchCenterGuestSeatView.kt
  10. 42 25
      module/room/src/main/java/com/adealink/weparty/room/micseat/dispatcenter/DispatchCenterSeatsTemplate.kt
  11. 53 0
      module/room/src/main/java/com/adealink/weparty/room/widget/RoomNameView.kt
  12. 0 1
      module/room/src/main/res/layout/fragment_home_room_list.xml
  13. 1 1
      module/room/src/main/res/layout/fragment_seats_template_dispatch_center.xml
  14. 1 1
      module/room/src/main/res/layout/layout_how_to_guide_1.xml
  15. 1 1
      module/room/src/main/res/layout/layout_how_to_guide_2.xml
  16. 1 1
      module/room/src/main/res/layout/layout_how_to_guide_3.xml
  17. 1 1
      module/room/src/main/res/layout/layout_how_to_guide_4.xml
  18. 39 0
      module/room/src/main/res/layout/widget_room_name.xml

+ 8 - 0
app/src/main/res/drawable/common_button_bg2.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="100dp" />
+    <gradient
+        android:endColor="#95E789"
+        android:startColor="#4ED2FE" />
+</shape>

+ 0 - 15
module/profile/src/main/java/com/adealink/weparty/profile/search/page/SearchAllFragment.kt

@@ -88,21 +88,6 @@ class SearchAllFragment : BaseFragment(R.layout.fragment_search_all),
         searchAllViewModel.searchRltLD.observeWithoutCache(this) { rlt ->
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()
-
-            when (rlt) {
-                is Rlt.Failed -> {
-                    if (rlt.error is NoMoreDataError) {
-                        return@observeWithoutCache
-                    }
-                    binding.rvResult.show()
-                    binding.rvResult.gone()
-                }
-
-                is Rlt.Success -> {
-                    binding.rvResult.show()
-                    binding.rvResult.show()
-                }
-            }
         }
         searchAllViewModel.searchResultLD.observeWithoutCache(this) { list ->
             resultAdapter.submitList(list, true)

+ 15 - 18
module/profile/src/main/java/com/adealink/weparty/profile/search/page/SearchRoomFragment.kt

@@ -13,6 +13,7 @@ import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.itemdecoration.GridSpacingItemDecoration
+import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.module.room.Room
 import com.adealink.weparty.module.room.data.RoomInfo
 import com.adealink.weparty.module.room.data.toEnterRoomInfo
@@ -71,28 +72,24 @@ class SearchRoomFragment : BaseFragment(R.layout.fragment_search_room),
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()
             binding.vRefresh.setEnableLoadMore(searchRoomViewModel.hasMoreData())
-
-            when (rlt) {
-                is Rlt.Failed -> {
-                    if (rlt.error is NoMoreDataError) {
-                        return@observeWithoutCache
-                    }
-                    binding.rvResult.show()
-                    binding.rvResult.gone()
-                    binding.vErrorView.show(
-                        errorEmptyResId = APP_R.drawable.common_list_empty_ic,
-                        title = APP_R.string.commonui_list_empty
-                    )
-                }
-
-                is Rlt.Success -> {
-                    binding.rvResult.show()
-                    binding.rvResult.show()
-                    binding.vErrorView.gone()
+            if (rlt is Rlt.Failed) {
+                if (rlt.error is NoMoreDataError) {
+                    return@observeWithoutCache
                 }
+                showFailedToast(rlt)
             }
         }
         searchRoomViewModel.searchResultLD.observeWithoutCache(this) { list ->
+            if (list.isEmpty()) {
+                binding.rvResult.gone()
+                binding.vErrorView.show(
+                    errorEmptyResId = APP_R.drawable.common_list_empty_ic,
+                    title = APP_R.string.commonui_list_empty
+                )
+            } else {
+                binding.rvResult.show()
+                binding.vErrorView.gone()
+            }
             resultAdapter.submitList(list, true)
         }
     }

+ 14 - 18
module/profile/src/main/java/com/adealink/weparty/profile/search/page/SearchUserFragment.kt

@@ -104,28 +104,24 @@ class SearchUserFragment : BaseFragment(R.layout.fragment_search_user),
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()
             binding.vRefresh.setEnableLoadMore(searchUserViewModel.hasMoreData())
-
-            when (rlt) {
-                is Rlt.Failed -> {
-                    if (rlt.error is NoMoreDataError) {
-                        return@observeWithoutCache
-                    }
-                    binding.rvResult.show()
-                    binding.rvResult.gone()
-                    binding.vErrorView.show(
-                        errorEmptyResId = APP_R.drawable.common_list_empty_ic,
-                        title = APP_R.string.commonui_list_empty
-                    )
-                }
-
-                is Rlt.Success -> {
-                    binding.rvResult.show()
-                    binding.rvResult.show()
-                    binding.vErrorView.gone()
+            if (rlt is Rlt.Failed) {
+                if (rlt.error is NoMoreDataError) {
+                    return@observeWithoutCache
                 }
+                showFailedToast(rlt)
             }
         }
         searchUserViewModel.searchResultLD.observeWithoutCache(this) { list ->
+            if (list.isEmpty()) {
+                binding.rvResult.gone()
+                binding.vErrorView.show(
+                    errorEmptyResId = APP_R.drawable.common_list_empty_ic,
+                    title = APP_R.string.commonui_list_empty
+                )
+            } else {
+                binding.rvResult.show()
+                binding.vErrorView.gone()
+            }
             resultAdapter.submitList(list, true)
         }
     }

+ 10 - 2
module/room/src/main/java/com/adealink/weparty/room/applymic/HostApplyListFragment.kt

@@ -154,8 +154,16 @@ class HostApplyListFragment : BaseFragment(R.layout.fragment_room_apply_mic_list
         showLoading()
         listViewModel.acceptApply(roomId, item.data.applyId, true).observe(viewLifecycleOwner) { rlt ->
             dismissLoading()
-            showFailedToast(rlt)
-            listViewModel.notifyApplyAccepted(item, position)
+            when (rlt) {
+                is Rlt.Failed -> {
+                    showFailedToast(rlt)
+                }
+
+                is Rlt.Success<*> -> {
+                    listViewModel.notifyApplyAccepted(item, position)
+                }
+            }
+
         }
     }
 

+ 0 - 5
module/room/src/main/java/com/adealink/weparty/room/chatroom/page/dispatchcenter/DispatchRoomBottomOperateFragment.kt

@@ -228,11 +228,6 @@ open class DispatchRoomBottomOperateFragment : BaseFragment(R.layout.fragment_di
     }
 
     private fun clickApplyMicPending() {
-        val myUserInfo = ProfileModule.getMyUserInfo() ?: return
-        if (!myUserInfo.isPlaymate()) {
-            //仅陪玩师能申请自动上麦
-            return
-        }
         val isOnMic = roomService.seatController.isOnMic(ProfileModule.getMyUid())
         if (!isOnMic) {
             ApplyMicListDialog().show(childFragmentManager)

+ 15 - 18
module/room/src/main/java/com/adealink/weparty/room/list/RoomHomeListFragment.kt

@@ -17,6 +17,7 @@ import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.itemdecoration.GridSpacingItemDecoration
+import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.module.room.Room
 import com.adealink.weparty.module.room.data.RoomInfo
 import com.adealink.weparty.module.room.data.RoomType
@@ -83,28 +84,24 @@ class RoomHomeListFragment : BaseFragment(R.layout.fragment_home_room_list), Sea
             binding.vRefresh.finishRefresh()
             binding.vRefresh.finishLoadMore()
             binding.vRefresh.setEnableLoadMore(roomViewModel.hasMoreData())
-
-            when (rlt) {
-                is Rlt.Failed -> {
-                    if (rlt.error is NoMoreDataError) {
-                        return@observeWithoutCache
-                    }
-                    binding.rvResult.show()
-                    binding.rvResult.gone()
-                    binding.vErrorView.show(
-                        errorEmptyResId = APP_R.drawable.common_list_empty_ic,
-                        title = APP_R.string.commonui_list_empty
-                    )
-                }
-
-                is Rlt.Success -> {
-                    binding.rvResult.show()
-                    binding.rvResult.show()
-                    binding.vErrorView.gone()
+            if (rlt is Rlt.Failed) {
+                if (rlt.error is NoMoreDataError) {
+                    return@observeWithoutCache
                 }
+                showFailedToast(rlt)
             }
         }
         roomViewModel.roomItemListLD.observeWithoutCache(this) { list ->
+            if (list.isEmpty()) {
+                binding.rvResult.gone()
+                binding.vErrorView.show(
+                    errorEmptyResId = APP_R.drawable.common_list_empty_ic,
+                    title = APP_R.string.commonui_list_empty
+                )
+            } else {
+                binding.rvResult.show()
+                binding.vErrorView.gone()
+            }
             resultAdapter.submitList(list, true)
         }
     }

+ 12 - 16
module/room/src/main/java/com/adealink/weparty/room/micseat/decor/NameDecorView.kt

@@ -15,34 +15,30 @@ import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.module.room.data.MicIndex
 import com.adealink.weparty.room.R
 import com.adealink.weparty.room.micseat.DecorDynamicLayers
+import com.adealink.weparty.room.widget.RoomNameView
 import com.adealink.weparty.R as APP_R
 
 class NameDecorView(
     dynamicLayers: DecorDynamicLayers,
     val isHost: Boolean = false,
     val topMargin: Int = 6.dp()
-) : BaseDecorView<AppCompatTextView>(R.id.id_mic_seat_name_decor, dynamicLayers),
+) : BaseDecorView<RoomNameView>(R.id.id_mic_seat_name_decor, dynamicLayers),
     INameDecorApi,
     IMicIndexDecorApi,
     IRoomRoleDecorApi {
 
     override val autoAttach: Boolean = true
 
-    override fun createView(context: Context): AppCompatTextView {
-        return AppCompatTextView(context).apply {
-            setTextSize(TypedValue.COMPLEX_UNIT_SP, 11f)
-            gravity = Gravity.CENTER
-            ellipsize = TextUtils.TruncateAt.END
-            maxLines = 1
-            includeFontPadding = false
+    override fun createView(context: Context): RoomNameView {
+        return RoomNameView(context).apply {
             minHeight = 14.dp()
         }
     }
 
-    override fun onViewAdded(view: AppCompatTextView) {
+    override fun onViewAdded(view: RoomNameView) {
         if (scale < 1) {
             TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
-                view,
+                view.getNameTextView(),
                 6,
                 11,
                 1,
@@ -50,9 +46,9 @@ class NameDecorView(
             )
         }
         if (isHost) {
-            view.setCompoundDrawablesWithIntrinsicBounds(getCompatDrawable(R.drawable.room_dispatch_center_host_tag_ic), null, null, null)
+            view.setLeftDrawable(getCompatDrawable(R.drawable.room_dispatch_center_host_tag_ic), size = 11.dp())
         } else {
-            view.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)
+            view.setLeftDrawable(null)
         }
     }
 
@@ -74,15 +70,15 @@ class NameDecorView(
 
     override fun showName(name: String, uid: String) {
         view {
-            it.setTextColor(getCompatColor(APP_R.color.white))
-            it.text = name
+            it.setNameColor(getCompatColor(APP_R.color.white))
+            it.setName(name)
         }
     }
 
     override fun showMicIndex(micIndex: MicIndex?) {
         view {
-            it.setTextColor(getCompatColor(APP_R.color.color_99FFFFFF))
-            it.text = micIndex?.micName?.invoke()
+            it.setNameColor(getCompatColor(APP_R.color.color_99FFFFFF))
+            it.setName(micIndex?.micName?.invoke())
         }
     }
 }

+ 1 - 1
module/room/src/main/java/com/adealink/weparty/room/micseat/dispatcenter/DispatchCenterGuestSeatView.kt

@@ -15,7 +15,7 @@ class DispatchCenterGuestSeatView @JvmOverloads constructor(
     override fun initViews() {
         super.initViews()
         addDecorView(AvatarDecorView(dynamicLayers, emptyResId = R.drawable.room_micseat_seat_guest_unlock_ic))
-        addDecorView(NameDecorView(dynamicLayers, isHost = true))
+        addDecorView(NameDecorView(dynamicLayers))
     }
 
 }

+ 42 - 25
module/room/src/main/java/com/adealink/weparty/room/micseat/dispatcenter/DispatchCenterSeatsTemplate.kt

@@ -91,42 +91,59 @@ class DispatchCenterSeatsTemplate :
         val onMicIndex = roomService.seatController.getMicSeatIndex(ProfileModule.getMyUid())
         val isMicEmpty = seatView.micSeatInfo == null || seatView.micSeatInfo?.isSeatEmpty() == true
 
-        val actionList = mutableListOf<Pair<Int, String>>()
         if (isOnMic) {
             //麦上
             if (onMicIndex == MIC_HOST) {
                 //"我"是否是主持人/管理员
                 if (isMicEmpty) {
                     //操作空麦位
-                    if (isLock) {
-                        actionList.add(Pair(R.id.id_mic_operate_unlock, getCompatString(R.string.room_mic_operate_unlock)))
-                    } else {
-                        actionList.add(Pair(R.id.id_mic_operate_invite, getCompatString(R.string.room_mic_operate_invite)))
-                        actionList.add(Pair(R.id.id_mic_operate_lock, getCompatString(R.string.room_mic_operate_lock)))
-                    }
+                    showMicActionList(seatView, mutableListOf<Pair<Int, String>>().apply {
+                        if (isLock) {
+                            add(Pair(R.id.id_mic_operate_unlock, getCompatString(R.string.room_mic_operate_unlock)))
+                        } else {
+                            add(Pair(R.id.id_mic_operate_invite, getCompatString(R.string.room_mic_operate_invite)))
+                            add(Pair(R.id.id_mic_operate_lock, getCompatString(R.string.room_mic_operate_lock)))
+                        }
+                    })
 
                 } else if (seatView.micIndex.index == onMicIndex) {
                     //操作自己的麦位
-                    actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
-                    actionList.add(Pair(R.id.id_mic_operate_off, getCompatString(R.string.room_mic_operate_off)))
+                    showMicActionList(seatView, mutableListOf<Pair<Int, String>>().apply {
+                        add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                        add(Pair(R.id.id_mic_operate_off, getCompatString(R.string.room_mic_operate_off)))
+                    })
 
                 } else {
                     //操作他人麦位
-                    actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
-                    actionList.add(Pair(R.id.id_mic_operate_kick, getCompatString(R.string.room_mic_operate_kick)))
-                    actionList.add(Pair(R.id.id_mic_operate_lock, getCompatString(R.string.room_mic_operate_lock)))
-                    if (seatView.micSeatInfo?.isRemoteMute() == true) {
-                        actionList.add(Pair(R.id.id_mic_operate_un_mute, getCompatString(R.string.room_mic_operate_un_mute)))
-                    } else {
-                        actionList.add(Pair(R.id.id_mic_operate_mute, getCompatString(R.string.room_mic_operate_mute)))
-                    }
+                    showMicActionList(seatView, mutableListOf<Pair<Int, String>>().apply {
+                        add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                        add(Pair(R.id.id_mic_operate_kick, getCompatString(R.string.room_mic_operate_kick)))
+                        add(Pair(R.id.id_mic_operate_lock, getCompatString(R.string.room_mic_operate_lock)))
+                        if (seatView.micSeatInfo?.isRemoteMute() == true) {
+                            add(Pair(R.id.id_mic_operate_un_mute, getCompatString(R.string.room_mic_operate_un_mute)))
+                        } else {
+                            add(Pair(R.id.id_mic_operate_mute, getCompatString(R.string.room_mic_operate_mute)))
+                        }
+                    })
                 }
             } else {
                 //"我"是普通身份
                 if (isMicEmpty) {
                     //Ntd.
+                } else if (seatView.micIndex.index == onMicIndex) {
+                    //操作自己的麦位
+                    showMicActionList(seatView, mutableListOf<Pair<Int, String>>().apply {
+                        add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                        add(Pair(R.id.id_mic_operate_off, getCompatString(R.string.room_mic_operate_off)))
+                    })
+
                 } else {
-                    actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                    //actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                    Router.getRouterInstance<BottomDialogFragment>(Room.RoomMemberInfo.PATH)?.apply {
+                        arguments = Bundle().apply {
+                            putString(Room.Common.EXTRA_UID, seatView.micSeatInfo?.micUid())
+                        }
+                    }?.show(childFragmentManager)
                 }
             }
         } else {
@@ -163,22 +180,22 @@ class DispatchCenterSeatsTemplate :
                 return
             } else {
                 //麦上有人
-                actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                //actionList.add(Pair(R.id.id_mic_operate_member_info, getCompatString(R.string.room_mic_operate_member_info)))
+                Router.getRouterInstance<BottomDialogFragment>(Room.RoomMemberInfo.PATH)?.apply {
+                    arguments = Bundle().apply {
+                        putString(Room.Common.EXTRA_UID, seatView.micSeatInfo?.micUid())
+                    }
+                }?.show(childFragmentManager)
             }
 
         }
-
-        showMicActionList(seatView, actionList)
     }
 
     private fun showMicActionList(seatView: DispatchCenterSeatView, actionList: List<Pair<Int, String>>) {
         RoomTextActionDialog
             .Builder()
             .addTitle(
-                getCompatString(
-                    R.string.room_mic_index_title,
-                    seatView.micIndex.micName.invoke()
-                )
+                seatView.micIndex.micName.invoke()
             ).apply {
                 for (action in actionList) {
                     addItem(action.first, action.second)

+ 53 - 0
module/room/src/main/java/com/adealink/weparty/room/widget/RoomNameView.kt

@@ -0,0 +1,53 @@
+package com.adealink.weparty.room.widget
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.annotation.ColorInt
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.appcompat.widget.AppCompatTextView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.updateLayoutParams
+import com.adealink.weparty.commonui.ext.dp
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.room.databinding.WidgetRoomNameBinding
+
+class RoomNameView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr) {
+
+    private val binding = WidgetRoomNameBinding.inflate(LayoutInflater.from(context), this)
+
+    fun setLeftDrawable(drawable: Drawable?, size: Int = 11.dp(), marginEnd: Int = 2.dp()) {
+        if (drawable == null) {
+            binding.ivLeft.gone()
+            return
+        }
+        binding.ivLeft.show()
+        binding.ivLeft.setImageDrawable(drawable)
+        binding.ivLeft.updateLayoutParams<ConstraintLayout.LayoutParams> {
+            this.width = size
+            this.height = size
+            this.marginEnd = marginEnd
+        }
+    }
+
+    fun setNameColor(@ColorInt color: Int) {
+        binding.tvName.setTextColor(color)
+    }
+
+    fun setName(name: String?) {
+        binding.tvName.text = name
+    }
+
+    fun getLeftDrawable(): AppCompatImageView {
+        return binding.ivLeft
+    }
+
+    fun getNameTextView(): AppCompatTextView {
+        return binding.tvName
+    }
+
+}

+ 0 - 1
module/room/src/main/res/layout/fragment_home_room_list.xml

@@ -46,7 +46,6 @@
         android:id="@+id/v_error_view"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:layout_marginTop="10dp"
         android:visibility="gone"
         app:layout_constraintBottom_toBottomOf="@id/v_refresh"
         app:layout_constraintEnd_toEndOf="@id/v_refresh"

+ 1 - 1
module/room/src/main/res/layout/fragment_seats_template_dispatch_center.xml

@@ -74,7 +74,7 @@
     </androidx.constraintlayout.widget.ConstraintLayout>
 
     <!-- 嘉宾 -->
-    <com.adealink.weparty.room.micseat.dispatcenter.DispatchCenterMemberSeatView
+    <com.adealink.weparty.room.micseat.dispatcenter.DispatchCenterGuestSeatView
         android:id="@+id/mic_guest"
         android:layout_width="0dp"
         android:layout_height="wrap_content"

+ 1 - 1
module/room/src/main/res/layout/layout_how_to_guide_1.xml

@@ -67,7 +67,7 @@
             android:layout_height="33dp"
             android:layout_marginHorizontal="16dp"
             android:layout_marginTop="12dp"
-            android:background="@drawable/common_button_bg"
+            android:background="@drawable/common_button_bg2"
             android:minWidth="80dp"
             android:paddingHorizontal="10dp"
             app:layout_constraintEnd_toEndOf="parent"

+ 1 - 1
module/room/src/main/res/layout/layout_how_to_guide_2.xml

@@ -68,7 +68,7 @@
             android:layout_height="33dp"
             android:layout_marginHorizontal="16dp"
             android:layout_marginTop="12dp"
-            android:background="@drawable/common_button_bg"
+            android:background="@drawable/common_button_bg2"
             android:minWidth="80dp"
             android:paddingHorizontal="10dp"
             app:layout_constraintEnd_toEndOf="parent"

+ 1 - 1
module/room/src/main/res/layout/layout_how_to_guide_3.xml

@@ -68,7 +68,7 @@
             android:layout_height="33dp"
             android:layout_marginHorizontal="16dp"
             android:layout_marginTop="12dp"
-            android:background="@drawable/common_button_bg"
+            android:background="@drawable/common_button_bg2"
             android:minWidth="80dp"
             android:paddingHorizontal="10dp"
             app:layout_constraintEnd_toEndOf="parent"

+ 1 - 1
module/room/src/main/res/layout/layout_how_to_guide_4.xml

@@ -67,7 +67,7 @@
             android:layout_height="33dp"
             android:layout_marginHorizontal="16dp"
             android:layout_marginTop="12dp"
-            android:background="@drawable/common_button_bg"
+            android:background="@drawable/common_button_bg2"
             android:minWidth="80dp"
             android:paddingHorizontal="10dp"
             app:layout_constraintEnd_toEndOf="parent"

+ 39 - 0
module/room/src/main/res/layout/widget_room_name.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge 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="match_parent"
+    tools:background="@color/black"
+    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
+
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_left"
+        android:layout_width="11dp"
+        android:layout_height="11dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/tv_name"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/common_loading_ic" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:singleLine="true"
+        android:textColor="@color/white"
+        android:textSize="11sp"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/iv_left"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="Following" />
+
+</merge>