Newer
Older
CasicSmartTube / app / src / main / java / com / casic / smarttube / fragment / MinePageFragment.kt
package com.casic.smarttube.fragment

import androidx.lifecycle.ViewModelProvider
import com.casic.smarttube.R
import com.casic.smarttube.model.UserDetailModel
import com.casic.smarttube.utils.AuthenticationHelper
import com.casic.smarttube.utils.DialogHelper
import com.casic.smarttube.utils.LocalConstant
import com.casic.smarttube.utils.RSAUtils
import com.casic.smarttube.view.LoginActivity
import com.casic.smarttube.vm.LoginViewModel
import com.casic.smarttube.vm.UserViewModel
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.base.KotlinBaseFragment
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog
import kotlinx.android.synthetic.main.fragment_mine.*
import java.nio.charset.StandardCharsets

class MinePageFragment : KotlinBaseFragment() {

    private val kTag = "MinePageFragment"
    private lateinit var userData: UserDetailModel.Data
    private lateinit var userViewModel: UserViewModel
    private lateinit var loginViewModel: LoginViewModel

    override fun initLayoutView(): Int = R.layout.fragment_mine

    override fun setupTopBarLayout() {

    }

    override fun initData() {
        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
        loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java)
    }

    override fun initEvent() {
        userImageView.setOnClickListener {
            "尽情期待~".show(requireContext())
        }

        updateUserButton.setOnClickListener {
            DialogHelper.showLoadingDialog(requireActivity(), "同步中,请稍后...")
            userViewModel.obtainUserDetail()
        }

        changePwdLayout.setOnClickListener {
            ChangePasswordDialog.Builder()
                .setContext(requireContext())
                .setOnDialogButtonClickListener(object :
                    ChangePasswordDialog.OnDialogButtonClickListener {
                    override fun onConfirmClick(oldPwd: String, newPwd: String) {
                        val publicKey =
                            RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!!
                        val oldPassKey = RSAUtils.encryptDataByPublicKey(
                            oldPwd.toByteArray(StandardCharsets.UTF_8),
                            publicKey
                        )
                        val newPassKey = RSAUtils.encryptDataByPublicKey(
                            newPwd.toByteArray(StandardCharsets.UTF_8),
                            publicKey
                        )
                        userViewModel.changePassword(oldPassKey, newPassKey)
                    }
                }).build().show()
        }

        loginOutButton.setOnClickListener {
            AlertControlDialog.Builder()
                .setContext(requireContext())
                .setTitle("退出登录")
                .setMessage("确定要退出吗?")
                .setNegativeButton("取消")
                .setPositiveButton("确定")
                .setOnDialogButtonClickListener(object :
                    AlertControlDialog.OnDialogButtonClickListener {
                    override fun onConfirmClick() {
                        loginViewModel.out()
                    }

                    override fun onCancelClick() {}
                }).build().show()
        }

        /**
         * 数据监听
         * */
        dataObserve()
    }

    private fun dataObserve() {
        /**
         * 用户信息数据监听
         * */
        userViewModel.userDetailModel.observe(this, {
            if (it.code == 200) {
                DialogHelper.dismissLoadingDialog()
                "同步完成".show(requireContext())
                userData = it.data
            }
        })

        userViewModel.loadState.observe(this, {
            when (it) {
                is LoadState.Loading -> {
                    DialogHelper.showLoadingDialog(requireActivity(), "修改中,请稍后")
                }
                is LoadState.Success -> {
                    DialogHelper.dismissLoadingDialog()
                    AuthenticationHelper.removeToken()
                    requireContext().navigatePageTo<LoginActivity>()
                    PageNavigationManager.finishAllActivity()
                }
                else -> {
                    DialogHelper.dismissLoadingDialog()
                }
            }
        })

        loginViewModel.outResultModel.observe(this, {
            if (it.code == 200) {
                AuthenticationHelper.removeToken()
                requireContext().navigatePageTo<LoginActivity>()
                PageNavigationManager.finishAllActivity()
            }
        })
    }

    override fun onResume() {
        val userDetailJson = SaveKeyValues.getValue(LocalConstant.USER_DETAIL_MODEL, "") as String
        if (userDetailJson.isNotBlank()) {
            userData = Gson().fromJson(
                userDetailJson, object : TypeToken<UserDetailModel.Data>() {}.type
            )
            updateUserInfo()
        }
        super.onResume()
    }

    private fun updateUserInfo() {
        userNameView.text = userData.name
        userPhoneView.text = String.format("电话:${userData.phone}")
        userDeptView.text = String.format("部门:${userData.deptName}")
    }
}