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

import android.app.ProgressDialog
import android.content.Intent
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smarttube.BuildConfig
import com.casic.smarttube.R
import com.casic.smarttube.extensions.appendDownloadUrl
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.AboutUsActivity
import com.casic.smarttube.view.LoginActivity
import com.casic.smarttube.vm.LoginViewModel
import com.casic.smarttube.vm.UserViewModel
import com.casic.smarttube.vm.VersionViewModel
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.base.KotlinBaseFragment
import com.pengxh.kt.lite.callback.OnDownloadListener
import com.pengxh.kt.lite.extensions.*
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.io.File
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
    private lateinit var versionViewModel: VersionViewModel
    private lateinit var progressDialog: ProgressDialog

    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)
        versionViewModel = ViewModelProvider(this).get(VersionViewModel::class.java)

        //初始化下载对话框
        progressDialog = ProgressDialog(requireContext())
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
        progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress))
        progressDialog.setCanceledOnTouchOutside(false)
        progressDialog.setCancelable(false)
    }

    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()
        }

        aboutUsLayout.setOnClickListener {
            requireContext().navigatePageTo<AboutUsActivity>()
        }

        updateVersionLayout.setOnClickListener {
            versionViewModel.updateVersion()
        }

        updateLogLayout.setOnClickListener {
            "尽情期待~".show(requireContext())
        }

        //TODO 待后期功能完善后再调整缓存实际位置
        clearCacheLayout.setOnClickListener {
            cacheSizeView.text = 0L.formatFileSize()
        }

        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 -> {
                    "修改成功,请重新登录".show(requireContext())
                    DialogHelper.dismissLoadingDialog()
                    AuthenticationHelper.removeToken()
                    requireContext().navigatePageTo<LoginActivity>()
                    PageNavigationManager.finishAllActivity()
                }
                else -> {
                    DialogHelper.dismissLoadingDialog()
                }
            }
        })

        versionViewModel.versionResultModel.observe(this, {
            if (BuildConfig.VERSION_NAME == it.version) {
                "已是最新版本,无需更新".show(requireContext())
            } else {
                AlertControlDialog.Builder()
                    .setContext(requireContext())
                    .setTitle("提示")
                    .setMessage("有新版本,是否更新?")
                    .setNegativeButton("稍后再说")
                    .setPositiveButton("立即下载")
                    .setOnDialogButtonClickListener(object :
                        AlertControlDialog.OnDialogButtonClickListener {
                        override fun onConfirmClick() {
                            downloadApk(it.downloadUrl)
                        }

                        override fun onCancelClick() {

                        }
                    }).build().show()
            }
        })

        versionViewModel.loadState.observe(this, {
            when (it) {
                is LoadState.Loading -> {
                    DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后")
                }
                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()
        }
        //缓存
        cacheSizeView.text = 0L.formatFileSize()
        super.onResume()
    }

    private fun updateUserInfo() {
        //设置头像,圆形,暂时是默认的
        val roundDrawable =
            BitmapFactory.decodeResource(requireContext().resources, R.mipmap.login_casic)
                .createRoundDrawable(
                    requireContext(),
                    3f.dp2px(requireContext()),
                    R.color.mainThemeColor.convertColor(requireContext())
                )
        userImageView.setImageDrawable(roundDrawable)
        userNameView.text = userData.name
        userPhoneView.text = String.format("电话:${userData.phone}")
        userDeptView.text = String.format("部门:${userData.deptName}")
    }

    private fun downloadApk(url: String?) {
        progressDialog.setMessage("下载新版本中...")
        progressDialog.show()
        if (url.toString().isBlank()) {
            "抱歉,版本下载失败".show(requireContext())
            return
        }
        /**
         * http://111.198.10.15:11304/static/apk/1.0.1.apk
         * */
        val downloadPath = url!!.appendDownloadUrl()
        //开始下载
        downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(),
            object : OnDownloadListener {
                override fun onDownloadStart(totalBytes: Long) {
                    progressDialog.max = totalBytes.toInt()
                }

                override fun onProgressChanged(currentBytes: Long) {
                    progressDialog.progress = currentBytes.toInt()
                }

                override fun onDownloadEnd(file: File?) {
                    progressDialog.dismiss()
                    progressDialog.progress = 0
                    //安装APK
                    installApk(file)
                }
            })
    }

    private fun installApk(apkPackage: File?) {
        if (apkPackage == null) {
            "文件异常,无法安装".show(requireContext())
            return
        }
        val intent = Intent(Intent.ACTION_VIEW)
        val data: Uri
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0
            data = FileProvider.getUriForFile(
                requireContext(), LocalConstant.APP_AUTHORITY, apkPackage
            )
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权
        } else {
            data = Uri.fromFile(apkPackage)
        }
        intent.setDataAndType(data, "application/vnd.android.package-archive")
        requireContext().startActivity(intent)
    }
}