honghengqiang há 3 anos atrás
pai
commit
8742a0245a
48 ficheiros alterados com 1217 adições e 80 exclusões
  1. 6 1
      .idea/misc.xml
  2. 2 2
      app/build.gradle
  3. 5 1
      app/proguard-rules.pro
  4. BIN
      app/release/app-release.aab
  5. 5 0
      app/src/main/java/com/swago/app/SwagoApp.kt
  6. 4 0
      baseswago/build.gradle
  7. 87 6
      baseswago/src/main/java/com/swago/baseswago/PayVm.kt
  8. 38 25
      baseswago/src/main/java/com/swago/baseswago/PersonDataDFragment.kt
  9. 23 0
      baseswago/src/main/java/com/swago/baseswago/UserVm.kt
  10. 6 1
      baseswago/src/main/java/com/swago/baseswago/dialog/BaseDFragment.kt
  11. 54 0
      baseswago/src/main/java/com/swago/baseswago/dialog/OrderLostDialog.kt
  12. 69 0
      baseswago/src/main/java/com/swago/baseswago/dialog/ReportDialog.kt
  13. 10 2
      baseswago/src/main/java/com/swago/baseswago/inter/PayApi.kt
  14. 13 0
      baseswago/src/main/java/com/swago/baseswago/inter/RoomApi.kt
  15. 4 0
      baseswago/src/main/java/com/swago/baseswago/inter/UserApi.kt
  16. 18 7
      baseswago/src/main/java/com/swago/baseswago/libpay/PayManager.kt
  17. 41 0
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftAllModel.java
  18. 99 0
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftModel.java
  19. 18 0
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/IMGiftModel.java
  20. 10 0
      baseswago/src/main/java/com/swago/baseswago/model/pay/CoinModel.kt
  21. 36 0
      baseswago/src/main/java/com/swago/baseswago/model/pay/OrderModel.java
  22. 52 0
      baseswago/src/main/res/layout/dialog_order_lost.xml
  23. 11 0
      baseswago/src/main/res/layout/dialog_person_data.xml
  24. 69 0
      baseswago/src/main/res/layout/dialog_report.xml
  25. BIN
      baseswago/src/main/res/mipmap-xxhdpi/icon_report.png
  26. BIN
      baseswago/src/main/res/mipmap-xxhdpi/icon_report_white.png
  27. 11 1
      baseswago/src/main/res/values-zh/strings.xml
  28. 12 2
      baseswago/src/main/res/values/strings.xml
  29. 8 0
      home/src/main/java/com/swago/home/ChatDetailActivity.kt
  30. 60 11
      home/src/main/java/com/swago/home/HomeActivity.kt
  31. 12 2
      home/src/main/res/layout/activity_chat_detail.xml
  32. 1 1
      login/src/main/java/com/swago/login/LoginActivity.kt
  33. 1 1
      login/src/main/res/layout/activity_login.xml
  34. 1 1
      room/src/main/java/com/swago/room/anchor/AnchorRoomFragment.kt
  35. 25 0
      room/src/main/java/com/swago/room/base/BaseComFragment.kt
  36. 17 0
      room/src/main/java/com/swago/room/gift/GiftDialog.kt
  37. 27 0
      room/src/main/java/com/swago/room/gift/GiftVm.kt
  38. 68 0
      room/src/main/java/com/swago/room/gift/control/SvgPlayerManager.kt
  39. 101 0
      room/src/main/java/com/swago/room/gift/control/XSvgPlayer.kt
  40. 48 4
      room/src/main/java/com/swago/room/user/UserRoomFragment.kt
  41. 0 1
      room/src/main/java/com/swago/room/vm/RoomVm.kt
  42. 15 0
      room/src/main/java/com/swago/room/widget/UserFooterView.kt
  43. 6 0
      room/src/main/res/layout/dialog_gift.xml
  44. 14 0
      room/src/main/res/layout/fragment_base_com.xml
  45. 14 0
      room/src/main/res/layout/layout_user_footer_view.xml
  46. 11 0
      room/src/main/res/layout/view_svga.xml
  47. 71 10
      user/src/main/java/com/swago/user/recharge/RechargeActivity.kt
  48. 14 1
      user/src/main/res/layout/fragment_rich_level.xml

+ 6 - 1
.idea/misc.xml

@@ -29,7 +29,9 @@
         <entry key="baseswago/src/main/res/layout/activity_abs_room_user.xml" value="0.3776041666666667" />
         <entry key="baseswago/src/main/res/layout/activity_web.xml" value="0.19047619047619047" />
         <entry key="baseswago/src/main/res/layout/dialog_loading.xml" value="0.36302083333333335" />
+        <entry key="baseswago/src/main/res/layout/dialog_order_lost.xml" value="0.3015625" />
         <entry key="baseswago/src/main/res/layout/dialog_person_data.xml" value="0.36302083333333335" />
+        <entry key="baseswago/src/main/res/layout/dialog_report.xml" value="0.3015625" />
         <entry key="baseswago/src/main/res/layout/item_room.xml" value="0.3776041666666667" />
         <entry key="baseswago/src/main/res/layout/layout_list.xml" value="0.17654508611955422" />
         <entry key="baseswago/src/main/res/layout/layout_refresh.xml" value="0.303125" />
@@ -62,10 +64,11 @@
         <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/dialog_anchor_close.xml" value="0.25" />
+        <entry key="room/src/main/res/layout/dialog_gift.xml" value="0.3015625" />
         <entry key="room/src/main/res/layout/dialog_message_list.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/dialog_send_msg.xml" value="0.338768115942029" />
         <entry key="room/src/main/res/layout/dialog_user_for_anchor_close.xml" value="0.39166666666666666" />
-        <entry key="room/src/main/res/layout/fragment_base_com.xml" value="0.35688405797101447" />
+        <entry key="room/src/main/res/layout/fragment_base_com.xml" value="0.29781021897810217" />
         <entry key="room/src/main/res/layout/fragment_no_content.xml" value="0.35688405797101447" />
         <entry key="room/src/main/res/layout/fragment_rank_list.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/item_chat.xml" value="0.3776041666666667" />
@@ -76,6 +79,7 @@
         <entry key="room/src/main/res/layout/layout_user_footer_view.xml" value="0.35688405797101447" />
         <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/view_svga.xml" value="0.3619791666666667" />
         <entry key="tuikit/src/main/res/layout/activity_camera.xml" value="0.303125" />
         <entry key="tuikit/src/main/res/layout/chat_layout.xml" value="0.303125" />
         <entry key="tuikit/src/main/res/layout/conversation_adapter.xml" value="0.20833333333333334" />
@@ -83,6 +87,7 @@
         <entry key="tuikit/src/main/res/layout/conversation_search_adapter.xml" value="0.3776041666666667" />
         <entry key="tuikit/src/main/res/layout/forward_fragment.xml" value="0.3776041666666667" />
         <entry key="tuikit/src/main/res/layout/message_adapter_content_image.xml" value="0.303125" />
+        <entry key="tuikit/src/main/res/layout/title_bar_layout.xml" value="0.3015625" />
         <entry key="user/src/main/res/drawable/progress_bar.xml" value="0.3333333333333333" />
         <entry key="user/src/main/res/drawable/shape_37393f_444652.xml" value="0.33177083333333335" />
         <entry key="user/src/main/res/drawable/shape_c3a165_ead6a7_top_10.xml" value="0.3333333333333333" />

+ 2 - 2
app/build.gradle

