honghengqiang 3 anos atrás
pai
commit
308bf44377
48 arquivos alterados com 769 adições e 65 exclusões
  1. 2 0
      .idea/misc.xml
  2. 5 1
      app/src/main/java/com/swago/app/SwagoApp.kt
  3. 13 0
      baseswago/src/main/java/com/swago/baseswago/PayVm.kt
  4. 1 1
      baseswago/src/main/java/com/swago/baseswago/PersonDataDFragment.kt
  5. 13 4
      baseswago/src/main/java/com/swago/baseswago/dialog/BenefitBagDialog.kt
  6. 4 0
      baseswago/src/main/java/com/swago/baseswago/http/SwagoInterceptor.kt
  7. 4 0
      baseswago/src/main/java/com/swago/baseswago/inter/ApiManager.kt
  8. 18 0
      baseswago/src/main/java/com/swago/baseswago/inter/ConfigApi.kt
  9. 7 0
      baseswago/src/main/java/com/swago/baseswago/inter/PayApi.kt
  10. 11 0
      baseswago/src/main/java/com/swago/baseswago/model/BenefitModel.kt
  11. 9 0
      baseswago/src/main/java/com/swago/baseswago/model/ConfigModel.kt
  12. 20 0
      baseswago/src/main/java/com/swago/baseswago/model/UserInfoModel.java
  13. 2 1
      baseswago/src/main/java/com/swago/baseswago/model/im/RoomChatMsgBean.java
  14. 2 1
      baseswago/src/main/java/com/swago/baseswago/model/im/UserJoinRoomBean.java
  15. 9 0
      baseswago/src/main/java/com/swago/baseswago/model/live/RoomModel.java
  16. 8 1
      baseswago/src/main/java/com/swago/baseswago/model/live/game/GameInfoModel.kt
  17. 3 3
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/IMGiftModel.java
  18. 3 0
      baseswago/src/main/java/com/swago/baseswago/model/pay/PayModel.java
  19. 29 30
      baseswago/src/main/java/com/swago/baseswago/util/ActivityManagerUtil.java
  20. 4 2
      baseswago/src/main/java/com/swago/baseswago/util/BaseViewModel.kt
  21. 36 0
      baseswago/src/main/java/com/swago/baseswago/util/SwagoInfo.kt
  22. 3 3
      baseswago/src/main/res/layout/dialog_benefit_bag.xml
  23. BIN
      baseswago/src/main/res/mipmap-xxhdpi/default_avatar.png
  24. BIN
      baseswago/src/main/res/mipmap-xxhdpi/state_error_empty.png
  25. BIN
      baseswago/src/main/res/mipmap-xxhdpi/state_error_empty.webp
  26. BIN
      baseswago/src/main/res/mipmap-xxhdpi/win_num_prize.webp
  27. 1 0
      baseswago/src/main/res/values/strings.xml
  28. 3 0
      home/src/main/java/com/swago/home/HomeActivity.kt
  29. 12 0
      home/src/main/java/com/swago/home/innerhome/HomeVm.kt
  30. 1 1
      room/src/main/java/com/swago/room/adapter/RoomChatAdapter.kt
  31. 4 0
      room/src/main/java/com/swago/room/anchor/AnchorRoomFragment.kt
  32. 20 0
      room/src/main/java/com/swago/room/base/BaseComFragment.kt
  33. 1 1
      room/src/main/java/com/swago/room/bean/UserRoomModel.kt
  34. 3 0
      room/src/main/java/com/swago/room/dialog/SendMsgDialog.kt
  35. 44 14
      room/src/main/java/com/swago/room/game/GamePlayDialog.kt
  36. 9 0
      room/src/main/java/com/swago/room/gift/GiftDialog.kt
  37. 132 0
      room/src/main/java/com/swago/room/giftdandao/GiftDanDaoManager.kt
  38. 124 0
      room/src/main/java/com/swago/room/giftdandao/GiftDanDaoView.kt
  39. 10 0
      room/src/main/java/com/swago/room/vm/MsgVm.kt
  40. 2 2
      room/src/main/java/com/swago/room/vm/RoomVm.kt
  41. 7 0
      room/src/main/java/com/swago/room/widget/AnchorFooterView.kt
  42. 8 0
      room/src/main/res/drawable/shape_ffff9300_00ff9300_20.xml
  43. 14 0
      room/src/main/res/layout/dialog_gift.xml
  44. 23 0
      room/src/main/res/layout/fragment_base_com.xml
  45. 11 0
      room/src/main/res/layout/layout_anchor_footer_view.xml
  46. 11 0
      room/src/main/res/layout/layout_user_footer_view.xml
  47. 123 0
      room/src/main/res/layout/view_item_gift.xml
  48. BIN
      room/src/main/res/mipmap-xxhdpi/live_game.png

+ 2 - 0
.idea/misc.xml

@@ -87,6 +87,7 @@
         <entry key="room/src/main/res/drawable/shape_6c55ff_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_6c55ff_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_80000000_20.xml" value="0.3723076923076923" />
         <entry key="room/src/main/res/drawable/shape_80000000_20.xml" value="0.3723076923076923" />
         <entry key="room/src/main/res/drawable/shape_f8614b_8c2922_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_f8614b_8c2922_20.xml" value="0.3640625" />
+        <entry key="room/src/main/res/drawable/shape_ffff9300_00ff9300_20.xml" value="0.3871794871794872" />
         <entry key="room/src/main/res/layout/activity_anchor_room.xml" value="0.21302083333333333" />
         <entry key="room/src/main/res/layout/activity_anchor_room.xml" value="0.21302083333333333" />
         <entry key="room/src/main/res/layout/activity_rank_list.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/activity_rank_list.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/dialog_anchor_close.xml" value="0.25" />
         <entry key="room/src/main/res/layout/dialog_anchor_close.xml" value="0.25" />
@@ -112,6 +113,7 @@
         <entry key="room/src/main/res/layout/layout_user_header_view.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/layout_user_header_view.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/layout_user_room.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/layout_user_room.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/layout_view_waft.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/layout_view_waft.xml" value="0.39166666666666666" />
+        <entry key="room/src/main/res/layout/view_item_gift.xml" value="0.67" />
         <entry key="room/src/main/res/layout/view_svga.xml" value="0.3619791666666667" />
         <entry key="room/src/main/res/layout/view_svga.xml" value="0.3619791666666667" />
         <entry key="room/src/main/res/layout/view_waft.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/view_waft.xml" value="0.39166666666666666" />
         <entry key="tuikit/src/main/res/layout/activity_camera.xml" value="0.303125" />
         <entry key="tuikit/src/main/res/layout/activity_camera.xml" value="0.303125" />

+ 5 - 1
app/src/main/java/com/swago/app/SwagoApp.kt

@@ -3,6 +3,7 @@ package com.swago.app
 import android.app.Application
 import android.app.Application
 import android.content.Context
 import android.content.Context
 import android.net.http.HttpResponseCache
 import android.net.http.HttpResponseCache
+import androidx.fragment.app.FragmentActivity
 import androidx.multidex.MultiDex
 import androidx.multidex.MultiDex
 import com.alibaba.android.arouter.launcher.ARouter
 import com.alibaba.android.arouter.launcher.ARouter
 import com.google.firebase.analytics.ktx.analytics
 import com.google.firebase.analytics.ktx.analytics
@@ -61,7 +62,10 @@ class SwagoApp : Application() {
         TUIKitImpl.addIMEventListener(object:IMEventListener(){
         TUIKitImpl.addIMEventListener(object:IMEventListener(){
             override fun onForceOffline() {
             override fun onForceOffline() {
                 super.onForceOffline()
                 super.onForceOffline()
-                ForceOfflineDialog.newInstance().show(ActivityManagerUtil.get().currentActivity().supportFragmentManager,"ForceOfflineDialog")
+                val currentActivity = ActivityManagerUtil.get().currentActivity()
+                if (currentActivity is FragmentActivity){
+                    ForceOfflineDialog.newInstance().show(currentActivity.supportFragmentManager,"ForceOfflineDialog")
+                }
             }
             }
         })
         })
     }
     }

+ 13 - 0
baseswago/src/main/java/com/swago/baseswago/PayVm.kt

@@ -4,9 +4,11 @@ import android.app.Application
 import android.widget.Toast
 import android.widget.Toast
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.MutableLiveData
 import com.android.billingclient.api.Purchase
 import com.android.billingclient.api.Purchase
+import com.google.protobuf.Api
 import com.swago.baseswago.http.SwagoException
 import com.swago.baseswago.http.SwagoException
 import com.swago.baseswago.inter.ApiManager
 import com.swago.baseswago.inter.ApiManager
 import com.swago.baseswago.libpay.PayManager
 import com.swago.baseswago.libpay.PayManager
+import com.swago.baseswago.model.BenefitModel
 import com.swago.baseswago.model.pay.CoinModel
 import com.swago.baseswago.model.pay.CoinModel
 import com.swago.baseswago.model.pay.OrderModel
 import com.swago.baseswago.model.pay.OrderModel
 import com.swago.baseswago.util.*
 import com.swago.baseswago.util.*
@@ -96,8 +98,19 @@ class PayVm(application: Application) : BaseViewModel(application) {
         }
         }
     }
     }
 
 
+
+    val benefitLiveData by lazy {
+        MutableLiveData<BenefitModel>()
+    }
+
     /**
     /**
      * 获取特惠礼包
      * 获取特惠礼包
      */
      */
