honghengqiang 2 yıl önce
ebeveyn
işleme
6d0ac18f81
72 değiştirilmiş dosya ile 1602 ekleme ve 133 silme
  1. 0 1
      .idea/gradle.xml
  2. 5 0
      .idea/misc.xml
  3. 2 2
      app/build.gradle
  4. 25 9
      app/src/main/java/com/swago/app/SplashActivity.kt
  5. 96 7
      app/src/main/java/com/swago/app/SplashVm.kt
  6. 31 0
      app/src/main/java/com/swago/app/ThreadPoolUtils.java
  7. 2 0
      baseswago/build.gradle
  8. 6 4
      baseswago/src/main/java/com/swago/baseswago/activity/WebViewActivity.kt
  9. 4 4
      baseswago/src/main/java/com/swago/baseswago/constant/UrlConstant.kt
  10. 1 0
      baseswago/src/main/java/com/swago/baseswago/http/RetrofitManager.kt
  11. 1 0
      baseswago/src/main/java/com/swago/baseswago/http/SwagoInterceptor.kt
  12. 49 0
      baseswago/src/main/java/com/swago/baseswago/http/UrlChangeInterceptor.kt
  13. 22 0
      baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt
  14. 8 0
      baseswago/src/main/java/com/swago/baseswago/im/ImConstant.kt
  15. 9 0
      baseswago/src/main/java/com/swago/baseswago/inter/ConfigApi.kt
  16. 5 0
      baseswago/src/main/java/com/swago/baseswago/model/DomainConfig.kt
  17. 18 0
      baseswago/src/main/java/com/swago/baseswago/model/MomentModel.java
  18. 8 0
      baseswago/src/main/java/com/swago/baseswago/model/im/GamePrize.kt
  19. 4 0
      baseswago/src/main/java/com/swago/baseswago/model/im/IPiaoTiao.kt
  20. 6 0
      baseswago/src/main/java/com/swago/baseswago/model/live/ErrorModel.kt
  21. 6 0
      baseswago/src/main/java/com/swago/baseswago/model/live/ForceCloseModel.kt
  22. 15 5
      baseswago/src/main/java/com/swago/baseswago/model/live/RoomConfig.java
  23. 3 1
      baseswago/src/main/java/com/swago/baseswago/model/live/gift/IMGiftModel.java
  24. 19 0
      baseswago/src/main/java/com/swago/baseswago/util/MD5Util.java
  25. 71 0
      baseswago/src/main/java/com/swago/baseswago/util/SwagoInfo.kt
  26. 29 0
      baseswago/src/main/java/com/swago/baseswago/util/TimeUtil.kt
  27. 1 0
      baseswago/src/main/java/com/swago/glide.kt
  28. 8 2
      baseswago/src/main/res/values-in/strings.xml
  29. 175 0
      baseswago/src/main/res/values-ms/strings.xml
  30. 7 0
      baseswago/src/main/res/values-zh/strings.xml
  31. 8 2
      baseswago/src/main/res/values/strings.xml
  32. 8 2
      build.gradle
  33. 1 1
      home/build.gradle
  34. 29 0
      home/src/main/java/com/swago/home/innerhome/ComGridItemDecoration.kt
  35. 1 1
      home/src/main/java/com/swago/home/innerhome/FollowFragment.kt
  36. 12 3
      home/src/main/java/com/swago/home/innerhome/HomeAdapter.kt
  37. 7 3
      home/src/main/java/com/swago/home/innerhome/HomeGridItemDecoration.kt
  38. 0 3
      home/src/main/java/com/swago/home/innerhome/HomeVm.kt
  39. 1 1
      home/src/main/java/com/swago/home/innerhome/NewFragment.kt
  40. 18 0
      home/src/main/res/layout/item_home.xml
  41. 2 0
      home/src/main/res/layout/layout_view_header.xml
  42. BIN
      home/src/main/res/mipmap-xxhdpi/icon_game_bg.webp
  43. 1 1
      lib_country_picker/build.gradle
  44. 1 1
      login/build.gradle
  45. 1 1
      room/build.gradle
  46. 37 0
      room/src/main/java/com/swago/room/adapter/BannerViewAdapter.kt
  47. 11 1
      room/src/main/java/com/swago/room/anchor/AnchorRoomActivity.kt
  48. 15 1
      room/src/main/java/com/swago/room/base/BaseComFragment.kt
  49. 44 0
      room/src/main/java/com/swago/room/dialog/CanStartLiveDialog.kt
  50. 70 0
      room/src/main/java/com/swago/room/dialog/ForceCloseRoomDialog.kt
  51. 45 0
      room/src/main/java/com/swago/room/dialog/ReachLevelServiceDialog.kt
  52. 45 0
      room/src/main/java/com/swago/room/dialog/UnReachLevelDialog.kt
  53. 21 7
      room/src/main/java/com/swago/room/gift/GiftDialog.kt
  54. 8 5
      room/src/main/java/com/swago/room/gift/GiftVm.kt
  55. 52 31
      room/src/main/java/com/swago/room/hongbao/RedEnvelopeDialog.kt
  56. 3 2
      room/src/main/java/com/swago/room/piaotiao/WaftManager.kt
  57. 38 14
      room/src/main/java/com/swago/room/piaotiao/WaftView.kt
  58. 36 8
      room/src/main/java/com/swago/room/vm/MsgVm.kt
  59. 9 5
      room/src/main/java/com/swago/room/vm/RoomOtherVm.kt
  60. 18 4
      room/src/main/java/com/swago/room/vm/RoomVm.kt
  61. 70 0
      room/src/main/java/com/swago/room/widget/BannerView.kt
  62. 110 0
      room/src/main/res/layout/dialog_can_start_live.xml
  63. 77 0
      room/src/main/res/layout/dialog_force_close_room.xml
  64. 63 0
      room/src/main/res/layout/dialog_reach_level_service.xml
  65. 63 0
      room/src/main/res/layout/dialog_unreach_level.xml
  66. 10 0
      room/src/main/res/layout/fragment_base_com.xml
  67. 30 0
      room/src/main/res/layout/view_banner.xml
  68. BIN
      room/src/main/res/mipmap-xxhdpi/icon_reach_level.webp
  69. BIN
      room/src/main/res/mipmap-xxhdpi/icon_start_live_ban.webp
  70. BIN
      room/src/main/res/mipmap-xxhdpi/icon_upgrade_level_unreach.webp
  71. BIN
      room/src/main/res/mipmap-xxhdpi/waft_game_bg.webp
  72. 1 1
      user/build.gradle

+ 0 - 1
.idea/gradle.xml

@@ -22,7 +22,6 @@
             <option value="$PROJECT_DIR$/user" />
             <option value="$PROJECT_DIR$/user" />
           </set>
           </set>
         </option>
         </option>
-        <option name="resolveModulePerSourceSet" value="false" />
       </GradleProjectSettings>
       </GradleProjectSettings>
     </option>
     </option>
   </component>
   </component>

+ 5 - 0
.idea/misc.xml

@@ -123,12 +123,16 @@
         <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" />
         <entry key="room/src/main/res/layout/dialog_audience_list.xml" value="0.27447916666666666" />
         <entry key="room/src/main/res/layout/dialog_audience_list.xml" value="0.27447916666666666" />
+        <entry key="room/src/main/res/layout/dialog_can_start_live.xml" value="0.2848731884057971" />
+        <entry key="room/src/main/res/layout/dialog_force_close_room.xml" value="0.2848731884057971" />
         <entry key="room/src/main/res/layout/dialog_game_play.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/dialog_game_play.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/dialog_gift.xml" value="0.3015625" />
         <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_message_list.xml" value="0.3776041666666667" />
+        <entry key="room/src/main/res/layout/dialog_reach_level_service.xml" value="0.2848731884057971" />
         <entry key="room/src/main/res/layout/dialog_red_envelope.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/dialog_red_envelope.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/dialog_send_msg.xml" value="0.5" />
         <entry key="room/src/main/res/layout/dialog_send_msg.xml" value="0.5" />
         <entry key="room/src/main/res/layout/dialog_share.xml" value="0.27447916666666666" />
         <entry key="room/src/main/res/layout/dialog_share.xml" value="0.27447916666666666" />
+        <entry key="room/src/main/res/layout/dialog_unreach_level.xml" value="0.2848731884057971" />
         <entry key="room/src/main/res/layout/dialog_user_for_anchor_close.xml" value="0.39166666666666666" />
         <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.29781021897810217" />
         <entry key="room/src/main/res/layout/fragment_base_com.xml" value="0.29781021897810217" />
         <entry key="room/src/main/res/layout/fragment_gift.xml" value="0.3640625" />
         <entry key="room/src/main/res/layout/fragment_gift.xml" value="0.3640625" />
@@ -151,6 +155,7 @@
         <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_stub_user_end.xml" value="0.309375" />
         <entry key="room/src/main/res/layout/layout_view_stub_user_end.xml" value="0.309375" />
         <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_banner.xml" value="0.1484375" />
         <entry key="room/src/main/res/layout/view_item_gift.xml" value="0.67" />
         <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" />

+ 2 - 2
app/build.gradle

@@ -15,8 +15,8 @@ android {
         applicationId "com.swago.app"
         applicationId "com.swago.app"
         minSdkVersion 21
         minSdkVersion 21
         targetSdkVersion 30
         targetSdkVersion 30
-        versionCode 6003
-        versionName "6.0.0.3"
+        versionCode 6004
+        versionName "6.0.0.4"
         multiDexEnabled true
         multiDexEnabled true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 
 

+ 25 - 9
app/src/main/java/com/swago/app/SplashActivity.kt

@@ -1,11 +1,13 @@
 package com.swago.app
 package com.swago.app
 
 
+import android.Manifest
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.app.AppCompatActivity
 import android.os.Bundle
 import android.os.Bundle
+import android.widget.Toast
 import androidx.activity.viewModels
 import androidx.activity.viewModels
 import com.alibaba.android.arouter.launcher.ARouter
 import com.alibaba.android.arouter.launcher.ARouter
 import com.swago.baseswago.constant.ARouteConstant
 import com.swago.baseswago.constant.ARouteConstant
-import com.swago.baseswago.util.UserInfo
+import com.permissionx.guolindev.PermissionX
 
 
 class SplashActivity : AppCompatActivity() {
 class SplashActivity : AppCompatActivity() {
 
 
@@ -15,13 +17,27 @@ class SplashActivity : AppCompatActivity() {
         super.onCreate(savedInstanceState)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_splash)
         setContentView(R.layout.activity_splash)
 
 
-        if (UserInfo.getLoginModel() == null){
-            ARouter.getInstance().build(ARouteConstant.Login.login).navigation()
-            finish()
-        }else{
-            splashVm.loginByAuto()
-        }
+        PermissionX.init(this@SplashActivity)
+            .permissions(
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE
+            )
+            .request { allGranted, grantedList, deniedList ->
+                if (allGranted) {
+                    splashVm.getApiDomain()
+                    splashVm.jumpToLoginLiveData.observe(this){
+                        if (!it){
+                            ARouter.getInstance().build(ARouteConstant.Login.login).navigation()
+                            finish()
+                        }
+                    }
+                } else {
+                    Toast.makeText(
+                        this@SplashActivity,
+                        "These permissions are denied: $deniedList",
+                        Toast.LENGTH_LONG
+                    ).show()
+                }
+            }
     }
     }
-
-
 }
 }

+ 96 - 7
app/src/main/java/com/swago/app/SplashVm.kt

@@ -1,30 +1,118 @@
 package com.swago.app
 package com.swago.app
 
 
+import android.annotation.SuppressLint
 import android.app.Application
 import android.app.Application
 import android.content.Intent
 import android.content.Intent
-import android.util.Log
-import android.widget.Toast
+import android.os.Handler
+import android.os.Message
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.MutableLiveData
 import com.alibaba.android.arouter.launcher.ARouter
 import com.alibaba.android.arouter.launcher.ARouter
 import com.google.gson.Gson
 import com.google.gson.Gson
 import com.swago.baseswago.constant.ARouteConstant
 import com.swago.baseswago.constant.ARouteConstant
 import com.swago.baseswago.constant.UrlConstant
 import com.swago.baseswago.constant.UrlConstant
+import com.swago.baseswago.http.RetrofitManager
 import com.swago.baseswago.inter.ApiManager
 import com.swago.baseswago.inter.ApiManager
-import com.swago.baseswago.model.ConfigModel
+import com.swago.baseswago.model.DomainConfig
 import com.swago.baseswago.util.*
 import com.swago.baseswago.util.*
-import com.tencent.qcloud.tim.uikit.TUIKit
-import com.tencent.qcloud.tim.uikit.base.IUIKitCallBack
+import org.jsoup.Jsoup
+import java.lang.Exception
 
 
 /**
 /**
  *@date 2022/2/26 11:33
  *@date 2022/2/26 11:33
  *description:
  *description:
  */
  */
