ソースを参照

1.添加大屏绑定手机号登陆弹窗

王鹏鹏 2 年 前
コミット
a0acbe8518

+ 5 - 2
.idea/misc.xml

@@ -546,16 +546,19 @@
         <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/dialog_payment_qr_code.xml" value="0.6" />
         <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_consultation.xml" value="0.8" />
         <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_consultation_data.xml" value="0.23697916666666666" />
-        <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_consultation_record.xml" value="0.536" />
+        <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_consultation_record.xml" value="0.264" />
         <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_evaluate.xml" value="0.46697566628041715" />
         <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_recommend_doctor.xml" value="0.23697916666666666" />
         <entry key="..\:/workspace/hcp-pads/healthconsultation/src/main/res/layout/item_search_doctor.xml" value="0.23697916666666666" />
+        <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_binding_evaluation.xml" value="0.1415" />
+        <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_down_load_app.xml" value="0.1415" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_home_task_btn.xml" value="0.151" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_home_task_progress.xml" value="0.151" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_home_title.xml" value="0.151" />
+        <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_large_screen_title.xml" value="0.1415" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/bg_results_content.xml" value="0.151" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/drawable/shape_ract_gold.xml" value="0.151" />
-        <entry key="..\:/workspace/hcp-pads/home/src/main/res/layout/activity_binding_evaluation.xml" value="0.23697916666666666" />
+        <entry key="..\:/workspace/hcp-pads/home/src/main/res/layout/activity_binding_evaluation.xml" value="0.264" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/layout/activity_evaluation.xml" value="0.23697916666666666" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/layout/activity_evaluation_history.xml" value="0.536" />
         <entry key="..\:/workspace/hcp-pads/home/src/main/res/layout/activity_evaluation_result.xml" value="0.4465161923454367" />

+ 328 - 0
baselib/src/main/java/com/yingyangfly/baselib/base/BaseLargeScreenActivity.kt

@@ -0,0 +1,328 @@
+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.text.TextUtils
+import android.util.Log
+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.bean.MessageBean
+import com.yingyangfly.baselib.databinding.ActivityBaseBinding
+import com.yingyangfly.baselib.db.AppDataBase
+import com.yingyangfly.baselib.db.DoctorDao
+import com.yingyangfly.baselib.db.GameSoundDao
+import com.yingyangfly.baselib.db.QuestionsDao
+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.router.RouterUrlCommon
+import com.yingyangfly.baselib.utils.*
+import gorden.rxbus2.RxBus
+
+/**
+ * activity基类
+ */
+abstract class BaseLargeScreenActivity<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
+
+    /**
+     * 专业测评
+     */
+    var questionsDao: QuestionsDao? = null
+
+    /**
+     * 健康咨询
+     */
+    var doctorDao: DoctorDao? = null
+
+    /**
+     * 游戏音乐
+     */
+    var gameSoundDao: GameSoundDao? = null
+
+    @SuppressLint("SourceLockedOrientationActivity")
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        RxBus.get().register(this)
+        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE // 竖屏
+        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, 1920, 1079))
+        db = AppDataBase.getInstance(mContext.applicationContext)
+        if (db != null) {
+            questionsDao = db?.getQuestionsDao()
+            doctorDao = db?.getDoctorsDao()
+            gameSoundDao = db?.getGameSoundDao()
+        }
+        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<MessageBean>(this, RxBusCodes.SHOWTASKDIALOG) { bean ->
+            Log.e("wwww", "showtaskdialog------------->         "+GsonUtil.GsonString(bean))
+            val taskFragment = TaskFragment()
+            taskFragment.setTaskDesn(bean.getMessageData(), "")
+            taskFragment.onDialogClickListener = {
+                if (TextUtils.isEmpty(bean.ext).not()) {
+                    if (TextUtils.equals("C", bean.businessID)) {
+                        JumpUtil.jumpActivityWithUrl(
+                            RouterUrlCommon.load_web_view,
+                            bean.ext,
+                            mContext
+                        )
+                    } else if (TextUtils.equals("D", bean.businessID)) {
+                        JumpUtil.jumpActivityWithUrl(
+                            RouterUrlCommon.trainContentDetails,
+                            bean.ext,
+                            mContext
+                        )
+                    }
+                }
+            }
+            taskFragment.show(supportFragmentManager, "taskFragment")
+        }
+    }
+
+//    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+//        if (keyCode == KeyEvent.KEYCODE_BACK) {
+//            return true;
+//        }
+//        return false
+//    }
+
+}