@@ -12,8 +12,8 @@ android {
         applicationId "com.swago.app"
         minSdkVersion 21
         targetSdkVersion 30
-        versionCode 2
-        versionName "1.0.1"
+        versionCode 3
+        versionName "1.0.2"
         multiDexEnabled true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 

+ 5 - 1
app/proguard-rules.pro

@@ -226,4 +226,8 @@
 -keep public class com.alibaba.android.arouter.facade.**{*;}
 -keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
 -keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
--keep class * implements com.alibaba.android.arouter.facade.template.IProvider
+-keep class * implements com.alibaba.android.arouter.facade.template.IProvider
+
+#svgplayer
+-keep class com.squareup.wire.** { *; }
+-keep class com.opensource.svgaplayer.proto.** { *; }

BIN
app/release/app-release.aab


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

@@ -2,6 +2,7 @@ package com.swago.app
 
 import android.app.Application
 import android.content.Context
+import android.net.http.HttpResponseCache
 import androidx.multidex.MultiDex
 import com.alibaba.android.arouter.launcher.ARouter
 import com.swago.baseswago.util.ActivityManagerUtil
@@ -10,6 +11,7 @@ import com.tencent.qcloud.tim.uikit.TUIKit
 import com.tencent.qcloud.tim.uikit.config.TUIKitConfigs
 import com.zy.multistatepage.MultiStateConfig
 import com.zy.multistatepage.MultiStatePage
+import java.io.File
 
 /**
  *@date 2021/7/17 10:05
@@ -27,6 +29,9 @@ class SwagoApp : Application() {
         ActivityManagerUtil.get().init(this)
         ARouter.init(this)
         TUIKit.init(this,AppContext.getContext().resources.getString(R.string.im_id).toInt(), TUIKitConfigs.getConfigs())
+        //svga缓存
+        val cacheDir = File(this.cacheDir, "http")
+        HttpResponseCache.install(cacheDir, 1024 * 1024 * 128)
 
         val config = MultiStateConfig.Builder()
             .alphaDuration(300)

+ 4 - 0
baseswago/build.gradle

@@ -110,7 +110,11 @@ dependencies {
     api 'com.android.billingclient:billing:3.0.3'
     //抓包
     debugImplementation "com.readystatesoftware.chuck:library:1.1.0"
+    releaseCompile "com.readystatesoftware.chuck:library-no-op:1.1.0"
     //国家选择
     api project(path: ':lib_country_picker')
+    //滑动栏
     api 'com.github.hackware1993:MagicIndicator:1.7.0'
+    //svgplayer
+    api 'com.github.yyued:SVGAPlayer-Android:2.5.12'
 }

+ 87 - 6
baseswago/src/main/java/com/swago/baseswago/PayVm.kt

@@ -1,10 +1,18 @@
 package com.swago.baseswago
 
 import android.app.Application
+import android.widget.Toast
 import androidx.lifecycle.MutableLiveData
+import com.android.billingclient.api.Purchase
+import com.coloros.ocs.base.common.api.Api
 import com.swago.baseswago.inter.ApiManager
+import com.swago.baseswago.libpay.PayManager
+import com.swago.baseswago.model.SwagoException
+import com.swago.baseswago.model.pay.CoinModel
+import com.swago.baseswago.model.pay.OrderModel
 import com.swago.baseswago.model.pay.PayModel
-import com.swago.baseswago.util.BaseViewModel
+import com.swago.baseswago.util.*
+import retrofit2.http.Field
 
 /**
  *@date 2021/11/25 19:42
@@ -12,15 +20,88 @@ import com.swago.baseswago.util.BaseViewModel
  */
 class PayVm(application: Application) : BaseViewModel(application) {
 
-    val productListLiveData by lazy {
-        MutableLiveData<List<PayModel>>()
+    var orderModel: OrderModel? = null
+
+    fun getProductList() {
+        requestData2 {
+            requestData {
+                val data = ApiManager.payApi.getProductList()
+                if (data.isNotEmpty()) {
+                    data[0].isSelected = true
+                }
+                PayManager.queryProductPrice(data)
+            }
+
+            requestError {
+                SwagoLoading.cancelLoadingDialog()
+                Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+            }
+        }
     }
 
 
-    fun getProductList() {
+    fun createOrder(productId: String) {
+        requestData2 {
+            requestData {
+                val data = ApiManager.payApi.createOrder(productId)
+                orderModel = data
+                SwagoLoading.cancelLoadingDialog()
+                UserInfo.getUserInfo()?.let {
+                    PayManager.pay(data.google_product_id, it.id, data.order_number)
+                }
+
+            }
+
+            requestError {
+                SwagoLoading.cancelLoadingDialog()
+                Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+            }
+        }
+    }
+
+
+    fun payOrderToServer(purchase: Purchase?, payType: Int) {
+        requestData2 {
+            requestData {
+                SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
+                if (payType == 1 || payType == 4) {
+                    purchase?.let {
+                        ApiManager.payApi.payOrderToServer(
+                            purchase.originalJson,
+                            purchase.signature,
+                            payType,
+                            purchase.accountIdentifiers?.obfuscatedProfileId ?: ""
+                        )
+                        getCoins()
+                        PayManager.consumeOrder(purchase)
+                    }
+                } else {
+                    orderModel?.order_number?.let {
+                        ApiManager.payApi.payOrderToServer("", "", payType, it)
+                    }
+
+                }
+                SwagoLoading.cancelLoadingDialog()
+            }
+
+            requestError {
+                if (it is SwagoException){
+                    Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+                }
+                SwagoLoading.cancelLoadingDialog()
+            }
+        }
+    }
+
+    val coinLiveData by lazy {
+        MutableLiveData<CoinModel>()
+    }
+
+    fun getCoins() {
         requestData {
-            val data = ApiManager.payApi.getProductList()
-            productListLiveData.value = data
+            val data = ApiManager.payApi.getCoins()
+            coinLiveData.value = data
+            UserInfo.getUserInfo()?.user_coins = data.user_coins
         }
     }
 

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

@@ -10,12 +10,14 @@ import com.bumptech.glide.Glide
 import com.swago.baseswago.constant.ARouteConstant
 import com.swago.baseswago.databinding.DialogPersonDataBinding
 import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.dialog.ReportDialog
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.IMUtil
+import com.swago.baseswago.util.NoDoubleClickListener
 
 /**
  *@date 2021/8/27 17:14
- *description:
+ *description:用户资料
  */
 class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
 
@@ -43,34 +45,45 @@ class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
             }
 
 
-            binding.ivFollow.setOnClickListener {
-                if (isFollow == 0){
-                    userVm.followUser(uid,0)
-                }else if (isFollow == 1){
-                    userVm.followUser(uid,1)
+            binding.ivFollow.setOnClickListener(object:NoDoubleClickListener(){
+                override fun onClick() {
+                    if (isFollow == 0){
+                        userVm.followUser(uid,0)
+                    }else if (isFollow == 1){
+                        userVm.followUser(uid,1)
+                    }
                 }
+            })
 
-            }
-
-            binding.llChat.setOnClickListener {
-                ARouter.getInstance().build(ARouteConstant.Home.chatDetail)
-                .withString("id",account)
-                .withString("chatName",binding.tvName.text.toString()).navigation()
-            }
-
-            binding.llBlock.setOnClickListener {
-                if (isBlock == 0){
-                    //拉黑操作
-                    //腾讯IM拉黑操作
-                    val list = ArrayList<String>()
-                    list.add(uid)
-                    IMUtil.addToBlackList(list){
-                        userVm.addBlack(uid,0)
+            binding.llChat.setOnClickListener(object:NoDoubleClickListener(){
+                override fun onClick() {
+                    ARouter.getInstance().build(ARouteConstant.Home.chatDetail)
+                        .withString("id",account)
+                        .withString("chatName",binding.tvName.text.toString()).navigation()
+                }
+            })
+
+            binding.llBlock.setOnClickListener(object:NoDoubleClickListener(){
+                override fun onClick() {
+                    if (isBlock == 0){
+                        //拉黑操作
+                        //腾讯IM拉黑操作
+                        val list = ArrayList<String>()
+                        list.add(uid)
+                        IMUtil.addToBlackList(list){
+                            userVm.addBlack(uid,0)
+                        }
+                    }else{
+                        Toast.makeText(AppContext.getContext(), "The User has been black", Toast.LENGTH_SHORT).show()
                     }
-                }else{
-                    Toast.makeText(AppContext.getContext(), "The User has been black", Toast.LENGTH_SHORT).show()
                 }
-            }
+            })
+
+            binding.ivReport.setOnClickListener(object:NoDoubleClickListener(){
+                override fun onClick() {
+                    ReportDialog.newInstance(account).show(parentFragmentManager,"ReportDialog")
+                }
+            })
 
         }
     }

+ 23 - 0
baseswago/src/main/java/com/swago/baseswago/UserVm.kt

@@ -121,6 +121,29 @@ class UserVm(application: Application) : BaseViewModel(application) {
         }
     }
 
+    /**
+     * 举报
+     */
+    val reportSuccessLiveData by lazy {
+        MutableLiveData<Any>()
+    }
+
+    fun reportUser(userId:String,content:String){
+        requestData2 {
+            requestData {
+                SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
+                ApiManager.userApi.reportUser(userId,content)
+                reportSuccessLiveData.value = "success"
+                Toast.makeText(AppContext.getContext(), AppContext.getContext().resources.getString(R.string.report_success), Toast.LENGTH_SHORT).show()
+                SwagoLoading.cancelLoadingDialog()
+            }
+
+            requestError {
+                SwagoLoading.cancelLoadingDialog()
+            }
+        }
+    }
+
     val uploadPicUrlLiveData by lazy {
         MutableLiveData<PicModel>()
     }

+ 6 - 1
baseswago/src/main/java/com/swago/baseswago/dialog/BaseDFragment.kt

@@ -22,6 +22,7 @@ abstract class BaseDFragment<T : ViewBinding> : DialogFragment() {
 
     private var mAmount = 0.5f
     private var gravity = Gravity.CENTER
+    private var canCancel = true
     private var mHeight = ViewGroup.LayoutParams.WRAP_CONTENT
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -38,7 +39,7 @@ abstract class BaseDFragment<T : ViewBinding> : DialogFragment() {
         dialog?.window?.attributes = attrs
         dialog?.window?.setGravity(gravity)
         dialog?.window?.setDimAmount(mAmount)
-        dialog?.setCanceledOnTouchOutside(true)
+        dialog?.setCanceledOnTouchOutside(canCancel)
     }
 
     override fun onCreateView(
@@ -63,6 +64,10 @@ abstract class BaseDFragment<T : ViewBinding> : DialogFragment() {
         mAmount = amount
     }
 
+    fun setCanCancel(canCancel:Boolean){
+        this.canCancel = canCancel
+    }
+
     fun setHeightMatchParent(){
         mHeight = ViewGroup.LayoutParams.MATCH_PARENT
     }

+ 54 - 0
baseswago/src/main/java/com/swago/baseswago/dialog/OrderLostDialog.kt

@@ -0,0 +1,54 @@
+package com.swago.baseswago.dialog
+
+import android.os.Bundle
+import com.swago.baseswago.R
+import com.swago.baseswago.databinding.DialogOrderLostBinding
+import com.swago.baseswago.util.AppContext
+import com.swago.baseswago.util.NoDoubleClickListener
+
+/**
+ *@date 2021/12/12 16:08
+ *description:掉单弹窗
+ */
+class OrderLostDialog : BaseXDFragment<DialogOrderLostBinding>() {
+
+    private var orderId:String = ""
+    var commitLostOrderFun:(()->Unit)? = null
+
+    init {
+        setCanCancel(false)
+    }
+
+    companion object{
+        fun newInstance(orderId:String):OrderLostDialog{
+            val dialog = OrderLostDialog()
+            val bundle = Bundle()
+            bundle.putString("orderId",orderId)
+            dialog.arguments = bundle
+            return dialog
+        }
+    }
+
+    override fun initOther() {
+        arguments?.let {
+            orderId =  it.getString("orderId","")
+            if (orderId.isNotEmpty()){
+                binding.tvContent.text = AppContext.getContext().resources.getString(R.string.consume_order).format(orderId)
+            }
+        }
+
+
+        binding.tvConsume.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                commitLostOrderFun?.invoke()
+            }
+        })
+
+    }
+
+    override fun initLiveData() {
+
+    }
+
+
+}

+ 69 - 0
baseswago/src/main/java/com/swago/baseswago/dialog/ReportDialog.kt

@@ -0,0 +1,69 @@
+package com.swago.baseswago.dialog
+
+import android.os.Bundle
+import androidx.fragment.app.viewModels
+import com.swago.baseswago.R
+import com.swago.baseswago.UserVm
+import com.swago.baseswago.databinding.DialogReportBinding
+import com.swago.baseswago.util.AppContext
+import com.swago.baseswago.util.NoDoubleClickListener
+
+/**
+ *@date 2021/12/12 13:47
+ *description:举报弹窗
+ */
+class ReportDialog : BaseXDFragment<DialogReportBinding>() {
+
+    private var account = ""
+
+    companion object{
+        fun newInstance(account: String):ReportDialog{
+            val dialog = ReportDialog()
+            val bundle = Bundle()
+            bundle.putString("account",account)
+            dialog.arguments = bundle
+            return dialog
+        }
+    }
+
+    private val userVm  by viewModels<UserVm>()
+
+    override fun initOther() {
+        arguments?.let {
+            account = it.getString("account","")
+        }
+        binding.tvReportOne.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                report(AppContext.getContext().resources.getString(R.string.report_one))
+            }
+        })
+
+        binding.tvReportTwo.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                report(AppContext.getContext().resources.getString(R.string.report_two))
+            }
+        })
+
+        binding.tvReportThree.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                report(AppContext.getContext().resources.getString(R.string.report_three))
+            }
+        })
+
+        binding.tvReportFour.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                report(AppContext.getContext().resources.getString(R.string.report_four))
+            }
+        })
+    }
+
+    fun report(content:String){
+        userVm.reportUser(account,content)
+    }
+
+    override fun initLiveData() {
+        userVm.reportSuccessLiveData.observe(this){
+            dismissAllowingStateLoss()
+        }
+    }
+}