-class SplashVm (application: Application) : BaseViewModel(application) {
+class SplashVm(application: Application) : BaseViewModel(application) {
 
 
     private val gson by lazy {
     private val gson by lazy {
         Gson()
         Gson()
     }
     }
 
 
+    val jumpToLoginLiveData by lazy {
+        MutableLiveData<Boolean>()
+    }
+
+    var retry = 0
+
+    private val executorService by lazy {
+        ThreadPoolUtils.getInstance().executorService
+    }
+
+    private val mHandler = @SuppressLint("HandlerLeak")
+    object : Handler() {
+        override fun handleMessage(msg: Message) {
+            if (UserInfo.getLoginModel() == null) {
+                jumpToLoginLiveData.value = false
+            } else {
+                loginByAuto()
+            }
+        }
+    }
+
+    fun getApiDomain() {
+        requestData2 {
+            requestData {
+                val data = ApiManager.configApi.getApiDomain()
+                setBaseUrl(data.host)
+                RetrofitManager.resetUrl()
+                if (UserInfo.getLoginModel() == null) {
+                    jumpToLoginLiveData.value = false
+                } else {
+                    loginByAuto()
+                }
+            }
+
+            requestError {
+                retry++
+                if (BuildConfig.DEBUG) {
+                    getHostUrl("https://github.com/whyNotBanMagna/MvpProject/blob/master/README.md")
+                } else {
+                    when (retry) {
+                        1 -> {
+                            getApiDomain()
+                        }
+                        2 -> {
+                            getHostUrl("https://github.com/whyNotBanMagna/MvpProject/blob/master/README.md")
+                        }
+                        3 -> {
+                            getHostUrl("https://github.com/mark-wby/pro/blob/main/README.md")
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private fun getHostUrl(url: String) {
+        executorService.execute {
+            try {
+                val document =
+                    Jsoup.connect(url)
+                        .timeout(2000).get()
+                val list = document.text().split(" ")
+                list.forEach {
+                    if (it.length == 32) {
+                        setBaseUrl(MD5Util.decodeBase64(it))
+                        RetrofitManager.resetUrl()
+                        mHandler.sendEmptyMessage(0)
+                        return@execute
+                    }
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+    }
+
+    private fun setBaseUrl(baseUrl: String) {
+        if (BuildConfig.DEBUG) {
+            UrlConstant.BASE_URL =   "http:test-api.swago.cn"
+//            UrlConstant.BASE_URL =   "http://advance.swago.cn"
+//            UrlConstant.BASE_URL =   "https://pro-api.swago.cn"
+        } else {
+            UrlConstant.BASE_URL = baseUrl
+        }
+    }
+
     fun loginByAuto() {
     fun loginByAuto() {
         requestData {
         requestData {
             val configModel = ApiManager.configApi.getAppConfig()
             val configModel = ApiManager.configApi.getAppConfig()
@@ -37,7 +125,8 @@ class SplashVm (application: Application) : BaseViewModel(application) {
             SpUtil.putString("login_info", Gson().toJson(data))
             SpUtil.putString("login_info", Gson().toJson(data))
             SwagoLoading.cancelLoadingDialog()
             SwagoLoading.cancelLoadingDialog()
             ARouter.getInstance().build(ARouteConstant.Home.home)
             ARouter.getInstance().build(ARouteConstant.Home.home)
-                .withFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP).navigation()
+                .withFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
+                .navigation()
         }
         }
     }
     }
 }
 }

+ 31 - 0
app/src/main/java/com/swago/app/ThreadPoolUtils.java

@@ -0,0 +1,31 @@
+package com.swago.app;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class ThreadPoolUtils {
+    private static int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
+    private static int KEEP_ALIVE_TIME = 1;
+    private static TimeUnit KEEP_ALIVE_TIME_UNIT = TimeUnit.SECONDS;
+    private ExecutorService executorService;
+
+    private ThreadPoolUtils(){
+        BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<>();
+        executorService = new ThreadPoolExecutor(NUMBER_OF_CORES, NUMBER_OF_CORES * 2, KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT, taskQueue);
+    }
+
+    public static ThreadPoolUtils getInstance(){
+        return ThreadPoolUtilsHolder.sInstance;
+    }
+
+    private static class ThreadPoolUtilsHolder{
+        private static final ThreadPoolUtils sInstance = new ThreadPoolUtils();
+    }
+
+    public ExecutorService  getExecutorService(){
+        return executorService;
+    }
+}

+ 2 - 0
baseswago/build.gradle

@@ -129,4 +129,6 @@ dependencies {
     api 'com.google.firebase:firebase-auth-ktx'
     api 'com.google.firebase:firebase-auth-ktx'
     api 'com.google.firebase:firebase-firestore-ktx'
     api 'com.google.firebase:firebase-firestore-ktx'
     api 'com.google.firebase:firebase-perf-ktx'
     api 'com.google.firebase:firebase-perf-ktx'
+    //jsoup
+    api 'org.jsoup:jsoup:1.12.1'
 }
 }

+ 6 - 4
baseswago/src/main/java/com/swago/baseswago/activity/WebViewActivity.kt

@@ -1,12 +1,10 @@
 package com.swago.baseswago.activity
 package com.swago.baseswago.activity
 
 
 import android.annotation.SuppressLint
 import android.annotation.SuppressLint
+import android.os.Build
 import android.view.KeyEvent
 import android.view.KeyEvent
 import android.view.ViewGroup
 import android.view.ViewGroup
-import android.webkit.JavascriptInterface
-import android.webkit.WebResourceRequest
-import android.webkit.WebView
-import android.webkit.WebViewClient
+import android.webkit.*
 import android.widget.FrameLayout
 import android.widget.FrameLayout
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.constraintlayout.widget.ConstraintLayout
 import com.alibaba.android.arouter.facade.annotation.Autowired
 import com.alibaba.android.arouter.facade.annotation.Autowired
@@ -60,6 +58,10 @@ class WebViewActivity : BaseXActivity<ActivityWebBinding>() {
                 e.printStackTrace()
                 e.printStackTrace()
             }
             }
 
 
+            if (Build.VERSION.SDK_INT >= 21) {
+                settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+            }
+
             settings.javaScriptEnabled = true
             settings.javaScriptEnabled = true
             addJavascriptInterface(jsLoad, "jsLoad")
             addJavascriptInterface(jsLoad, "jsLoad")
             settings.allowUniversalAccessFromFileURLs = true
             settings.allowUniversalAccessFromFileURLs = true

+ 4 - 4
baseswago/src/main/java/com/swago/baseswago/constant/UrlConstant.kt

@@ -15,13 +15,13 @@ import java.io.File
  */
  */
 object UrlConstant {
 object UrlConstant {
 
 
-    val BASE_URL by lazy {
-        if (BuildConfig.DEBUG) {
+    var BASE_URL = if (BuildConfig.DEBUG) {
             "http:test-api.swago.cn"
             "http:test-api.swago.cn"
-        } else {
+//        "http://advance.swago.cn"
+//        "https://pro-api.swago.cn"
+    } else {
             "https://pro-api.swago.cn"
             "https://pro-api.swago.cn"
         }
         }
-    }
 
 
     private val BASE_WEB_URL by lazy {
     private val BASE_WEB_URL by lazy {
         if (BuildConfig.DEBUG) {
         if (BuildConfig.DEBUG) {

+ 1 - 0
baseswago/src/main/java/com/swago/baseswago/http/RetrofitManager.kt

@@ -22,6 +22,7 @@ object RetrofitManager {
 
 
     init {
     init {
         val okHttpClientBuilder = OkHttpClient.Builder()
         val okHttpClientBuilder = OkHttpClient.Builder()
+        okHttpClientBuilder.addInterceptor(UrlChangeInterceptor())
         if (BuildConfig.DEBUG){
         if (BuildConfig.DEBUG){
             okHttpClientBuilder.addInterceptor(ChuckInterceptor(AppContext.getContext()))
             okHttpClientBuilder.addInterceptor(ChuckInterceptor(AppContext.getContext()))
         }
         }

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

@@ -51,6 +51,7 @@ class SwagoInterceptor : Interceptor {
             .addHeader("app-client-channel", SwagoInfo.getChannel())
             .addHeader("app-client-channel", SwagoInfo.getChannel())
             .addHeader("app-time", "$time")
             .addHeader("app-time", "$time")
             .addHeader("app-secret", secret)
             .addHeader("app-secret", secret)
+            .addHeader("app-client-device-id",SwagoInfo.getIMEI())
             .build()
             .build()
         return chain.proceed(finalRequest)
         return chain.proceed(finalRequest)
     }
     }

+ 49 - 0
baseswago/src/main/java/com/swago/baseswago/http/UrlChangeInterceptor.kt

@@ -0,0 +1,49 @@
+package com.swago.baseswago.http
+
+import android.text.TextUtils
+import android.util.Log
+import com.swago.baseswago.constant.UrlConstant
+import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import okhttp3.HttpUrl
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class UrlChangeInterceptor : Interceptor {
+
+    private var baseURL: HttpUrl? = null
+
+    override fun intercept(chain: Interceptor.Chain): Response {
+        val request = chain.request()
+        val headerValue = request.header("urlFlag")
+        if (!TextUtils.isEmpty(headerValue)){
+            baseURL = when(headerValue){
+                "apiDomain" -> {
+                    "http://doc.swago.cn".toHttpUrlOrNull()
+                }
+
+                else -> {
+                    UrlConstant.BASE_URL.toHttpUrlOrNull()
+                }
+            }
+
+            val newBuilder = request.newBuilder()
+            newBuilder.removeHeader("urlFlag")
+            baseURL?.let {
+                val newHttpUrl = request.url.newBuilder()
+                    .scheme(it.scheme)
+                    .host(it.host)
+                    .port(it.port)
+                    .build()
+                Log.i("zkc","转换的:${it.host}   ${it.port}")
+
+                val newRequest = newBuilder.url(newHttpUrl).build()
+                return chain.proceed(newRequest)
+            }
+
+        }else{
+            return chain.proceed(request)
+        }
+
+        return chain.proceed(request)
+    }
+}

+ 22 - 0
baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt

@@ -7,7 +7,9 @@ import com.swago.baseswago.im.ImConstant.beauty_game
 import com.swago.baseswago.im.ImConstant.cancel_forbid_speak
 import com.swago.baseswago.im.ImConstant.cancel_forbid_speak
 import com.swago.baseswago.im.ImConstant.follow_anchor_success
 import com.swago.baseswago.im.ImConstant.follow_anchor_success
 import com.swago.baseswago.im.ImConstant.forbid_speak
 import com.swago.baseswago.im.ImConstant.forbid_speak
+import com.swago.baseswago.im.ImConstant.force_close_live_room
 import com.swago.baseswago.im.ImConstant.fruit_game
 import com.swago.baseswago.im.ImConstant.fruit_game
+import com.swago.baseswago.im.ImConstant.game_win_big_prize
 import com.swago.baseswago.im.ImConstant.lucky_gift
 import com.swago.baseswago.im.ImConstant.lucky_gift
 import com.swago.baseswago.im.ImConstant.red_envelope
 import com.swago.baseswago.im.ImConstant.red_envelope
 import com.swago.baseswago.im.ImConstant.red_envelope_broadcast
 import com.swago.baseswago.im.ImConstant.red_envelope_broadcast
@@ -18,7 +20,9 @@ import com.swago.baseswago.im.ImConstant.user_exit_room
 import com.swago.baseswago.im.ImConstant.user_join_room
 import com.swago.baseswago.im.ImConstant.user_join_room
 import com.swago.baseswago.model.RedEnvelope
 import com.swago.baseswago.model.RedEnvelope
 import com.swago.baseswago.model.im.*
 import com.swago.baseswago.model.im.*
+import com.swago.baseswago.model.live.ForceCloseModel
 import com.swago.baseswago.model.live.ReceiveModel
 import com.swago.baseswago.model.live.ReceiveModel
+import com.swago.baseswago.model.im.GamePrize
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.LogUtil
 import com.swago.baseswago.util.LogUtil
 import com.tencent.imsdk.v2.V2TIMMessage
 import com.tencent.imsdk.v2.V2TIMMessage
@@ -107,6 +111,15 @@ class GroupMsgParser : IGroupNewMsgParser {
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                 }
                 }
 
 
+                force_close_live_room -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(ForceCloseModel::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
+
                 red_envelope, red_envelope_broadcast -> {
                 red_envelope, red_envelope_broadcast -> {
                     parameterizedTypeImpl = ParameterizedTypeImpl(
                     parameterizedTypeImpl = ParameterizedTypeImpl(
                         arrayOf<Type>(RedEnvelope::class.java),
                         arrayOf<Type>(RedEnvelope::class.java),
@@ -124,6 +137,15 @@ class GroupMsgParser : IGroupNewMsgParser {
                     )
                     )
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                 }
                 }
+
+                game_win_big_prize -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(GamePrize::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
             }
             }
             parserModel?.v2TIMMessage = v2TIMMessage
             parserModel?.v2TIMMessage = v2TIMMessage
         }catch (e:Exception){
         }catch (e:Exception){

+ 8 - 0
baseswago/src/main/java/com/swago/baseswago/im/ImConstant.kt

@@ -51,6 +51,10 @@ object ImConstant {
     const val forbid_speak = 101
     const val forbid_speak = 101
     const val cancel_forbid_speak = 102
     const val cancel_forbid_speak = 102
     const val remove_room = 103
     const val remove_room = 103
+    /**
+     * 强制关播
+     */
+    const val force_close_live_room = 105
 
 
     /**
     /**
      * 直播间内下收到红包 104
      * 直播间内下收到红包 104
@@ -60,6 +64,10 @@ object ImConstant {
      * 发送大额红包的大群通知 3
      * 发送大额红包的大群通知 3
      */
      */
     const val red_envelope_broadcast = 3
     const val red_envelope_broadcast = 3
+    /**
+     * 玩游戏中奖
+     */
+    const val game_win_big_prize = 4
 
 
 
 
 
 

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

@@ -1,7 +1,9 @@
 package com.swago.baseswago.inter
 package com.swago.baseswago.inter
 
 
 import com.swago.baseswago.model.ConfigModel
 import com.swago.baseswago.model.ConfigModel
+import com.swago.baseswago.model.DomainConfig
 import retrofit2.http.GET
 import retrofit2.http.GET
+import retrofit2.http.Headers
 import retrofit2.http.POST
 import retrofit2.http.POST
 
 
 /**
 /**
@@ -16,4 +18,11 @@ interface ConfigApi {
     @POST("/v1/home/config")
     @POST("/v1/home/config")
     suspend fun getAppConfig(): ConfigModel
     suspend fun getAppConfig(): ConfigModel
 
 
+    /**
+     * 获取api接口
+     */
+    @Headers("urlFlag:apiDomain")
+    @GET("/domain/domain.json")
+    suspend fun getApiDomain(): DomainConfig
+
 }
 }

+ 5 - 0
baseswago/src/main/java/com/swago/baseswago/model/DomainConfig.kt

@@ -0,0 +1,5 @@
+package com.swago.baseswago.model
+
+data class DomainConfig(
+    val host:String=""
+)

+ 18 - 0
baseswago/src/main/java/com/swago/baseswago/model/MomentModel.java

@@ -29,6 +29,8 @@ public class MomentModel implements Parcelable {
     private int user_sex;
     private int user_sex;
     private int user_level;
     private int user_level;
     private int is_robot;
     private int is_robot;
+    private boolean forbid_status;
+    private String game_url;
 
 
     protected MomentModel(Parcel in) {
     protected MomentModel(Parcel in) {
         user_account = in.readString();
         user_account = in.readString();
@@ -193,4 +195,20 @@ public class MomentModel implements Parcelable {
     public void setIs_robot(int is_robot) {
     public void setIs_robot(int is_robot) {
         this.is_robot = is_robot;
         this.is_robot = is_robot;
     }
     }
+
+    public boolean isForbid_status() {
+        return forbid_status;
+    }
+
+    public void setForbid_status(boolean forbid_status) {
+        this.forbid_status = forbid_status;
+    }
+
+    public String getGame_url() {
+        return game_url;
+    }
+
+    public void setGame_url(String game_url) {
+        this.game_url = game_url;
+    }
 }
 }

+ 8 - 0
baseswago/src/main/java/com/swago/baseswago/model/im/GamePrize.kt

@@ -0,0 +1,8 @@
+package com.swago.baseswago.model.im
+
+class GamePrize:IPiaoTiao{
+    val senderName:String=""
+    val senderId:String=""
+    val gameName:String=""
+    val coin:String=""
+}

+ 4 - 0
baseswago/src/main/java/com/swago/baseswago/model/im/IPiaoTiao.kt

@@ -0,0 +1,4 @@
+package com.swago.baseswago.model.im
+
+interface IPiaoTiao {
+}

+ 6 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/ErrorModel.kt

@@ -0,0 +1,6 @@
+package com.swago.baseswago.model.live
+
+data class ErrorModel(
+    var code:Int,
+    var msg:String=""
+)

+ 6 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/ForceCloseModel.kt

@@ -0,0 +1,6 @@
+package com.swago.baseswago.model.live
+
+data class ForceCloseModel (
+    val roomId:String="",
+    val closedReason:String=""
+)

+ 15 - 5
baseswago/src/main/java/com/swago/baseswago/model/live/RoomConfig.java

@@ -3,7 +3,7 @@ package com.swago.baseswago.model.live;
 import android.os.Parcel;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.Parcelable;
 
 
-import java.util.List;
+import java.util.ArrayList;
 
 
 /**
 /**
  * @date 2022/4/12 18:04
  * @date 2022/4/12 18:04
@@ -24,10 +24,11 @@ public class RoomConfig implements Parcelable {
     * rotation_img_url : http://image2.vv-tool.com/2021/09/13/03/09/30/47067.jpg
     * rotation_img_url : http://image2.vv-tool.com/2021/09/13/03/09/30/47067.jpg
     * rotation_url : d
     * rotation_url : d
     */
     */
-
-   private List<BannersBean> banners;
+   private int is_show_game; //1展示 0不展示
+   private ArrayList<BannersBean> banners;
 
 
    protected RoomConfig(Parcel in) {
    protected RoomConfig(Parcel in) {
+      is_show_game = in.readInt();
    }
    }
 
 
    public static final Creator<RoomConfig> CREATOR = new Creator<RoomConfig>() {
    public static final Creator<RoomConfig> CREATOR = new Creator<RoomConfig>() {
@@ -50,11 +51,19 @@ public class RoomConfig implements Parcelable {
       this.red_package = red_package;
       this.red_package = red_package;
    }
    }
 
 
-   public List<BannersBean> getBanners() {
+   public int getIs_show_game() {
+      return is_show_game;
+   }
+
+   public void setIs_show_game(int is_show_game) {
+      this.is_show_game = is_show_game;
+   }
+
+   public ArrayList<BannersBean> getBanners() {
       return banners;
       return banners;
    }
    }
 
 
-   public void setBanners(List<BannersBean> banners) {
+   public void setBanners(ArrayList<BannersBean> banners) {
       this.banners = banners;
       this.banners = banners;
    }
    }
 
 
@@ -65,6 +74,7 @@ public class RoomConfig implements Parcelable {
 
 
    @Override
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(Parcel dest, int flags) {
+      dest.writeInt(is_show_game);
    }
    }
 
 
    public static class RedPackageBean {
    public static class RedPackageBean {

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

@@ -1,10 +1,12 @@
 package com.swago.baseswago.model.live.gift;
 package com.swago.baseswago.model.live.gift;
 
 
+import com.swago.baseswago.model.im.IPiaoTiao;
+
 /**
 /**
  * @date 2021/12/11 16:47
  * @date 2021/12/11 16:47
  * description:
  * description:
  */
  */
-public class IMGiftModel {
+public class IMGiftModel implements IPiaoTiao {
 
 
     /**
     /**
      * roomId : 112
      * roomId : 112

+ 19 - 0
baseswago/src/main/java/com/swago/baseswago/util/MD5Util.java

@@ -1,7 +1,9 @@
 package com.swago.baseswago.util;
 package com.swago.baseswago.util;
 
 
+import com.google.android.gms.common.util.Base64Utils;
 import com.google.android.gms.common.util.Hex;
 import com.google.android.gms.common.util.Hex;
 
 
+import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.security.MessageDigest;
 
 
 public class MD5Util {
 public class MD5Util {
@@ -18,4 +20,21 @@ public class MD5Util {
             throw new RuntimeException("md5加密失败", e);
             throw new RuntimeException("md5加密失败", e);
         }
         }
     }
     }
+
+
+    public static String encodeBase64(String str){
+        try {
+            return Base64Utils.encodeUrlSafe(str.getBytes(StandardCharsets.UTF_8));
+        }catch (Exception e){
+            throw new RuntimeException("加密失败",e);
+        }
+    }
+
+    public static String decodeBase64(String str) {
+        try {
+            return new String(Base64Utils.decodeUrlSafe(str),"UTF-8");
+        } catch (Exception e) {
+            throw new RuntimeException("解密失败", e);
+        }
+    }
 }
 }

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

@@ -1,7 +1,10 @@
 package com.swago.baseswago.util
 package com.swago.baseswago.util
 
 
+import android.Manifest
 import android.os.Build
 import android.os.Build
 import android.text.TextUtils
 import android.text.TextUtils
+import com.permissionx.guolindev.PermissionX
+import java.io.*
 import java.util.*
 import java.util.*
 
 
 /**
 /**
@@ -14,6 +17,7 @@ object SwagoInfo {
     private var languageCode = "en"
     private var languageCode = "en"
     private var appClient = "android"
     private var appClient = "android"
     private var channel = "DDD02"
     private var channel = "DDD02"
+    private var imei = ""
 
 
     fun isGooglePackage():Boolean{
     fun isGooglePackage():Boolean{
         return false
         return false
@@ -28,6 +32,9 @@ object SwagoInfo {
             "in" -> {
             "in" -> {
                 "id"
                 "id"
             }
             }
+            "ms" -> {
+                "ms"
+            }
             else -> {
             else -> {
                 "en"
                 "en"
             }
             }
@@ -63,4 +70,68 @@ object SwagoInfo {
         return channel
         return channel
     }
     }
 
 
+
+    fun getIMEI():String{
+        if (imei.isEmpty()){
+            imei = getUniqueDeviceId()
+        }
+        return imei
+    }
+
+    private fun getUniqueDeviceId():String{
+        if (PermissionX.isGranted(AppContext.getContext(), Manifest.permission.READ_EXTERNAL_STORAGE)){
+           if (AppContext.getContext().getExternalFilesDir(null) == null){
+               return ""
+           }else{
+               val path = "${AppContext.getContext().getExternalFilesDir(null)!!.path}/swagoFile"
+               val pathFile = File("$path/uuid.txt")
+               if (pathFile.exists()){
+                   var br: BufferedReader? = null
+                   var isr: InputStreamReader? = null
+                   try {
+                       isr = InputStreamReader(FileInputStream(pathFile))
+                       br = BufferedReader(isr)
+                       val stringBuilder = StringBuffer()
+                       var line:String?
+                       while (br.readLine().also { line = it } != null) {
+                           stringBuilder.append(line)
+                       }
+                       LogUtil.d("设备唯一标识","本地文件获取:"+stringBuilder.toString())
+                       return stringBuilder.toString()
+                   }catch (e:Exception){
+                       e.printStackTrace()
+                   }finally {
+                       try {
+                           isr?.close()
+                           br?.close()
+                       } catch (e: Exception) {
+                           e.printStackTrace()
+                       }
+                   }
+               }else{
+                   File(path).mkdirs()
+                   pathFile.createNewFile()
+                   val rawImei = "${System.currentTimeMillis()}${"Android ${Build.VERSION.RELEASE}"}"
+                   val imei = MD5Util.md5Hex(rawImei)
+                   var writer:FileWriter? = null
+                   try {
+                       writer = FileWriter(pathFile)
+                       writer.write(imei)
+                       LogUtil.d("设备唯一标识","创建的时候获取:"+imei)
+                       return imei
+                   }catch (e:Exception){
+                       e.printStackTrace()
+                   }finally {
+                       try {
+                           writer?.close()
+                       } catch (e: Exception) {
+                           e.printStackTrace()
+                       }
+                   }
+               }
+           }
+        }
+        return ""
+    }
+
 }
 }

+ 29 - 0
baseswago/src/main/java/com/swago/baseswago/util/TimeUtil.kt

@@ -28,6 +28,35 @@ object TimeUtil {
         return convertTime
         return convertTime
     }
     }
 
 
+    /**
+     * 秒转化成时分秒
+     */
+    fun convertHours(time: Long): String {
+        var convertTime = ""
+        var hour = 0
+        var min = 0
+        var sec = 0
+        if (time <= 0) {
+            return "00:00:00"
+        }
+
+        min = (time / 60).toInt()
+        if (min < 60) {
+            sec = (time % 60).toInt()
+            convertTime = "00:" + unitFormat(min) + ":" + unitFormat(sec)
+        } else {
+            hour = min / 60
+            if (hour > 99) {
+                return "99:59:59"
+            }
+            min %= 60
+            sec = (time - hour * 3600 - min * 60).toInt()
+            convertTime = unitFormat(hour) + ":" + unitFormat(min) + ":" + unitFormat(sec)
+        }
+
+        return convertTime
+    }
+
 
 
     private fun unitFormat(i: Int): String {
     private fun unitFormat(i: Int): String {
         return if (i in 0..9) {
         return if (i in 0..9) {

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

@@ -22,6 +22,7 @@ fun ImageView.loadWebp(context: Context, @DrawableRes resourceId:Int){
 fun ImageView.loadUrl(context: Context,url:String){
 fun ImageView.loadUrl(context: Context,url:String){
     Glide.with(context)
     Glide.with(context)
         .load(url)
         .load(url)
+        .centerCrop()
         .placeholder(R.mipmap.default_avatar)
         .placeholder(R.mipmap.default_avatar)
         .error(R.mipmap.default_avatar)
         .error(R.mipmap.default_avatar)
         .into(this)
         .into(this)

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

@@ -174,7 +174,13 @@
     <string name="prepare_to_open_red_envelope">Saya mengirim Angpao keberuntungan, akan dirampok dalam 30-an, silakan persiapkan terlebih dahulu</string>
     <string name="prepare_to_open_red_envelope">Saya mengirim Angpao keberuntungan, akan dirampok dalam 30-an, silakan persiapkan terlebih dahulu</string>
     <string name="thank_for_boss">Saya mendapat %s koin, terima kasih bos %s!</string>
     <string name="thank_for_boss">Saya mendapat %s koin, terima kasih bos %s!</string>
 
 
-    <string name="please_update">Please upgrade the application first</string>
-
+    <string name="please_update">Silakan perbarui aplikasi terlebih dahulu</string>
+    <string name="upgrade_level">Bagaimana cara perbarui?</string>
+    <string name="got_it_ss">Paham(%ss)</string>
+    <string name="ban_title">Anda telah dilarang menyiarkan</string>
+    <string name="remaining_time_of_ban">Waktu yang tersisa dilarang untuk disiarkan</string>
+    <string name="got_it">Paham</string>
+    <string name="force_closed_by_admin">Ruang siaran Anda telah ditutup oleh administrator</string>
+    <string name="game_prize">%s baru saja memenangkan %s koin dalam %s, luar biasa!</string>
 
 
 </resources>
 </resources>

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

@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="user_agreement">Perjanjian Pengguna</string>
+    <string name="privacy_policy">Polisi Privasi</string>
+    <string name="and">dan</string>
+    <string name="explain">Log masuk bermakna anda telah bersetuju dengan Perjanjian Pengguna dan Polisi Privasi di atas</string>
+    <string name="follow">ikut</string>
+    <string name="fans">pengikut</string>
+    <string name="following">mengikut</string>
+    <string name="followers">pengikut</string>
+    <string name="current_version">versi</string>
+    <string name="logout">log keluar</string>
+    <string name="blacklist">senarai hitam</string>
+    <string name="setting">tetapan</string>
+    <string name="edit_profile">Sunting profil</string>
+    <string name="male">lelaki</string>
+    <string name="female">perempuan</string>
+    <string name="save">simpan</string>
+    <string name="start_live">Siaran Langsung</string>
+    <string name="room_has_been_closed">Live telah sampai ke penghujungnya.</string>
+    <string name="leave">Tercicir keluar</string>
+    <string name="join_room">Menyertai bilik</string>
+    <string name="id_x">ID:%s</string>
+    <string name="swago_offical_msg">Maklumat rasmi Swago</string>
+    <string name="message">mesej</string>
+    <string name="coin">koin</string>
+    <string name="diamond">berlian</string>
+    <string name="my_level">Tahap Saya</string>
+    <string name="top_up_center">pusat tambah nilai</string>
+    <string name="task_center">Pusat Tugas</string>
+    <string name="contact_service">khidmat pelanggan</string>
+    <string name="sex">Jantina</string>
+    <string name="age">umur</string>
+    <string name="constellation">Buruj</string>
+    <string name="sign">bio</string>
+    <string name="selecte_country">pilih negara/negeri</string>
+    <string name="country">negara/negeri</string>
+    <string name="rich_level">tahap terkaya</string>
+    <string name="anchor_level">tahap host</string>
+    <string name="get_exp">mendapat poin pengalaman</string>
+    <string name="level_up_exp">Pengalaman diperlukan untuk meningkatkan: %s</string>
+    <string name="know_detail">Ketahui lebih lanjut</string>
+    <string name="level_medal">lencana</string>
+    <string name="show_first">Paparan keutamaan</string>
+    <string name="vip_server">Perkhidmatan pelanggan yang berdedikasi</string>
+    <string name="level_privilege">Keistimewaan Tahap</string>
+    <string name="levek_compare_table">Jadual perbandingan tahap</string>
+    <string name="home_hot">kegemaran</string>
+    <string name="home_new">bintang baru</string>
+    <string name="home_follow">mengikut</string>
+    <string name="mine_balance">baki saya</string>
+    <string name="recharge_gear">senarai tambah nilai</string>
+    <string name="recharge">tambah nilai</string>
+    <string name="daily_task">tugasan harian</string>
+    <string name="newer_task">tugasan host baru</string>
+    <string name="reward">hadiah:</string>
+    <string name="exp">pengalaman</string>
+    <string name="receive">terima</string>
+    <string name="uncomplete">tidak di selesai kan</string>
+    <string name="complete">selesai</string>
+    <string name="live_end">Live telah sampai ke penghujungnya</string>
+    <string name="sure_close">mengesahkan</string>
+    <string name="search_name_or_id">Cari nama panggilan/ID</string>
+    <string name="fans_list">Kedudukan Peminat</string>
+    <string name="daily">harian</string>
+    <string name="weekly">mingguan</string>
+    <string name="monthly">bulanan</string>
+    <string name="need_exp">poin pengalaman yang diperlukan</string>
+    <string name="exp_explain">Untuk setiap hadiah 100 syiling emas, pengalaman mata +1</string>
+    <string name="exp_explain2">Untuk setiap hadiah 100 syiling emas, pengalaman mata +1</string>
+    <string name="report">melaporkan</string>
+    <string name="report_success">berjaya melaporkan</string>
+    <string name="report_one">Kandungan kesat atau lucah</string>
+    <string name="report_two">Haram atau ganas</string>
+    <string name="report_three">Membahayakan keselamatan diri</string>
+    <string name="report_four">Avatar haram</string>
+    <string name="report_five">Penutup haram</string>
+    <string name="report_six">lain</string>
+    <string name="tips">segera</string>
+    <string name="consume_order">Pesanan\n%s\n tidak berjaya digunakan, sila klik serahkan semula pesanan!</string>
+    <string name="sure_consume">Hantar semula pesanan sekarang</string>
+    <string name="send">Memberi</string>
+    <string name="hot">kegemaran</string>
+    <string name="luxury">Hadiah premium</string>
+    <string name="pay_cancel">pembayaran di batalkan</string>
+    <string name="pay_fail">Pengecualian pembayaran Google</string>
+    <string name="send_to">hadiah kepada %s</string>
+    <string name="install_facebook">Sila muat turun Facebook dahulu</string>
+    <string name="acccount_login">Log masuk akaun</string>
+    <string name="other_login">Google &amp; Facebook log masuk</string>
+    <string name="input_account">Sila masukkan akaun anda</string>
+    <string name="input_secret">Sila masukkan rahsia anda</string>
+    <string name="login">log masuk</string>
+    <string name="facebook_google_login">Kaedah log masuk lain</string>
+    <string name="google_service_error">Terdapat masalah dengan perkhidmatan Google anda</string>
+    <string name="big_gift_msg">%s memberikan %s kepada %s, yang sangat membanggakan!</string>
+    <string name="big_gift">%s memberikan %s kepada %s</string>
+    <string name="balance">baki:</string>
+    <string name="login_anthor_device">Akaun anda sudah dilog masuk pada peranti lain</string>
+    <string name="lucky">Bertuah</string>
+    <string name="live">Siaran Langsung</string>
+    <string name="win_num_prize">win %s times</string>
+    <string name="kick_success">Ditendang keluar dengan jayanya</string>
+    <string name="kick_room">Tendang keluar dari ruang siaran</string>
+    <string name="be_kick_out">Anda telah dihalau keluar dari studio</string>
+    <string name="mute_success">berjaya dibisukan</string>
+    <string name="cancel_mute_success">berjaya membatalkan bisu</string>
+    <string name="forbid_speak">bisu</string>
+    <string name="cancel_forbid_speak">batal bisu</string>
+    <string name="you_are_been_forbid">anda telah dibisukan</string>
+    <string name="black">blokir</string>
+    <string name="black_success">berjaya diblokir</string>
+    <string name="cancel_black_success">berjaya membatalkan blokir</string>
+    <string name="room_anchor_black_list">senarai hitam penyiar</string>
+    <string name="room_user_black_list">senarai hitam penguna</string>
+    <string name="delete">padam</string>
+    <string name="rank_title">Tajuk</string>
+    <string name="special_effects">Kesan kemasukan</string>
+    <string name="send_gift">hadiah</string>
+    <string name="add_privat_chat_black">Tambahkan pada senarai hitam mesej peribadi</string>
+    <string name="cancel_private_chat_black">Batalkan sekatan mesej peribadi</string>
+    <string name="add_room_chat_black">Tambahkan pada senarai hitam ruang langsung</string>
+    <string name="cancel_room_chat_black">Batalkan senarai hitam ruang langsung</string>
+    <string name="never_watcher_the_anchor">berhenti menonton strim ini</string>
+    <string name="private_message_black">senarai hitam mesej peribadi</string>
+    <string name="live_room_black">senarai hitam siaran langsung</string>
+    <string name="anchor_black">senarai hitam host</string>
+    <string name="edit">edit</string>
+    <string name="level">tahap</string>
+    <string name="withdrawal">pengeluaran</string>
+    <string name="top_up">tambah nilai</string>
+    <string name="app_settings">sediakan</string>
+    <string name="nickname">nama pangilan</string>
+    <string name="confirm">mengesahkan</string>
+    <string name="say_hi">kata hi</string>
+    <string name="total">keseluruhan</string>
+
+    <string name="followed">mengkuti</string>
+    <string name="audience_list">senarai penguna</string>
+    <string name="share_to">berkongsi ke</string>
+    <string name="app_not_install">aplikasi tidak dimuat turun</string>
+    <string name="follow_anchor">Dah follow hos, jangan risau terlepas live lagi~</string>
+    <string name="big_prize">Alangkah bertuahnya! %s menghantar %s untuk memenangi %s kali ganda ganjaran, tahniah kepadanya!</string>
+    <string name="update_now">kemas kini dengan segera</string>
+
+    <string name="special">istimewa</string>
+    <string name="not_less_coin">Tidak kurang daripada %s emas</string>
+    <string name="at_last_red_num">Sekurang-kurangnya %s paket merah</string>
+    <string name="broadcast_red_envelope">Apabila jumlah keseluruhan sampul merah >=%s, pemberitahuan akan disiarkan di seluruh platform.</string>
+    <string name="receive_red_envelope_coin">terima sampul merah itu</string>
+    <string name="go_to_send">untuk memberi hadiah</string>
+    <string name="congratulation">tahniah! sudah mendapat</string>
+    <string name="sorry_fail_to_get">Sayang sekali awak datang lewat selangkah,\nsampul merah telah habis</string>
+    <string name="from_who_red_envelope">Paket merah dari %s</string>
+    <string name="konw">faham</string>
+    <string name="red_envelope_rule">Peraturan Paket Merah Bertuah</string>
+    <string name="red_envelope">sampul merah bertuah</string>
+    <string name="coin_sum">Jumlah syiling emas</string>
+    <string name="red_envelope_num">Bilangan peket merah</string>
+    <string name="send_red_envelope">Sampul surat merah</string>
+    <string name="go_to">pergi ke</string>
+    <string name="who_send_red_envelope_broadcast">Baru sahaja menghantar sampul merah di bilik %s, adakah anda mahu pergi ke bilik siaran langsung untuk mengambil sampul merah itu?</string>
+    <string name="already_receive_red_envelope">Awak dah ambik sampul merah tu</string>
+    <string name="cancel">Batal</string>
+    <string name="not_enough_coin">Baki syiling emas tidak mencukupi</string>
+
+    <string name="please_update">Kemas kini aplikasi anda ke versi yang terbaru.</string>
+    <string name="upgrade_level">Bagaimana untuk kemas kini</string>
+    <string name="got_it_ss">Okay! (%ss)</string>
+    <string name="ban_title">Anda telah DILARANG untuk siaran</string>
+    <string name="remaining_time_of_ban">Baki masa dilarang daripada penyiaran</string>
+    <string name="got_it">Okay!</string>
+    <string name="force_closed_by_admin">Ruang langsung anda telah ditutup oleh admin</string>
+    <string name="game_prize">%s baru sahaja memenangi %s syiling dalam %s, itu hebat!</string>
+</resources>

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

@@ -165,5 +165,12 @@
     <string name="not_enough_coin">金币余额不足</string>
     <string name="not_enough_coin">金币余额不足</string>
 
 
     <string name="please_update">请您先更新应用</string>
     <string name="please_update">请您先更新应用</string>
+    <string name="upgrade_level">如何升级</string>
+    <string name="got_it_ss">知道了(%ss)</string>
+    <string name="ban_title">您已被禁止开播</string>
+    <string name="remaining_time_of_ban">被禁止开播剩余时长</string>
+    <string name="got_it">知道了</string>
+    <string name="force_closed_by_admin">您的直播间已被管理员关闭</string>
+    <string name="game_prize">%s刚刚在%s中赢得了%s金币,真是太厉害了</string>
 
 
 </resources>
 </resources>

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

@@ -191,7 +191,13 @@
     <string name="prepare_to_open_red_envelope">I sent out a lucky red envelope, which will be robbed in 30s, please prepare in advance</string>
     <string name="prepare_to_open_red_envelope">I sent out a lucky red envelope, which will be robbed in 30s, please prepare in advance</string>
     <string name="thank_for_boss">I got %s coins, thank you boss %s!</string>
     <string name="thank_for_boss">I got %s coins, thank you boss %s!</string>
 
 
-    <string name="please_update">Please upgrade the application first</string>
-
+    <string name="please_update">Please update the app first</string>
+    <string name="upgrade_level">How to upgrade</string>
+    <string name="got_it_ss">Got it (%ss)</string>
+    <string name="ban_title">You have been banned from broadcasting</string>
+    <string name="remaining_time_of_ban">Remaining time banned from broadcasting</string>
+    <string name="got_it">Got it</string>
+    <string name="force_closed_by_admin">Your broadcast room has been closed by an administrator</string>
+    <string name="game_prize">%s just won %s coins in %s, that\'s awesome!</string>
 
 
 </resources>
 </resources>

+ 8 - 2
build.gradle

@@ -9,8 +9,8 @@ buildscript {
         maven { url 'http://maven.faceunity.com/repository/maven-public/' }
         maven { url 'http://maven.faceunity.com/repository/maven-public/' }
     }
     }
     dependencies {
     dependencies {
-        classpath "com.android.tools.build:gradle:4.2.1"
-        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10'
+        classpath "com.android.tools.build:gradle:4.2.2"
+        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'
         classpath 'com.google.gms:google-services:4.3.10'
         classpath 'com.google.gms:google-services:4.3.10'
         classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
         classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
         classpath 'com.google.firebase:perf-plugin:1.4.0'
         classpath 'com.google.firebase:perf-plugin:1.4.0'
@@ -30,6 +30,12 @@ allprojects {
         maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" }
         maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" }
         maven { url 'http://maven.faceunity.com/repository/maven-public/' }
         maven { url 'http://maven.faceunity.com/repository/maven-public/' }
     }
     }
+
+    configurations.all{
+        resolutionStrategy{
+            force 'com.squareup.okhttp3:okhttp:4.9.1'
+        }
+    }
 }
 }
 
 
 task clean(type: Delete) {
 task clean(type: Delete) {

+ 1 - 1
home/build.gradle

@@ -45,7 +45,7 @@ android {
 
 
 dependencies {
 dependencies {
 
 
-    implementation 'androidx.core:core-ktx:1.3.2'
+    implementation 'androidx.core:core-ktx:1.5.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     testImplementation 'junit:junit:4.+'
     testImplementation 'junit:junit:4.+'

+ 29 - 0
home/src/main/java/com/swago/home/innerhome/ComGridItemDecoration.kt

@@ -0,0 +1,29 @@
+package com.swago.home.innerhome
+
+import android.graphics.Rect
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import com.swago.baseswago.util.DpPxUtil
+
+class ComGridItemDecoration  : RecyclerView.ItemDecoration() {
+    override fun getItemOffsets(
+        outRect: Rect,
+        view: View,
+        parent: RecyclerView,
+        state: RecyclerView.State
+    ) {
+        val itemPosition = (view.layoutParams as RecyclerView.LayoutParams).viewLayoutPosition
+        val column = itemPosition % 2
+        val margin = DpPxUtil.dip2px(6f)
+        val middle = DpPxUtil.dip2px(3f)
+        when(column){
+            0 -> {
+                outRect.set(margin, 0, middle, margin)
+            }
+
+            1 -> {
+                outRect.set(middle, 0, margin, margin)
+            }
+        }
+    }
+}

+ 1 - 1
home/src/main/java/com/swago/home/innerhome/FollowFragment.kt

@@ -38,7 +38,7 @@ class FollowFragment : BaseListFragment<FragmentHotBinding, MomentModel>(){
     }
     }
 
 
     override fun initViewData() {
     override fun initViewData() {
-        smartRecyclerView.recyclerView?.addItemDecoration(HomeGridItemDecoration())
+        smartRecyclerView.recyclerView?.addItemDecoration(ComGridItemDecoration())
         adapter.setOnItemClickListener { _, _, position ->
         adapter.setOnItemClickListener { _, _, position ->
             if (adapter.data.size>position){
             if (adapter.data.size>position){
                 if (adapter.data[position].user_broadcast_status == 1){
                 if (adapter.data[position].user_broadcast_status == 1){

+ 12 - 3
home/src/main/java/com/swago/home/innerhome/HomeAdapter.kt

@@ -11,6 +11,7 @@ import com.swago.baseswago.cusview.SwagoLevelView
 import com.swago.baseswago.model.MomentModel
 import com.swago.baseswago.model.MomentModel
 import com.swago.baseswago.model.home.HomeModel
 import com.swago.baseswago.model.home.HomeModel
 import com.swago.home.R
 import com.swago.home.R
+import com.swago.loadUrl
 import com.swago.loadWebp
 import com.swago.loadWebp
 
 
 /**
 /**
@@ -30,15 +31,23 @@ class HomeAdapter  : BaseQuickAdapter<MomentModel, BaseViewHolder>(R.layout.item
                 setImageResource(R.id.ivSex,R.mipmap.male)
                 setImageResource(R.id.ivSex,R.mipmap.male)
             }
             }
             val imageView = itemView.findViewById<ShapeableImageView>(R.id.ivAvatar)
             val imageView = itemView.findViewById<ShapeableImageView>(R.id.ivAvatar)
-            Glide.with(itemView.context).load(item.user_head_img_url)
-                .placeholder(R.mipmap.default_avatar)
-                .error(R.mipmap.default_avatar).centerCrop().into(imageView)
+            imageView.loadUrl(itemView.context,item.user_head_img_url)
             if (item.user_broadcast_status == 1){
             if (item.user_broadcast_status == 1){
                 itemView.findViewById<ImageView>(R.id.ivLive).loadWebp(mContext,R.mipmap.icon_living)
                 itemView.findViewById<ImageView>(R.id.ivLive).loadWebp(mContext,R.mipmap.icon_living)
                 setVisible(R.id.llLive,true)
                 setVisible(R.id.llLive,true)
             }else{
             }else{
                 setVisible(R.id.llLive,false)
                 setVisible(R.id.llLive,false)
             }
             }
+
+            if (item.isForbid_status||item.user_broadcast_status==0){
+                setGone(R.id.llGame,false)
+            }else{
+                val ivGameIcon = itemView.findViewById<ImageView>(R.id.ivGameIcon)
+                ivGameIcon.loadUrl(itemView.context,item.game_url)
+                setGone(R.id.llGame,true)
+
+            }
+
 //            setImageResource(R.id.ivCountry,R.drawable.flag_ac)
 //            setImageResource(R.id.ivCountry,R.drawable.flag_ac)
         }
         }
     }
     }

+ 7 - 3
home/src/main/java/com/swago/home/innerhome/HomeGridItemDecoration.kt

@@ -20,14 +20,18 @@ class HomeGridItemDecoration : RecyclerView.ItemDecoration() {
         val column = itemPosition % 2
         val column = itemPosition % 2
         val margin = DpPxUtil.dip2px(6f)
         val margin = DpPxUtil.dip2px(6f)
         val middle = DpPxUtil.dip2px(3f)
         val middle = DpPxUtil.dip2px(3f)
+        if (itemPosition <= 0) {
+            outRect.set(0, 0, 0, 0)
+            return
+        }
         when(column){
         when(column){
             0 -> {
             0 -> {
-                outRect.set(margin, 0, middle, margin)
+                outRect.set(middle, margin, margin, 0)
             }
             }
 
 
             1 -> {
             1 -> {
-                outRect.set(middle, 0, margin, margin)
+                outRect.set(margin, margin, middle, 0)
             }
             }
         }
         }
     }
     }
-}
+}

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

@@ -4,12 +4,9 @@ import android.app.Application
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.MutableLiveData
 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.model.ConfigModel
 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
 
 
 /**
 /**
  *@date 2021/11/28 10:35
  *@date 2021/11/28 10:35

+ 1 - 1
home/src/main/java/com/swago/home/innerhome/NewFragment.kt

@@ -39,7 +39,7 @@ class NewFragment  : BaseListFragment<FragmentHotBinding, MomentModel>(){
     }
     }
 
 
     override fun initViewData() {
     override fun initViewData() {
-        smartRecyclerView.recyclerView?.addItemDecoration(HomeGridItemDecoration())
+        smartRecyclerView.recyclerView?.addItemDecoration(ComGridItemDecoration())
         adapter.setOnItemClickListener { _, _, position ->
         adapter.setOnItemClickListener { _, _, position ->
             ARouter.getInstance()
             ARouter.getInstance()
                 .build(ARouteConstant.Room.user)
                 .build(ARouteConstant.Room.user)

+ 18 - 0
home/src/main/res/layout/item_home.xml

@@ -13,6 +13,24 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:shapeAppearanceOverlay="@style/fourCornerImageStyle" />
         app:shapeAppearanceOverlay="@style/fourCornerImageStyle" />
 
 
+    <FrameLayout
+        android:id="@+id/llGame"
+        android:visibility="gone"
+        tools:visibility="visible"
+        android:background="@mipmap/icon_game_bg"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/ivGameIcon"
+            android:layout_marginStart="5dp"
+            android:layout_marginTop="5dp"
+            android:layout_width="22dp"
+            android:layout_height="22dp"/>
+    </FrameLayout>
+
     <LinearLayout
     <LinearLayout
         android:id="@+id/llLive"
         android:id="@+id/llLive"
         android:visibility="gone"
         android:visibility="gone"

+ 2 - 0
home/src/main/res/layout/layout_view_header.xml

@@ -10,6 +10,8 @@
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
+            android:layout_marginStart="6dp"
+            android:layout_marginEnd="6dp"
             android:layout_width="0dp"
             android:layout_width="0dp"
             android:layout_height="0dp"/>
             android:layout_height="0dp"/>
 
 

BIN
home/src/main/res/mipmap-xxhdpi/icon_game_bg.webp


+ 1 - 1
lib_country_picker/build.gradle

@@ -33,7 +33,7 @@ android {
 
 
 dependencies {
 dependencies {
 
 
-    implementation 'androidx.core:core-ktx:1.3.2'
+    implementation 'androidx.core:core-ktx:1.5.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     testImplementation 'junit:junit:4.+'
     testImplementation 'junit:junit:4.+'

+ 1 - 1
login/build.gradle

@@ -45,7 +45,7 @@ android {
 
 
 dependencies {
 dependencies {
 
 
-    implementation 'androidx.core:core-ktx:1.3.2'
+    implementation 'androidx.core:core-ktx:1.5.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     testImplementation 'junit:junit:4.+'
     testImplementation 'junit:junit:4.+'

+ 1 - 1
room/build.gradle

@@ -43,7 +43,7 @@ android {
 
 
 dependencies {
 dependencies {
 
 
-    implementation 'androidx.core:core-ktx:1.3.2'
+    implementation 'androidx.core:core-ktx:1.5.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     testImplementation 'junit:junit:4.+'
     testImplementation 'junit:junit:4.+'

+ 37 - 0
room/src/main/java/com/swago/room/adapter/BannerViewAdapter.kt

@@ -0,0 +1,37 @@
+package com.swago.room.adapter
+
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.recyclerview.widget.RecyclerView
+import com.swago.baseswago.model.live.RoomConfig
+import com.swago.loadUrl
+import com.youth.banner.adapter.BannerAdapter
+
+class BannerViewAdapter(data:List<RoomConfig.BannersBean>) :  BannerAdapter<RoomConfig.BannersBean, BannerViewAdapter.BannerViewHolder>(data){
+
+    class BannerViewHolder(var imageView: ImageView) : RecyclerView.ViewHolder(
+        imageView
+    )
+
+    override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerViewHolder {
+        val imageView = ImageView(parent.context)
+        //注意,必须设置为match_parent,这个是viewpager2强制要求的
+        imageView.layoutParams = ViewGroup.LayoutParams(
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.MATCH_PARENT
+        )
+        imageView.scaleType = ImageView.ScaleType.CENTER_CROP
+        return BannerViewHolder(imageView)
+    }
+
+    override fun onBindView(
+        holder: BannerViewHolder?,
+        data: RoomConfig.BannersBean,
+        position: Int,
+        size: Int
+    ) {
+        holder?.let {
+            it.imageView.loadUrl(holder.imageView.context,data.rotation_img_url)
+        }
+    }
+}

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

@@ -27,6 +27,8 @@ import com.swago.room.base.NoContentFragment
 import com.swago.room.bean.UserRoomModel
 import com.swago.room.bean.UserRoomModel
 import com.swago.room.databinding.ActivityAnchorRoomBinding
 import com.swago.room.databinding.ActivityAnchorRoomBinding
 import com.swago.room.dialog.AnchorCloseDialog
 import com.swago.room.dialog.AnchorCloseDialog
+import com.swago.room.dialog.CanStartLiveDialog
+import com.swago.room.dialog.ForceCloseRoomDialog
 import com.swago.room.service.AgoraForegroundService
 import com.swago.room.service.AgoraForegroundService
 import com.swago.room.service.AgoraForegroundService.ACTION_START_FOREGROUND_SERVICE
 import com.swago.room.service.AgoraForegroundService.ACTION_START_FOREGROUND_SERVICE
 import com.swago.room.service.AgoraForegroundService.ACTION_STOP_FOREGROUND_SERVICE
 import com.swago.room.service.AgoraForegroundService.ACTION_STOP_FOREGROUND_SERVICE
@@ -153,7 +155,15 @@ class AnchorRoomActivity : AbsAnchorActivity<ActivityAnchorRoomBinding, IRoomInf
             SwagoRoomManager.closeRoom()
             SwagoRoomManager.closeRoom()
         }
         }
 
 
-        roomVm.anchorCloseLiveData.observe(this) {
+        msgVm.forceCloseAnchorRoom = {
+            ForceCloseRoomDialog.newInstance(it).show(supportFragmentManager,"ForceCloseRoomDialog")
+        }
+
+        roomVm.showBannerTime = {
+            CanStartLiveDialog.newInstance(it).show(supportFragmentManager,"CanStartLiveDialog")
+        }
+
+        roomVm.anchorCloseLiveData.observe(this){
             val dialog = AnchorCloseDialog.newInstance(it)
             val dialog = AnchorCloseDialog.newInstance(it)
             dialog.show(supportFragmentManager, "AnchorCloseDialog")
             dialog.show(supportFragmentManager, "AnchorCloseDialog")
         }
         }

+ 15 - 1
room/src/main/java/com/swago/room/base/BaseComFragment.kt

@@ -10,6 +10,7 @@ import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import androidx.recyclerview.widget.RecyclerView
+import com.alibaba.android.arouter.launcher.ARouter
 import com.gyf.immersionbar.ImmersionBar
 import com.gyf.immersionbar.ImmersionBar
 import com.liulishuo.okdownload.DownloadListener
 import com.liulishuo.okdownload.DownloadListener
 import com.liulishuo.okdownload.DownloadTask
 import com.liulishuo.okdownload.DownloadTask
@@ -22,9 +23,11 @@ import com.swago.baseswago.baseroom.IRoomActiveListener
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.RoomTimer
 import com.swago.baseswago.baseroom.RoomTimer
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.constant.ARouteConstant
 import com.swago.baseswago.constant.UrlConstant
 import com.swago.baseswago.constant.UrlConstant
 import com.swago.baseswago.fragment.BaseXFragment
 import com.swago.baseswago.fragment.BaseXFragment
 import com.swago.baseswago.im.IRoomChat
 import com.swago.baseswago.im.IRoomChat
+import com.swago.baseswago.model.im.GamePrize
 import com.swago.baseswago.model.im.RoomSystemMsgBean
 import com.swago.baseswago.model.im.RoomSystemMsgBean
 import com.swago.baseswago.model.live.RoomConfig
 import com.swago.baseswago.model.live.RoomConfig
 import com.swago.baseswago.model.live.RoomUserModel
 import com.swago.baseswago.model.live.RoomUserModel
@@ -194,7 +197,11 @@ abstract class BaseComFragment<T : FragmentBaseComBinding> : BaseXFragment<T>(),
         }
         }
         //飘条
         //飘条
         msgVm.waftFun = {
         msgVm.waftFun = {
-            waftManager.addNewMessage(it)
+            if (it is GamePrize && roomConfig?.is_show_game == 1){
+                waftManager.addNewMessage(it)
+            }else{
+                waftManager.addNewMessage(it)
+            }
         }
         }
         msgVm.showGiftDanDao = {
         msgVm.showGiftDanDao = {
             danDaoManager.addNewMessage(it)
             danDaoManager.addNewMessage(it)
@@ -221,6 +228,13 @@ abstract class BaseComFragment<T : FragmentBaseComBinding> : BaseXFragment<T>(),
         //直播间配置
         //直播间配置
         roomVm.roomConfigLiveData.observe(this){
         roomVm.roomConfigLiveData.observe(this){
             this.roomConfig = it
             this.roomConfig = it
+            //轮播图
+            binding.bannerView.setData(it.banners)
+            binding.bannerView.jumpToWebFun = { banner ->
+                ARouter.getInstance().build(ARouteConstant.Base.webView)
+                    .withString("url", banner.rotation_url)
+                    .navigation()
+            }
         }
         }
 
 
         //红包列表
         //红包列表

+ 44 - 0
room/src/main/java/com/swago/room/dialog/CanStartLiveDialog.kt

@@ -0,0 +1,44 @@
+package com.swago.room.dialog
+
+import android.os.Bundle
+import android.view.Gravity
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.util.NoDoubleClickListener
+import com.swago.baseswago.util.TimeUtil
+import com.swago.room.databinding.DialogCanStartLiveBinding
+import java.sql.Time
+
+class CanStartLiveDialog : BaseXDFragment<DialogCanStartLiveBinding>() {
+
+    init {
+        setGravity(Gravity.BOTTOM)
+        setDimAmount(0.5f)
+        setCanCancel(false)
+    }
+
+    companion object{
+        fun newInstance(time:Long): CanStartLiveDialog {
+            val args = Bundle()
+            args.putLong("time",time)
+            val fragment = CanStartLiveDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+    override fun initOther() {
+        arguments?.let {
+            val time = it.getLong("time",0L)
+            binding.tvTime.text = TimeUtil.convertHours(time)
+        }
+
+        binding.tvClose.setOnClickListener(object: NoDoubleClickListener(){
+            override fun onClick() {
+                dismissAllowingStateLoss()
+            }
+        })
+    }
+
+    override fun initLiveData() {
+    }
+}

+ 70 - 0
room/src/main/java/com/swago/room/dialog/ForceCloseRoomDialog.kt

@@ -0,0 +1,70 @@
+package com.swago.room.dialog
+
+import android.os.Bundle
+import android.view.Gravity
+import com.swago.baseswago.baseroom.RoomTimer
+import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.util.AppContext
+import com.swago.baseswago.util.NoDoubleClickListener
+import com.swago.room.R
+import com.swago.room.databinding.DialogForceCloseRoomBinding
+
+class ForceCloseRoomDialog : BaseXDFragment<DialogForceCloseRoomBinding>(),
+    RoomTimer.TimeTickListener {
+
+    init {
+        setGravity(Gravity.BOTTOM)
+        setDimAmount(0.5f)
+        setCanCancel(false)
+    }
+
+    var time = 5
+
+    companion object{
+        fun newInstance(content:String): ForceCloseRoomDialog {
+            val args = Bundle()
+            args.putString("msg",content)
+            val fragment = ForceCloseRoomDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+    override fun initOther() {
+        RoomTimer.timeTickList.add(this)
+    }
+
+    override fun initLiveData() {
+        arguments?.let {
+            val msg = it.getString("msg","")
+            binding.tvMsg.text = msg
+            binding.tvClose.text = AppContext.getContext().resources.getString(R.string.got_it_ss).format(time)
+        }
+
+        binding.tvClose.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                SwagoRoomManager.closeRoom()
+                dismissAllowingStateLoss()
+            }
+        })
+    }
+
+
+    override fun onDestroyView() {
+        RoomTimer.timeTickList.remove(this)
+        super.onDestroyView()
+    }
+
+    override fun onTimeCount(i: Int) {
+        time--
+        if (time==0){
+            SwagoRoomManager.closeRoom()
+            dismissAllowingStateLoss()
+        }else{
+            binding.tvClose.text = AppContext.getContext().resources.getString(R.string.got_it_ss).format(time)
+        }
+    }
+
+
+}

+ 45 - 0
room/src/main/java/com/swago/room/dialog/ReachLevelServiceDialog.kt

@@ -0,0 +1,45 @@
+package com.swago.room.dialog
+
+import android.os.Bundle
+import android.view.Gravity
+import com.alibaba.android.arouter.launcher.ARouter
+import com.swago.baseswago.constant.ARouteConstant
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.util.NoDoubleClickListener
+import com.swago.room.databinding.DialogReachLevelServiceBinding
+
+class ReachLevelServiceDialog :  BaseXDFragment<DialogReachLevelServiceBinding>(){
+
+    init {
+        setGravity(Gravity.CENTER)
+        setDimAmount(0.5f)
+        setCanCancel(true)
+    }
+
+    companion object{
+        fun newInstance(content:String): ReachLevelServiceDialog {
+            val args = Bundle()
+            args.putString("msg",content)
+            val fragment = ReachLevelServiceDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+    override fun initOther() {
+        arguments?.let {
+            val msg = it.getString("msg","")
+            binding.tvContent.text = msg
+        }
+
+        binding.tvContactService.setOnClickListener(object: NoDoubleClickListener(){
+            override fun onClick() {
+                ARouter.getInstance().build(ARouteConstant.User.customService).navigation()
+                dismissAllowingStateLoss()
+            }
+        })
+    }
+
+    override fun initLiveData() {
+    }
+}

+ 45 - 0
room/src/main/java/com/swago/room/dialog/UnReachLevelDialog.kt

@@ -0,0 +1,45 @@
+package com.swago.room.dialog
+
+import android.os.Bundle
+import android.view.Gravity
+import com.alibaba.android.arouter.launcher.ARouter
+import com.swago.baseswago.constant.ARouteConstant
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.util.NoDoubleClickListener
+import com.swago.room.databinding.DialogUnreachLevelBinding
+
+class UnReachLevelDialog : BaseXDFragment<DialogUnreachLevelBinding>() {
+
+    init {
+        setGravity(Gravity.CENTER)
+        setDimAmount(0.5f)
+        setCanCancel(true)
+    }
+
+    companion object{
+        fun newInstance(content:String): UnReachLevelDialog {
+            val args = Bundle()
+            args.putString("msg",content)
+            val fragment = UnReachLevelDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+    override fun initOther() {
+        arguments?.let {
+            val msg = it.getString("msg","")
+            binding.tvContent.text = msg
+        }
+
+        binding.tvUpgradeLevel.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                ARouter.getInstance().build(ARouteConstant.User.level).navigation()
+                dismissAllowingStateLoss()
+            }
+        })
+    }
+
+    override fun initLiveData() {
+    }
+}

+ 21 - 7
room/src/main/java/com/swago/room/gift/GiftDialog.kt

@@ -28,6 +28,8 @@ import com.swago.baseswago.model.live.gift.GiftModel
 import com.swago.baseswago.util.*
 import com.swago.baseswago.util.*
 import com.swago.room.R
 import com.swago.room.R
 import com.swago.room.databinding.DialogGiftBinding
 import com.swago.room.databinding.DialogGiftBinding
+import com.swago.room.dialog.ReachLevelServiceDialog
+import com.swago.room.dialog.UnReachLevelDialog
 import com.swago.room.gift.GiftConfig.giftSelectedWhichType
 import com.swago.room.gift.GiftConfig.giftSelectedWhichType
 import net.lucode.hackware.magicindicator.ViewPagerHelper
 import net.lucode.hackware.magicindicator.ViewPagerHelper
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
 import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
@@ -326,7 +328,7 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
                                 openSendRedEnvelopeFun?.invoke()
                                 openSendRedEnvelopeFun?.invoke()
                             }
                             }
                             else -> {
                             else -> {
-                                
+                                sendGift(gifModel, 0)
                             }
                             }
                         }
                         }
                        
                        
@@ -403,16 +405,28 @@ class GiftDialog : BaseXDFragment<DialogGiftBinding>() {
         }
         }
 
 
         giftVm.sendResultLiveData.observe(this) {
         giftVm.sendResultLiveData.observe(this) {
-            if (it != null) {
-                if (returnGiftBatch < it.gift_batch) {
+            if (it != null && returnGiftBatch < it.gift_batch) {
                     UserInfo.getUserInfo()?.user_coins = it.user_coins
                     UserInfo.getUserInfo()?.user_coins = it.user_coins
                     binding.tvCoins.text = it.user_coins ?: "0"
                     binding.tvCoins.text = it.user_coins ?: "0"
                     returnGiftBatch = it.gift_batch
                     returnGiftBatch = it.gift_batch
+            }
+        }
+
+        giftVm.sendGiftCodeLiveData.observe(this) {
+            when(it.code){
+                517 -> {
+                    ARouter.getInstance().build(ARouteConstant.Base.htmlRechargeWebView)
+                        .withString("url", UrlConstant.TOP_UP)
+                        .navigation()
+                    Toast.makeText(AppContext.getContext(), it.msg, Toast.LENGTH_SHORT).show()
+                }
+                542,543 -> {
+                    UnReachLevelDialog.newInstance(it.msg).show(parentFragmentManager,"UnReachLevelDialog")
+                }
+
+                544 -> {
+                    ReachLevelServiceDialog.newInstance(it.msg).show(parentFragmentManager,"ReachLevelServiceDialog")
                 }
                 }
-            } else {
-                ARouter.getInstance().build(ARouteConstant.Base.htmlRechargeWebView)
-                    .withString("url", UrlConstant.TOP_UP)
-                    .navigation()
             }
             }
         }
         }
 
 

+ 8 - 5
room/src/main/java/com/swago/room/gift/GiftVm.kt

@@ -6,6 +6,7 @@ import android.widget.Toast
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.MutableLiveData
 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.model.live.ErrorModel
 import com.swago.baseswago.model.live.gift.GiftAllModel
 import com.swago.baseswago.model.live.gift.GiftAllModel
 import com.swago.baseswago.model.live.gift.GiftSendModel
 import com.swago.baseswago.model.live.gift.GiftSendModel
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.AppContext
@@ -41,6 +42,10 @@ class GiftVm(application: Application) : BaseViewModel(application) {
         MutableLiveData<GiftSendModel?>()
         MutableLiveData<GiftSendModel?>()
     }
     }
 
 
+    val sendGiftCodeLiveData by lazy {
+        MutableLiveData<ErrorModel>()
+    }
+
     fun sendGift(
     fun sendGift(
         room_id: String,
         room_id: String,
         gift_id: String,
         gift_id: String,
@@ -49,7 +54,7 @@ class GiftVm(application: Application) : BaseViewModel(application) {
         isCombo:Int = 0,
         isCombo:Int = 0,
         gift_num: Int = 1,
         gift_num: Int = 1,
     ) {
     ) {
-        requestData2 {
+        requestData2(false) {
             requestData {
             requestData {
                 val data = ApiManager.roomApi.sendGift(room_id, gift_id, gift_batch, gift_receive_id, isCombo,gift_num)
                 val data = ApiManager.roomApi.sendGift(room_id, gift_id, gift_batch, gift_receive_id, isCombo,gift_num)
                 LogUtil.d("送礼","接口调用成功--${System.currentTimeMillis()}")
                 LogUtil.d("送礼","接口调用成功--${System.currentTimeMillis()}")
@@ -63,10 +68,8 @@ class GiftVm(application: Application) : BaseViewModel(application) {
 
 
             requestError {
             requestError {
                 if (it is SwagoException){
                 if (it is SwagoException){
-                    Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
-                    if (it.code == 517){
-                        sendResultLiveData.value = null
-                    }
+                    val errorModel = ErrorModel(it.code,it.message?:"")
+                    sendGiftCodeLiveData.value = errorModel
                 }
                 }
             }
             }
         }
         }

+ 52 - 31
room/src/main/java/com/swago/room/hongbao/RedEnvelopeDialog.kt

@@ -5,15 +5,18 @@ import android.text.Editable
 import android.text.TextWatcher
 import android.text.TextWatcher
 import android.view.Gravity
 import android.view.Gravity
 import android.view.View
 import android.view.View
+import android.widget.Toast
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import androidx.fragment.app.viewModels
 import com.gyf.immersionbar.ImmersionBar
 import com.gyf.immersionbar.ImmersionBar
 import com.swago.baseswago.dialog.BaseXDFragment
 import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.dialog.PayDialog
 import com.swago.baseswago.model.live.RoomConfig
 import com.swago.baseswago.model.live.RoomConfig
 import com.swago.baseswago.util.*
 import com.swago.baseswago.util.*
 import com.swago.room.R
 import com.swago.room.R
 import com.swago.room.databinding.DialogRedEnvelopeBinding
 import com.swago.room.databinding.DialogRedEnvelopeBinding
+import com.swago.room.dialog.UnReachLevelDialog
 import com.swago.room.vm.RoomOtherVm
 import com.swago.room.vm.RoomOtherVm
 import com.swago.room.vm.RoomVm
 import com.swago.room.vm.RoomVm
 
 
@@ -31,21 +34,21 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
 
 
     private val roomOtherVm by viewModels<RoomOtherVm>()
     private val roomOtherVm by viewModels<RoomOtherVm>()
 
 
-    companion object{
+    companion object {
         fun newInstance(roomConfig: RoomConfig?): RedEnvelopeDialog {
         fun newInstance(roomConfig: RoomConfig?): RedEnvelopeDialog {
             val args = Bundle()
             val args = Bundle()
-            args.putParcelable("roomConfig",roomConfig)
+            args.putParcelable("roomConfig", roomConfig)
             val fragment = RedEnvelopeDialog()
             val fragment = RedEnvelopeDialog()
             fragment.arguments = args
             fragment.arguments = args
             return fragment
             return fragment
         }
         }
     }
     }
 
 
-    private var roomConfig:RoomConfig? = null
+    private var roomConfig: RoomConfig? = null
     private var coinIsAchieve = false
     private var coinIsAchieve = false
     private var redEnvelopeNumIsAchieve = false
     private var redEnvelopeNumIsAchieve = false
 
 
-    private var coin:String = "0"
+    private var coin: String = "0"
     private var num = "0"
     private var num = "0"
 
 
     override fun initOther() {
     override fun initOther() {
@@ -53,28 +56,34 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
             KeyboardUtils.registerSoftInputChangedListener(it.window, listener)
             KeyboardUtils.registerSoftInputChangedListener(it.window, listener)
         }
         }
 
 
-        binding.ivHelp.setOnClickListener(object:NoDoubleClickListener(){
+        binding.ivHelp.setOnClickListener(object : NoDoubleClickListener() {
             override fun onClick() {
             override fun onClick() {
                 binding.clRedEnvelope.visibility = View.INVISIBLE
                 binding.clRedEnvelope.visibility = View.INVISIBLE
                 binding.clRule.visibility = View.VISIBLE
                 binding.clRule.visibility = View.VISIBLE
             }
             }
         })
         })
 
 
-        binding.ivBack.setOnClickListener(object:NoDoubleClickListener(){
+        binding.ivBack.setOnClickListener(object : NoDoubleClickListener() {
             override fun onClick() {
             override fun onClick() {
                 binding.clRedEnvelope.visibility = View.VISIBLE
                 binding.clRedEnvelope.visibility = View.VISIBLE
                 binding.clRule.visibility = View.INVISIBLE
                 binding.clRule.visibility = View.INVISIBLE
             }
             }
         })
         })
 
 
-        arguments?.let {  bundle->
+        arguments?.let { bundle ->
             roomConfig = bundle.getParcelable("roomConfig")
             roomConfig = bundle.getParcelable("roomConfig")
             roomConfig?.let {
             roomConfig?.let {
-                if (it.red_package!=null){
+                if (it.red_package != null) {
                     binding.tvRule.text = it.red_package.rule
                     binding.tvRule.text = it.red_package.rule
-                    binding.etInputCoin.hint = AppContext.getContext().resources.getString(R.string.not_less_coin).format(it.red_package.total_min_coins)
-                    binding.etInputCount.hint = AppContext.getContext().resources.getString(R.string.at_last_red_num).format(it.red_package.total_min_num)
-                    binding.tvDescribe.text = AppContext.getContext().resources.getString(R.string.broadcast_red_envelope).format(it.red_package.all_notice_coins)
+                    binding.etInputCoin.hint =
+                        AppContext.getContext().resources.getString(R.string.not_less_coin)
+                            .format(it.red_package.total_min_coins)
+                    binding.etInputCount.hint =
+                        AppContext.getContext().resources.getString(R.string.at_last_red_num)
+                            .format(it.red_package.total_min_num)
+                    binding.tvDescribe.text =
+                        AppContext.getContext().resources.getString(R.string.broadcast_red_envelope)
+                            .format(it.red_package.all_notice_coins)
                 }
                 }
             }
             }
         }
         }
@@ -82,29 +91,41 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
         binding.etInputCoin.addTextChangedListener(coinTextWatcher)
         binding.etInputCoin.addTextChangedListener(coinTextWatcher)
         binding.etInputCount.addTextChangedListener(countTextWatcher)
         binding.etInputCount.addTextChangedListener(countTextWatcher)
 
 
-        binding.tvSendRedEnvelope.setOnClickListener(object:NoDoubleClickListener(){
+        binding.tvSendRedEnvelope.setOnClickListener(object : NoDoubleClickListener() {
             override fun onClick() {
             override fun onClick() {
                 SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
                 SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
-                roomOtherVm.sendRedEnvelope(coin,num.toInt())
+                roomOtherVm.sendRedEnvelope(coin, num.toInt())
             }
             }
         })
         })
     }
     }
 
 
     override fun initLiveData() {
     override fun initLiveData() {
-        roomOtherVm.sendSuccessLiveData.observe(this){
-            if (it==200){
-                activity?.let {
-                    KeyboardUtils.hideSoftInputByToggle(it)
+        roomOtherVm.sendSuccessLiveData.observe(this) {
+            activity?.let {
+                KeyboardUtils.hideSoftInputByToggle(it)
+            }
+            dismissAllowingStateLoss()
+        }
+
+        roomOtherVm.sendGiftCodeLiveData.observe(this) {
+            when (it.code) {
+                517 -> {
+                    binding.tvNotEnough.visibility = View.VISIBLE
+                    Toast.makeText(AppContext.getContext(), it.msg, Toast.LENGTH_SHORT).show()
+                }
+                542, 543 -> {
+                    UnReachLevelDialog.newInstance(it.msg)
+                        .show(parentFragmentManager, "UnReachLevelDialog")
+                }
+                else -> {
+                    Toast.makeText(AppContext.getContext(), it.msg, Toast.LENGTH_SHORT).show()
                 }
                 }
-                dismissAllowingStateLoss()
-            }else{
-                binding.tvNotEnough.visibility = View.VISIBLE
             }
             }
         }
         }
     }
     }
 
 
 
 
-    private var coinTextWatcher = object:TextWatcher{
+    private var coinTextWatcher = object : TextWatcher {
         override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
         override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
         }
         }
 
 
@@ -114,17 +135,17 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
         override fun afterTextChanged(s: Editable?) {
         override fun afterTextChanged(s: Editable?) {
             roomConfig?.let {
             roomConfig?.let {
                 coin = binding.etInputCoin.text.toString().trim()
                 coin = binding.etInputCoin.text.toString().trim()
-                coinIsAchieve = if (coin.isEmpty()){
+                coinIsAchieve = if (coin.isEmpty()) {
                     false
                     false
-                }else{
-                    coin.toInt()>=it.red_package.total_min_coins
+                } else {
+                    coin.toInt() >= it.red_package.total_min_coins
                 }
                 }
                 setTvSendRedEnvelopeState()
                 setTvSendRedEnvelopeState()
             }
             }
         }
         }
     }
     }
 
 
-    private var countTextWatcher = object:TextWatcher{
+    private var countTextWatcher = object : TextWatcher {
         override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
         override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
         }
         }
 
 
@@ -134,10 +155,10 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
         override fun afterTextChanged(s: Editable?) {
         override fun afterTextChanged(s: Editable?) {
             roomConfig?.let {
             roomConfig?.let {
                 num = binding.etInputCount.text.toString().trim()
                 num = binding.etInputCount.text.toString().trim()
-                redEnvelopeNumIsAchieve = if(num.isEmpty()){
+                redEnvelopeNumIsAchieve = if (num.isEmpty()) {
                     false
                     false
-                }else{
-                    num.toInt()>=it.red_package.total_min_num
+                } else {
+                    num.toInt() >= it.red_package.total_min_num
                 }
                 }
                 setTvSendRedEnvelopeState()
                 setTvSendRedEnvelopeState()
             }
             }
@@ -147,9 +168,9 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
 
 
     private fun setTvSendRedEnvelopeState() {
     private fun setTvSendRedEnvelopeState() {
         if (coinIsAchieve && redEnvelopeNumIsAchieve) {
         if (coinIsAchieve && redEnvelopeNumIsAchieve) {
-            if (coin.toInt()/num.toInt()>=100){
+            if (coin.toInt() / num.toInt() >= 100) {
                 binding.tvSendRedEnvelope.setBackgroundResource(R.drawable.shape_ff56b7_37)
                 binding.tvSendRedEnvelope.setBackgroundResource(R.drawable.shape_ff56b7_37)
-            }else{
+            } else {
                 binding.tvSendRedEnvelope.setBackgroundResource(R.drawable.shape_80ff56b7_all_38)
                 binding.tvSendRedEnvelope.setBackgroundResource(R.drawable.shape_80ff56b7_all_38)
             }
             }
         } else {
         } else {
@@ -167,7 +188,7 @@ class RedEnvelopeDialog : BaseXDFragment<DialogRedEnvelopeBinding>() {
     }
     }
 
 
     var listener = KeyboardUtils.OnSoftInputChangedListener {
     var listener = KeyboardUtils.OnSoftInputChangedListener {
-        val params = binding.clRedEnvelope.layoutParams  as ConstraintLayout.LayoutParams
+        val params = binding.clRedEnvelope.layoutParams as ConstraintLayout.LayoutParams
         params.bottomMargin = it
         params.bottomMargin = it
         binding.clRedEnvelope.layoutParams = params
         binding.clRedEnvelope.layoutParams = params
     }
     }

+ 3 - 2
room/src/main/java/com/swago/room/piaotiao/WaftManager.kt

@@ -3,6 +3,7 @@ package com.swago.room.piaotiao
 import com.swago.baseswago.baseroom.IRoomActiveListener
 import com.swago.baseswago.baseroom.IRoomActiveListener
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.model.im.IPiaoTiao
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.LogUtil
 import com.swago.baseswago.util.LogUtil
 import kotlinx.coroutines.*
 import kotlinx.coroutines.*
@@ -16,7 +17,7 @@ import kotlin.collections.ArrayList
 class WaftManager : IRoomActiveListener {
 class WaftManager : IRoomActiveListener {
 
 
     val waftViewList = ArrayList<WaftView>()
     val waftViewList = ArrayList<WaftView>()
-    private val giftModelList = LinkedList<IMGiftModel>()
+    private val giftModelList = LinkedList<IPiaoTiao>()
 
 
     private var loopJob: Job? = null
     private var loopJob: Job? = null
 
 
@@ -52,7 +53,7 @@ class WaftManager : IRoomActiveListener {
     }
     }
 
 
 
 
-    fun addNewMessage(imGiftModel: IMGiftModel){
+    fun addNewMessage(imGiftModel: IPiaoTiao){
         giftModelList.add(imGiftModel)
         giftModelList.add(imGiftModel)
         if (loopJob==null){
         if (loopJob==null){
             initQueue()
             initQueue()

+ 38 - 14
room/src/main/java/com/swago/room/piaotiao/WaftView.kt

@@ -11,9 +11,12 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.View
 import android.widget.FrameLayout
 import android.widget.FrameLayout
 import android.widget.LinearLayout
 import android.widget.LinearLayout
+import com.swago.baseswago.model.im.GamePrize
+import com.swago.baseswago.model.im.IPiaoTiao
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.DpPxUtil
 import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.SwagoInfo
 import com.swago.room.R
 import com.swago.room.R
 import com.swago.room.databinding.ViewItemGiftBinding
 import com.swago.room.databinding.ViewItemGiftBinding
 import com.swago.room.databinding.ViewWaftBinding
 import com.swago.room.databinding.ViewWaftBinding
@@ -28,7 +31,7 @@ class WaftView : FrameLayout {
 
 
     var isBusy = false
     var isBusy = false
 
 
-    private val imGiftModelList = LinkedList<IMGiftModel>()
+    private val imGiftModelList = LinkedList<IPiaoTiao>()
     private var binding : ViewWaftBinding? = null
     private var binding : ViewWaftBinding? = null
 
 
     constructor(context: Context) : super(context)
     constructor(context: Context) : super(context)
@@ -41,7 +44,7 @@ class WaftView : FrameLayout {
     }
     }
 
 
 
 
-    fun addData(imGiftModel: IMGiftModel) {
+    fun addData(imGiftModel: IPiaoTiao) {
         isBusy = true
         isBusy = true
         imGiftModelList.add(imGiftModel)
         imGiftModelList.add(imGiftModel)
         if (animatorSet?.isRunning !=true){
         if (animatorSet?.isRunning !=true){
@@ -91,22 +94,43 @@ class WaftView : FrameLayout {
             return
             return
         }
         }
         val next = imGiftModelList.pop()
         val next = imGiftModelList.pop()
-        if (next.multiple>=500){
-            val sendName = "<font color='#FFDB43'>${next.senderName}</font>"
-            val giftName = "<font color='#FFDB43'>${next.giftName}</font>"
-            val multiple = "<font color='#FFDB43'>${next.multiple}</font>"
-            binding?.ll?.setBackgroundResource(R.mipmap.waft_big_prize)
-            binding?.marqueeTextView?.text = Html.fromHtml(AppContext.getContext().resources.getString(R.string.big_prize).format(sendName,giftName,multiple))
-        }else{
-            val sendName = "<font color='#FFDB43'>${next.senderName}</font>"
-            val giftName = "<font color='#FFDB43'>${next.giftName}</font>"
-            val receiverName = "<font color='#FFDB43'>${next.receiverName}</font>"
-            binding?.ll?.setBackgroundResource(R.mipmap.waft_bg)
-            binding?.marqueeTextView?.text = Html.fromHtml(AppContext.getContext().resources.getString(R.string.big_gift_msg).format(sendName,giftName,receiverName))
+        when(next){
+            is IMGiftModel -> {
+                if (next.multiple>=500){
+                    val sendName = "<font color='#FFDB43'>${next.senderName}</font>"
+                    val giftName = "<font color='#FFDB43'>${next.giftName}</font>"
+                    val multiple = "<font color='#FFDB43'>${next.multiple}</font>"
+                    binding?.ll?.setBackgroundResource(R.mipmap.waft_big_prize)
+                    binding?.marqueeTextView?.text = Html.fromHtml(AppContext.getContext().resources.getString(R.string.big_prize).format(sendName,giftName,multiple))
+                }else{
+                    val sendName = "<font color='#FFDB43'>${next.senderName}</font>"
+                    val giftName = "<font color='#FFDB43'>${next.giftName}</font>"
+                    val receiverName = "<font color='#FFDB43'>${next.receiverName}</font>"
+                    binding?.ll?.setBackgroundResource(R.mipmap.waft_bg)
+                    binding?.marqueeTextView?.text = Html.fromHtml(AppContext.getContext().resources.getString(R.string.big_gift_msg).format(sendName,giftName,receiverName))
+                }
+            }
+
+            is GamePrize -> {
+                val sendName = "<font color='#FFDB43'>${next.senderName}</font>"
+                val gameName = "<font color='#FFDB43'>${next.gameName}</font>"
+                val coin = "<font color='#FFDB43'>${next.coin}</font>"
+                binding?.ll?.setBackgroundResource(R.mipmap.waft_game_bg)
+                when(SwagoInfo.getLanguageCode()){
+                    "id","ms" -> {
+                        binding?.marqueeTextView?.text = Html.fromHtml(AppContext.getContext().resources.getString(R.string.game_prize).format(sendName,coin,gameName))
+                    }
+                    else -> {
+                        binding?.marqueeTextView?.text = Html.fromHtml(AppContext.getContext().resources.getString(R.string.game_prize).format(sendName,gameName,coin))
+                    }
+                }
+            }
+
         }
         }
 
 
 
 
 
 
+
         binding?.marqueeTextView?.post {
         binding?.marqueeTextView?.post {
             binding?.marqueeTextView?.startScroll()
             binding?.marqueeTextView?.startScroll()
         }
         }

+ 36 - 8
room/src/main/java/com/swago/room/vm/MsgVm.kt

@@ -10,6 +10,8 @@ import com.swago.baseswago.im.ImConstant.anchor_close_room
 import com.swago.baseswago.im.ImConstant.cancel_forbid_speak
 import com.swago.baseswago.im.ImConstant.cancel_forbid_speak
 import com.swago.baseswago.im.ImConstant.follow_anchor_success
 import com.swago.baseswago.im.ImConstant.follow_anchor_success
 import com.swago.baseswago.im.ImConstant.forbid_speak
 import com.swago.baseswago.im.ImConstant.forbid_speak
+import com.swago.baseswago.im.ImConstant.force_close_live_room
+import com.swago.baseswago.im.ImConstant.game_win_big_prize
 import com.swago.baseswago.im.ImConstant.lucky_gift
 import com.swago.baseswago.im.ImConstant.lucky_gift
 import com.swago.baseswago.im.ImConstant.red_envelope
 import com.swago.baseswago.im.ImConstant.red_envelope
 import com.swago.baseswago.im.ImConstant.red_envelope_broadcast
 import com.swago.baseswago.im.ImConstant.red_envelope_broadcast
@@ -20,7 +22,9 @@ import com.swago.baseswago.im.ImConstant.user_exit_room
 import com.swago.baseswago.im.ImConstant.user_join_room
 import com.swago.baseswago.im.ImConstant.user_join_room
 import com.swago.baseswago.model.RedEnvelope
 import com.swago.baseswago.model.RedEnvelope
 import com.swago.baseswago.model.im.*
 import com.swago.baseswago.model.im.*
+import com.swago.baseswago.model.live.ForceCloseModel
 import com.swago.baseswago.model.live.ReceiveModel
 import com.swago.baseswago.model.live.ReceiveModel
+import com.swago.baseswago.model.im.GamePrize
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.UserInfo
 import com.swago.baseswago.util.UserInfo
 
 
@@ -36,6 +40,9 @@ class MsgVm (application: Application) : AbsMsgVm(application){
 
 
     var anchorRoomClosed:((data:AnchorRoomClosedBean?)->Unit)? = null
     var anchorRoomClosed:((data:AnchorRoomClosedBean?)->Unit)? = null
 
 
+    //强制关播
+    var forceCloseAnchorRoom:((closedReason:String)->Unit)? = null
+
     var inComeChange:((income:String)->Unit)? = null
     var inComeChange:((income:String)->Unit)? = null
 
 
     var updateHotValue:((hotValue:String)->Unit)? = null
     var updateHotValue:((hotValue:String)->Unit)? = null
@@ -58,7 +65,7 @@ class MsgVm (application: Application) : AbsMsgVm(application){
     /**
     /**
      * 礼物飘条
      * 礼物飘条
      */
      */
-    var waftFun:((data:IMGiftModel)->Unit)? = null
+    var waftFun:((data:IPiaoTiao)->Unit)? = null
 
 
     /**
     /**
      * 礼物弹道展示
      * 礼物弹道展示
@@ -67,7 +74,7 @@ class MsgVm (application: Application) : AbsMsgVm(application){
 
 
     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() ?: "")){
                 it.data?.let {
                 it.data?.let {
                     newChatMsgFun?.invoke(it)
                     newChatMsgFun?.invoke(it)
                 }
                 }
@@ -75,7 +82,7 @@ class MsgVm (application: Application) : AbsMsgVm(application){
         }
         }
 
 
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<UserJoinRoomBean>>(user_join_room){
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<UserJoinRoomBean>>(user_join_room){
-            if (it.getGroupId() == SwagoRoomManager.iRoomInfo?.getRoomGroupId()?:""){
+            if (it.getGroupId() == (SwagoRoomManager.iRoomInfo?.getRoomGroupId() ?: "")){
                 if (SwagoRoomManager.roleType == RoleType.user || it.data?.senderCode != UserInfo.getUserInfo()?.user_account) {
                 if (SwagoRoomManager.roleType == RoleType.user || it.data?.senderCode != UserInfo.getUserInfo()?.user_account) {
                     it.data?.let {
                     it.data?.let {
                         newChatMsgFun?.invoke(it)
                         newChatMsgFun?.invoke(it)
@@ -88,7 +95,7 @@ class MsgVm (application: Application) : AbsMsgVm(application){
         }
         }
 
 
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<UserJoinRoomBean>>(user_exit_room){
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<UserJoinRoomBean>>(user_exit_room){
-            if (it.getGroupId() == SwagoRoomManager.iRoomInfo?.getRoomGroupId()?:""){
+            if (it.getGroupId() == (SwagoRoomManager.iRoomInfo?.getRoomGroupId() ?: "")){
                 if (SwagoRoomManager.roleType == RoleType.user || it.data?.senderCode != UserInfo.getUserInfo()?.user_account) {
                 if (SwagoRoomManager.roleType == RoleType.user || it.data?.senderCode != UserInfo.getUserInfo()?.user_account) {
                     it.data?.let {
                     it.data?.let {
                         updateHotValue?.invoke(it.hotValue)
                         updateHotValue?.invoke(it.hotValue)
@@ -101,16 +108,26 @@ class MsgVm (application: Application) : AbsMsgVm(application){
 
 
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<AnchorRoomClosedBean>>(anchor_close_room){
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<AnchorRoomClosedBean>>(anchor_close_room){
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
-                if (iRoomInfo.getRoomId()== it.data?.roomId?:""){
+                if (iRoomInfo.getRoomId() == (it.data?.roomId ?: "")){
                     anchorRoomClosed?.invoke(it.data)
                     anchorRoomClosed?.invoke(it.data)
                 }
                 }
             }
             }
         }
         }
+
+        //后台强制关播
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<ForceCloseModel>>(force_close_live_room){
+            SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                if (iRoomInfo.getRoomId() == (it.data?.roomId ?: "")){
+                    forceCloseAnchorRoom?.invoke(it.data?.closedReason?:"")
+                }
+            }
+        }
+
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<IMGiftModel>>(svg_gift){
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<IMGiftModel>>(svg_gift){
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
                 if (isReady){
                 if (isReady){
                     it.data?.let {
                     it.data?.let {
-                        if (iRoomInfo.getRoomId()== it.roomId?:""){
+                        if (iRoomInfo.getRoomId() == (it.roomId ?: "")){
                             playSvgUrl?.invoke(it)
                             playSvgUrl?.invoke(it)
                             inComeChange?.invoke(it.incomeCount)
                             inComeChange?.invoke(it.incomeCount)
                         }
                         }
@@ -124,7 +141,7 @@ class MsgVm (application: Application) : AbsMsgVm(application){
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
                 if (isReady){
                 if (isReady){
                     it.data?.let {
                     it.data?.let {
-                        if (iRoomInfo.getRoomId()== it.roomId?:""){
+                        if (iRoomInfo.getRoomId() == (it.roomId ?: "")){
                             showGiftDanDao?.invoke(it)
                             showGiftDanDao?.invoke(it)
                             inComeChange?.invoke(it.incomeCount)
                             inComeChange?.invoke(it.incomeCount)
                         }
                         }
@@ -141,7 +158,7 @@ class MsgVm (application: Application) : AbsMsgVm(application){
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
                 if (isReady){
                 if (isReady){
                     it.data?.let {
                     it.data?.let {
-                        if (iRoomInfo.getRoomId()== it.roomId?:""){
+                        if (iRoomInfo.getRoomId() == (it.roomId ?: "")){
                             newChatMsgFun?.invoke(it)
                             newChatMsgFun?.invoke(it)
                         }
                         }
                     }
                     }
@@ -209,6 +226,17 @@ class MsgVm (application: Application) : AbsMsgVm(application){
                 }
                 }
             }
             }
         }
         }
+        //游戏中奖飘条
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<GamePrize>>(game_win_big_prize){
+            SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                it.data?.let {
+                    if (isReady) {
+                        //游戏飘条
+                        waftFun?.invoke(it)
+                    }
+                }
+            }
+        }
     }
     }
 
 
     override fun changeRoom(iRoomInfo: IRoomInfo) {
     override fun changeRoom(iRoomInfo: IRoomInfo) {

+ 9 - 5
room/src/main/java/com/swago/room/vm/RoomOtherVm.kt

@@ -8,6 +8,7 @@ import com.swago.baseswago.baseroom.SwagoRoomManager
 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.model.RedEnvelope
 import com.swago.baseswago.model.RedEnvelope
+import com.swago.baseswago.model.live.ErrorModel
 import com.swago.baseswago.model.live.RankListModel
 import com.swago.baseswago.model.live.RankListModel
 import com.swago.baseswago.model.live.ShareConfig
 import com.swago.baseswago.model.live.ShareConfig
 import com.swago.baseswago.model.live.game.GameListModel
 import com.swago.baseswago.model.live.game.GameListModel
@@ -85,11 +86,16 @@ class RoomOtherVm (application: Application) : BaseViewModel(application){
     val sendSuccessLiveData by lazy {
     val sendSuccessLiveData by lazy {
         MutableLiveData<Int>()
         MutableLiveData<Int>()
     }
     }
+
+    val sendGiftCodeLiveData by lazy {
+        MutableLiveData<ErrorModel>()
+    }
+
     /**
     /**
      * 发红包
      * 发红包
      */
      */
     fun sendRedEnvelope(coins:String,count:Int){
     fun sendRedEnvelope(coins:String,count:Int){
-        requestData2 {
+        requestData2(false) {
             requestData {
             requestData {
                 SwagoRoomManager.iRoomInfo?.let {
                 SwagoRoomManager.iRoomInfo?.let {
                     ApiManager.roomApi.sendRedEnvelope(it.getRoomId(),coins,count)
                     ApiManager.roomApi.sendRedEnvelope(it.getRoomId(),coins,count)
@@ -101,10 +107,8 @@ class RoomOtherVm (application: Application) : BaseViewModel(application){
             requestError {
             requestError {
                 SwagoLoading.cancelLoadingDialog()
                 SwagoLoading.cancelLoadingDialog()
                 if (it is SwagoException){
                 if (it is SwagoException){
-                    Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
-                    if ( it.code == 517){
-                        sendSuccessLiveData.value = -1
-                    }
+                    val errorModel = ErrorModel(it.code,it.message?:"")
+                    sendGiftCodeLiveData.value = errorModel
                 }
                 }
             }
             }
         }
         }

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

@@ -34,6 +34,9 @@ class RoomVm(application: Application) : AbsRoomVm(application) {
         MutableLiveData<AnchorClosedModel>()
         MutableLiveData<AnchorClosedModel>()
     }
     }
 
 
+    //显示禁播时长弹窗
+    var showBannerTime:((time:Long)->Unit)? = null
+
     override fun afterRoomChange(
     override fun afterRoomChange(
         roleType: Int,
         roleType: Int,
         iRoomInfo: IRoomInfo,
         iRoomInfo: IRoomInfo,
@@ -97,7 +100,7 @@ class RoomVm(application: Application) : AbsRoomVm(application) {
         iRoomInfo: IRoomInfo,
         iRoomInfo: IRoomInfo,
         callback: (canJoinRoom: Boolean) -> Unit
         callback: (canJoinRoom: Boolean) -> Unit
     ) {
     ) {
-        requestData2 {
+        requestData2(false) {
             requestData {
             requestData {
                 SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
                 SwagoLoading.showLoadingDialog(ActivityManagerUtil.get().currentActivity())
                 val roomInfo = iRoomInfo as UserRoomModel
                 val roomInfo = iRoomInfo as UserRoomModel
@@ -108,11 +111,22 @@ class RoomVm(application: Application) : AbsRoomVm(application) {
             }
             }
 
 
             requestError {
             requestError {
+                SwagoLoading.cancelLoadingDialog()
                 if (it is SwagoException) {
                 if (it is SwagoException) {
-                    Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+                    when(it.code){
+                        545 -> {
+                            showBannerTime?.invoke((it.message?:"0").toLong())
+                        }
+                        else -> {
+                            Toast.makeText(AppContext.getContext(), it.message, Toast.LENGTH_SHORT).show()
+                            SwagoRoomManager.closeRoom()
+                            callback.invoke(false)
+                        }
+                    }
+                }else{
+                    SwagoRoomManager.closeRoom()
+                    callback.invoke(false)
                 }
                 }
-                SwagoRoomManager.closeRoom()
-                callback.invoke(false)
             }
             }
 
 
         }
         }

+ 70 - 0
room/src/main/java/com/swago/room/widget/BannerView.kt

@@ -0,0 +1,70 @@
+package com.swago.room.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.FrameLayout
+import androidx.lifecycle.findViewTreeLifecycleOwner
+import com.swago.baseswago.baseroom.IRoomActiveListener
+import com.swago.baseswago.baseroom.IRoomInfo
+import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.model.live.RoomConfig
+import com.swago.room.adapter.BannerViewAdapter
+import com.swago.room.databinding.ViewBannerBinding
+import com.youth.banner.indicator.CircleIndicator
+
+class BannerView : FrameLayout,IRoomActiveListener {
+
+    private val mData by lazy {
+        ArrayList<RoomConfig.BannersBean>()
+    }
+
+    var jumpToWebFun:((RoomConfig.BannersBean)->Unit)? = null
+
+    private val bannerViewAdapter  = BannerViewAdapter(mData)
+
+    private var binding:ViewBannerBinding? = null
+
+    constructor(context: Context) : super(context)
+    constructor(context: Context, mAttributeSet: AttributeSet?) : super(context, mAttributeSet){
+        initView(context)
+    }
+
+    private fun initView(context: Context) {
+        SwagoRoomManager.addListener(this)
+        binding = ViewBannerBinding.inflate(LayoutInflater.from(context),this,true)
+    }
+
+    override fun changeRoom(iRoomInfo: IRoomInfo) {
+        visibility = View.GONE
+    }
+
+    override fun leaveRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun joinedRoom(iRoomInfo: IRoomInfo) {
+        visibility = View.VISIBLE
+    }
+
+    override fun endRoom(iRoomInfo: IRoomInfo?) {
+    }
+
+    override fun closeRoomed() {
+        SwagoRoomManager.removeListener(this)
+    }
+
+    fun setData(data:ArrayList<RoomConfig.BannersBean>){
+        binding?.let {
+            mData.addAll(data)
+            it.banner.setAdapter(bannerViewAdapter)
+                .setIndicator(CircleIndicator(context))
+                .addBannerLifecycleObserver(findViewTreeLifecycleOwner())
+                .setOnBannerListener { data, _ ->
+                    val bannerData = data as RoomConfig.BannersBean
+                    jumpToWebFun?.invoke(bannerData)
+                }
+        }
+    }
+
+}

+ 110 - 0
room/src/main/res/layout/dialog_can_start_live.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/shape_white_top_20"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <ImageView
+            android:id="@+id/iv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:src="@mipmap/icon_start_live_ban"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvTitle"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="24dp"
+            android:layout_marginTop="18dp"
+            android:layout_marginEnd="24dp"
+            android:gravity="center"
+            android:textColor="#000"
+            android:textSize="16dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/iv"
+            android:text="@string/ban_title" />
+
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/clRemain"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="20dp"
+            android:layout_marginTop="16dp"
+            android:layout_marginEnd="20dp"
+            android:background="@drawable/shape_f1f4f8_16"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvTitle">
+
+            <com.swago.baseswago.cusview.RegularTextView
+                android:id="@+id/tvMsg"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="24dp"
+                android:layout_marginTop="12dp"
+                android:layout_marginEnd="24dp"
+                android:gravity="center"
+                android:textColor="#435568"
+                android:textSize="14dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                android:text="@string/remaining_time_of_ban"/>
+
+            <com.swago.baseswago.cusview.RegularTextView
+                android:id="@+id/tvTime"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="24dp"
+                android:layout_marginTop="12dp"
+                android:layout_marginEnd="24dp"
+                android:gravity="center"
+                android:textColor="#000"
+                android:textSize="18dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/tvMsg"
+                app:layout_constraintBottom_toBottomOf="parent"
+                android:layout_marginBottom="12dp"
+                tools:text="Remaining time of ban"/>
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvClose"
+            android:layout_width="0dp"
+            android:layout_height="44dp"
+            android:layout_marginStart="36dp"
+            android:layout_marginTop="24dp"
+            android:layout_marginEnd="36dp"
+            android:layout_marginBottom="24dp"
+            android:background="@drawable/shape_ff56b7_37"
+            android:gravity="center"
+            android:text="@string/got_it"
+            android:textColor="#fff"
+            android:textSize="14dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/clRemain" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 77 - 0
room/src/main/res/layout/dialog_force_close_room.xml

@@ -0,0 +1,77 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        app:layout_constraintTop_toTopOf="parent"
+        android:background="@drawable/shape_white_top_20"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/iv"
+            android:layout_marginTop="16dp"
+            android:src="@mipmap/icon_report"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvTitle"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/iv"
+            android:textSize="16dp"
+            android:textColor="#000"
+            android:gravity="center"
+            android:layout_marginStart="24dp"
+            android:layout_marginEnd="24dp"
+            android:layout_marginTop="18dp"
+            android:text="@string/force_closed_by_admin"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+        <com.swago.baseswago.cusview.RegularTextView
+            android:id="@+id/tvMsg"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvTitle"
+            android:layout_marginTop="16dp"
+            android:textSize="14dp"
+            android:textColor="#435568"
+            android:gravity="center"
+            android:layout_marginStart="24dp"
+            android:layout_marginEnd="24dp"
+            tools:text="Your live studio has been closed by the administrator"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvClose"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvMsg"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginBottom="24dp"
+            android:layout_marginTop="24dp"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            android:layout_marginStart="36dp"
+            android:layout_marginEnd="36dp"
+            android:text="@string/got_it_ss"
+            android:gravity="center"
+            android:background="@drawable/shape_ff56b7_37"
+            android:layout_width="0dp"
+            android:layout_height="44dp"/>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 63 - 0
room/src/main/res/layout/dialog_reach_level_service.xml

@@ -0,0 +1,63 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginStart="40dp"
+        android:layout_marginEnd="40dp"
+        android:background="@drawable/shape_white_20"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/ivIcon"
+            android:layout_marginTop="16dp"
+            android:src="@mipmap/icon_reach_level"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.RegularTextView
+            android:id="@+id/tvContent"
+            android:layout_marginStart="24dp"
+            android:layout_marginEnd="24dp"
+            android:textSize="14dp"
+            android:textColor="#000000"
+            android:gravity="center"
+            app:layout_constraintTop_toBottomOf="@+id/ivIcon"
+            android:layout_marginTop="8dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvContactService"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvContent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginBottom="24dp"
+            android:layout_marginTop="24dp"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            android:layout_marginStart="36dp"
+            android:layout_marginEnd="36dp"
+            android:text="@string/contact_service"
+            android:gravity="center"
+            android:background="@drawable/shape_ff56b7_37"
+            android:layout_width="0dp"
+            android:layout_height="44dp"/>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 63 - 0
room/src/main/res/layout/dialog_unreach_level.xml

@@ -0,0 +1,63 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginStart="40dp"
+        android:layout_marginEnd="40dp"
+        android:background="@drawable/shape_white_20"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/ivIcon"
+            android:layout_marginTop="16dp"
+            android:src="@mipmap/icon_upgrade_level_unreach"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.RegularTextView
+            android:id="@+id/tvContent"
+            android:layout_marginStart="24dp"
+            android:layout_marginEnd="24dp"
+            android:textSize="14dp"
+            android:textColor="#000000"
+            android:gravity="center"
+            app:layout_constraintTop_toBottomOf="@+id/ivIcon"
+            android:layout_marginTop="8dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvUpgradeLevel"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvContent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginBottom="24dp"
+            android:layout_marginTop="24dp"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            android:layout_marginStart="36dp"
+            android:layout_marginEnd="36dp"
+            android:text="@string/upgrade_level"
+            android:gravity="center"
+            android:background="@drawable/shape_ff56b7_37"
+            android:layout_width="0dp"
+            android:layout_height="44dp"/>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -71,6 +71,16 @@
         android:layout_width="wrap_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
         android:layout_height="wrap_content"/>
 
 
+    <com.swago.room.widget.BannerView
+        android:id="@+id/bannerView"
+        android:layout_marginTop="150dp"
+        android:visibility="gone"
+        tools:visibility="visible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
 
 
     <ImageView
     <ImageView
         android:id="@+id/ivReport"
         android:id="@+id/ivReport"

+ 30 - 0
room/src/main/res/layout/view_banner.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="80dp"
+    android:layout_height="80dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <com.youth.banner.Banner
+        android:id="@+id/banner"
+        android:layout_width="60dp"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:banner_indicator_selected_color="@color/white"
+        app:banner_indicator_normal_color="#cccccc"
+        app:banner_indicator_selected_width="4dp"
+        app:banner_indicator_normal_width="4dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_height="60dp"/>
+
+    <com.youth.banner.indicator.CircleIndicator
+        android:id="@+id/cirCleIndicator"
+        android:layout_marginTop="6dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="4dp"/>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

BIN
room/src/main/res/mipmap-xxhdpi/icon_reach_level.webp


BIN
room/src/main/res/mipmap-xxhdpi/icon_start_live_ban.webp


BIN
room/src/main/res/mipmap-xxhdpi/icon_upgrade_level_unreach.webp


BIN
room/src/main/res/mipmap-xxhdpi/waft_game_bg.webp


+ 1 - 1
user/build.gradle

@@ -44,7 +44,7 @@ android {
 
 
 dependencies {
 dependencies {
 
 
-    implementation 'androidx.core:core-ktx:1.3.2'
+    implementation 'androidx.core:core-ktx:1.5.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     testImplementation 'junit:junit:4.+'
     testImplementation 'junit:junit:4.+'