Browse Source

1.添加收到IM消息展示弹窗功能

王鹏鹏 2 years ago
parent
commit
0fc9b6b915

+ 278 - 0
baselib/src/main/java/com/yingyangfly/baselib/base/BaseGameActivity.kt

@@ -0,0 +1,278 @@
+package com.yingyangfly.baselib.base
+
+import android.annotation.SuppressLint
+import android.app.AlertDialog
+import android.content.Context
+import android.content.pm.ActivityInfo
+import android.os.Bundle
+import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.EditText
+import android.widget.LinearLayout
+import androidx.appcompat.app.AppCompatActivity
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.Fragment
+import com.alibaba.android.arouter.launcher.ARouter
+import com.scwang.smartrefresh.layout.api.RefreshLayout
+import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener
+import com.yingyangfly.baselib.R
+import com.yingyangfly.baselib.databinding.ActivityBaseBinding
+import com.yingyangfly.baselib.db.AppDataBase
+import com.yingyangfly.baselib.dialog.LoadingDialog
+import com.yingyangfly.baselib.dialog.TaskFragment
+import com.yingyangfly.baselib.ext.getDbClass
+import com.yingyangfly.baselib.ext.initBar
+import com.yingyangfly.baselib.utils.*
+import gorden.rxbus2.RxBus
+
+/**
+ * activity基类
+ */
+abstract class BaseGameActivity<DB : ViewDataBinding> : AppCompatActivity(),
+    OnRefreshLoadMoreListener {
+
+    /**
+     * 确定初始化将总是发生在单个线程,那么你可以使用 LazyThreadSafetyMode.NONE模式, 它不会有任何线程安全的保证和相关的开销。
+     * 如果初始化委托的同步锁不是必需的,这样多个线程可以同时执行,那么将 LazyThreadSafetyMode.PUBLICATION 作为参数传递给 lazy() 函数
+     */
+    val binding: DB by lazy(LazyThreadSafetyMode.NONE) {
+        getDbClass(this)
+    }
+
+    val bindingBase: ActivityBaseBinding by lazy {
+        ActivityBaseBinding.inflate(layoutInflater)
+    }
+
+    lateinit var mContext: Context
+
+    /**
+     * 是否执行了下拉刷新或上拉加载
+     */
+    private var isRefreshOrLoadMore = false
+
+    /**
+     * 加载loading
+     */
+    val netLoading: LoadingDialog by lazy {
+        LoadingDialog(mContext)
+    }
+
+    private var logoutDialog: AlertDialog? = null
+
+    var db: AppDataBase? = null
+
+    @SuppressLint("SourceLockedOrientationActivity")
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        RxBus.get().register(this)
+        mContext = this
+        initWindow()
+        // 默认不全屏,底部导航栏透明
+        initBar(false)
+        ARouter.getInstance().inject(this)
+        ActivityManagers.instance.addActivity(this)
+        initSmartRefresh()
+        val params: ViewGroup.LayoutParams = LinearLayout.LayoutParams(
+            LinearLayout.LayoutParams.MATCH_PARENT,
+            LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
+        )
+        binding.root.layoutParams = params
+        bindingBase.llytContent.addView(binding.root)
+        setContentView(ViewTool.inflateLayoutPixels(this, bindingBase.root, 2388, 1668))
+        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+        db = AppDataBase.getInstance(mContext)
+        initMVVM()
+        initViews()
+        initListener()
+        initData()
+        initLiveEventBusUtil()
+    }
+
+    protected inline fun binding(block: DB.() -> Unit): DB {
+        return binding.apply(block)
+    }
+
+    /**
+     * 初始化View
+     */
+    abstract fun initViews()
+
+    /**
+     * 初始化监听
+     */
+    abstract fun initListener()
+
+    /**
+     * 初始化数据源 or 请求
+     */
+    abstract fun initData()
+
+    /**
+     * 需要设置window参数可重写此方法
+     */
+    open fun initWindow() {}
+
+    /**
+     * 初始化数据源 or 请求
+     */
+    open fun initMVVM() {}
+
+    /**
+     * 初始化下拉刷新布局
+     */
+    fun initSmartRefresh() {
+        // 是否启用下拉刷新功能
+        bindingBase.smartRefreshLayout.setEnableRefresh(false)
+        // 是否启用上拉加载功能
+        bindingBase.smartRefreshLayout.setEnableLoadMore(false)
+        // 关闭越界回弹功能
+        bindingBase.smartRefreshLayout.setEnableOverScrollBounce(false)
+        // 禁止越界拖动
+        bindingBase.smartRefreshLayout.setEnableOverScrollDrag(false)
+        bindingBase.smartRefreshLayout.setOnRefreshLoadMoreListener(this)
+        //设置刷新头和加载头的背景色
+        bindingBase.smartRefreshLayout.refreshHeader?.view?.setBackgroundColor(ResUtil.getColor(R.color.color_F5F5F5))
+        bindingBase.smartRefreshLayout.refreshFooter?.view?.setBackgroundColor(ResUtil.getColor(R.color.color_F5F5F5))
+    }
+
+    /**
+     * 是否需要下拉刷新加载更多布局 默认不需要
+     */
+    open fun enableRefreshLoadMore() = false
+
+    /**
+     * 下拉刷新
+     */
+    override fun onRefresh(refreshLayout: RefreshLayout) {
+        isRefreshOrLoadMore = true
+    }
+
+    /**
+     * 加载更多
+     */
+    override fun onLoadMore(refreshLayout: RefreshLayout) {
+        isRefreshOrLoadMore = true
+    }
+
+    /**
+     * 是否自动刷新
+     */
+    fun autoRefresh() {
+        bindingBase.smartRefreshLayout.autoRefresh()
+    }
+
+    /**
+     * 是否下拉刷新,默认不能下拉刷新
+     */
+    fun enableRefresh(refresh: Boolean) {
+        bindingBase.smartRefreshLayout.setEnableRefresh(refresh)
+    }
+
+    /**
+     * 是否加载更多,默认不加载更多
+     */
+    fun enableLoadMore(loadMore: Boolean) {
+        bindingBase.smartRefreshLayout.setEnableLoadMore(loadMore)
+        bindingBase.smartRefreshLayout.setEnableFooterFollowWhenNoMoreData(true)
+    }
+
+    /**
+     * 结束下拉刷新
+     */
+    fun finishRefresh() {
+        isRefreshOrLoadMore = false
+        bindingBase.smartRefreshLayout.finishRefresh()
+    }
+
+    /**
+     * 结束加载更多
+     */
+    fun finishLoadMore() {
+        isRefreshOrLoadMore = false
+        bindingBase.smartRefreshLayout.finishLoadMore()
+    }
+
+    /**
+     * 结束加载更多,且没有更多数据
+     */
+    fun finishLoadMoreWithNoMoreData() {
+        isRefreshOrLoadMore = false
+        bindingBase.smartRefreshLayout.finishLoadMoreWithNoMoreData()
+    }
+
+    /**
+     * 设置没有更多数据
+     */
+    fun resetNoMoreData() {
+        bindingBase.smartRefreshLayout.resetNoMoreData()
+    }
+
+    /**
+     * 显示Loading
+     */
+    fun showLoading() {
+        if (isRefreshOrLoadMore) return
+        netLoading.show()
+    }
+
+    /**
+     * 取消Loading
+     */
+    fun dismissLoading() {
+        netLoading.dismiss()
+    }
+
+    /**
+     * 显示键盘
+     */
+    fun showInput(et: EditText) {
+        et.requestFocus()
+        val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
+        imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT)
+    }
+
+    /**
+     * 关闭软键盘
+     */
+    fun closeKeyBord(mEditText: EditText, mContext: Context) {
+        val imm = mContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+        imm.hideSoftInputFromWindow(mEditText.windowToken, 0)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        RxBus.get().unRegister(this)
+        ActivityManagers.instance.removeActivity(this)
+    }
+
+    var showFragment: Fragment? = null
+    fun showFragment(viewId: Int, f: Fragment) {
+        try {
+            val ft = supportFragmentManager.beginTransaction()
+            if (showFragment != null)
+                ft.hide(showFragment!!)
+            if (f.isAdded) {
+                ft.show(f)
+            } else {
+                ft.add(viewId, f)
+            }
+            showFragment = f
+            ft.commitAllowingStateLoss()
+            supportFragmentManager.executePendingTransactions()// 立即执行
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    private fun initLiveEventBusUtil() {
+        //展示任务弹窗
+        LiveEventBusUtil.observer<String>(this, RxBusCodes.SHOWTASKDIALOG) {
+            val taskFragment = TaskFragment()
+            taskFragment.setTaskDesn(it, "")
+            taskFragment.onDialogClickListener = {
+
+            }
+            taskFragment.show(supportFragmentManager, "taskFragment")
+        }
+    }
+}

+ 25 - 0
baselib/src/main/java/com/yingyangfly/baselib/ext/ActivityExt.kt

@@ -13,6 +13,7 @@ import com.yingyangfly.baselib.R
 import com.yingyangfly.baselib.base.BaseActivity
 import com.yingyangfly.baselib.base.BaseFragment
 import com.yingyangfly.baselib.base.BaseFragmentActivity
+import com.yingyangfly.baselib.base.BaseGameActivity
 import com.yingyangfly.baselib.dialog.BaseDialogFragment
 import java.lang.reflect.ParameterizedType
 
@@ -32,6 +33,16 @@ fun BaseActivity<*>.initBar(full: Boolean) {
     }
 }
 