+ 10 - 2
baseswago/src/main/java/com/swago/baseswago/inter/PayApi.kt

@@ -1,5 +1,7 @@
 package com.swago.baseswago.inter
 
+import com.swago.baseswago.model.pay.CoinModel
+import com.swago.baseswago.model.pay.OrderModel
 import com.swago.baseswago.model.pay.PayModel
 import retrofit2.http.Field
 import retrofit2.http.FormUrlEncoded
@@ -24,19 +26,25 @@ interface PayApi {
      */
     @FormUrlEncoded
     @POST("/v1/order/add")
-    suspend fun createOrder(@Field("product_id")product_id:String):Any
+    suspend fun createOrder(@Field("product_id")product_id:String):OrderModel
 
 
     /**
      *商品列表
+     * 1:消费新订单 2:支付失败 3:取消支付 4:上次未被消费的订单
      */
     @FormUrlEncoded
     @POST("/v1/order/pay/callback")
     suspend fun payOrderToServer(@Field("receipt") receipt:String,
                                  @Field("signature") signature:String,
-                                 @Field("pay_type") pay_type:String,
+                                 @Field("pay_type") pay_type:Int,
                                  @Field("order_number") order_number:String):Any
 
 
+    /**
+     * 获取用户自己的金币余额
+     */
+    @GET("/v1/user/coins")
+    suspend fun getCoins(): CoinModel
 
 }

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

@@ -4,6 +4,7 @@ import com.swago.baseswago.model.live.AnchorClosedModel
 import com.swago.baseswago.model.live.RankListModel
 import com.swago.baseswago.model.live.RoomModel
 import com.swago.baseswago.model.live.RoomUserModel
+import com.swago.baseswago.model.live.gift.GiftAllModel
 import retrofit2.http.*
 
 /**
@@ -55,4 +56,16 @@ interface RoomApi {
     suspend fun getRankList(@Query("room_id")room_id:String,@Query("rank_type")rank_type:Int,@Query("page")page:Int=1,@Query("page_size")page_size:Int=20):RankListModel
 
 
+    /**
+     * 直播间礼物
+     */
+    @GET("/v1/rtc/gift/list")
+    suspend fun getGiftList():List<GiftAllModel>
+
+    /**
+     * 赠送礼物
+     */
+    @FormUrlEncoded
+    @POST("/v1/rtc/buy/gift")
+    suspend fun sendGift(@Query("room_id")room_id:String):Any
 }

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

@@ -63,4 +63,8 @@ interface UserApi {
     //等级列表接口 等级类型(1财富等级2主播等级)
     @GET("/v1/user/level/rule/list")
     suspend fun getLevelList(@Query("level_type")level_type:Int):ArrayList<LevelModel>
+
+    @FormUrlEncoded
+    @POST("/v1/user/report")
+    suspend fun reportUser(@Field("report_user_id")report_user_id: String,@Field("report_content")report_content: String):Any
 }

+ 18 - 7
baseswago/src/main/java/com/swago/baseswago/libpay/PayManager.kt