+    fun getBenefit(){
+        requestData {
+            val data = ApiManager.payApi.getBenefit()
+            benefitLiveData.value = data
+        }
+    }
 
 
 }
 }

+ 1 - 1
baseswago/src/main/java/com/swago/baseswago/PersonDataDFragment.kt

@@ -119,7 +119,7 @@ class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
             binding.tvFansNum.text = it.user_fans_num
             binding.tvFansNum.text = it.user_fans_num
             binding.tvFollowNum.text = it.user_follow_num
             binding.tvFollowNum.text = it.user_follow_num
             binding.tvAccount.text = AppContext.getContext().resources.getString(R.string.id_x).format(it.user_account)
             binding.tvAccount.text = AppContext.getContext().resources.getString(R.string.id_x).format(it.user_account)
-            binding.tvLevelView.setUserLevel(it.user_level.toInt())
+            binding.tvLevelView.setUserLevel(it.user_wealth_level.toInt())
             if (isFollow==1){
             if (isFollow==1){
                 binding.ivFollow.setImageResource(R.mipmap.followed)
                 binding.ivFollow.setImageResource(R.mipmap.followed)
             }else{
             }else{

+ 13 - 4
baseswago/src/main/java/com/swago/baseswago/dialog/BenefitBagDialog.kt

@@ -23,6 +23,8 @@ class BenefitBagDialog : BaseXDFragment<DialogBenefitBagBinding>(), IPayCallback
 
 
     private val payVm by viewModels<PayVm>()
     private val payVm by viewModels<PayVm>()
 
 
+    private var googleProductId = ""
+
     companion object{
     companion object{
         fun newInstance(): BenefitBagDialog {
         fun newInstance(): BenefitBagDialog {
             val args = Bundle()
             val args = Bundle()
@@ -34,6 +36,7 @@ class BenefitBagDialog : BaseXDFragment<DialogBenefitBagBinding>(), IPayCallback
 
 
     override fun initOther() {
     override fun initOther() {
         PayManager.listener.add(this)
         PayManager.listener.add(this)
+        payVm.getBenefit()
         binding.ivClose.setOnClickListener(object:NoDoubleClickListener(){
         binding.ivClose.setOnClickListener(object:NoDoubleClickListener(){
             override fun onClick() {
             override fun onClick() {
                 dismissAllowingStateLoss()
                 dismissAllowingStateLoss()
@@ -43,16 +46,22 @@ class BenefitBagDialog : BaseXDFragment<DialogBenefitBagBinding>(), IPayCallback
             override fun onClick() {
             override fun onClick() {
                 activity?.let {
                 activity?.let {
                     SwagoLoading.showLoadingDialog(it)
                     SwagoLoading.showLoadingDialog(it)
+                    PayManager.queryUnConsumeOrder(googleProductId)
                 }
                 }
-                //TODO 对接接口的时候在弄
-                //PayManager.queryUnConsumeOrder(adapter.data[selectedPosition].id)
             }
             }
-
         })
         })
     }
     }
 
 
     override fun initLiveData() {
     override fun initLiveData() {
-
+        payVm.benefitLiveData.observe(this){
+            binding.tvCoin.text = it.product_coins
+            googleProductId = it.google_product_id
+            val payModel = PayModel()
+            payModel.google_product_id = it.google_product_id
+            payModel.product_coins = it.product_coins
+            val list = ArrayList<PayModel>()
+            PayManager.queryProductPrice(list)
+        }
     }
     }
 
 
     override fun onDestroyView() {
     override fun onDestroyView() {

+ 4 - 0
baseswago/src/main/java/com/swago/baseswago/http/SwagoInterceptor.kt

@@ -17,6 +17,10 @@ class SwagoInterceptor : Interceptor {
             .newBuilder()
             .newBuilder()
             .addHeader("apiToken", getLoginModel()?.token?:"")
             .addHeader("apiToken", getLoginModel()?.token?:"")
             .addHeader("languageCode",SwagoInfo.getLanguageCode())
             .addHeader("languageCode",SwagoInfo.getLanguageCode())
+            .addHeader("app-client-version",SwagoInfo.getVersionCode())
+            .addHeader("app-client",SwagoInfo.getAppClient())
+            .addHeader("app-client-device",SwagoInfo.getDeviceInfo())
+            .addHeader("app-client-channel",SwagoInfo.getChannel())
             .build()
             .build()
         return chain.proceed(request)
         return chain.proceed(request)
     }
     }

+ 4 - 0
baseswago/src/main/java/com/swago/baseswago/inter/ApiManager.kt

@@ -8,6 +8,10 @@ import com.swago.baseswago.util.createService
  */
  */
 object ApiManager {
 object ApiManager {
 
 
+    val configApi by lazy {
+        createService(ConfigApi::class.java)
+    }
+
     val loginApi by lazy {
     val loginApi by lazy {
         createService(LoginApi::class.java)
         createService(LoginApi::class.java)
     }
     }

+ 18 - 0
baseswago/src/main/java/com/swago/baseswago/inter/ConfigApi.kt

@@ -0,0 +1,18 @@
+package com.swago.baseswago.inter
+
+import com.swago.baseswago.model.ConfigModel
+import retrofit2.http.GET
+
+/**
+ *@date 2022/1/23 10:32
+ *description:
+ */
+interface ConfigApi {
+
+    /**
+     * 系统配置
+     */
+    @GET("/v1/home/config")
+    suspend fun getAppConfig(): ConfigModel
+
+}

+ 7 - 0
baseswago/src/main/java/com/swago/baseswago/inter/PayApi.kt

@@ -1,5 +1,6 @@
 package com.swago.baseswago.inter
 package com.swago.baseswago.inter
 
 
+import com.swago.baseswago.model.BenefitModel
 import com.swago.baseswago.model.pay.CoinModel
 import com.swago.baseswago.model.pay.CoinModel
 import com.swago.baseswago.model.pay.OrderModel
 import com.swago.baseswago.model.pay.OrderModel
 import com.swago.baseswago.model.pay.PayModel
 import com.swago.baseswago.model.pay.PayModel
@@ -47,4 +48,10 @@ interface PayApi {
     @GET("/v1/user/coins")
     @GET("/v1/user/coins")
     suspend fun getCoins(): CoinModel
     suspend fun getCoins(): CoinModel
 
 
+    /**
+     * 特惠礼包配置
+     */
+    @GET("/v1/rtc/discount/package")
+    suspend fun getBenefit(): BenefitModel
+
 }
 }

+ 11 - 0
baseswago/src/main/java/com/swago/baseswago/model/BenefitModel.kt

@@ -0,0 +1,11 @@
+package com.swago.baseswago.model
+
+/**
+ *@date 2022/1/23 14:58
+ *description:
+ */
+data class BenefitModel(
+    val google_product_id:String,
+    val product_coins:String,
+    val product_id:String
+)

+ 9 - 0
baseswago/src/main/java/com/swago/baseswago/model/ConfigModel.kt

@@ -0,0 +1,9 @@
+package com.swago.baseswago.model
+
+/**
+ *@date 2022/1/23 10:34
+ *description:
+ */
+data class ConfigModel(
+    val game_url : String
+)

+ 20 - 0
baseswago/src/main/java/com/swago/baseswago/model/UserInfoModel.java

@@ -41,6 +41,10 @@ public class UserInfoModel {
     private String next_wealth_need_jingyan;
     private String next_wealth_need_jingyan;
     private String next_user_level;
     private String next_user_level;
     private String next_user_need_jingyan;
     private String next_user_need_jingyan;
+    private int is_benefit;
+    private int is_new;
+
+
 
 
 
 
     public String getUser_constellation() {
     public String getUser_constellation() {
@@ -226,4 +230,20 @@ public class UserInfoModel {
     public void setNext_user_need_jingyan(String next_user_need_jingyan) {
     public void setNext_user_need_jingyan(String next_user_need_jingyan) {
         this.next_user_need_jingyan = next_user_need_jingyan;
         this.next_user_need_jingyan = next_user_need_jingyan;
     }
     }
+
+    public int getIs_benefit() {
+        return is_benefit;
+    }
+
+    public void setIs_benefit(int is_benefit) {
+        this.is_benefit = is_benefit;
+    }
+
+    public int getIs_new() {
+        return is_new;
+    }
+
+    public void setIs_new(int is_new) {
+        this.is_new = is_new;
+    }
 }
 }

+ 2 - 1
baseswago/src/main/java/com/swago/baseswago/model/im/RoomChatMsgBean.java

@@ -15,6 +15,7 @@ public class RoomChatMsgBean implements IRoomChat {
     public String sendName;
     public String sendName;
     public String content;
     public String content;
     public int senderLevel;
     public int senderLevel;
+    public int isBenefit;
 
 
 
 
     @NonNull
     @NonNull
@@ -41,6 +42,6 @@ public class RoomChatMsgBean implements IRoomChat {
 
 
     @Override
     @Override
     public int getIsBenefit() {
     public int getIsBenefit() {
-        return 0;
+        return isBenefit;
     }
     }
 }
 }

+ 2 - 1
baseswago/src/main/java/com/swago/baseswago/model/im/UserJoinRoomBean.java

@@ -21,6 +21,7 @@ public class UserJoinRoomBean implements IRoomChat {
     public String hotValue;
     public String hotValue;
     public String userAvatar;
     public String userAvatar;
     public int senderLevel;
     public int senderLevel;
+    public int isBenefit;
 
 
     @NonNull
     @NonNull
     @Override
     @Override
@@ -46,6 +47,6 @@ public class UserJoinRoomBean implements IRoomChat {
 
 
     @Override
     @Override
     public int getIsBenefit() {
     public int getIsBenefit() {
-        return 0;
+        return isBenefit;
     }
     }
 }
 }

+ 9 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/RoomModel.java

@@ -31,6 +31,7 @@ public class RoomModel {
     private String im_group_id;
     private String im_group_id;
     private int is_follow;
     private int is_follow;
     private String broadcast_income_coins;
     private String broadcast_income_coins;
+    private int anchor_type;
 
 
     public String getRtc_token() {
     public String getRtc_token() {
         return rtc_token;
         return rtc_token;
@@ -127,4 +128,12 @@ public class RoomModel {
     public void setBroadcast_income_coins(String broadcast_income_coins) {
     public void setBroadcast_income_coins(String broadcast_income_coins) {
         this.broadcast_income_coins = broadcast_income_coins;
         this.broadcast_income_coins = broadcast_income_coins;
     }
     }
+
+    public int getAnchor_type() {
+        return anchor_type;
+    }
+
+    public void setAnchor_type(int anchor_type) {
+        this.anchor_type = anchor_type;
+    }
 }
 }

+ 8 - 1
baseswago/src/main/java/com/swago/baseswago/model/live/game/GameInfoModel.kt

@@ -9,5 +9,12 @@ data class GameInfoModel (
     val userId:String,
     val userId:String,
     val anchorId:String,
     val anchorId:String,
     val anchorType:Int,
     val anchorType:Int,
-    val language:String
+    val language:String,
+    val appVersion:String,
+    val appClient:String,
+    val deviceInfo:String,
+    val appChannel:String,
+    val gameUrl:String,
+    val gameType:String,
+    val token:String
     )
     )

+ 3 - 3
baseswago/src/main/java/com/swago/baseswago/model/live/gift/IMGiftModel.java

@@ -39,7 +39,7 @@ public class IMGiftModel {
     private String giftName;
     private String giftName;
     private String giftIcon;
     private String giftIcon;
     private String giftNum;
     private String giftNum;
-    private String isCombo;
+    private int isCombo;
     private String svga;
     private String svga;
     private String incomeCount;
     private String incomeCount;
     private int multiple;
     private int multiple;
@@ -149,11 +149,11 @@ public class IMGiftModel {
         this.giftNum = giftNum;
         this.giftNum = giftNum;
     }
     }
 
 
-    public String getIsCombo() {
+    public int getIsCombo() {
         return isCombo;
         return isCombo;
     }
     }
 
 
-    public void setIsCombo(String isCombo) {
+    public void setIsCombo(int isCombo) {
         this.isCombo = isCombo;
         this.isCombo = isCombo;
     }
     }
 
 

+ 3 - 0
baseswago/src/main/java/com/swago/baseswago/model/pay/PayModel.java

@@ -9,6 +9,9 @@ import android.os.Parcelable;
  */
  */
 public class PayModel implements Parcelable {
 public class PayModel implements Parcelable {
 
 
+    public PayModel() {
+    }
+
     private String id;
     private String id;
     private String product_name;
     private String product_name;
     private String product_price;
     private String product_price;

+ 29 - 30
baseswago/src/main/java/com/swago/baseswago/util/ActivityManagerUtil.java

@@ -10,7 +10,6 @@ import android.os.Bundle;
 import android.util.Log;
 import android.util.Log;
 
 
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.RequiresPermission;
-import androidx.fragment.app.FragmentActivity;
 
 
 import java.lang.ref.WeakReference;
 import java.lang.ref.WeakReference;
 import java.util.List;
 import java.util.List;
@@ -22,11 +21,11 @@ import java.util.Stack;
  */
  */
 public class ActivityManagerUtil {
 public class ActivityManagerUtil {
 
 
-    private static Stack<WeakReference<FragmentActivity>> activityStack;
+    private static Stack<WeakReference<Activity>> activityStack;
     private static ActivityManagerUtil instance;
     private static ActivityManagerUtil instance;
 
 
     private ActivityManagerUtil() {
     private ActivityManagerUtil() {
-        activityStack = new Stack<WeakReference<FragmentActivity>>();
+        activityStack = new Stack<WeakReference<Activity>>();
     }
     }
 
 
     public static ActivityManagerUtil get() {
     public static ActivityManagerUtil get() {
@@ -49,7 +48,7 @@ public class ActivityManagerUtil {
      */
      */
     public int size() {
     public int size() {
         if (activityStack == null) {
         if (activityStack == null) {
-            activityStack = new Stack<WeakReference<FragmentActivity>>();
+            activityStack = new Stack<WeakReference<Activity>>();
         }
         }
         return activityStack.size();
         return activityStack.size();
     }
     }
@@ -60,7 +59,7 @@ public class ActivityManagerUtil {
      * @param cls
      * @param cls
      * @return
      * @return
      */
      */
-    public boolean hasActivity(Class<? extends FragmentActivity> cls) {
+    public boolean hasActivity(Class<? extends Activity> cls) {
         for (int i = 0; i < activityStack.size(); i++) {
         for (int i = 0; i < activityStack.size(); i++) {
             if (activityStack.get(i) != null & activityStack.get(i).get() != null && activityStack.get(i).get().getClass().equals(cls)) {
             if (activityStack.get(i) != null & activityStack.get(i).get() != null && activityStack.get(i).get().getClass().equals(cls)) {
                 return true;
                 return true;
@@ -72,16 +71,16 @@ public class ActivityManagerUtil {
     /**
     /**
      * 获取指定的Activity
      * 获取指定的Activity
      */
      */
-    public static FragmentActivity getActivity(Class<? extends FragmentActivity> cls) {
-        WeakReference<FragmentActivity> weakReference = findWeakByActivityCls(cls);
+    public static Activity getActivity(Class<? extends Activity> cls) {
+        WeakReference<Activity> weakReference = findWeakByActivityCls(cls);
         if (weakReference != null) {
         if (weakReference != null) {
             return weakReference.get();
             return weakReference.get();
         }
         }
         return null;
         return null;
     }
     }
 
 
-    private static WeakReference<FragmentActivity> findWeakByActivity(FragmentActivity activity) {
-        for (WeakReference<FragmentActivity> weakReference : activityStack) {
+    private static WeakReference<Activity> findWeakByActivity(Activity activity) {
+        for (WeakReference<Activity> weakReference : activityStack) {
             if (weakReference.get() != null && weakReference.get() == activity) {
             if (weakReference.get() != null && weakReference.get() == activity) {
                 return weakReference;
                 return weakReference;
             }
             }
@@ -89,8 +88,8 @@ public class ActivityManagerUtil {
         return null;
         return null;
     }
     }
 
 
-    private static WeakReference<FragmentActivity> findWeakByActivityCls(Class<? extends FragmentActivity> activityClass) {
-        for (WeakReference<FragmentActivity> weakReference : activityStack) {
+    private static WeakReference<Activity> findWeakByActivityCls(Class<? extends Activity> activityClass) {
+        for (WeakReference<Activity> weakReference : activityStack) {
             if (weakReference.get() != null && weakReference.get().getClass().equals(activityClass)) {
             if (weakReference.get() != null && weakReference.get().getClass().equals(activityClass)) {
                 return weakReference;
                 return weakReference;
             }
             }
@@ -103,9 +102,9 @@ public class ActivityManagerUtil {
      *
      *
      * @return
      * @return
      */
      */
-    public FragmentActivity currentActivity() {
+    public Activity currentActivity() {
         if (!activityStack.isEmpty()) {
         if (!activityStack.isEmpty()) {
-            WeakReference<FragmentActivity> temp = activityStack.lastElement();
+            WeakReference<Activity> temp = activityStack.lastElement();
             if (temp.get() != null) {
             if (temp.get() != null) {
                 return temp.get();
                 return temp.get();
             }
             }
@@ -117,7 +116,7 @@ public class ActivityManagerUtil {
      * 销毁栈顶的activity
      * 销毁栈顶的activity
      */
      */
     public void finishTopActivity() {
     public void finishTopActivity() {
-        WeakReference<FragmentActivity> activity = activityStack.lastElement();
+        WeakReference<Activity> activity = activityStack.lastElement();
         if (activity != null && activity.get() != null) {
         if (activity != null && activity.get() != null) {
             activity.get().finish();
             activity.get().finish();
 
 
@@ -130,9 +129,9 @@ public class ActivityManagerUtil {
      *
      *
      * @param activityClass
      * @param activityClass
      */
      */
-    public void finishActivity(Class<? extends FragmentActivity> activityClass) {
+    public void finishActivity(Class<? extends Activity> activityClass) {
         for (int i = 0; i < activityStack.size(); i++) {
         for (int i = 0; i < activityStack.size(); i++) {
-            WeakReference<FragmentActivity> activity = activityStack.elementAt(i);
+            WeakReference<Activity> activity = activityStack.elementAt(i);
             if (activity != null && activity.get() != null && activity.get().getClass().equals(activityClass)) {
             if (activity != null && activity.get() != null && activity.get().getClass().equals(activityClass)) {
                 finishActivity(activity.get());
                 finishActivity(activity.get());
                 return;
                 return;
@@ -145,9 +144,9 @@ public class ActivityManagerUtil {
      *
      *
      * @param activity
      * @param activity
      */
      */
-    public void finishActivity(FragmentActivity activity) {
+    public void finishActivity(Activity activity) {
         if (activity != null) {
         if (activity != null) {
-            WeakReference<FragmentActivity> weakReference = findWeakByActivity(activity);
+            WeakReference<Activity> weakReference = findWeakByActivity(activity);
             if (weakReference != null) {
             if (weakReference != null) {
                 if (weakReference.get() != null) {
                 if (weakReference.get() != null) {
                     weakReference.get().finish();
                     weakReference.get().finish();
@@ -164,7 +163,7 @@ public class ActivityManagerUtil {
         if (activityStack == null || activityStack.isEmpty()) {
         if (activityStack == null || activityStack.isEmpty()) {
             return;
             return;
         }
         }
-        for (WeakReference<FragmentActivity> weakReference : activityStack) {
+        for (WeakReference<Activity> weakReference : activityStack) {
             if (weakReference != null && weakReference.get() != null) {
             if (weakReference != null && weakReference.get() != null) {
                 weakReference.get().finish();
                 weakReference.get().finish();
             }
             }
@@ -183,7 +182,7 @@ public class ActivityManagerUtil {
             if (size() <= 1) {
             if (size() <= 1) {
                 break;
                 break;
             }
             }
-            FragmentActivity activity = currentActivity();
+            Activity activity = currentActivity();
             if (activity == null) {
             if (activity == null) {
                 break;
                 break;
             }
             }
@@ -196,7 +195,7 @@ public class ActivityManagerUtil {
      *
      *
      * @param cls
      * @param cls
      */
      */
-    public void popAllActivityExceptOne(Class<? extends FragmentActivity> cls) {
+    public void popAllActivityExceptOne(Class<? extends Activity> cls) {
         if (activityStack.isEmpty()) {
         if (activityStack.isEmpty()) {
             return;
             return;
         }
         }
@@ -206,7 +205,7 @@ public class ActivityManagerUtil {
             if (i >= size) {
             if (i >= size) {
                 return;
                 return;
             }
             }
-            WeakReference<FragmentActivity> weakReference = activityStack.get(i);
+            WeakReference<Activity> weakReference = activityStack.get(i);
             i++;
             i++;
             if (weakReference == null || weakReference.get() == null) {
             if (weakReference == null || weakReference.get() == null) {
                 i--;
                 i--;
@@ -247,14 +246,14 @@ public class ActivityManagerUtil {
      *
      *
      * @param activity
      * @param activity
      */
      */
-    private void pushActivity(FragmentActivity activity) {
+    private void pushActivity(Activity activity) {
         Log.i("ActivityManager", "当前入栈activity ===>>>" + activity.getClass().getSimpleName());
         Log.i("ActivityManager", "当前入栈activity ===>>>" + activity.getClass().getSimpleName());
         if (activityStack == null) {
         if (activityStack == null) {
-            activityStack = new Stack<WeakReference<FragmentActivity>>();
+            activityStack = new Stack<WeakReference<Activity>>();
         }
         }
-        WeakReference<FragmentActivity> item = findWeakByActivity(activity);
+        WeakReference<Activity> item = findWeakByActivity(activity);
         if (item == null) {
         if (item == null) {
-            activityStack.add(new WeakReference<FragmentActivity>(activity));
+            activityStack.add(new WeakReference<Activity>(activity));
         }
         }
     }
     }
 
 
@@ -263,9 +262,9 @@ public class ActivityManagerUtil {
      *
      *
      * @param activity
      * @param activity
      */
      */
-    private void removeActivity(FragmentActivity activity) {
+    private void removeActivity(Activity activity) {
         Log.i("ActivityManager", "当前出栈activity ===>>>" + activity.getClass().getSimpleName());
         Log.i("ActivityManager", "当前出栈activity ===>>>" + activity.getClass().getSimpleName());
-        for (WeakReference<FragmentActivity> weakReference : activityStack) {
+        for (WeakReference<Activity> weakReference : activityStack) {
             if (weakReference != null && weakReference.get() != null && weakReference.get() == activity) {
             if (weakReference != null && weakReference.get() != null && weakReference.get() == activity) {
                 activityStack.remove(weakReference);
                 activityStack.remove(weakReference);
                 return;
                 return;
@@ -277,7 +276,7 @@ public class ActivityManagerUtil {
 
 
         @Override
         @Override
         public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
         public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
-            pushActivity((FragmentActivity) activity);
+            pushActivity((Activity) activity);
         }
         }
 
 
         @Override
         @Override
@@ -307,7 +306,7 @@ public class ActivityManagerUtil {
 
 
         @Override
         @Override
         public void onActivityDestroyed(Activity activity) {
         public void onActivityDestroyed(Activity activity) {
-            removeActivity((FragmentActivity) activity);
+            removeActivity((Activity) activity);
         }
         }
     }
     }
 
 

+ 4 - 2
baseswago/src/main/java/com/swago/baseswago/util/BaseViewModel.kt

@@ -61,15 +61,17 @@ open class BaseViewModel(application: Application) : AndroidViewModel(applicatio
     }
     }
 
 
 
 
-    fun requestData2(callback: CoroutineScopeX.() -> Unit) {
+    fun requestData2(isShowToast:Boolean=true,callback: CoroutineScopeX.() -> Unit) {
         GlobalScope.launch(Dispatchers.Main) {
         GlobalScope.launch(Dispatchers.Main) {
             val block = CoroutineScopeX()
             val block = CoroutineScopeX()
             callback.invoke(block)
             callback.invoke(block)
             try {
             try {
                 block.requestData.invoke(this)
                 block.requestData.invoke(this)
             } catch (e: Exception) {
             } catch (e: Exception) {
-                Toast.makeText(AppContext.getContext(), e.message, Toast.LENGTH_SHORT).show()
                 if (e is SwagoException) {
                 if (e is SwagoException) {
+                    if (isShowToast){
+                        Toast.makeText(AppContext.getContext(), e.message, Toast.LENGTH_SHORT).show()
+                    }
                     if (e.code == 403) {
                     if (e.code == 403) {
                         if (UserInfo.getLoginModel()?.token?.isNotEmpty() == true){
                         if (UserInfo.getLoginModel()?.token?.isNotEmpty() == true){
                             UserInfo.clearUserInfo()
                             UserInfo.clearUserInfo()

+ 36 - 0
baseswago/src/main/java/com/swago/baseswago/util/SwagoInfo.kt

@@ -1,5 +1,7 @@
 package com.swago.baseswago.util
 package com.swago.baseswago.util
 
 
+import android.os.Build
+import android.text.TextUtils
 import java.util.*
 import java.util.*
 
 
 /**
 /**
@@ -8,7 +10,13 @@ import java.util.*
  */
  */
 object SwagoInfo {
 object SwagoInfo {
 
 
+    private var versionCode = ""
     private var languageCode = "en"
     private var languageCode = "en"
+    private var appClient = "android"
+    private var channel = "DDD01"
+
+    //配置信息
+    var gameBaseUrl = ""
 
 
     fun getLanguageCode(): String {
     fun getLanguageCode(): String {
         val language = Locale.getDefault().language
         val language = Locale.getDefault().language
@@ -26,4 +34,32 @@ object SwagoInfo {
         return languageCode
         return languageCode
     }
     }
 
 
+
+    fun getDeviceInfo():String{
+        return Build.BRAND + "--" + Build.MODEL
+    }
+
+    fun getVersionCode():String{
+        if (TextUtils.isEmpty(versionCode)) {
+            versionCode = try {
+                val context = AppContext.getContext()
+                val packageManager = context.packageManager
+                val info = packageManager.getPackageInfo(context.packageName, 0)
+                info.versionCode.toString()
+            } catch (e: Exception) {
+                e.printStackTrace()
+                "-1"
+            }
+        }
+        return versionCode
+    }
+
+    fun getAppClient():String{
+        return appClient
+    }
+
+    fun getChannel():String{
+        return channel
+    }
+
 }
 }

+ 3 - 3
baseswago/src/main/res/layout/dialog_benefit_bag.xml

@@ -66,9 +66,9 @@
                     android:layout_height="wrap_content"/>
                     android:layout_height="wrap_content"/>
 
 
                 <TextView
                 <TextView
+                    android:id="@+id/tvCoin"
                     android:textSize="16dp"
                     android:textSize="16dp"
                     android:textColor="#FFAE34"
                     android:textColor="#FFAE34"
-                    android:text="10000"
                     android:layout_marginBottom="5dp"
                     android:layout_marginBottom="5dp"
                     android:layout_width="wrap_content"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"/>
                     android:layout_height="wrap_content"/>
@@ -104,7 +104,7 @@
                 <TextView
                 <TextView
                     android:textSize="16dp"
                     android:textSize="16dp"
                     android:textColor="#FFAE34"
                     android:textColor="#FFAE34"
-                    android:text="10000"
+                    android:text="24*h"
                     android:layout_marginBottom="5dp"
                     android:layout_marginBottom="5dp"
                     android:layout_width="wrap_content"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"/>
                     android:layout_height="wrap_content"/>
@@ -141,7 +141,7 @@
                 <TextView
                 <TextView
                     android:textSize="16dp"
                     android:textSize="16dp"
                     android:textColor="#FFAE34"
                     android:textColor="#FFAE34"
-                    android:text="10000"
+                    android:text="24*h"
                     android:layout_marginBottom="5dp"
                     android:layout_marginBottom="5dp"
                     android:layout_width="wrap_content"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"/>
                     android:layout_height="wrap_content"/>

BIN
baseswago/src/main/res/mipmap-xxhdpi/default_avatar.png


BIN
baseswago/src/main/res/mipmap-xxhdpi/state_error_empty.png


BIN
baseswago/src/main/res/mipmap-xxhdpi/state_error_empty.webp


BIN
baseswago/src/main/res/mipmap-xxhdpi/win_num_prize.webp


+ 1 - 0
baseswago/src/main/res/values/strings.xml

@@ -101,4 +101,5 @@
     <string name="login_anthor_device">Your account is already logged in on another device</string>
     <string name="login_anthor_device">Your account is already logged in on another device</string>
     <string name="lucky">Lucky</string>
     <string name="lucky">Lucky</string>
     <string name="live">Live</string>
     <string name="live">Live</string>
+    <string name="win_num_prize">Win %s coins</string>
 </resources>
 </resources>

+ 3 - 0
home/src/main/java/com/swago/home/HomeActivity.kt

@@ -26,6 +26,7 @@ import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.IMUtil
 import com.swago.baseswago.util.IMUtil
 import com.swago.baseswago.util.UserInfo
 import com.swago.baseswago.util.UserInfo
 import com.swago.home.databinding.ActivityHomeBinding
 import com.swago.home.databinding.ActivityHomeBinding
+import com.swago.home.innerhome.HomeVm
 import com.swago.home.official.OfficialVm
 import com.swago.home.official.OfficialVm
 import com.tencent.qcloud.tim.uikit.TUIKit
 import com.tencent.qcloud.tim.uikit.TUIKit
 import com.tencent.qcloud.tim.uikit.base.IUIKitCallBack
 import com.tencent.qcloud.tim.uikit.base.IUIKitCallBack
@@ -38,6 +39,7 @@ import com.tencent.qcloud.tim.uikit.base.IUIKitCallBack
 class HomeActivity : BaseXActivity<ActivityHomeBinding>(), IPayCallback {
 class HomeActivity : BaseXActivity<ActivityHomeBinding>(), IPayCallback {
 
 
     private val officialVm by viewModels<OfficialVm>()
     private val officialVm by viewModels<OfficialVm>()
+    private val homeVm by viewModels<HomeVm>()
     private val payVm by viewModels<PayVm>()
     private val payVm by viewModels<PayVm>()
 
 
     private val listFragment =
     private val listFragment =
@@ -55,6 +57,7 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>(), IPayCallback {
     override fun initOther() {
     override fun initOther() {
         PayManager.init()
         PayManager.init()
         IMMessageManager.groupMessageParser.add(GroupMsgParser())
         IMMessageManager.groupMessageParser.add(GroupMsgParser())
+        homeVm.getAppConfig()
 
 
         binding.viewPager.offscreenPageLimit = 3
         binding.viewPager.offscreenPageLimit = 3
         binding.rg.setOnCheckedChangeListener { _, checkedId ->
         binding.rg.setOnCheckedChangeListener { _, checkedId ->

+ 12 - 0
home/src/main/java/com/swago/home/innerhome/HomeVm.kt

@@ -7,6 +7,7 @@ import com.swago.baseswago.inter.ApiManager
 import com.swago.baseswago.model.MomentModel
 import com.swago.baseswago.model.MomentModel
 import com.swago.baseswago.model.home.BannerModel
 import com.swago.baseswago.model.home.BannerModel
 import com.swago.baseswago.util.BaseViewModel
 import com.swago.baseswago.util.BaseViewModel
+import com.swago.baseswago.util.SwagoInfo
 import kotlinx.coroutines.async
 import kotlinx.coroutines.async
 
 
 /**
 /**
@@ -64,4 +65,15 @@ class HomeVm(application: Application) : BaseViewModel(application) {
         }
         }
     }
     }
 
 
+
+    /**
+     * 获取配置
+     */
+    fun getAppConfig(){
+        requestData {
+            val data = ApiManager.configApi.getAppConfig()
+            SwagoInfo.gameBaseUrl = data.game_url
+        }
+    }
+
 }
 }

+ 1 - 1
room/src/main/java/com/swago/room/adapter/RoomChatAdapter.kt

@@ -56,7 +56,7 @@ class RoomChatAdapter :
                         .append(LEVEL_KEY).append(".png")
                         .append(LEVEL_KEY).append(".png")
                         .append("'>")
                         .append("'>")
 
 
-                    if (item.getIsBenefit() == 0) {
+                    if (item.getIsBenefit() == 1) {
                         count++
                         count++
                         sb.append("<img src='" + "file:///android_asset/icon_chat_benefit.png")
                         sb.append("<img src='" + "file:///android_asset/icon_chat_benefit.png")
                             .append("'>")
                             .append("'>")

+ 4 - 0
room/src/main/java/com/swago/room/anchor/AnchorRoomFragment.kt

@@ -41,6 +41,10 @@ class AnchorRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
             openMessageListDialog()
             openMessageListDialog()
         }
         }
 
 
+        footerView.openGameFun = {
+            openGameDialog()
+        }
+
         val headerView = iHeader as AnchorHeaderView
         val headerView = iHeader as AnchorHeaderView
         headerView.showUserInfo = {
         headerView.showUserInfo = {
             PersonDataDFragment.newInstance(it).show(childFragmentManager,"PersonDataDFragment")
             PersonDataDFragment.newInstance(it).show(childFragmentManager,"PersonDataDFragment")

+ 20 - 0
room/src/main/java/com/swago/room/base/BaseComFragment.kt

@@ -23,7 +23,9 @@ import com.swago.room.adapter.RoomChatAdapter
 import com.swago.room.databinding.FragmentBaseComBinding
 import com.swago.room.databinding.FragmentBaseComBinding
 import com.swago.room.dialog.MessageListDialog
 import com.swago.room.dialog.MessageListDialog
 import com.swago.room.dialog.SendMsgDialog
 import com.swago.room.dialog.SendMsgDialog
+import com.swago.room.game.GamePlayDialog
 import com.swago.room.gift.control.SvgPlayerManager
 import com.swago.room.gift.control.SvgPlayerManager
+import com.swago.room.giftdandao.GiftDanDaoManager
 import com.swago.room.inter.IFooter
 import com.swago.room.inter.IFooter
 import com.swago.room.inter.IHeader
 import com.swago.room.inter.IHeader
 import com.swago.room.piaotiao.WaftManager
 import com.swago.room.piaotiao.WaftManager
@@ -45,6 +47,7 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
     abstract val iFooter : IFooter
     abstract val iFooter : IFooter
 
 
     var dialog:SendMsgDialog? = null
     var dialog:SendMsgDialog? = null
+    var gameDialog:GamePlayDialog? = null
     var msgListDialog:MessageListDialog? = null
     var msgListDialog:MessageListDialog? = null
 
 
     private val chatAdapter by lazy {
     private val chatAdapter by lazy {
@@ -59,6 +62,10 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
         WaftManager()
         WaftManager()
     }
     }
 
 
+    private val danDaoManager by lazy {
+        GiftDanDaoManager()
+    }
+
     private val dataChatList = CopyOnWriteArrayList<IRoomChat>()
     private val dataChatList = CopyOnWriteArrayList<IRoomChat>()
 
 
     override fun loadData() {
     override fun loadData() {
@@ -75,6 +82,11 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
         waftManager.init()
         waftManager.init()
         waftManager.waftViewList.add(binding.waftView)
         waftManager.waftViewList.add(binding.waftView)
         waftManager.waftViewList.add(binding.waftView2)
         waftManager.waftViewList.add(binding.waftView2)
+        //弹道
+        danDaoManager.init()
+        danDaoManager.giftDanDaoViewList.add(binding.danDaoView)
+        danDaoManager.giftDanDaoViewList.add(binding.danDaoView2)
+        danDaoManager.giftDanDaoViewList.add(binding.danDaoView3)
 
 
         val layoutManager = LinearLayoutManager(context)
         val layoutManager = LinearLayoutManager(context)
         layoutManager.stackFromEnd = true
         layoutManager.stackFromEnd = true
@@ -116,6 +128,9 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
             //飘条
             //飘条
             waftManager.addNewMessage(it)
             waftManager.addNewMessage(it)
         }
         }
+        msgVm.showGiftDanDao = {
+            danDaoManager.addNewMessage(it)
+        }
     }
     }
 
 
     private fun addChatMsgToRv(it: IRoomChat?) {
     private fun addChatMsgToRv(it: IRoomChat?) {
@@ -185,6 +200,11 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
         msgListDialog?.show(childFragmentManager,"MessageListDialog")
         msgListDialog?.show(childFragmentManager,"MessageListDialog")
     }
     }
 
 
+    fun openGameDialog(){
+        gameDialog = GamePlayDialog.newInstance("http://game.swago.cn")
+        gameDialog?.show(childFragmentManager,"GamePlayDialog")
+    }
+
     override fun closeRoomed() {
     override fun closeRoomed() {
         RoomTimer.timeTickList.remove(this)
         RoomTimer.timeTickList.remove(this)
     }
     }

+ 1 - 1
room/src/main/java/com/swago/room/bean/UserRoomModel.kt

@@ -33,7 +33,7 @@ class UserRoomModel :  IRoomInfo{
     }
     }
 
 
     override fun getAnchorType(): Int {
     override fun getAnchorType(): Int {
-        return RoleType.user
+        return roomModel?.anchor_type?:0
     }
     }
 
 
     override fun getRoomId(): String {
     override fun getRoomId(): String {

+ 3 - 0
room/src/main/java/com/swago/room/dialog/SendMsgDialog.kt

@@ -97,11 +97,14 @@ class SendMsgDialog : BaseXDFragment<DialogSendMsgBinding>() {
                         roomChatMsgBean.content = content
                         roomChatMsgBean.content = content
                         roomChatMsgBean.sendName = it.user_name
                         roomChatMsgBean.sendName = it.user_name
                         roomChatMsgBean.senderId = it.id
                         roomChatMsgBean.senderId = it.id
+                        roomChatMsgBean.senderLevel = it.user_wealth_level.toInt()
                         addSenderMsgToRoomChatList?.invoke(roomChatMsgBean)
                         addSenderMsgToRoomChatList?.invoke(roomChatMsgBean)
 
 
                         val jsonObject = JSONObject()
                         val jsonObject = JSONObject()
                         jsonObject.put("senderId", it.id)
                         jsonObject.put("senderId", it.id)
                         jsonObject.put("sendName", it.user_name)
                         jsonObject.put("sendName", it.user_name)
+                        jsonObject.put("senderLevel", it.user_wealth_level)
+                        jsonObject.put("isBenefit", it.is_benefit)
                         jsonObject.put("content", content)
                         jsonObject.put("content", content)
 
 
                         val jsonObjectType = JSONObject()
                         val jsonObjectType = JSONObject()

+ 44 - 14
room/src/main/java/com/swago/room/game/GamePlayDialog.kt

@@ -9,9 +9,12 @@ import android.webkit.WebView
 import android.webkit.WebViewClient
 import android.webkit.WebViewClient
 import android.widget.FrameLayout
 import android.widget.FrameLayout
 import com.google.gson.Gson
 import com.google.gson.Gson
+import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.dialog.BaseXDFragment
 import com.swago.baseswago.dialog.BaseXDFragment
 import com.swago.baseswago.model.live.game.GameInfoModel
 import com.swago.baseswago.model.live.game.GameInfoModel
 import com.swago.baseswago.util.DpPxUtil
 import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.SwagoInfo
+import com.swago.baseswago.util.UserInfo
 import com.swago.room.databinding.DialogGamePlayBinding
 import com.swago.room.databinding.DialogGamePlayBinding
 
 
 /**
 /**
@@ -22,7 +25,7 @@ class GamePlayDialog : BaseXDFragment<DialogGamePlayBinding>() {
 
 
     private var url = ""
     private var url = ""
 
 
-    private var webView:WebView? = null
+    private var webView: WebView? = null
     private val jsLoad by lazy {
     private val jsLoad by lazy {
         JSLoad()
         JSLoad()
     }
     }
@@ -30,19 +33,19 @@ class GamePlayDialog : BaseXDFragment<DialogGamePlayBinding>() {
         Gson()
         Gson()
     }
     }
 
 
-    companion object{
+    companion object {
         private const val URL = "url"
         private const val URL = "url"
-        fun newInstance(url:String): GamePlayDialog {
+        fun newInstance(url: String): GamePlayDialog {
             val dialog = GamePlayDialog()
             val dialog = GamePlayDialog()
             val bundle = Bundle()
             val bundle = Bundle()
-            bundle.putString(URL,url)
+            bundle.putString(URL, url)
             dialog.arguments = bundle
             dialog.arguments = bundle
             return dialog
             return dialog
         }
         }
     }
     }
 
 
     init {
     init {
-        setCanCancel(false)
+        setCanCancel(true)
         setGravity(Gravity.BOTTOM)
         setGravity(Gravity.BOTTOM)
         setDimAmount(0f)
         setDimAmount(0f)
     }
     }
@@ -50,12 +53,12 @@ class GamePlayDialog : BaseXDFragment<DialogGamePlayBinding>() {
 
 
     override fun initOther() {
     override fun initOther() {
         arguments?.let {
         arguments?.let {
-            url = it.getString(URL,"")
+            url = it.getString(URL, "")
             activity?.let { activity ->
             activity?.let { activity ->
                 webView = WebView(activity)
                 webView = WebView(activity)
                 webView?.apply {
                 webView?.apply {
                     settings.javaScriptEnabled = true
                     settings.javaScriptEnabled = true
-                    addJavascriptInterface(jsLoad,"jsLoad")
+                    addJavascriptInterface(jsLoad, "jsLoad")
                     settings.allowUniversalAccessFromFileURLs = true
                     settings.allowUniversalAccessFromFileURLs = true
                     settings.allowFileAccess = true
                     settings.allowFileAccess = true
                     settings.allowFileAccessFromFileURLs = true
                     settings.allowFileAccessFromFileURLs = true
@@ -66,7 +69,7 @@ class GamePlayDialog : BaseXDFragment<DialogGamePlayBinding>() {
                     isHorizontalScrollBarEnabled = true
                     isHorizontalScrollBarEnabled = true
                     isVerticalScrollBarEnabled = true
                     isVerticalScrollBarEnabled = true
                     clearCache(true)
                     clearCache(true)
-                    webViewClient = object:WebViewClient(){
+                    webViewClient = object : WebViewClient() {
                         override fun shouldOverrideUrlLoading(
                         override fun shouldOverrideUrlLoading(
                             view: WebView?,
                             view: WebView?,
                             request: WebResourceRequest?
                             request: WebResourceRequest?
@@ -76,9 +79,12 @@ class GamePlayDialog : BaseXDFragment<DialogGamePlayBinding>() {
                     }
                     }
 
 
                     //设置大小
                     //设置大小
-                    val params = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
+                    val params = FrameLayout.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.MATCH_PARENT
+                    )
                     params.width = DpPxUtil.getScreenWidth()
                     params.width = DpPxUtil.getScreenWidth()
-                    params.height = (params.width*276/360f).toInt()
+                    params.height = (params.width * 276 / 360f).toInt()
                     this.layoutParams = params
                     this.layoutParams = params
                     binding.cl.addView(this)
                     binding.cl.addView(this)
                 }
                 }
@@ -94,15 +100,39 @@ class GamePlayDialog : BaseXDFragment<DialogGamePlayBinding>() {
     }
     }
 
 
 
 
-    inner class JSLoad{
+    inner class JSLoad {
 
 
         @JavascriptInterface
         @JavascriptInterface
-        fun getGameNeedInfo():String{
-//            val gameInfoModel = GameInfoModel()
-//            return gson.toJson(gameInfoModel)
+        fun getGameNeedInfo(): String {
+            SwagoRoomManager.iRoomInfo?.let {
+                UserInfo.getUserInfo()?.let { userInfoModel ->
+                    UserInfo.getLoginModel()?.let { loginModel ->
+                        val gameInfoModel = GameInfoModel(
+                            it.getRoomId(),
+                            userInfoModel.id,
+                            it.getAnchorId(),
+                            it.getAnchorType(),
+                            SwagoInfo.getLanguageCode(),
+                            SwagoInfo.getVersionCode(),
+                            SwagoInfo.getAppClient(),
+                            SwagoInfo.getDeviceInfo(),
+                            SwagoInfo.getChannel(),
+                            SwagoInfo.gameBaseUrl,
+                            "1",
+                            loginModel.token
+                        )
+                        return gson.toJson(gameInfoModel)
+                    }
+                }
+            }
             return ""
             return ""
         }
         }
 
 
+        @JavascriptInterface
+        fun recharge() {
+
+        }
+
     }
     }
 
 
     override fun onDestroyView() {
     override fun onDestroyView() {

+ 9 - 0
room/src/main/java/com/swago/room/gift/GiftDialog.kt

@@ -188,6 +188,14 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
                 }
                 }
             }
             }
 
 
+            binding.tvCombo.setOnClickListener {
+                luckyData?.let {
+                    val gifModel = it[GiftConfig.giftSelectedPageIndex*8+GiftConfig.giftSelectedPageSelectedPosition]
+                    LogUtil.d("礼物id","${gifModel.gift_name}")
+                    sendGift(gifModel,1)
+                }
+            }
+
             //点击送礼
             //点击送礼
             binding.tvToSend.setOnClickListener {
             binding.tvToSend.setOnClickListener {
                 when (type) {
                 when (type) {
@@ -233,6 +241,7 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
         if (receiveId.isNotEmpty()){
         if (receiveId.isNotEmpty()){
             SwagoRoomManager.iRoomInfo?.let {
             SwagoRoomManager.iRoomInfo?.let {
                 giftVm.sendGift(it.getRoomId(),giftModel.id,giftBatch,receiveId,isCombo,giftNum)
                 giftVm.sendGift(it.getRoomId(),giftModel.id,giftBatch,receiveId,isCombo,giftNum)
+                Log.d("礼物弹道","接口调用成功${System.currentTimeMillis()}")
             }
             }
         }
         }
     }
     }

+ 132 - 0
room/src/main/java/com/swago/room/giftdandao/GiftDanDaoManager.kt

@@ -0,0 +1,132 @@
+package com.swago.room.giftdandao
+
+import com.swago.baseswago.baseroom.IRoomActiveListener
+import com.swago.baseswago.baseroom.IRoomInfo
+import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.model.live.gift.IMGiftModel
+import com.swago.baseswago.util.LogUtil
+import kotlinx.coroutines.*
+import java.util.*
+import kotlin.collections.ArrayList
+
+/**
+ *@date 2022/1/22 17:12
+ *description:
+ */
+class GiftDanDaoManager  : IRoomActiveListener {
+
+    val giftDanDaoViewList = ArrayList<GiftDanDaoView>()
+    private val giftModelList = LinkedList<IMGiftModel>()
+
+    private var loopJob: Job? = null
+
+    //用来标记往哪个GiftDanDaoView添加数据
+    private var giftDanDaoViewCount = 0
+
+    fun init(){
+        SwagoRoomManager.addListener(this)
+    }
+
+    override fun changeRoom(iRoomInfo: IRoomInfo) {
+
+    }
+
+    override fun leaveRoom(iRoomInfo: IRoomInfo) {
+        giftModelList.clear()
+    }
+
+    override fun joinedRoom(iRoomInfo: IRoomInfo) {
+
+    }
+
+    override fun endRoom(iRoomInfo: IRoomInfo?) {
+        giftModelList.clear()
+    }
+
+    override fun closeRoomed() {
+        giftModelList.clear()
+        giftDanDaoViewList.forEach {
+            it.clear()
+        }
+        SwagoRoomManager.removeListener(this)
+    }
+
+
+    fun addNewMessage(imGiftModel: IMGiftModel){
+        giftModelList.add(imGiftModel)
+        if (loopJob==null){
+            initQueue()
+            loopJob?.start()
+        }
+
+    }
+
+    private fun initQueue(){
+        loopJob = GlobalScope.launch(Dispatchers.Main,start = CoroutineStart.LAZY) {
+            var isLoop = true
+            //用来在都忙的时候往
+            while (isLoop){
+                val imGiftModel  = giftModelList.peek()
+                LogUtil.d("giftDanDaoViewList","peek")
+                if (imGiftModel!=null){
+                    //用来判断是否有未使用的飘条 把数据添加进去
+                    var isSetData = false
+
+                    for (index in 0 until giftDanDaoViewList.size){
+                        if (giftDanDaoViewList[index].isBusy){
+                            //判断当前正忙的礼物弹道跟新来的礼物是不是同一个
+                            val imCurrentGiftModel = giftDanDaoViewList[index].imCurrentGiftModel
+                            if (imCurrentGiftModel!=null){
+                                if (imCurrentGiftModel.giftId==imGiftModel.giftId&&imCurrentGiftModel.senderCode==imGiftModel.senderCode){
+                                    giftDanDaoViewList[index].addData(imGiftModel)
+                                    isSetData = true
+                                    break
+                                }
+                            }
+                        }else{
+                            //有空闲轨道
+                            LogUtil.d("giftDanDaoViewList","ddddd-$index")
+                            giftDanDaoViewList[index].addData(imGiftModel)
+                            isSetData = true
+                            break
+                        }
+                    }
+
+                    if (!isSetData){
+                        //表示此事所有飘条都在忙 那么按顺序添加
+                        LogUtil.d("giftDanDaoViewList","${giftDanDaoViewCount%giftDanDaoViewList.size}----$giftDanDaoViewCount")
+                        when(giftDanDaoViewCount%giftDanDaoViewList.size){
+                            0 -> {
+                                giftDanDaoViewCount++
+                                giftDanDaoViewList[0].addData(imGiftModel)
+                                LogUtil.d("giftDanDaoViewList","ddddd1")
+                            }
+                            1 -> {
+                                giftDanDaoViewCount++
+                                giftDanDaoViewList[1].addData(imGiftModel)
+                                LogUtil.d("giftDanDaoViewList","ddddd2")
+                            }
+                            2 -> {
+                                giftDanDaoViewCount++
+                                giftDanDaoViewList[2].addData(imGiftModel)
+                                LogUtil.d("giftDanDaoViewList","ddddd1")
+                            }
+                        }
+                    }else{
+                        giftDanDaoViewCount = 0
+                    }
+
+                    giftModelList.poll()
+                    if (giftModelList.isEmpty()){
+                        isLoop = false
+                        loopJob= null
+                    }
+                }else{
+                    isLoop = false
+                    loopJob= null
+                    giftDanDaoViewCount = 0
+                }
+            }
+        }
+    }
+}

+ 124 - 0
room/src/main/java/com/swago/room/giftdandao/GiftDanDaoView.kt

@@ -0,0 +1,124 @@
+package com.swago.room.giftdandao
+
+import android.animation.Animator
+import android.animation.AnimatorSet
+import android.animation.ObjectAnimator
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.view.animation.BounceInterpolator
+import android.widget.FrameLayout
+import com.bumptech.glide.Glide
+import com.swago.baseswago.model.live.gift.IMGiftModel
+import com.swago.baseswago.util.AppContext
+import com.swago.room.R
+import com.swago.room.databinding.ViewItemGiftBinding
+
+/**
+ *@date 2022/1/22 16:57
+ *description:
+ */
+class GiftDanDaoView : FrameLayout {
+
+    var isBusy = false
+    private var binding : ViewItemGiftBinding? = null
+
+
+    var imCurrentGiftModel:IMGiftModel? = null
+
+    constructor(context: Context) : super(context){
+        initView(context)
+    }
+
+    constructor(context: Context, mAttributeSet: AttributeSet?) : super(context, mAttributeSet){
+        initView(context)
+    }
+
+    private fun initView(context: Context) {
+        binding = ViewItemGiftBinding.inflate(LayoutInflater.from(context), this, true)
+    }
+
+    fun addData(imGiftModel: IMGiftModel){
+        isBusy = true
+        binding?.apply {
+            Glide.with(ivAvatar.context)
+                .load(imGiftModel.senderAvatar)
+                .placeholder(R.mipmap.default_avatar)
+                .error(R.mipmap.default_avatar)
+                .into(ivAvatar)
+            Glide.with(ivAvatar.context)
+                .load(imGiftModel.giftIcon)
+                .placeholder(R.mipmap.default_avatar)
+                .error(R.mipmap.default_avatar)
+                .into(ivGiftIcon)
+
+            tvSenderName.text = imGiftModel.senderName
+            tvSenderTo.text = AppContext.getContext().resources.getString(R.string.send_to).format(imGiftModel.receiverName)
+            tvNum.text = "x${imGiftModel.giftNum}"
+            clRoot.visibility = View.VISIBLE
+            if (imCurrentGiftModel!=null&&imGiftModel.isCombo==1){
+
+            }else{
+                //执行进场动画
+                giftEnterAnimator.start()
+            }
+            imCurrentGiftModel = imGiftModel
+
+            clRoot.removeCallbacks(showRunnable)
+            clRoot.postDelayed(showRunnable, 3000)
+            
+            if (imGiftModel.multiple>500){
+                clWinPrize.visibility = View.VISIBLE
+                tvWinPrize.text = AppContext.getContext().resources.getString(R.string.win_num_prize).format(imGiftModel.multiple)
+                clWinPrize.removeCallbacks(winPrizeRunnable)
+                clWinPrize.postDelayed(winPrizeRunnable, 1000)
+            }
+        }
+
+
+    }
+
+
+    private val giftEnterAnimator by lazy {
+        val tx = ObjectAnimator.ofFloat(binding!!.clRoot, "translationX", -binding!!.clRoot.width.toFloat(), 0f)
+        val ap = ObjectAnimator.ofFloat(binding!!.clRoot, "alpha", 0.5f, 1f)
+        tx.interpolator = BounceInterpolator()
+        tx.duration = 400
+        tx.repeatCount = 0
+        ap.duration = 200
+        ap.repeatCount = 0
+        val animatorSet = AnimatorSet()
+        animatorSet.playTogether(tx, ap)
+        animatorSet
+    }
+
+    private val showRunnable by lazy {
+        Runnable {
+            clear()
+            binding?.apply {
+                clRoot.translationX = -(clRoot.width).toFloat()
+            }
+        }
+    }
+
+    private val winPrizeRunnable by lazy {
+        Runnable {
+            binding!!.clWinPrize.visibility = View.INVISIBLE
+            binding!!.tvWinPrize.text=""
+        }
+    }
+
+
+    fun clear() {
+        isBusy = false
+        imCurrentGiftModel=null
+        binding?.apply {
+            clWinPrize.visibility = View.INVISIBLE
+            clRoot.visibility = View.GONE
+            clWinPrize.removeCallbacks(winPrizeRunnable)
+            clRoot.removeCallbacks(showRunnable)
+        }
+    }
+
+}

+ 10 - 0
room/src/main/java/com/swago/room/vm/MsgVm.kt

@@ -1,6 +1,7 @@
 package com.swago.room.vm
 package com.swago.room.vm
 
 
 import android.app.Application
 import android.app.Application
+import android.util.Log
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.RoleType
 import com.swago.baseswago.baseroom.RoleType
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.baseroom.SwagoRoomManager
@@ -38,6 +39,11 @@ class MsgVm (application: Application) : AbsMsgVm(application){
      */
      */
     var playSvgUrl:((data:IMGiftModel)->Unit)? = null
     var playSvgUrl:((data:IMGiftModel)->Unit)? = null
 
 
+    /**
+     * 礼物弹道展示
+     */
+    var showGiftDanDao:((data:IMGiftModel)->Unit)? = null
+
     override fun receiveMsg() {
     override fun receiveMsg() {
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<RoomChatMsgBean>>(room_chat_text){
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<RoomChatMsgBean>>(room_chat_text){
             if (it.getGroupId() == SwagoRoomManager.iRoomInfo?.getRoomGroupId()?:""){
             if (it.getGroupId() == SwagoRoomManager.iRoomInfo?.getRoomGroupId()?:""){
@@ -71,6 +77,10 @@ class MsgVm (application: Application) : AbsMsgVm(application){
                         if (it.giftType == 1||it.giftType == 2){
                         if (it.giftType == 1||it.giftType == 2){
                             playSvgUrl?.invoke(it)
                             playSvgUrl?.invoke(it)
                         }
                         }
+                        if (it.giftType == 3){
+                            showGiftDanDao?.invoke(it)
+                            Log.d("礼物弹道","${System.currentTimeMillis()}")
+                        }
 
 
                         inComeChange?.invoke(it.incomeCount)
                         inComeChange?.invoke(it.incomeCount)
                     }
                     }

+ 2 - 2
room/src/main/java/com/swago/room/vm/RoomVm.kt

@@ -127,7 +127,7 @@ class RoomVm (application: Application) : AbsRoomVm(application)  {
                 if (SwagoRoomManager.iRoomInfo == null){
                 if (SwagoRoomManager.iRoomInfo == null){
                     ActivityManagerUtil.get().currentActivity().finish()
                     ActivityManagerUtil.get().currentActivity().finish()
                 }else{
                 }else{
-                    requestData2 {
+                    requestData2(false) {
                         requestData {
                         requestData {
                             SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
                             SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
                             val data = ApiManager.roomApi.closeLive()
                             val data = ApiManager.roomApi.closeLive()
@@ -152,7 +152,7 @@ class RoomVm (application: Application) : AbsRoomVm(application)  {
     }
     }
 
 
     private fun leaveCurrentRoom(iRoomInfo: IRoomInfo) {
     private fun leaveCurrentRoom(iRoomInfo: IRoomInfo) {
-        requestData2 {
+        requestData2(false) {
             requestData {
             requestData {
                 ApiManager.roomApi.leaveRoom(iRoomInfo.getRoomId())
                 ApiManager.roomApi.leaveRoom(iRoomInfo.getRoomId())
             }
             }

+ 7 - 0
room/src/main/java/com/swago/room/widget/AnchorFooterView.kt

@@ -21,6 +21,7 @@ class AnchorFooterView : ConstraintLayout, IFooter {
 
 
     var openSendMsgDialog:(()->Unit)? = null
     var openSendMsgDialog:(()->Unit)? = null
     var openMessageFun:(()->Unit)? = null
     var openMessageFun:(()->Unit)? = null
+    var openGameFun:(()->Unit)? = null
 
 
     constructor(context: Context) : this(context, null)
     constructor(context: Context) : this(context, null)
     constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
     constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
@@ -50,6 +51,12 @@ class AnchorFooterView : ConstraintLayout, IFooter {
                 openMessageFun?.invoke()
                 openMessageFun?.invoke()
             }
             }
         })
         })
+
+        binding.ivGame.setOnClickListener(object : NoDoubleClickListener() {
+            override fun onClick() {
+                openGameFun?.invoke()
+            }
+        })
     }
     }
 
 
     override fun getFooterView(): View {
     override fun getFooterView(): View {

+ 8 - 0
room/src/main/res/drawable/shape_ffff9300_00ff9300_20.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient android:angle="0"
+        android:startColor="#ff9300"
+        android:endColor="#00ff9300"/>
+    <corners android:topLeftRadius="20dp"
+        android:bottomLeftRadius="20dp"/>
+</shape>

+ 14 - 0
room/src/main/res/layout/dialog_gift.xml

@@ -70,6 +70,20 @@
             android:layout_width="72dp"
             android:layout_width="72dp"
             android:layout_height="30dp"/>
             android:layout_height="30dp"/>
 
 
+        <TextView
+            android:id="@+id/tvCombo"
+            android:textSize="14dp"
+            android:textColor="#2E2D2B"
+            android:text="连击"
+            android:gravity="center"
+            android:background="@drawable/selector_gift_send"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/viewPager"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginEnd="100dp"
+            android:layout_width="72dp"
+            android:layout_height="30dp"/>
+
 
 
     </androidx.constraintlayout.widget.ConstraintLayout>
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 

+ 23 - 0
room/src/main/res/layout/fragment_base_com.xml

@@ -31,6 +31,29 @@
         android:layout_height="170dp"/>
         android:layout_height="170dp"/>
 
 
 
 
+    <com.swago.room.giftdandao.GiftDanDaoView
+        android:id="@+id/danDaoView"
+        app:layout_constraintVertical_chainStyle="packed"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toTopOf="@+id/danDaoView2"
+        android:layout_width="match_parent"
+        android:layout_height="65dp"/>
+
+    <com.swago.room.giftdandao.GiftDanDaoView
+        android:id="@+id/danDaoView2"
+        app:layout_constraintTop_toBottomOf="@+id/danDaoView"
+        app:layout_constraintBottom_toTopOf="@+id/danDaoView3"
+        android:layout_width="match_parent"
+        android:layout_height="65dp"/>
+
+    <com.swago.room.giftdandao.GiftDanDaoView
+        android:id="@+id/danDaoView3"
+        app:layout_constraintTop_toBottomOf="@+id/danDaoView2"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="65dp"/>
+
+
     <com.swago.room.gift.control.XSvgPlayer
     <com.swago.room.gift.control.XSvgPlayer
         android:id="@+id/xSvgaPlayer"
         android:id="@+id/xSvgaPlayer"
         android:layout_width="match_parent"
         android:layout_width="match_parent"

+ 11 - 0
room/src/main/res/layout/layout_anchor_footer_view.xml

@@ -24,6 +24,17 @@
         android:layout_width="40dp"
         android:layout_width="40dp"
         android:layout_height="40dp"/>
         android:layout_height="40dp"/>
 
 
+    <ImageView
+        android:id="@+id/ivGame"
+        android:layout_marginStart="10dp"
+        android:background="@drawable/shape_80000000_20"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/ivSwitchCamera"
+        android:src="@mipmap/live_game"
+        android:visibility="visible"
+        android:layout_width="40dp"
+        android:layout_height="40dp"/>
+
     <ImageView
     <ImageView
         android:id="@+id/ivMessage"
         android:id="@+id/ivMessage"
         android:layout_marginEnd="60dp"
         android:layout_marginEnd="60dp"

+ 11 - 0
room/src/main/res/layout/layout_user_footer_view.xml

@@ -36,6 +36,17 @@
         android:layout_width="40dp"
         android:layout_width="40dp"
         android:layout_height="40dp"/>
         android:layout_height="40dp"/>
 
 
+    <ImageView
+        android:id="@+id/ivGame"
+        android:layout_marginStart="10dp"
+        android:background="@drawable/shape_80000000_20"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/ivGift"
+        android:src="@mipmap/live_game"
+        android:visibility="visible"
+        android:layout_width="40dp"
+        android:layout_height="40dp"/>
+
 
 
     <ImageView
     <ImageView
         android:id="@+id/ivReport"
         android:id="@+id/ivReport"

+ 123 - 0
room/src/main/res/layout/view_item_gift.xml

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:visibility="gone"
+    tools:visibility="visible"
+    android:id="@+id/clRoot"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/clContainer"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:background="@drawable/shape_ffff9300_00ff9300_20"
+        android:layout_marginStart="10dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivAvatar"
+            android:layout_marginStart="2dp"
+            android:layout_marginTop="2dp"
+            android:layout_marginBottom="2dp"
+            tools:src="@mipmap/default_avatar"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            android:layout_width="36dp"
+            android:layout_height="36dp"/>
+
+        <TextView
+            android:id="@+id/tvSenderName"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            tools:text = "Swago"
+            android:maxWidth="80dp"
+            android:maxLines="1"
+            android:layout_marginStart="5dp"
+            app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+            android:layout_marginTop="2dp"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <TextView
+            android:id="@+id/tvSenderTo"
+            android:textSize="11dp"
+            android:textColor="#fff"
+            tools:text = "Swago"
+            android:maxWidth="80dp"
+            android:maxLines="1"
+            android:layout_marginStart="5dp"
+            app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+            android:layout_marginBottom="2dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <ImageView
+            android:id="@+id/ivGiftIcon"
+            tools:src="@mipmap/default_avatar"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            android:layout_marginStart="128dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_marginEnd="10dp"
+            android:layout_width="40dp"
+            android:layout_height="40dp"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    <TextView
+        android:id="@+id/tvNum"
+        android:textSize="18dp"
+        android:textColor="#fff"
+        tools:text="x12"
+        android:layout_marginStart="5dp"
+        android:textStyle="bold|italic"
+        app:layout_constraintTop_toTopOf="@+id/clContainer"
+        app:layout_constraintStart_toEndOf="@+id/clContainer"
+        app:layout_constraintBottom_toBottomOf="@+id/clContainer"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/clWinPrize"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/clContainer"
+        tools:visibility="visible"
+        android:visibility="gone"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/iv"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_marginTop="5dp"
+            app:layout_constraintStart_toStartOf="parent"
+            android:layout_marginStart="68dp"
+            android:background="@mipmap/win_num_prize"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <TextView
+            android:id="@+id/tvWinPrize"
+            app:layout_constraintStart_toStartOf="@+id/iv"
+            app:layout_constraintEnd_toEndOf="@+id/iv"
+            app:layout_constraintTop_toTopOf="@+id/iv"
+            app:layout_constraintBottom_toBottomOf="@+id/iv"
+            tools:text="Win 500x coins"
+            android:layout_marginStart="32dp"
+            android:textColor="#fff"
+            android:textSize="11dp"
+            android:layout_width="0dp"
+            android:maxLines="1"
+            android:layout_height="wrap_content"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

BIN
room/src/main/res/mipmap-xxhdpi/live_game.png