+ 10 - 2
baselib/src/main/java/com/yingyangfly/baselib/dialog/BindingPhoneDialog.kt

@@ -4,6 +4,7 @@ import android.content.Context
 import android.os.Bundle
 import android.text.SpannableString
 import android.text.Spanned
+import android.text.TextUtils
 import android.text.style.ForegroundColorSpan
 import android.view.LayoutInflater
 import android.view.View
@@ -20,6 +21,7 @@ import com.yingyangfly.baselib.net.BaseObserver
 import com.yingyangfly.baselib.net.BaselibServiceFactory
 import com.yingyangfly.baselib.net.MyRxScheduler
 import com.yingyangfly.baselib.utils.RxTimer
+import com.yingyangfly.baselib.utils.User
 import com.yingyangfly.baselib.utils.ViewTool
 import io.reactivex.schedulers.Schedulers
 
@@ -35,6 +37,8 @@ class BindingPhoneDialog : DialogFragment() {
     private lateinit var rxTimer: RxTimer
     private var mContent: Context? = null
 
+    var onDialogClickListener: ((bean: String) -> Unit)? = null
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         isCancelable = false
@@ -145,8 +149,12 @@ class BindingPhoneDialog : DialogFragment() {
             .compose(MyRxScheduler.ioMain(mContent!!, true))
             .subscribe(object : BaseObserver<String>() {
                 override fun onSuccess(t: String?) {
-                    "登陆成功".toast()
-                    dismiss()
+                    if (TextUtils.isEmpty(t).not()) {
+                        User.saveToken(t!!)
+                        User.savePhone(editPhone?.text.toString().trim())
+                        onDialogClickListener?.invoke(editPhone?.text.toString().trim())
+                        dismiss()
+                    }
                 }
 
                 override fun onFail(msg: String) {

+ 26 - 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.BaseLargeScreenActivity
 import com.yingyangfly.baselib.dialog.BaseDialogFragment
 import java.lang.reflect.ParameterizedType
 
@@ -32,6 +33,16 @@ fun BaseActivity<*>.initBar(full: Boolean) {
     }
 }
 
+/**
+ * 沉浸式状态栏
+ */
+fun BaseLargeScreenActivity<*>.initBar(full: Boolean) {
+    immersionBar {
+        hideBar(BarHide.FLAG_HIDE_BAR)
+        navigationBarColor(R.color.transparent)
+    }
+}
+
 /**
  * 沉浸式状态栏
  */
@@ -162,6 +173,21 @@ fun <DB> BaseActivity<*>.getDbClass(t: Any): DB {
     return method?.invoke(null, layoutInflater) as DB
 }
 
+
+/**
+ * 根据传入的Databinding泛型 获取 Databingding
+ */
+fun <DB> BaseLargeScreenActivity<*>.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
  */

+ 71 - 0
baselib/src/main/java/com/yingyangfly/baselib/mvvm/BaseLargeScreenMVVMActivity.kt

@@ -0,0 +1,71 @@
+package com.yingyangfly.baselib.mvvm
+
+import androidx.databinding.ViewDataBinding
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
+import com.yingyangfly.baselib.base.BaseLargeScreenActivity
+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 BaseLargeScreenMVVMActivity<DB : ViewDataBinding, VM : BaseViewModel> : BaseLargeScreenActivity<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()
+    }
+}

+ 149 - 3
home/src/main/java/com/yingyangfly/home/evaluation/BindingEvaluationActivity.kt

@@ -1,25 +1,171 @@
 package com.yingyangfly.home.evaluation
 
+import android.annotation.SuppressLint
+import android.text.TextUtils
+import android.view.MotionEvent
+import android.view.View
 import com.alibaba.android.arouter.facade.annotation.Route
+import com.yingyang.home.R
 import com.yingyang.home.databinding.ActivityBindingEvaluationBinding
-import com.yingyangfly.baselib.base.BaseActivity
+import com.yingyangfly.baselib.db.QuestionsBean
+import com.yingyangfly.baselib.dialog.BindingPhoneDialog
+import com.yingyangfly.baselib.ext.getEndAnimation
+import com.yingyangfly.baselib.ext.getScaleAnimation
+import com.yingyangfly.baselib.ext.toast
+import com.yingyangfly.baselib.mvvm.BaseLargeScreenMVVMActivity
 import com.yingyangfly.baselib.router.RouterUrlCommon
+import com.yingyangfly.baselib.utils.JumpUtil
+import com.yingyangfly.baselib.utils.User
 
 /**
  * 大屏测评页面
  */
 @Route(path = RouterUrlCommon.bindingEvaluation)
-class BindingEvaluationActivity : BaseActivity<ActivityBindingEvaluationBinding>() {
+class BindingEvaluationActivity :
+    BaseLargeScreenMVVMActivity<ActivityBindingEvaluationBinding, BindingEvaluationViewModel>(),
+    View.OnTouchListener {
+
+    private var reviewTaskId = ""
 
     override fun initViews() {
 
     }
 
+    @SuppressLint("ClickableViewAccessibility")
     override fun initListener() {
-
+        binding {
+            loginOutLayout.setOnTouchListener(this@BindingEvaluationActivity)
+            searchLayout.setOnTouchListener(this@BindingEvaluationActivity)
+            mocaLayout.setOnTouchListener(this@BindingEvaluationActivity)
+            mmseLayout.setOnTouchListener(this@BindingEvaluationActivity)
+        }
     }
 
     override fun initData() {
 
     }
+
+    @SuppressLint("ClickableViewAccessibility")
+    override fun onTouch(v: View, event: MotionEvent): Boolean {
+        when (event.action) {
+            MotionEvent.ACTION_DOWN -> {
+                if (v.id == R.id.loginOutLayout || v.id == R.id.searchLayout ||
+                    v.id == R.id.mocaLayout || v.id == R.id.mmseLayout
+                ) {
+                    v.startAnimation(getScaleAnimation())
+                }
+            }
+            MotionEvent.ACTION_UP -> {
+                v.startAnimation(getEndAnimation())
+                when (v.id) {
+                    R.id.loginOutLayout -> {
+                        loginOut()
+                    }
+                    R.id.searchLayout -> {
+                        JumpUtil.jumpActivity(RouterUrlCommon.evaluationHistory, mContext)
+                    }
+                    R.id.mocaLayout -> {
+                        getReviewTaskList("MOCA", "0")
+                    }
+                    R.id.mmseLayout -> {
+                        getReviewTaskList("MMSE", "0")
+                    }
+                }
+            }
+            MotionEvent.ACTION_CANCEL -> {
+                if (v.id == R.id.loginOutLayout || v.id == R.id.searchLayout ||
+                    v.id == R.id.mocaLayout || v.id == R.id.mmseLayout
+                ) {
+                    v.startAnimation(getEndAnimation())
+                }
+            }
+        }
+        return true
+    }
+
+    /**
+     * 退出登录
+     */
+    private fun loginOut() {
+        viewModel.logout(fail = {
+            "退出失败,请重试".toast()
+        }, success = {
+            runOnUiThread {
+                User.saveToken("")
+                User.savePhone("")
+                showBindingPhoneDialog()
+            }
+        })
+    }
+
+    /**
+     * 获取测评任务
+     */
+    private fun getReviewTaskList(type: String, status: String) {
+        viewModel.getReviewTaskList(type, status, fail = {
+            it.toast()
+        }, success = {
+            if (it != null) {
+                if (it.records.isNullOrEmpty().not()) {
+                    val record = it.records[0]
+                    if (record != null) {
+                        reviewTaskId = record.reviewTaskId
+                    }
+                    loadData(type)
+                } else {
+                    "您当前没有测评任务,无需测评".toast()
+                }
+            }
+        })
+    }
+
+
+    private fun loadData(type: String) {
+        if (db != null) {
+            val dao = db?.getQuestionsDao()
+            dao?.deleteAll()
+            val questionsList = mutableListOf<QuestionsBean>()
+            viewModel.getQuestions(type, fail = {
+                it.toast()
+            }, success = {
+                if (it.isNullOrEmpty().not()) {
+                    questionsList.addAll(it!!)
+                    questionsList.forEach {
+                        it.reviewTaskId = reviewTaskId
+                    }
+                    dao?.insertAll(questionsList)
+                }
+                if (TextUtils.equals("MMSE", type)) {
+                    JumpUtil.jumpActivity(RouterUrlCommon.mmseEvaluation, mContext)
+                } else {
+                    JumpUtil.jumpActivity(RouterUrlCommon.mocaEvaluation, mContext)
+                }
+            })
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        if (TextUtils.isEmpty(User.getToken())) {
+            showBindingPhoneDialog()
+        } else {
+            binding.tvPhone.text = if (TextUtils.isEmpty(User.getPhone()).not()) {
+                "手机号:" + User.getPhone()
+            } else {
+                "手机号:"
+            }
+        }
+    }
+
+    /**
+     * 展示绑定手机号弹窗
+     */
+    @SuppressLint("SetTextI18n")
+    private fun showBindingPhoneDialog() {
+        val bindingPhoneDialog = BindingPhoneDialog()
+        bindingPhoneDialog.onDialogClickListener = {
+            binding.tvPhone.text = "手机号:$it"
+        }
+        bindingPhoneDialog.show(supportFragmentManager, "bindingPhoneDialog")
+    }
 }

+ 66 - 0
home/src/main/java/com/yingyangfly/home/evaluation/BindingEvaluationViewModel.kt

@@ -0,0 +1,66 @@
+package com.yingyangfly.home.evaluation
+
+import com.yingyangfly.baselib.bean.EvaluationPagingBean
+import com.yingyangfly.baselib.db.QuestionsBean
+import com.yingyangfly.baselib.mvvm.BaseViewModel
+import com.yingyangfly.baselib.net.XUtils
+import com.yingyangfly.baselib.utils.GsonUtil
+import com.yingyangfly.home.entity.QuestionsTypeBean
+import com.yingyangfly.home.entity.ReviewTask
+import com.yingyangfly.home.entity.ReviewTaskListBean
+import com.yingyangfly.home.net.HOME_API
+
+/**
+ * @author 王鹏鹏
+ * @description 工作台页面ViewModel
+ */
+class BindingEvaluationViewModel : BaseViewModel() {
+
+    /**
+     * 获取mmse试题
+     */
+    fun getReviewTaskList(
+        method: String,
+        stast: String,
+        fail: ((msg: String) -> Unit)? = null,
+        success: ((success: ReviewTaskListBean?) -> Unit)? = null,
+    ) = launchFlow(true) {
+        val requestBean = ReviewTask().apply {
+            type = method
+            status = stast
+        }
+        val body = XUtils.createJson(GsonUtil.GsonString(requestBean))
+        HOME_API.getReviewTaskList(body)
+    }.runUI(
+        success,
+        fail
+    )
+
+    /**
+     * 获取mmse试题
+     */
+    fun getQuestions(
+        method: String,
+        fail: ((msg: String) -> Unit)? = null,
+        success: ((success: List<QuestionsBean>?) -> Unit)? = null,
+    ) = launchFlow(true) {
+        val requestBean = QuestionsTypeBean().apply {
+            type = method
+        }
+        val body = XUtils.createJson(GsonUtil.GsonString(requestBean))
+        HOME_API.getQuestions(body)
+    }.runUI(
+        success,
+        fail
+    )
+
+    fun logout(
+        fail: ((msg: String) -> Unit)? = null,
+        success: ((success: String?) -> Unit)? = null,
+    ) = launchFlow(true) {
+        HOME_API.logout()
+    }.runUI(
+        success,
+        fail
+    )
+}

+ 1 - 1
home/src/main/java/com/yingyangfly/home/evaluation/EvaluationActivity.kt

@@ -112,7 +112,7 @@ class EvaluationActivity : BaseMVVMActivity<ActivityEvaluationBinding, Evaluatio
             it.toast()
         }, success = {
             if (it != null) {
-                if (it.records.isEmpty().not()) {
+                if (it.records.isNullOrEmpty().not()) {
                     val record = it.records[0]
                     if (record != null) {
                         reviewTaskId = record.reviewTaskId

+ 6 - 0
home/src/main/java/com/yingyangfly/home/net/HomeApiService.kt

@@ -78,4 +78,10 @@ interface HomeApiService {
     @POST("app/game/replay")
     suspend fun gameReplay(@Query("id") id: String): BaseResp<Any>
 
+    /**
+     * 退出登录
+     */
+    @POST("app/logout")
+    suspend fun logout(): BaseResp<String>
+
 }

+ 10 - 0
home/src/main/res/drawable/bg_large_screen_title.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="ResourceName">
+    <corners android:radius="@dimen/divider_71px" />
+    <solid android:color="@color/color_3378CCFF" />
+    <stroke
+        android:width="@dimen/divider_4px"
+        android:color="@color/color_FF6BB0FF" />
+</shape>

+ 155 - 6
home/src/main/res/layout/activity_binding_evaluation.xml

@@ -4,28 +4,177 @@
     xmlns:tools="http://schemas.android.com/tools"
     tools:ignore="ResourceName">
 
-    <data>
-
-        <import type="com.yingyangfly.baselib.utils.User" />
-    </data>
-
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="@drawable/bg_binding_evaluation">
 
         <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tvPhone"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginStart="@dimen/divider_48px"
             android:layout_marginTop="@dimen/divider_48px"
-            android:text='@{"手机号:"+User.INSTANCE.phone}'
             android:textColor="@android:color/white"
             android:textSize="@dimen/divider_32px"
             android:textStyle="bold"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
+        <LinearLayout
+            android:id="@+id/loginOutLayout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/divider_48px"
+            android:gravity="center_horizontal"
+            android:orientation="vertical"
+            android:paddingStart="@dimen/divider_48px"
+            android:paddingEnd="@dimen/divider_48px"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="@dimen/divider_59px"
+                android:layout_height="@dimen/divider_53px"
+                android:background="@mipmap/icon_evaluation_login_out"
+                android:scaleType="centerInside" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/divider_10px"
+                android:text="退出绑定"
+                android:textColor="@android:color/white"
+                android:textSize="@dimen/divider_28px"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/searchLayout"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/divider_141px"
+            android:layout_marginStart="@dimen/divider_283px"
+            android:layout_marginTop="@dimen/divider_185px"
+            android:layout_marginEnd="@dimen/divider_282px"
+            android:background="@drawable/bg_large_screen_title"
+            android:gravity="center"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="@dimen/divider_59px"
+                android:layout_height="@dimen/divider_59px"
+                android:background="@mipmap/icon_evaluation_search"
+                android:scaleType="centerInside" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/divider_16px"
+                android:text="报告查询"
+                android:textColor="@android:color/white"
+                android:textSize="@dimen/divider_54px"
+                android:textStyle="bold" />
+
+        </LinearLayout>
+
+        <com.google.android.material.card.MaterialCardView
+            android:id="@+id/mocaLayout"
+            android:layout_width="0dp"
+            android:layout_height="@dimen/divider_466px"
+            android:layout_marginStart="@dimen/divider_267px"
+            android:layout_marginTop="@dimen/divider_89px"
+            android:layout_marginEnd="@dimen/divider_27px"
+            android:theme="@style/Theme.MaterialComponents.NoActionBar"
+            app:cardBackgroundColor="@color/color_3378CCFF"
+            app:cardCornerRadius="@dimen/divider_40px"
+            app:layout_constraintEnd_toStartOf="@+id/mmseLayout"
+            app:layout_constraintHorizontal_weight="1"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/searchLayout"
+            app:strokeColor="@color/color_FF6BB0FF"
+            app:strokeWidth="@dimen/divider_4px">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <androidx.appcompat.widget.AppCompatImageView
+                    android:id="@+id/iamgeMoca"
+                    android:layout_width="@dimen/divider_119px"
+                    android:layout_height="@dimen/divider_119px"
+                    android:layout_marginTop="@dimen/divider_126px"
+                    android:background="@mipmap/icon_large_screen_moca"
+                    android:scaleType="centerInside"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/divider_31px"
+                    android:gravity="center"
+                    android:text="MOCA测评"
+                    android:textColor="@android:color/white"
+                    android:textSize="@dimen/divider_42px"
+                    android:textStyle="bold"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@+id/iamgeMoca" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </com.google.android.material.card.MaterialCardView>
+
+        <com.google.android.material.card.MaterialCardView
+            android:id="@+id/mmseLayout"
+            android:layout_width="0dp"
+            android:layout_height="@dimen/divider_466px"
+            android:layout_marginStart="@dimen/divider_27px"
+            android:layout_marginTop="@dimen/divider_89px"
+            android:layout_marginEnd="@dimen/divider_259px"
+            android:theme="@style/Theme.MaterialComponents.NoActionBar"
+            app:cardBackgroundColor="@color/color_3378CCFF"
+            app:cardCornerRadius="@dimen/divider_40px"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_weight="1"
+            app:layout_constraintStart_toEndOf="@+id/mocaLayout"
+            app:layout_constraintTop_toBottomOf="@+id/searchLayout"
+            app:strokeColor="@color/color_FF6BB0FF"
+            app:strokeWidth="@dimen/divider_4px">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <androidx.appcompat.widget.AppCompatImageView
+                    android:id="@+id/iamgeMmse"
+                    android:layout_width="@dimen/divider_119px"
+                    android:layout_height="@dimen/divider_119px"
+                    android:layout_marginTop="@dimen/divider_126px"
+                    android:background="@mipmap/icon_large_screen_mmse"
+                    android:scaleType="centerInside"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/divider_31px"
+                    android:gravity="center"
+                    android:text="MMSE测评"
+                    android:textColor="@android:color/white"
+                    android:textSize="@dimen/divider_42px"
+                    android:textStyle="bold"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@+id/iamgeMmse" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </com.google.android.material.card.MaterialCardView>
+
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 

BIN
home/src/main/res/mipmap-xxhdpi/icon_evaluation_login_out.png


BIN
home/src/main/res/mipmap-xxhdpi/icon_evaluation_search.png


BIN
home/src/main/res/mipmap-xxhdpi/icon_large_screen_mmse.png


BIN
home/src/main/res/mipmap-xxhdpi/icon_large_screen_moca.png


+ 3 - 0
home/src/main/res/values/colors.xml

@@ -71,4 +71,7 @@
     <color name="color_FF2F55FB" tools:ignore="ResourceName">#FF2F55FB</color>
     <color name="color_FFF0F0F0" tools:ignore="ResourceName">#FFF0F0F0</color>
     <color name="color_FFFB4F28" tools:ignore="ResourceName">#FFFB4F28</color>
+    <color name="color_FF3C63EE" tools:ignore="ResourceName">#FF3C63EE</color>
+    <color name="color_FF6BB0FF" tools:ignore="ResourceName">#FF6BB0FF</color>
+    <color name="color_3378CCFF" tools:ignore="ResourceName">#3378CCFF</color>
 </resources>

+ 9 - 0
home/src/main/res/values/dimens.xml

@@ -13,6 +13,7 @@
     <dimen name="divider_516px" tools:ignore="ResourceName">516px</dimen>
     <dimen name="divider_503px" tools:ignore="ResourceName">503px</dimen>
     <dimen name="divider_472px" tools:ignore="ResourceName">472px</dimen>
+    <dimen name="divider_466px" tools:ignore="ResourceName">466px</dimen>
     <dimen name="divider_445px" tools:ignore="ResourceName">445px</dimen>
     <dimen name="divider_443px" tools:ignore="ResourceName">443px</dimen>
     <dimen name="divider_440px" tools:ignore="ResourceName">440px</dimen>
@@ -47,11 +48,15 @@
     <dimen name="divider_307px" tools:ignore="ResourceName">307px</dimen>
     <dimen name="divider_289px" tools:ignore="ResourceName">289px</dimen>
     <dimen name="divider_285px" tools:ignore="ResourceName">285px</dimen>
+    <dimen name="divider_283px" tools:ignore="ResourceName">283px</dimen>
+    <dimen name="divider_282px" tools:ignore="ResourceName">282px</dimen>
     <dimen name="divider_277px" tools:ignore="ResourceName">277px</dimen>
     <dimen name="divider_270px" tools:ignore="ResourceName">270px</dimen>
+    <dimen name="divider_267px" tools:ignore="ResourceName">267px</dimen>
     <dimen name="divider_265px" tools:ignore="ResourceName">265px</dimen>
     <dimen name="divider_264px" tools:ignore="ResourceName">264px</dimen>
     <dimen name="divider_260px" tools:ignore="ResourceName">260px</dimen>
+    <dimen name="divider_259px" tools:ignore="ResourceName">259px</dimen>
     <dimen name="divider_255px" tools:ignore="ResourceName">255px</dimen>
     <dimen name="divider_253px" tools:ignore="ResourceName">253px</dimen>
     <dimen name="divider_250px" tools:ignore="ResourceName">250px</dimen>
@@ -74,6 +79,7 @@
     <dimen name="divider_195px" tools:ignore="ResourceName">195px</dimen>
     <dimen name="divider_190px" tools:ignore="ResourceName">190px</dimen>
     <dimen name="divider_188px" tools:ignore="ResourceName">188px</dimen>
+    <dimen name="divider_185px" tools:ignore="ResourceName">185px</dimen>
     <dimen name="divider_184px" tools:ignore="ResourceName">184px</dimen>
     <dimen name="divider_181px" tools:ignore="ResourceName">181px</dimen>
     <dimen name="divider_180px" tools:ignore="ResourceName">180px</dimen>
@@ -83,6 +89,7 @@
     <dimen name="divider_158px" tools:ignore="ResourceName">158px</dimen>
     <dimen name="divider_150px" tools:ignore="ResourceName">150px</dimen>
     <dimen name="divider_148px" tools:ignore="ResourceName">148px</dimen>
+    <dimen name="divider_141px" tools:ignore="ResourceName">141px</dimen>
     <dimen name="divider_140px" tools:ignore="ResourceName">140px</dimen>
     <dimen name="divider_135px" tools:ignore="ResourceName">135px</dimen>
     <dimen name="divider_134px" tools:ignore="ResourceName">134px</dimen>
@@ -90,6 +97,7 @@
     <dimen name="divider_132px" tools:ignore="ResourceName">132px</dimen>
     <dimen name="divider_130px" tools:ignore="ResourceName">130px</dimen>
     <dimen name="divider_128px" tools:ignore="ResourceName">128px</dimen>
+    <dimen name="divider_126px" tools:ignore="ResourceName">126px</dimen>
     <dimen name="divider_122px" tools:ignore="ResourceName">122px</dimen>
     <dimen name="divider_120px" tools:ignore="ResourceName">120px</dimen>
     <dimen name="divider_119px" tools:ignore="ResourceName">119px</dimen>
@@ -113,6 +121,7 @@
     <dimen name="divider_101px" tools:ignore="ResourceName">101px</dimen>
     <dimen name="divider_100px" tools:ignore="ResourceName">100px</dimen>
     <dimen name="divider_95px" tools:ignore="ResourceName">95px</dimen>
+    <dimen name="divider_89px" tools:ignore="ResourceName">89px</dimen>
     <dimen name="divider_88px" tools:ignore="ResourceName">88px</dimen>
     <dimen name="divider_87px" tools:ignore="ResourceName">87px</dimen>
     <dimen name="divider_83px" tools:ignore="ResourceName">83px</dimen>

+ 1 - 1
personalcenter/src/main/java/com/yingyang/personalcenter/personalcenter/PersonalCenterActivity.kt

@@ -155,7 +155,7 @@ class PersonalCenterActivity :
      */
     private fun loginOut() {
         viewModel.logout(fail = {
-            it.toast()
+            "退出失败,请重试".toast()
         }, success = {
             User.saveUserId("")
             User.saveName("")