+/**
+ * 沉浸式状态栏
+ */
+fun BaseGameActivity<*>.initBar(full: Boolean) {
+    immersionBar {
+        hideBar(BarHide.FLAG_HIDE_BAR)
+        navigationBarColor(R.color.transparent)
+    }
+}
+
 /**
  * 沉浸式状态栏
  */
@@ -162,6 +173,20 @@ fun <DB> BaseActivity<*>.getDbClass(t: Any): DB {
     return method?.invoke(null, layoutInflater) as DB
 }
 
+/**
+ * 根据传入的Databinding泛型 获取 Databingding
+ */
+fun <DB> BaseGameActivity<*>.getDbClass(t: Any): DB {
+    // 使用反射得到ViewBinding的class
+    // 当前对象的直接超类的 Type  并 参数化类型
+    val type = t.javaClass.genericSuperclass as ParameterizedType
+    // 返回表示此类型实际类型参数的 Type 对象的数组  目前泛型只有一个,所以拿第0 个
+    val bClass = type.actualTypeArguments[0] as Class<*>
+    // 获得私有方法
+    val method = bClass.getDeclaredMethod("inflate", LayoutInflater::class.java)
+    return method?.invoke(null, layoutInflater) as DB
+}
+
 /**
  * 根据传入的Databinding泛型 获取 Databingding
  */

