diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt index a4fa951..047df78 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt @@ -7,7 +7,7 @@ import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter import com.casic.smart.town.sanxi.fragment.AlarmPageFragment -import com.casic.smart.town.sanxi.fragment.MinePageFragment +import com.casic.smart.town.sanxi.fragment.MorePageFragment import com.casic.smart.town.sanxi.fragment.MonitorPageFragment import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment import com.gyf.immersionbar.ImmersionBar @@ -34,7 +34,7 @@ fragmentPages.add(StatisticsPageFragment()) fragmentPages.add(MonitorPageFragment()) fragmentPages.add(AlarmPageFragment()) - fragmentPages.add(MinePageFragment()) + fragmentPages.add(MorePageFragment()) } override fun initLayoutView(): Int = R.layout.activity_main diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt index a4fa951..047df78 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt @@ -7,7 +7,7 @@ import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter import com.casic.smart.town.sanxi.fragment.AlarmPageFragment -import com.casic.smart.town.sanxi.fragment.MinePageFragment +import com.casic.smart.town.sanxi.fragment.MorePageFragment import com.casic.smart.town.sanxi.fragment.MonitorPageFragment import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment import com.gyf.immersionbar.ImmersionBar @@ -34,7 +34,7 @@ fragmentPages.add(StatisticsPageFragment()) fragmentPages.add(MonitorPageFragment()) fragmentPages.add(AlarmPageFragment()) - fragmentPages.add(MinePageFragment()) + fragmentPages.add(MorePageFragment()) } override fun initLayoutView(): Int = R.layout.activity_main diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt index c5d8b22..e79b646 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt @@ -1,10 +1,21 @@ package com.casic.smart.town.sanxi.view +import android.content.Context import com.casic.smart.town.sanxi.R +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_base_title.* class MonitorRecordActivity : KotlinBaseActivity() { + private val context: Context = this@MonitorRecordActivity + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.activity_monitor_record override fun observeRequestState() { @@ -12,7 +23,10 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + leftBackView.setOnClickListener { finish() } + titleView.text = "监控摄像头列表" } override fun initData() { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt index a4fa951..047df78 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt @@ -7,7 +7,7 @@ import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter import com.casic.smart.town.sanxi.fragment.AlarmPageFragment -import com.casic.smart.town.sanxi.fragment.MinePageFragment +import com.casic.smart.town.sanxi.fragment.MorePageFragment import com.casic.smart.town.sanxi.fragment.MonitorPageFragment import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment import com.gyf.immersionbar.ImmersionBar @@ -34,7 +34,7 @@ fragmentPages.add(StatisticsPageFragment()) fragmentPages.add(MonitorPageFragment()) fragmentPages.add(AlarmPageFragment()) - fragmentPages.add(MinePageFragment()) + fragmentPages.add(MorePageFragment()) } override fun initLayoutView(): Int = R.layout.activity_main diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt index c5d8b22..e79b646 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt @@ -1,10 +1,21 @@ package com.casic.smart.town.sanxi.view +import android.content.Context import com.casic.smart.town.sanxi.R +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_base_title.* class MonitorRecordActivity : KotlinBaseActivity() { + private val context: Context = this@MonitorRecordActivity + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.activity_monitor_record override fun observeRequestState() { @@ -12,7 +23,10 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + leftBackView.setOnClickListener { finish() } + titleView.text = "监控摄像头列表" } override fun initData() { diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index 9b2d9e5..6aa71a5 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt index a4fa951..047df78 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt @@ -7,7 +7,7 @@ import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter import com.casic.smart.town.sanxi.fragment.AlarmPageFragment -import com.casic.smart.town.sanxi.fragment.MinePageFragment +import com.casic.smart.town.sanxi.fragment.MorePageFragment import com.casic.smart.town.sanxi.fragment.MonitorPageFragment import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment import com.gyf.immersionbar.ImmersionBar @@ -34,7 +34,7 @@ fragmentPages.add(StatisticsPageFragment()) fragmentPages.add(MonitorPageFragment()) fragmentPages.add(AlarmPageFragment()) - fragmentPages.add(MinePageFragment()) + fragmentPages.add(MorePageFragment()) } override fun initLayoutView(): Int = R.layout.activity_main diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt index c5d8b22..e79b646 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt @@ -1,10 +1,21 @@ package com.casic.smart.town.sanxi.view +import android.content.Context import com.casic.smart.town.sanxi.R +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_base_title.* class MonitorRecordActivity : KotlinBaseActivity() { + private val context: Context = this@MonitorRecordActivity + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.activity_monitor_record override fun observeRequestState() { @@ -12,7 +23,10 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + leftBackView.setOnClickListener { finish() } + titleView.text = "监控摄像头列表" } override fun initData() { diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index 9b2d9e5..6aa71a5 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> diff --git a/app/src/main/res/layout/activity_monitor_record.xml b/app/src/main/res/layout/activity_monitor_record.xml index 77d9ef6..64f1807 100644 --- a/app/src/main/res/layout/activity_monitor_record.xml +++ b/app/src/main/res/layout/activity_monitor_record.xml @@ -1,6 +1,43 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt index a4fa951..047df78 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt @@ -7,7 +7,7 @@ import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter import com.casic.smart.town.sanxi.fragment.AlarmPageFragment -import com.casic.smart.town.sanxi.fragment.MinePageFragment +import com.casic.smart.town.sanxi.fragment.MorePageFragment import com.casic.smart.town.sanxi.fragment.MonitorPageFragment import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment import com.gyf.immersionbar.ImmersionBar @@ -34,7 +34,7 @@ fragmentPages.add(StatisticsPageFragment()) fragmentPages.add(MonitorPageFragment()) fragmentPages.add(AlarmPageFragment()) - fragmentPages.add(MinePageFragment()) + fragmentPages.add(MorePageFragment()) } override fun initLayoutView(): Int = R.layout.activity_main diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt index c5d8b22..e79b646 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt @@ -1,10 +1,21 @@ package com.casic.smart.town.sanxi.view +import android.content.Context import com.casic.smart.town.sanxi.R +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_base_title.* class MonitorRecordActivity : KotlinBaseActivity() { + private val context: Context = this@MonitorRecordActivity + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.activity_monitor_record override fun observeRequestState() { @@ -12,7 +23,10 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + leftBackView.setOnClickListener { finish() } + titleView.text = "监控摄像头列表" } override fun initData() { diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index 9b2d9e5..6aa71a5 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> diff --git a/app/src/main/res/layout/activity_monitor_record.xml b/app/src/main/res/layout/activity_monitor_record.xml index 77d9ef6..64f1807 100644 --- a/app/src/main/res/layout/activity_monitor_record.xml +++ b/app/src/main/res/layout/activity_monitor_record.xml @@ -1,6 +1,43 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 77d9ef6..04881f3 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,6 +1,26 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt deleted file mode 100644 index 1809dc5..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MinePageFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package com.casic.smart.town.sanxi.fragment - -import android.app.ProgressDialog -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import androidx.core.content.FileProvider -import androidx.lifecycle.ViewModelProvider -import com.casic.smart.town.sanxi.BuildConfig -import com.casic.smart.town.sanxi.R -import com.casic.smart.town.sanxi.extensions.appendDownloadUrl -import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant -import com.casic.smart.town.sanxi.util.RSAUtils -import com.casic.smart.town.sanxi.view.AboutUsActivity -import com.casic.smart.town.sanxi.view.LoginActivity -import com.casic.smart.town.sanxi.vm.LoginViewModel -import com.casic.smart.town.sanxi.vm.UserViewModel -import com.casic.smart.town.sanxi.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 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)[UserViewModel::class.java] - loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] - versionViewModel = ViewModelProvider(this)[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) - - /** - * 数据监听 - * */ - dataObserve() - } - - override fun observeRequestState() { - userViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") - is LoadState.Success -> { - "修改成功,请重新登录".show(requireContext()) - LoadingDialogHub.dismiss() - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - else -> LoadingDialogHub.dismiss() - } - }) - - versionViewModel.loadState.observe(this, { - when (it) { - is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") - else -> LoadingDialogHub.dismiss() - } - }) - } - - override fun initEvent() { - userImageView.setOnClickListener { - "尽情期待~".show(requireContext()) - } - - updateUserButton.setOnClickListener { - LoadingDialogHub.show(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() - } - - updateVersionLayout.setOnClickListener { - versionViewModel.updateVersion() - } - - clearCacheLayout.setOnClickListener { - //删除缓存之后在设置缓存大小 - LoadingDialogHub.show(requireActivity(), "清理中,请稍后") - File(requireContext().cacheDir.path).deleteFile() - object : CountDownTimer(1500, 500) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() - } - }.start() - } - - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - loginViewModel.out() - } - - override fun onCancelClick() {} - }).build().show() - } - } - - private fun dataObserve() { - userViewModel.userDetailModel.observe(this, { - if (it.code == 200) { - LoadingDialogHub.dismiss() - "同步完成".show(requireContext()) - userData = it.data - updateUserInfo() - } - }) - - 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() - } - }) - - loginViewModel.outResultModel.observe(this, { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - PageNavigationManager.finishAllActivity() - } - }) - } - - private fun collectApplicationCache(): Long { - return File(requireContext().cacheDir.path).calculateSize() - } - - override fun onResume() { - val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String - if (userDetailJson.isNotBlank()) { - userData = Gson().fromJson( - userDetailJson, object : TypeToken() {}.type - ) - updateUserInfo() - } - //缓存 - cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt new file mode 100644 index 0000000..31c6fb3 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -0,0 +1,288 @@ +package com.casic.smart.town.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.CountDownTimer +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.smart.town.sanxi.BuildConfig +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.model.UserDetailModel +import com.casic.smart.town.sanxi.util.AuthenticationHelper +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.RSAUtils +import com.casic.smart.town.sanxi.view.AboutUsActivity +import com.casic.smart.town.sanxi.view.LoginActivity +import com.casic.smart.town.sanxi.vm.LoginViewModel +import com.casic.smart.town.sanxi.vm.UserViewModel +import com.casic.smart.town.sanxi.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_more.* +import java.io.File +import java.nio.charset.StandardCharsets + +class MorePageFragment : KotlinBaseFragment() { + + 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_more + + override fun setupTopBarLayout() { + + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + versionViewModel = ViewModelProvider(this)[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) + + /** + * 数据监听 + * */ + dataObserve() + } + + override fun observeRequestState() { + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "修改中,请稍后") + is LoadState.Success -> { + "修改成功,请重新登录".show(requireContext()) + LoadingDialogHub.dismiss() + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + else -> LoadingDialogHub.dismiss() + } + }) + + versionViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun initEvent() { + userImageView.setOnClickListener { + "尽情期待~".show(requireContext()) + } + + updateUserButton.setOnClickListener { + LoadingDialogHub.show(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() + } + + updateVersionLayout.setOnClickListener { + versionViewModel.updateVersion() + } + + clearCacheLayout.setOnClickListener { + //删除缓存之后在设置缓存大小 + LoadingDialogHub.show(requireActivity(), "清理中,请稍后") + File(requireContext().cacheDir.path).deleteFile() + object : CountDownTimer(1500, 500) { + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + LoadingDialogHub.dismiss() + cacheSizeView.text = collectApplicationCache().formatFileSize() + } + }.start() + } + + loginOutButton.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出登录") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + loginViewModel.out() + } + + override fun onCancelClick() {} + }).build().show() + } + } + + private fun dataObserve() { + userViewModel.userDetailModel.observe(this, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + "同步完成".show(requireContext()) + userData = it.data + updateUserInfo() + } + }) + + 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() + } + }) + + loginViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + } + + private fun collectApplicationCache(): Long { + return File(requireContext().cacheDir.path).calculateSize() + } + + override fun onResume() { + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userData = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + updateUserInfo() + } + //缓存 + cacheSizeView.text = collectApplicationCache().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(), LocaleConstant.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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt index a4fa951..047df78 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt @@ -7,7 +7,7 @@ import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter import com.casic.smart.town.sanxi.fragment.AlarmPageFragment -import com.casic.smart.town.sanxi.fragment.MinePageFragment +import com.casic.smart.town.sanxi.fragment.MorePageFragment import com.casic.smart.town.sanxi.fragment.MonitorPageFragment import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment import com.gyf.immersionbar.ImmersionBar @@ -34,7 +34,7 @@ fragmentPages.add(StatisticsPageFragment()) fragmentPages.add(MonitorPageFragment()) fragmentPages.add(AlarmPageFragment()) - fragmentPages.add(MinePageFragment()) + fragmentPages.add(MorePageFragment()) } override fun initLayoutView(): Int = R.layout.activity_main diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt index c5d8b22..e79b646 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt @@ -1,10 +1,21 @@ package com.casic.smart.town.sanxi.view +import android.content.Context import com.casic.smart.town.sanxi.R +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_base_title.* class MonitorRecordActivity : KotlinBaseActivity() { + private val context: Context = this@MonitorRecordActivity + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.activity_monitor_record override fun observeRequestState() { @@ -12,7 +23,10 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + leftBackView.setOnClickListener { finish() } + titleView.text = "监控摄像头列表" } override fun initData() { diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index 9b2d9e5..6aa71a5 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> diff --git a/app/src/main/res/layout/activity_monitor_record.xml b/app/src/main/res/layout/activity_monitor_record.xml index 77d9ef6..64f1807 100644 --- a/app/src/main/res/layout/activity_monitor_record.xml +++ b/app/src/main/res/layout/activity_monitor_record.xml @@ -1,6 +1,43 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 77d9ef6..04881f3 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,6 +1,26 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml deleted file mode 100644 index ca0b3f0..0000000 --- a/app/src/main/res/layout/fragment_mine.xml +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -