diff --git a/app/build.gradle b/app/build.gradle index 340e332..b5ad31e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //HTML解析 + implementation 'org.jsoup:jsoup:1.15.3' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 340e332..b5ad31e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //HTML解析 + implementation 'org.jsoup:jsoup:1.15.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e558914..1c12d51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -36,5 +37,15 @@ + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 340e332..b5ad31e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //HTML解析 + implementation 'org.jsoup:jsoup:1.15.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e558914..1c12d51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -36,5 +37,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt new file mode 100644 index 0000000..1cfe7ad --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.extensions + +import org.jsoup.Jsoup + +fun String.extractApkFiles(): ArrayList { + val apkFiles = ArrayList() + val document = Jsoup.parse(this) + val links = document.select("a[href$=.apk]") + for (link in links) { + val apkFileName = link.text() + apkFiles.add(apkFileName) + } + return apkFiles +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 340e332..b5ad31e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //HTML解析 + implementation 'org.jsoup:jsoup:1.15.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e558914..1c12d51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -36,5 +37,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt new file mode 100644 index 0000000..1cfe7ad --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.extensions + +import org.jsoup.Jsoup + +fun String.extractApkFiles(): ArrayList { + val apkFiles = ArrayList() + val document = Jsoup.parse(this) + val links = document.select("a[href$=.apk]") + for (link in links) { + val apkFileName = link.text() + apkFiles.add(apkFileName) + } + return apkFiles +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt index 11ea965..5579474 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt @@ -1,18 +1,28 @@ package com.casic.app.safetreecontroller.fragments +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import androidx.core.content.FileProvider import com.casic.app.safetreecontroller.BuildConfig +import com.casic.app.safetreecontroller.R import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding +import com.casic.app.safetreecontroller.extensions.extractApkFiles +import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.FileDownloadManager +import com.pengxh.kt.lite.utils.HttpRequestKit +import java.io.File + class VersionManageFragment : KotlinBaseFragment() { - override fun initEvent() { - binding.updateLayout.setOnClickListener { - } - } + private val kTag = "VersionManageFragment" override fun initOnCreate(savedInstanceState: Bundle?) { binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}" @@ -31,4 +41,82 @@ override fun setupTopBarLayout() { } + + override fun initEvent() { + binding.updateLayout.setOnClickListener { + /** + * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk + * */ + HttpRequestKit.Builder().setAuthentication() + .setRequestTarget(LocaleConstant.APK_FILES_URL) + .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener { + override fun onFailure(throwable: Throwable) { + "更新失败:${throwable.message}".show(requireContext()) + } + + override fun onSuccess(result: String) { + val files = result.extractApkFiles() + if (files.isEmpty()) { + "已经是最新版本".show(requireContext()) + return + } + + //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk] + val lastApk = files.last() + + //判断是否需要下载 + if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) { + "已经是最新版本".show(requireContext()) + return + } + + //拼接apk下载地址 + val url = "${LocaleConstant.APK_FILES_URL}${lastApk}" + AlertDialog.Builder(requireContext()) + .setTitle(getString(R.string.app_name)) + .setMessage("有新版本,是否更新?") + .setIcon(R.mipmap.ic_launcher) + .setCancelable(false) + .setNegativeButton("稍后再说") { _, _ -> } + .setPositiveButton("立即下载") { _, _ -> + downloadApk(url) + }.create().show() + } + + }).build().start() + } + } + + private fun downloadApk(url: String) { + binding.downloadProgressBar.visibility = View.VISIBLE + FileDownloadManager.Builder().setDownloadFileSource(url) + .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk") + .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener { + override fun onDownloadEnd(file: File) { + binding.downloadProgressBar.visibility = View.GONE + //安装APK + installApk(file) + } + + override fun onFailure(throwable: Throwable) { + + } + + override fun onProgressChanged(progress: Int) { + binding.downloadProgressBar.progress = progress + } + + }).build().start() + } + + private fun installApk(apkFile: File) { + val apkUri = FileProvider.getUriForFile( + requireContext(), "${requireContext().packageName}.provider", apkFile + ) + val intent = Intent(Intent.ACTION_VIEW) + intent.setDataAndType(apkUri, "application/vnd.android.package-archive") + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + requireContext().startActivity(intent) + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 340e332..b5ad31e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //HTML解析 + implementation 'org.jsoup:jsoup:1.15.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e558914..1c12d51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -36,5 +37,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt new file mode 100644 index 0000000..1cfe7ad --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.extensions + +import org.jsoup.Jsoup + +fun String.extractApkFiles(): ArrayList { + val apkFiles = ArrayList() + val document = Jsoup.parse(this) + val links = document.select("a[href$=.apk]") + for (link in links) { + val apkFileName = link.text() + apkFiles.add(apkFileName) + } + return apkFiles +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt index 11ea965..5579474 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt @@ -1,18 +1,28 @@ package com.casic.app.safetreecontroller.fragments +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import androidx.core.content.FileProvider import com.casic.app.safetreecontroller.BuildConfig +import com.casic.app.safetreecontroller.R import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding +import com.casic.app.safetreecontroller.extensions.extractApkFiles +import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.FileDownloadManager +import com.pengxh.kt.lite.utils.HttpRequestKit +import java.io.File + class VersionManageFragment : KotlinBaseFragment() { - override fun initEvent() { - binding.updateLayout.setOnClickListener { - } - } + private val kTag = "VersionManageFragment" override fun initOnCreate(savedInstanceState: Bundle?) { binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}" @@ -31,4 +41,82 @@ override fun setupTopBarLayout() { } + + override fun initEvent() { + binding.updateLayout.setOnClickListener { + /** + * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk + * */ + HttpRequestKit.Builder().setAuthentication() + .setRequestTarget(LocaleConstant.APK_FILES_URL) + .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener { + override fun onFailure(throwable: Throwable) { + "更新失败:${throwable.message}".show(requireContext()) + } + + override fun onSuccess(result: String) { + val files = result.extractApkFiles() + if (files.isEmpty()) { + "已经是最新版本".show(requireContext()) + return + } + + //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk] + val lastApk = files.last() + + //判断是否需要下载 + if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) { + "已经是最新版本".show(requireContext()) + return + } + + //拼接apk下载地址 + val url = "${LocaleConstant.APK_FILES_URL}${lastApk}" + AlertDialog.Builder(requireContext()) + .setTitle(getString(R.string.app_name)) + .setMessage("有新版本,是否更新?") + .setIcon(R.mipmap.ic_launcher) + .setCancelable(false) + .setNegativeButton("稍后再说") { _, _ -> } + .setPositiveButton("立即下载") { _, _ -> + downloadApk(url) + }.create().show() + } + + }).build().start() + } + } + + private fun downloadApk(url: String) { + binding.downloadProgressBar.visibility = View.VISIBLE + FileDownloadManager.Builder().setDownloadFileSource(url) + .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk") + .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener { + override fun onDownloadEnd(file: File) { + binding.downloadProgressBar.visibility = View.GONE + //安装APK + installApk(file) + } + + override fun onFailure(throwable: Throwable) { + + } + + override fun onProgressChanged(progress: Int) { + binding.downloadProgressBar.progress = progress + } + + }).build().start() + } + + private fun installApk(apkFile: File) { + val apkUri = FileProvider.getUriForFile( + requireContext(), "${requireContext().packageName}.provider", apkFile + ) + val intent = Intent(Intent.ACTION_VIEW) + intent.setDataAndType(apkUri, "application/vnd.android.package-archive") + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + requireContext().startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt index 353eaad..d8423a1 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -63,4 +63,9 @@ const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" + + /** + * APK文件列表地址 + * */ + const val APK_FILES_URL = "http://apk.smartlog.work/SafetyTree/" } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 340e332..b5ad31e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,6 @@ implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //HTML解析 + implementation 'org.jsoup:jsoup:1.15.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e558914..1c12d51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -36,5 +37,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt new file mode 100644 index 0000000..1cfe7ad --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.extensions + +import org.jsoup.Jsoup + +fun String.extractApkFiles(): ArrayList { + val apkFiles = ArrayList() + val document = Jsoup.parse(this) + val links = document.select("a[href$=.apk]") + for (link in links) { + val apkFileName = link.text() + apkFiles.add(apkFileName) + } + return apkFiles +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt index 11ea965..5579474 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt @@ -1,18 +1,28 @@ package com.casic.app.safetreecontroller.fragments +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import androidx.core.content.FileProvider import com.casic.app.safetreecontroller.BuildConfig +import com.casic.app.safetreecontroller.R import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding +import com.casic.app.safetreecontroller.extensions.extractApkFiles +import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.FileDownloadManager +import com.pengxh.kt.lite.utils.HttpRequestKit +import java.io.File + class VersionManageFragment : KotlinBaseFragment() { - override fun initEvent() { - binding.updateLayout.setOnClickListener { - } - } + private val kTag = "VersionManageFragment" override fun initOnCreate(savedInstanceState: Bundle?) { binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}" @@ -31,4 +41,82 @@ override fun setupTopBarLayout() { } + + override fun initEvent() { + binding.updateLayout.setOnClickListener { + /** + * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk + * */ + HttpRequestKit.Builder().setAuthentication() + .setRequestTarget(LocaleConstant.APK_FILES_URL) + .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener { + override fun onFailure(throwable: Throwable) { + "更新失败:${throwable.message}".show(requireContext()) + } + + override fun onSuccess(result: String) { + val files = result.extractApkFiles() + if (files.isEmpty()) { + "已经是最新版本".show(requireContext()) + return + } + + //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk] + val lastApk = files.last() + + //判断是否需要下载 + if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) { + "已经是最新版本".show(requireContext()) + return + } + + //拼接apk下载地址 + val url = "${LocaleConstant.APK_FILES_URL}${lastApk}" + AlertDialog.Builder(requireContext()) + .setTitle(getString(R.string.app_name)) + .setMessage("有新版本,是否更新?") + .setIcon(R.mipmap.ic_launcher) + .setCancelable(false) + .setNegativeButton("稍后再说") { _, _ -> } + .setPositiveButton("立即下载") { _, _ -> + downloadApk(url) + }.create().show() + } + + }).build().start() + } + } + + private fun downloadApk(url: String) { + binding.downloadProgressBar.visibility = View.VISIBLE + FileDownloadManager.Builder().setDownloadFileSource(url) + .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk") + .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener { + override fun onDownloadEnd(file: File) { + binding.downloadProgressBar.visibility = View.GONE + //安装APK + installApk(file) + } + + override fun onFailure(throwable: Throwable) { + + } + + override fun onProgressChanged(progress: Int) { + binding.downloadProgressBar.progress = progress + } + + }).build().start() + } + + private fun installApk(apkFile: File) { + val apkUri = FileProvider.getUriForFile( + requireContext(), "${requireContext().packageName}.provider", apkFile + ) + val intent = Intent(Intent.ACTION_VIEW) + intent.setDataAndType(apkUri, "application/vnd.android.package-archive") + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + requireContext().startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt index 353eaad..d8423a1 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -63,4 +63,9 @@ const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" + + /** + * APK文件列表地址 + * */ + const val APK_FILES_URL = "http://apk.smartlog.work/SafetyTree/" } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_version_manage.xml b/app/src/main/res/layout/fragment_version_manage.xml index d336a94..f80bb2c 100644 --- a/app/src/main/res/layout/fragment_version_manage.xml +++ b/app/src/main/res/layout/fragment_version_manage.xml @@ -52,22 +52,35 @@ android:orientation="vertical" android:paddingHorizontal="@dimen/dp_20"> - + android:layout_height="@dimen/itemLayoutHeight" + android:gravity="center_vertical" + android:orientation="horizontal"> + + - + + @@ -36,5 +37,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt new file mode 100644 index 0000000..1cfe7ad --- /dev/null +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt @@ -0,0 +1,14 @@ +package com.casic.app.safetreecontroller.extensions + +import org.jsoup.Jsoup + +fun String.extractApkFiles(): ArrayList { + val apkFiles = ArrayList() + val document = Jsoup.parse(this) + val links = document.select("a[href$=.apk]") + for (link in links) { + val apkFileName = link.text() + apkFiles.add(apkFileName) + } + return apkFiles +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt index 11ea965..5579474 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt @@ -1,18 +1,28 @@ package com.casic.app.safetreecontroller.fragments +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import androidx.core.content.FileProvider import com.casic.app.safetreecontroller.BuildConfig +import com.casic.app.safetreecontroller.R import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding +import com.casic.app.safetreecontroller.extensions.extractApkFiles +import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.FileDownloadManager +import com.pengxh.kt.lite.utils.HttpRequestKit +import java.io.File + class VersionManageFragment : KotlinBaseFragment() { - override fun initEvent() { - binding.updateLayout.setOnClickListener { - } - } + private val kTag = "VersionManageFragment" override fun initOnCreate(savedInstanceState: Bundle?) { binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}" @@ -31,4 +41,82 @@ override fun setupTopBarLayout() { } + + override fun initEvent() { + binding.updateLayout.setOnClickListener { + /** + * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk + * */ + HttpRequestKit.Builder().setAuthentication() + .setRequestTarget(LocaleConstant.APK_FILES_URL) + .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener { + override fun onFailure(throwable: Throwable) { + "更新失败:${throwable.message}".show(requireContext()) + } + + override fun onSuccess(result: String) { + val files = result.extractApkFiles() + if (files.isEmpty()) { + "已经是最新版本".show(requireContext()) + return + } + + //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk] + val lastApk = files.last() + + //判断是否需要下载 + if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) { + "已经是最新版本".show(requireContext()) + return + } + + //拼接apk下载地址 + val url = "${LocaleConstant.APK_FILES_URL}${lastApk}" + AlertDialog.Builder(requireContext()) + .setTitle(getString(R.string.app_name)) + .setMessage("有新版本,是否更新?") + .setIcon(R.mipmap.ic_launcher) + .setCancelable(false) + .setNegativeButton("稍后再说") { _, _ -> } + .setPositiveButton("立即下载") { _, _ -> + downloadApk(url) + }.create().show() + } + + }).build().start() + } + } + + private fun downloadApk(url: String) { + binding.downloadProgressBar.visibility = View.VISIBLE + FileDownloadManager.Builder().setDownloadFileSource(url) + .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk") + .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener { + override fun onDownloadEnd(file: File) { + binding.downloadProgressBar.visibility = View.GONE + //安装APK + installApk(file) + } + + override fun onFailure(throwable: Throwable) { + + } + + override fun onProgressChanged(progress: Int) { + binding.downloadProgressBar.progress = progress + } + + }).build().start() + } + + private fun installApk(apkFile: File) { + val apkUri = FileProvider.getUriForFile( + requireContext(), "${requireContext().packageName}.provider", apkFile + ) + val intent = Intent(Intent.ACTION_VIEW) + intent.setDataAndType(apkUri, "application/vnd.android.package-archive") + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + requireContext().startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt index 353eaad..d8423a1 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -63,4 +63,9 @@ const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" + + /** + * APK文件列表地址 + * */ + const val APK_FILES_URL = "http://apk.smartlog.work/SafetyTree/" } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_version_manage.xml b/app/src/main/res/layout/fragment_version_manage.xml index d336a94..f80bb2c 100644 --- a/app/src/main/res/layout/fragment_version_manage.xml +++ b/app/src/main/res/layout/fragment_version_manage.xml @@ -52,22 +52,35 @@ android:orientation="vertical" android:paddingHorizontal="@dimen/dp_20"> - + android:layout_height="@dimen/itemLayoutHeight" + android:gravity="center_vertical" + android:orientation="horizontal"> + + - + + + +