+ 72 - 0
baselib/src/main/java/com/yingyangfly/baselib/mvvm/BaseGameMVVMActivity.kt

@@ -0,0 +1,72 @@
+package com.yingyangfly.baselib.mvvm
+
+import androidx.databinding.ViewDataBinding
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
+import com.yingyangfly.baselib.base.BaseActivity
+import com.yingyangfly.baselib.base.BaseGameActivity
+import com.yingyangfly.baselib.bean.StatusViewType
+import com.yingyangfly.baselib.ext.logi
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+
+/**
+ * @author: gold
+ * @time: 2021/12/8 下午5:31
+ * @description: MVVM基类封装
+ */
+private const val TAG = "BaseMVVMActivity"
+
+abstract class BaseGameMVVMActivity<DB : ViewDataBinding, VM : BaseViewModel> : BaseGameActivity<DB>() {
+    val viewModel: VM by lazy {
+        ViewModelProvider(this).get(getVmClass(this))
+    }
+
+    fun launch(block: suspend CoroutineScope.() -> Unit) {
+        lifecycleScope.launch {
+            block()
+        }
+    }
+
+    override fun initMVVM() {
+        super.initMVVM()
+        launch {
+            viewModel.loadingStateFlow.collect {
+                when (it) {
+                    StatusViewType.DEFAULT -> {
+                        "$TAG -->MVVM:DEFAULT".logi()
+                    }
+                    StatusViewType.LOADING -> {
+                        "$TAG -->MVVM:LOADING".logi()
+                        showLoading()
+                    }
+                    StatusViewType.DISMISS -> {
+                        "$TAG -->MVVM:DISMISS".logi()
+                        dismissLoading()
+                        finishLoadMore()
+                        finishRefresh()
+                    }
+                    StatusViewType.EMPTY -> {
+                        "$TAG -->MVVM:EMPTY".logi()
+                    }
+                    StatusViewType.ERROR -> {
+                        "$TAG -->MVVM:ERROR".logi()
+                        onErrorView()
+                    }
+                    else -> {
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 加载错误失败要显示的布局
+     */
+    open fun onErrorView() {
+        dismissLoading()
+        finishLoadMore()
+        finishRefresh()
+    }
+}

+ 2 - 1
game/src/main/java/com/yingyangfly/game/introduction/GameIntroductionActivity.kt

@@ -19,6 +19,7 @@ import com.yingyangfly.baselib.ext.getEndAnimation
 import com.yingyangfly.baselib.ext.getScaleAnimation
 import com.yingyangfly.baselib.ext.show
 import com.yingyangfly.baselib.ext.toast
+import com.yingyangfly.baselib.mvvm.BaseGameMVVMActivity
 import com.yingyangfly.baselib.mvvm.BaseMVVMActivity
 import com.yingyangfly.baselib.player.VoicePlayer
 import com.yingyangfly.baselib.router.RouterUrlCommon
@@ -36,7 +37,7 @@ import com.yingyangfly.game.entity.GameBean
  */
 @Route(path = RouterUrlCommon.gameIntroduction)
 class GameIntroductionActivity :
-    BaseMVVMActivity<ActivityGameIntroductionBinding, GameIntroductionViewModel>(),
+    BaseGameMVVMActivity<ActivityGameIntroductionBinding, GameIntroductionViewModel>(),
     View.OnTouchListener {
 
     private var desn = ""