@@ -14,12 +14,13 @@ import java.lang.Exception
 object PayManager {
 
     val listener = ArrayList<IPayCallback>()
-    val publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA184P/HXDtDi+3NgrxRkwIRU6tI2tiodETDzIyA/uwqgKwl/9JgXw2fZEFlsbEv1rUCVvvFGLGo7Z1GrUoR7WUAPktIuMWF330BurThfiwkpkSamzHEe+Pk/98/1YjZ8ltF2xaunUHZhRuE2WonrTy/rFvv/9PZtYd0xNFN5yOQwzFmT5nJvtpfCDWe2OhHXxuswG1bBn+faCcE0Rg1ZkSi36+0gDVvGjX/zQDgsXhwGJqFdVaJu7E7iR4zEGZLHquA931M0gYgGuF/tO9h8ppcaP1N7yR/ibek6KLcs969P47ENlRaL1QnrB3MSbomhhrtAzDLlV8YEIlukzsLrR7wIDAQAB"
+    private val publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA184P/HXDtDi+3NgrxRkwIRU6tI2tiodETDzIyA/uwqgKwl/9JgXw2fZEFlsbEv1rUCVvvFGLGo7Z1GrUoR7WUAPktIuMWF330BurThfiwkpkSamzHEe+Pk/98/1YjZ8ltF2xaunUHZhRuE2WonrTy/rFvv/9PZtYd0xNFN5yOQwzFmT5nJvtpfCDWe2OhHXxuswG1bBn+faCcE0Rg1ZkSi36+0gDVvGjX/zQDgsXhwGJqFdVaJu7E7iR4zEGZLHquA931M0gYgGuF/tO9h8ppcaP1N7yR/ibek6KLcs969P47ENlRaL1QnrB3MSbomhhrtAzDLlV8YEIlukzsLrR7wIDAQAB"
 
     private var isConnected = false
     private var billingClient: BillingClient? = null
 
     fun init() {
+        if (billingClient!=null) return
         billingClient = BillingClient.newBuilder(AppContext.getContext()).enablePendingPurchases()
             .setListener { billingResult, data ->
                 when (billingResult.responseCode) {
@@ -62,6 +63,7 @@ object PayManager {
                         it.onConnectedServer()
                         LogUtil.d("链接到谷歌")
                     }
+                    queryUnConsumeOrder(null,"","")
                 } else {
                     listener.forEach {
                         it.onPayError(p0.responseCode)
@@ -99,6 +101,11 @@ object PayManager {
                             listener.forEach {
                                 it.onQueryProductPrice(dataNet)
                             }
+                        }else{
+                            listener.forEach {
+                                //未查询到商品
+                                it.onPayError(-5)
+                            }
                         }
                     }
                 }
@@ -134,8 +141,10 @@ object PayManager {
         }
     }
 
-
-    fun queryUnConsumeOrder(productId: String, userId: String, orderId: String) {
+    /**
+     * productId  谷歌商品id
+     */
+    fun queryUnConsumeOrder(productId: String?, userId: String, orderId: String) {
         billingClient?.let {
             val result = it.queryPurchases(BillingClient.SkuType.INAPP)
             when (result.responseCode) {
@@ -157,10 +166,12 @@ object PayManager {
                         }
                     } else {
                         //不存在未消费
-                        val idList = ArrayList<String>()
-                        idList.add(productId)
-                        //先去查ID对应的商品是否存在存在才去支付
-                        queryProductIsExit(idList, userId, orderId)
+                        productId?.let {
+                            val idList = ArrayList<String>()
+                            idList.add(productId)
+                            //先去查ID对应的商品是否存在存在才去支付
+                            queryProductIsExit(idList, userId, orderId)
+                        }
                     }
 
                 }

+ 41 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftAllModel.java

@@ -0,0 +1,41 @@
+package com.swago.baseswago.model.live.gift;
+
+import java.util.List;
+
+/**
+ * @date 2021/12/12 17:31
+ * description:
+ */
+public class GiftAllModel {
+    /**
+     * gift_type : string
+     * data : [{"id":"string","gift_name":"Unknown Type: float","gift_coins":"Unknown Type: float","gift_icon_url":"string","gift_svg_url":"string"}]
+     */
+
+    private int gift_type;
+    /**
+     * id : string
+     * gift_name : Unknown Type: float
+     * gift_coins : Unknown Type: float
+     * gift_icon_url : string
+     * gift_svg_url : string
+     */
+
+    private List<GiftModel> data;
+
+    public int getGift_type() {
+        return gift_type;
+    }
+
+    public void setGift_type(int gift_type) {
+        this.gift_type = gift_type;
+    }
+
+    public List<GiftModel> getData() {
+        return data;
+    }
+
+    public void setData(List<GiftModel> data) {
+        this.data = data;
+    }
+}

+ 99 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/gift/GiftModel.java

@@ -0,0 +1,99 @@
+package com.swago.baseswago.model.live.gift;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * @date 2021/12/12 17:31
+ * description:
+ */
+public class GiftModel implements Parcelable {
+
+    /**
+     * id : string
+     * gift_name : Unknown Type: float
+     * gift_coins : Unknown Type: float
+     * gift_icon_url : string
+     * gift_svg_url : string
+     */
+
+    private String id;
+    private String gift_name;
+    private String gift_coins;
+    private String gift_icon_url;
+    private String gift_svg_url;
+
+    protected GiftModel(Parcel in) {
+        id = in.readString();
+        gift_name = in.readString();
+        gift_coins = in.readString();
+        gift_icon_url = in.readString();
+        gift_svg_url = in.readString();
+    }
+
+    public static final Creator<GiftModel> CREATOR = new Creator<GiftModel>() {
+        @Override
+        public GiftModel createFromParcel(Parcel in) {
+            return new GiftModel(in);
+        }
+
+        @Override
+        public GiftModel[] newArray(int size) {
+            return new GiftModel[size];
+        }
+    };
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getGift_name() {
+        return gift_name;
+    }
+
+    public void setGift_name(String gift_name) {
+        this.gift_name = gift_name;
+    }
+
+    public String getGift_coins() {
+        return gift_coins;
+    }
+
+    public void setGift_coins(String gift_coins) {
+        this.gift_coins = gift_coins;
+    }
+
+    public String getGift_icon_url() {
+        return gift_icon_url;
+    }
+
+    public void setGift_icon_url(String gift_icon_url) {
+        this.gift_icon_url = gift_icon_url;
+    }
+
+    public String getGift_svg_url() {
+        return gift_svg_url;
+    }
+
+    public void setGift_svg_url(String gift_svg_url) {
+        this.gift_svg_url = gift_svg_url;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(id);
+        dest.writeString(gift_name);
+        dest.writeString(gift_coins);
+        dest.writeString(gift_icon_url);
+        dest.writeString(gift_svg_url);
+    }
+}

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

@@ -0,0 +1,18 @@
+package com.swago.baseswago.model.live.gift;
+
+/**
+ * @date 2021/12/11 16:47
+ * description:
+ */
+public class IMGiftModel {
+
+    private String url;
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 10 - 0
baseswago/src/main/java/com/swago/baseswago/model/pay/CoinModel.kt

@@ -0,0 +1,10 @@
+package com.swago.baseswago.model.pay
+
+/**
+ *@date 2021/12/9 22:41
+ *description:
+ */
+data class CoinModel(
+    val id :String,
+    val user_coins:String
+)

+ 36 - 0
baseswago/src/main/java/com/swago/baseswago/model/pay/OrderModel.java

@@ -0,0 +1,36 @@
+package com.swago.baseswago.model.pay;
+
+/**
+ * @date 2021/12/9 22:20
+ * description:创建订单生成的Model类
+ */
+public class OrderModel {
+
+    private String order_number;
+    private String google_product_id;
+    private String product_id;
+
+    public String getOrder_number() {
+        return order_number;
+    }
+
+    public void setOrder_number(String order_number) {
+        this.order_number = order_number;
+    }
+
+    public String getGoogle_product_id() {
+        return google_product_id;
+    }
+
+    public void setGoogle_product_id(String google_product_id) {
+        this.google_product_id = google_product_id;
+    }
+
+    public String getProduct_id() {
+        return product_id;
+    }
+
+    public void setProduct_id(String product_id) {
+        this.product_id = product_id;
+    }
+}

+ 52 - 0
baseswago/src/main/res/layout/dialog_order_lost.xml

@@ -0,0 +1,52 @@
+<?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="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+
+
+    <LinearLayout
+        android:orientation="vertical"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginStart="60dp"
+        android:layout_marginEnd="60dp"
+        android:background="@drawable/shape_white_20"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:id="@+id/tvTitle"
+            android:text="@string/tips"
+            android:textSize="18dp"
+            android:textColor="#000"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="50dp"/>
+
+        <TextView
+            android:id="@+id/tvContent"
+            android:text="@string/consume_order"
+            android:textSize="16dp"
+            android:textColor="#000"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <TextView
+            android:id="@+id/tvConsume"
+            android:gravity="center"
+            android:textSize="16dp"
+            android:textColor="#000"
+            android:layout_marginTop="10dp"
+            android:text="@string/sure_consume"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"/>
+
+    </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 11 - 0
baseswago/src/main/res/layout/dialog_person_data.xml

@@ -20,6 +20,17 @@
             android:layout_width="match_parent"
             android:layout_height="125dp"/>
 
+        <ImageView
+            android:id="@+id/ivReport"
+            android:padding="7dp"
+            android:src="@mipmap/icon_report"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_marginTop="15dp"
+            android:layout_marginEnd="10dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="50dp"
+            android:layout_height="50dp"/>
+
         <de.hdodenhof.circleimageview.CircleImageView
             android:id="@+id/ivAvatar"
             android:layout_marginStart="20dp"

+ 69 - 0
baseswago/src/main/res/layout/dialog_report.xml

@@ -0,0 +1,69 @@
+<?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="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <LinearLayout
+        android:orientation="vertical"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginStart="60dp"
+        android:layout_marginEnd="60dp"
+        android:background="@drawable/shape_white_20"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:id="@+id/tvTitle"
+            android:text="@string/report"
+            android:textSize="18dp"
+            android:textColor="#F44336"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="50dp"/>
+
+        <TextView
+            android:id="@+id/tvReportOne"
+            android:text="@string/report_one"
+            android:textSize="16dp"
+            android:textColor="#F44336"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="40dp"/>
+
+        <TextView
+            android:id="@+id/tvReportTwo"
+            android:text="@string/report_two"
+            android:textSize="16dp"
+            android:textColor="#F44336"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="40dp"/>
+
+        <TextView
+            android:id="@+id/tvReportThree"
+            android:text="@string/report_three"
+            android:textSize="16dp"
+            android:textColor="#F44336"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="40dp"/>
+
+        <TextView
+            android:id="@+id/tvReportFour"
+            android:text="@string/report_four"
+            android:textSize="16dp"
+            android:textColor="#F44336"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="40dp"/>
+
+    </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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


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


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

@@ -66,6 +66,16 @@
     <string name="weekly">周榜</string>
     <string name="monthly">月榜</string>
     <string name="need_exp">所需经验值</string>
-    <string name="exp_explain">每通过礼物收到1钻石,经验值+1</string>
+    <string name="exp_explain">每送出10金币的礼物,经验值+1</string>
+    <string name="exp_explain2">每收到10金币的礼物,经验值+1</string>
     <string name="level">Lv.%s</string>
+    <string name="report">举报</string>
+    <string name="report_success">举报成功</string>
+    <string name="report_one">内容令人不适或者反感</string>
+    <string name="report_two">涉嫌政治言论</string>
+    <string name="report_three">非法用户昵称</string>
+    <string name="report_four">涉嫌辱骂用户和暴力言论</string>
+    <string name="tips">提示</string>
+    <string name="consume_order">该笔订单\n%s\n未消费成功,请确认消费!</string>
+    <string name="sure_consume">确认消费</string>
 </resources>

+ 12 - 2
baseswago/src/main/res/values/strings.xml

@@ -4,7 +4,7 @@
     <string name="google_id" translatable="false">513792265744-3fevv3crpsstn0ggt247hcob119c9f6n.apps.googleusercontent.com</string>
     <string name="fb_login_protocol_scheme" translatable="false">fb4494801737250774</string>
     <string name="im_id" translatable="false">1400566587</string>
-    <string name="agora_id" translatable="false">3d2fe24948ba4df6855cd70dc8eb9961</string>
+    <string name="agora_id" translatable="false">ae14303e10bd4d98acbd8f63e09fb19b</string>
     <string name="user_agreement">User agreement</string>
     <string name="privacy_policy">Privacy policy</string>
     <string name="and">&amp;</string>
@@ -71,6 +71,16 @@
     <string name="weekly">Weekly</string>
     <string name="monthly">Monthly</string>
     <string name="need_exp">所需经验值</string>
-    <string name="exp_explain">每通过礼物收到1钻石,经验值+1</string>
+    <string name="exp_explain">每送出10金币的礼物,经验值+1</string>
+    <string name="exp_explain2">每收到10金币的礼物,经验值+1</string>
     <string name="level">Lv.%s</string>
+    <string name="report">Report</string>
+    <string name="report_success">Report success</string>
+    <string name="report_one">Content is uncomfortable or offensive</string>
+    <string name="report_two">Suspected political speech</string>
+    <string name="report_three">Illegal user nickname</string>
+    <string name="report_four">Suspected of insulting users and violent speech</string>
+    <string name="tips">Tips</string>
+    <string name="consume_order">This order\n %s \nhas not been consumed successfully, please confirm the consumption!</string>
+    <string name="sure_consume">Sure consume</string>
 </resources>

+ 8 - 0
home/src/main/java/com/swago/home/ChatDetailActivity.kt

@@ -9,6 +9,8 @@ import com.alibaba.android.arouter.launcher.ARouter
 import com.gyf.immersionbar.ImmersionBar
 import com.swago.baseswago.activity.BaseXActivity
 import com.swago.baseswago.constant.ARouteConstant
+import com.swago.baseswago.dialog.ReportDialog
+import com.swago.baseswago.util.NoDoubleClickListener
 import com.swago.home.databinding.ActivityChatDetailBinding
 import com.tencent.imsdk.v2.V2TIMConversation
 import com.tencent.imsdk.v2.V2TIMManager
@@ -59,6 +61,12 @@ class ChatDetailActivity  : BaseXActivity<ActivityChatDetailBinding>() {
         binding.chatLayout.titleBar.rightIcon.visibility = View.GONE
 
         binding.chatLayout.inputLayout.disableSendFileAction(true)
+
+        binding.ivReport.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                ReportDialog.newInstance(id).show(supportFragmentManager,"ReportDialog")
+            }
+        })
     }
 
     override fun initLiveData() {

+ 60 - 11
home/src/main/java/com/swago/home/HomeActivity.kt

@@ -3,17 +3,23 @@ package com.swago.home
 import android.Manifest
 import android.widget.Toast
 import androidx.activity.viewModels
+import androidx.fragment.app.viewModels
 import androidx.viewpager.widget.ViewPager
 import com.alibaba.android.arouter.facade.annotation.Route
 import com.alibaba.android.arouter.launcher.ARouter
+import com.android.billingclient.api.Purchase
 import com.permissionx.guolindev.PermissionX
+import com.swago.baseswago.PayVm
 import com.swago.baseswago.SwagoAdapter
 import com.swago.baseswago.activity.BaseXActivity
 import com.swago.baseswago.agora.AgoraManager
 import com.swago.baseswago.constant.ARouteConstant
+import com.swago.baseswago.dialog.OrderLostDialog
 import com.swago.baseswago.im.GroupMsgParser
 import com.swago.baseswago.im.IMMessageManager
+import com.swago.baseswago.libpay.IPayCallback
 import com.swago.baseswago.libpay.PayManager
+import com.swago.baseswago.model.pay.PayModel
 import com.swago.home.databinding.ActivityHomeBinding
 import com.swago.home.official.OfficialVm
 
@@ -22,11 +28,13 @@ import com.swago.home.official.OfficialVm
  *description:
  */
 @Route(path = ARouteConstant.Home.home)
-class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
+class HomeActivity : BaseXActivity<ActivityHomeBinding>(), IPayCallback {
 
     private val officialVm by viewModels<OfficialVm>()
+    private val payVm by viewModels<PayVm>()
 
-    private val listFragment = arrayListOf(HomeFragment(),MomentFragment(),MessageFragment(),MineFragment())
+    private val listFragment =
+        arrayListOf(HomeFragment(), MomentFragment(), MessageFragment(), MineFragment())
 
     override fun loadData() {
 
@@ -38,7 +46,7 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
 
         binding.viewPager.offscreenPageLimit = 4
         binding.rg.setOnCheckedChangeListener { _, checkedId ->
-            when(checkedId){
+            when (checkedId) {
                 R.id.rbHome -> {
                     binding.viewPager.currentItem = 0
                 }
@@ -54,7 +62,7 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
             }
         }
 
-        binding.viewPager.addOnPageChangeListener(object:ViewPager.OnPageChangeListener{
+        binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
             override fun onPageScrolled(
                 position: Int,
                 positionOffset: Float,
@@ -63,27 +71,27 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
             }
 
             override fun onPageSelected(position: Int) {
-                when(position){
+                when (position) {
                     0 -> {
-                        if(binding.rbHome.isChecked){
+                        if (binding.rbHome.isChecked) {
                             return
                         }
                         binding.rg.check(R.id.rbHome)
                     }
                     1 -> {
-                        if(binding.rbCircle.isChecked){
+                        if (binding.rbCircle.isChecked) {
                             return
                         }
                         binding.rg.check(R.id.rbCircle)
                     }
                     2 -> {
-                        if(binding.rbMessage.isChecked){
+                        if (binding.rbMessage.isChecked) {
                             return
                         }
                         binding.rg.check(R.id.rbMessage)
                     }
                     3 -> {
-                        if(binding.rbMine.isChecked){
+                        if (binding.rbMine.isChecked) {
                             return
                         }
                         binding.rg.check(R.id.rbMine)
@@ -99,7 +107,7 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
         })
 
 
-        binding.viewPager.adapter = SwagoAdapter(listFragment,supportFragmentManager)
+        binding.viewPager.adapter = SwagoAdapter(listFragment, supportFragmentManager)
 
 
         binding.ivStartLive.setOnClickListener {
@@ -111,7 +119,11 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
                         ARouter.getInstance().build(ARouteConstant.Room.anchor).navigation()
                     } else {
                         binding.ivStartLive.isEnabled = true
-                        Toast.makeText(this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show()
+                        Toast.makeText(
+                            this,
+                            "These permissions are denied: $deniedList",
+                            Toast.LENGTH_LONG
+                        ).show()
                     }
                 }
         }
@@ -122,5 +134,42 @@ class HomeActivity : BaseXActivity<ActivityHomeBinding>() {
     override fun onResume() {
         super.onResume()
         binding.ivStartLive.isEnabled = true
+        PayManager.listener.add(this)
+    }
+
+    override fun onPause() {
+        super.onPause()
+        PayManager.listener.remove(this)
+    }
+
+    override fun onConnectedServer() {
+    }
+
+    override fun onPaySuccess(data: List<Purchase>?) {
+    }
+
+    override fun onQueryProductPrice(data: List<PayModel>) {
+    }
+
+    override fun onPayError(code: Int) {
+    }
+
+    override fun onPayCancel() {
+    }
+
+    override fun onUnConsumeOrder(data: List<Purchase>) {
+//        data.forEach {
+//            val orderLostDialog = OrderLostDialog.newInstance(it.orderId)
+//            orderLostDialog.commitLostOrderFun = {
+//                payVm.payOrderToServer(it,4)
+//            }
+//            orderLostDialog.show(supportFragmentManager, "OrderLostDialog")
+//        }
+    }
+
+    override fun consumeOrderSuccess() {
+    }
+
+    override fun consumeOrderFail(code: Int) {
     }
 }

+ 12 - 2
home/src/main/res/layout/activity_chat_detail.xml

@@ -1,12 +1,22 @@
 <?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="match_parent">
-
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <com.tencent.qcloud.tim.uikit.modules.chat.ChatLayout
         android:id="@+id/chat_layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 
+    <ImageView
+        android:id="@+id/ivReport"
+        android:layout_marginEnd="10dp"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:padding="8dp"
+        android:src="@mipmap/icon_report"
+        android:layout_width="50dp"
+        android:layout_height="50dp"/>
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
login/src/main/java/com/swago/login/LoginActivity.kt

@@ -113,7 +113,7 @@ class LoginActivity : BaseXActivity<ActivityLoginBinding>() {
 
         binding.bt.setOnClickListener(object: NoDoubleClickListener() {
             override fun onClick() {
-                loginVm.loginByAccount("app", "dd")
+                loginVm.loginByAccount("app", "xx")
             }
         })
     }

+ 1 - 1
login/src/main/res/layout/activity_login.xml

@@ -78,7 +78,7 @@
         android:id="@+id/bt"
         android:layout_marginStart="40dp"
         android:layout_marginEnd="40dp"
-        android:visibility="visible"
+        android:visibility="gone"
         app:layout_constraintTop_toBottomOf="@+id/clGoogle"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"/>

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

@@ -37,7 +37,7 @@ class AnchorRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
             openMessageListDialog()
         }
 
-        val headerView = iFooter as AnchorHeaderView
+        val headerView = iHeader as AnchorHeaderView
         headerView.showUserInfo = {
             PersonDataDFragment.newInstance(it).show(childFragmentManager,"PersonDataDFragment")
         }

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

@@ -11,11 +11,14 @@ import com.swago.baseswago.baseroom.IRoomActiveListener
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.fragment.BaseXFragment
 import com.swago.baseswago.im.IRoomChat
+import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.NoDoubleClickListener
 import com.swago.room.adapter.RoomChatAdapter
 import com.swago.room.databinding.FragmentBaseComBinding
 import com.swago.room.dialog.MessageListDialog
 import com.swago.room.dialog.SendMsgDialog
+import com.swago.room.gift.control.SvgPlayerManager
 import com.swago.room.inter.IFooter
 import com.swago.room.inter.IHeader
 import com.swago.room.vm.MsgVm
@@ -41,6 +44,10 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
         RoomChatAdapter()
     }
 
+    private val svgPlayerManager by lazy {
+        SvgPlayerManager()
+    }
+
     private val dataChatList = CopyOnWriteArrayList<IRoomChat>()
 
     override fun loadData() {
@@ -57,7 +64,25 @@ abstract class BaseComFragment<T:FragmentBaseComBinding> : BaseXFragment<T>(),IR
         binding.rv.addItemDecoration(RoomChatItemDecoration())
         binding.rv.adapter = chatAdapter
         chatAdapter.setNewData(dataChatList)
+        context?.let {
+            svgPlayerManager.init(it,binding.xSvgaPlayer)
+        }
 
+        var i = 0
+        binding.bt.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+
+                val t = IMGiftModel()
+                if (i%2==0){
+                    t.url = "https://s.xingqiu123.com/liwu/gift_pengranxindong_1096.svga"
+                    svgPlayerManager.addSvgUrl(t)
+                }else{
+                    t.url = "https://s.xingqiu123.com/donghua/svga_yijianzhongqing1.svga"
+                    svgPlayerManager.addSvgUrl(t)
+                }
+                i++
+            }
+        })
     }
 
     private fun setHeaderViewPosition() {

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

@@ -0,0 +1,17 @@
+package com.swago.room.gift
+
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.room.databinding.DialogGiftBinding
+
+/**
+ *@date 2021/12/12 14:59
+ *description:
+ */
+class GiftDialog:BaseXDFragment<DialogGiftBinding>() {
+
+    override fun initOther() {
+    }
+
+    override fun initLiveData() {
+    }
+}

+ 27 - 0
room/src/main/java/com/swago/room/gift/GiftVm.kt

@@ -0,0 +1,27 @@
+package com.swago.room.gift
+
+import android.app.Application
+import androidx.lifecycle.MutableLiveData
+import com.swago.baseswago.inter.ApiManager
+import com.swago.baseswago.model.live.gift.GiftAllModel
+import com.swago.baseswago.model.live.gift.GiftModel
+import com.swago.baseswago.util.BaseViewModel
+
+/**
+ *@date 2021/12/12 17:03
+ *description:
+ */
+class GiftVm(application: Application) : BaseViewModel(application) {
+
+    val allGiftLiveData by lazy {
+        MutableLiveData<List<GiftAllModel>>()
+    }
+
+    fun getGiftList(){
+        requestData {
+            val data = ApiManager.roomApi.getGiftList()
+            allGiftLiveData.value = data
+        }
+    }
+
+}

+ 68 - 0
room/src/main/java/com/swago/room/gift/control/SvgPlayerManager.kt

@@ -0,0 +1,68 @@
+package com.swago.room.gift.control
+
+import android.content.Context
+import com.opensource.svgaplayer.SVGAParser
+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 java.util.*
+
+/**
+ *@date 2021/12/11 16:42
+ *description:
+ */
+class SvgPlayerManager : IRoomActiveListener {
+
+    private val svgListQueue = LinkedList<IMGiftModel>()
+    private var xSvgPlayer: XSvgPlayer? = null
+
+    fun init(context: Context, xSvgPlayer: XSvgPlayer) {
+        SVGAParser.shareParser().init(context)
+        this.xSvgPlayer = xSvgPlayer
+        SwagoRoomManager.addListener(this)
+
+        this.xSvgPlayer?.nextSvgPlay = {
+            svgListQueue.poll()
+            val imGiftModel = svgListQueue.peek()
+            imGiftModel?.let {
+                this.xSvgPlayer?.playSvga(imGiftModel)
+            }
+        }
+    }
+
+    override fun changeRoom(iRoomInfo: IRoomInfo) {
+
+    }
+
+    override fun leaveRoom(iRoomInfo: IRoomInfo) {
+        svgListQueue.clear()
+        xSvgPlayer?.clear()
+    }
+
+    override fun joinedRoom(iRoomInfo: IRoomInfo) {
+
+    }
+
+    override fun endRoom(iRoomInfo: IRoomInfo?) {
+
+    }
+
+    override fun closeRoomed() {
+        svgListQueue.clear()
+        xSvgPlayer?.clear()
+        SwagoRoomManager.addListener(this)
+    }
+
+
+    fun addSvgUrl(imGiftModel: IMGiftModel?) {
+        imGiftModel?.let {
+            if (svgListQueue.isEmpty()) {
+                svgListQueue.add(it)
+                this.xSvgPlayer?.playSvga(it)
+            } else {
+                svgListQueue.add(it)
+            }
+        }
+    }
+}

+ 101 - 0
room/src/main/java/com/swago/room/gift/control/XSvgPlayer.kt

@@ -0,0 +1,101 @@
+package com.swago.room.gift.control
+
+import android.content.Context
+import android.util.AttributeSet
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.opensource.svgaplayer.SVGACallback
+import com.opensource.svgaplayer.SVGADrawable
+import com.opensource.svgaplayer.SVGAParser
+import com.opensource.svgaplayer.SVGAVideoEntity
+import com.swago.baseswago.model.live.gift.IMGiftModel
+import com.swago.room.databinding.ViewSvgaBinding
+import java.net.URL
+
+/**
+ *@date 2021/12/11 17:04
+ *description:
+ */
+class XSvgPlayer : ConstraintLayout {
+
+    private var binding:ViewSvgaBinding? = null
+    private var svgaParser:SVGAParser? = null
+
+    var nextSvgPlay:(()->Unit)? = null
+
+    var isCanplay = false
+
+    constructor(context: Context) : super(context)
+    constructor(context: Context, mAttributeSet: AttributeSet?) : super(context, mAttributeSet){
+        initView(context)
+    }
+
+    private fun initView(context: Context) {
+        binding = ViewSvgaBinding.inflate(LayoutInflater.from(context),this,true)
+        svgaParser = SVGAParser(context)
+    }
+
+
+    fun playSvga(imGiftModel:IMGiftModel){
+        svgaParser?.let {
+            isCanplay = true
+            it.parse(URL(imGiftModel.url),object:SVGAParser.ParseCompletion{
+                override fun onComplete(videoItem: SVGAVideoEntity) {
+                    binding?.apply {
+                        val drawable = SVGADrawable(videoItem)
+                        svgaImageView.visibility = View.VISIBLE
+                        svgaImageView.setImageDrawable(drawable)
+                        svgaImageView.loops = 1
+                        svgaImageView.callback = callback
+                        Log.d("svgPlayer","dddd")
+                        if (isCanplay){
+                            svgaImageView.startAnimation()
+                        }
+
+                    }
+
+                }
+
+                override fun onError() {
+                    binding?.apply {
+                        svgaImageView.visibility = View.GONE
+                        nextSvgPlay?.invoke()
+                    }
+                }
+
+            })
+        }
+    }
+
+    fun clear(){
+        binding?.apply {
+            isCanplay = false
+            svgaImageView.pauseAnimation()
+            svgaImageView.clear()
+        }
+
+    }
+
+    private var callback = object:SVGACallback {
+
+        override fun onFinished() {
+            binding?.svgaImageView?.visibility = View.GONE
+            nextSvgPlay?.invoke()
+        }
+
+        override fun onPause() {
+            
+        }
+
+        override fun onRepeat() {
+            
+        }
+
+        override fun onStep(frame: Int, percentage: Double) {
+            
+        }
+    }
+
+}

+ 48 - 4
room/src/main/java/com/swago/room/user/UserRoomFragment.kt

@@ -6,8 +6,11 @@ import com.swago.baseswago.UserVm
 import com.swago.baseswago.agora.AgoraManager
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.dialog.ReportDialog
+import com.swago.baseswago.model.live.gift.GiftModel
 import com.swago.room.base.BaseComFragment
 import com.swago.room.databinding.FragmentBaseComBinding
+import com.swago.room.gift.GiftVm
 import com.swago.room.inter.IFooter
 import com.swago.room.inter.IHeader
 import com.swago.room.vm.RoomVm
@@ -22,15 +25,23 @@ import com.swago.room.widget.UserHeaderView
 class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
 
     private val userVm by activityViewModels<UserVm>()
+    private val giftVm by activityViewModels<GiftVm>()
+
+    //热门礼物列表
+    private val hotList = ArrayList<GiftModel>()
+
+    //奢华礼物列表
+    private val luxuryList = ArrayList<GiftModel>()
 
     override fun initOther() {
         super.initOther()
+        giftVm.getGiftList()
     }
 
 
     override fun initLiveData() {
         super.initLiveData()
-        roomVm.roomUserDataLiveData.observe(this){
+        roomVm.roomUserDataLiveData.observe(this) {
             iHeader.updateRoomUser(it)
         }
 
@@ -49,18 +60,51 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
             openMessageListDialog()
         }
 
+        footerView.openGiftPanelFun = {
+            if (hotList.isNotEmpty()||luxuryList.isNotEmpty()){
+                //打开礼物列表
+            }
+        }
+
+        footerView.reportUserFun = {
+            SwagoRoomManager.iRoomInfo?.let {
+                ReportDialog.newInstance(it.getAnchorCode())
+                    .show(childFragmentManager, "ReportDialog")
+            }
+        }
+
         val headerView = iHeader as UserHeaderView
         headerView.followFun = {
-            userVm.followUser(it,0)
+            userVm.followUser(it, 0)
         }
 
         headerView.showUserInfo = {
-            PersonDataDFragment.newInstance(it).show(childFragmentManager,"PersonDataDFragment")
+            PersonDataDFragment.newInstance(it).show(childFragmentManager, "PersonDataDFragment")
         }
 
-        userVm.followStateLiveData.observe(this){
+        userVm.followStateLiveData.observe(this) {
             headerView.setFollow()
         }
+
+        giftVm.allGiftLiveData.observe(this) {
+            it.forEach { giftAllModel ->
+                when (giftAllModel.gift_type) {
+                    1 -> {
+                        //热门礼物
+                        hotList.addAll(giftAllModel.data)
+                    }
+
+                    2 -> {
+                        //奢华礼物
+                        luxuryList.addAll(giftAllModel.data)
+                    }
+
+                    3 -> {
+                        //幸运礼物
+                    }
+                }
+            }
+        }
     }
 
     override fun changeRoom(iRoomInfo: IRoomInfo) {

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

@@ -136,7 +136,6 @@ class RoomVm (application: Application) : AbsRoomVm(application)  {
                         }
 
                         requestError {
-                            Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
                             ActivityManagerUtil.get().currentActivity().finish()
                         }
                     }

+ 15 - 0
room/src/main/java/com/swago/room/widget/UserFooterView.kt

@@ -5,6 +5,7 @@ import android.util.AttributeSet
 import android.view.LayoutInflater
 import android.view.View
 import androidx.constraintlayout.widget.ConstraintLayout
+import com.swago.baseswago.dialog.ReportDialog
 import com.swago.baseswago.util.NoDoubleClickListener
 import com.swago.room.databinding.LayoutUserFooterViewBinding
 import com.swago.room.databinding.LayoutUserHeaderViewBinding
@@ -21,6 +22,8 @@ class UserFooterView : ConstraintLayout, IFooter {
     var openSendMsgDialog:(()->Unit)? = null
     var setMirrorFun:(()->Unit)? = null
     var openMessageFun:(()->Unit)? = null
+    var openGiftPanelFun:(()->Unit)? = null
+    var reportUserFun:(()->Unit)? = null
 
     constructor(context: Context) : this(context, null)
     constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
@@ -51,6 +54,18 @@ class UserFooterView : ConstraintLayout, IFooter {
                 openMessageFun?.invoke()
             }
         })
+
+        binding.ivGift.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                openGiftPanelFun?.invoke()
+            }
+        })
+
+        binding.ivReport.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                reportUserFun?.invoke()
+            }
+        })
     }
 
     override fun getFooterView(): View {

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

@@ -0,0 +1,6 @@
+<?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="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -28,4 +28,18 @@
         android:layout_width="match_parent"
         android:layout_height="170dp"/>
 
+
+    <com.swago.room.gift.control.XSvgPlayer
+        android:id="@+id/xSvgaPlayer"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+    <Button
+        android:id="@+id/bt"
+        android:visibility="gone"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_width="100dp"
+        android:layout_height="wrap_content"/>
+
 </androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -32,9 +32,23 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toEndOf="@+id/ivMirror"
         android:src="@mipmap/live_gift"
+        android:visibility="gone"
         android:layout_width="40dp"
         android:layout_height="40dp"/>
 
+
+    <ImageView
+        android:id="@+id/ivReport"
+        android:background="@drawable/shape_80000000_20"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/ivMessage"
+        android:layout_marginEnd="10dp"
+        android:padding="5dp"
+        android:src="@mipmap/icon_report_white"
+        android:layout_width="40dp"
+        android:layout_height="40dp"/>
+
+
     <ImageView
         android:id="@+id/ivMessage"
         android:background="@drawable/shape_80000000_20"

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

@@ -0,0 +1,11 @@
+<?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="match_parent">
+
+    <com.opensource.svgaplayer.SVGAImageView
+        android:id="@+id/svgaImageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 71 - 10
user/src/main/java/com/swago/user/recharge/RechargeActivity.kt

@@ -6,12 +6,15 @@ import androidx.activity.viewModels
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.alibaba.android.arouter.facade.annotation.Route
+import com.android.billingclient.api.Purchase
 import com.swago.baseswago.PayVm
 import com.swago.baseswago.activity.BaseXActivity
 import com.swago.baseswago.constant.ARouteConstant
-import com.swago.baseswago.util.AppContext
-import com.swago.baseswago.util.DpPxUtil
-import com.swago.baseswago.util.UserInfo
+import com.swago.baseswago.dialog.OrderLostDialog
+import com.swago.baseswago.libpay.IPayCallback
+import com.swago.baseswago.libpay.PayManager
+import com.swago.baseswago.model.pay.PayModel
+import com.swago.baseswago.util.*
 import com.swago.user.R
 import com.swago.user.databinding.ActivityRechargeBinding
 
@@ -20,7 +23,7 @@ import com.swago.user.databinding.ActivityRechargeBinding
  *description:
  */
 @Route(path = ARouteConstant.User.recharge)
-class RechargeActivity : BaseXActivity<ActivityRechargeBinding>() {
+class RechargeActivity : BaseXActivity<ActivityRechargeBinding>(), IPayCallback {
 
 
     private val payVm by viewModels<PayVm>()
@@ -32,23 +35,26 @@ class RechargeActivity : BaseXActivity<ActivityRechargeBinding>() {
     private var selectedPosition = 0
 
     override fun loadData() {
+        SwagoLoading.showLoadingDialog(this)
         payVm.getProductList()
     }
 
     override fun initOther() {
+        PayManager.listener.add(this)
         setBackView(binding.toolbar.ivBack)
-        binding.toolbar.tvTitle.text = AppContext.getContext().resources.getString(R.string.recharge)
+        binding.toolbar.tvTitle.text =
+            AppContext.getContext().resources.getString(R.string.recharge)
 
         UserInfo.getUserInfo()?.let {
             binding.tvBalanceCount.text = it.user_coins
         }
 
-        binding.rv.layoutManager = GridLayoutManager(this,3)
+        binding.rv.layoutManager = GridLayoutManager(this, 3)
         binding.rv.addItemDecoration(GridItemDecoration())
         binding.rv.adapter = adapter
 
         adapter.setOnItemClickListener { _, _, position ->
-            if (selectedPosition != position){
+            if (selectedPosition != position) {
                 adapter.data[selectedPosition].isSelected = false
                 adapter.data[position].isSelected = false
                 adapter.notifyItemChanged(selectedPosition)
@@ -57,11 +63,19 @@ class RechargeActivity : BaseXActivity<ActivityRechargeBinding>() {
             }
         }
 
+        binding.btRecharge.setOnClickListener(object : NoDoubleClickListener() {
+            override fun onClick() {
+                SwagoLoading.showLoadingDialog(this@RechargeActivity)
+                payVm.createOrder(adapter.data[selectedPosition].id)
+            }
+        })
+
     }
 
+
     override fun initLiveData() {
-        payVm.productListLiveData.observe(this){
-            adapter.setNewData(it)
+        payVm.coinLiveData.observe(this) {
+            binding.tvBalanceCount.text = it.user_coins
         }
     }
 
@@ -77,7 +91,7 @@ class RechargeActivity : BaseXActivity<ActivityRechargeBinding>() {
             val margin = DpPxUtil.dip2px(20f)
             val middle = DpPxUtil.dip2px(5f)
             val bottom = DpPxUtil.dip2px(15f)
-            when(column){
+            when (column) {
                 0 -> {
                     outRect.set(margin, 0, middle, bottom)
                 }
@@ -92,4 +106,51 @@ class RechargeActivity : BaseXActivity<ActivityRechargeBinding>() {
             }
         }
     }
+
+    override fun onDestroy() {
+        PayManager.listener.remove(this)
+        super.onDestroy()
+    }
+
+    override fun onConnectedServer() {
+    }
+
+    override fun onPaySuccess(data: List<Purchase>?) {
+        data?.forEach {
+            payVm.payOrderToServer(it, 1)
+        }
+    }
+
+    override fun onQueryProductPrice(data: List<PayModel>) {
+        SwagoLoading.cancelLoadingDialog()
+        adapter.setNewData(data)
+        PayManager.queryUnConsumeOrder(null,"","")
+    }
+
+    override fun onPayError(code: Int) {
+        SwagoLoading.cancelLoadingDialog()
+        payVm.payOrderToServer(null, 2)
+    }
+
+    override fun onPayCancel() {
+        payVm.payOrderToServer(null, 3)
+    }
+
+    override fun onUnConsumeOrder(data: List<Purchase>) {
+        data.forEach {
+            val orderLostDialog = OrderLostDialog.newInstance(it.orderId)
+            orderLostDialog.commitLostOrderFun = {
+                payVm.payOrderToServer(it,4)
+            }
+            orderLostDialog.show(supportFragmentManager, "OrderLostDialog")
+        }
+    }
+
+    override fun consumeOrderSuccess() {
+
+    }
+
+    override fun consumeOrderFail(code: Int) {
+
+    }
 }

+ 14 - 1
user/src/main/res/layout/fragment_rich_level.xml

@@ -179,13 +179,26 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
+    <TextView
+        android:id="@+id/tv2"
+        android:layout_marginTop="10dp"
+        app:layout_constraintTop_toBottomOf="@+id/tv"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:textSize="12dp"
+        android:textColor="#868686"
+        android:text="@string/exp_explain2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
 
     <ImageView
         android:id="@+id/iv1"
         android:layout_marginTop="15dp"
         android:layout_marginStart="15dp"
         android:layout_marginEnd="15dp"
-        app:layout_constraintTop_toBottomOf="@+id/tv"
+        app:layout_constraintTop_toBottomOf="@+id/tv2"
         android:background="@mipmap/bg_level_medal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"/>