From 51ab79b5ca4b0e6998941a8f14cea9c016f8dbf1 Mon Sep 17 00:00:00 2001 From: WoooKong <159127017+WoooKong@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:04:50 +0800 Subject: [PATCH] Optimize SettingFragment (#536) --- app/src/main/java/com/lizongying/mytv/Ext.kt | 84 +++++++++++++++++++ .../java/com/lizongying/mytv/MainActivity.kt | 81 ++---------------- .../com/lizongying/mytv/SettingFragment.kt | 53 ++++++------ .../java/com/lizongying/mytv/UpdateManager.kt | 14 ++-- 4 files changed, 122 insertions(+), 110 deletions(-) create mode 100644 app/src/main/java/com/lizongying/mytv/Ext.kt diff --git a/app/src/main/java/com/lizongying/mytv/Ext.kt b/app/src/main/java/com/lizongying/mytv/Ext.kt new file mode 100644 index 0000000..1ba934d --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/Ext.kt @@ -0,0 +1,84 @@ +@file:Suppress("DEPRECATION") + +package com.lizongying.mytv + +import android.content.Context +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.content.pm.Signature +import android.content.pm.SigningInfo +import android.os.Build +import android.util.Log +import java.security.MessageDigest + +private const val TAG = "Extensions" + +private val Context.packageInfo: PackageInfo + get() { + val flag = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + PackageManager.GET_SIGNATURES + } else { + PackageManager.GET_SIGNING_CERTIFICATES + } + return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackageInfo(packageName, flag) + } else { + packageManager.getPackageInfo( + packageName, + PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNING_CERTIFICATES.toLong()) + ) + } + } + +/** + * Return the version code of the app which is defined in build.gradle. + * eg:100 + */ +val Context.appVersionCode: Long + get() { + val packageInfo = this.packageInfo + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + packageInfo.longVersionCode + } else { + packageInfo.versionCode.toLong() + } + } + +/** + * Return the version name of the app which is defined in build.gradle. + * eg:1.0.0 + */ +val Context.appVersionName: String get() = packageInfo.versionName + +val Context.appSignature: String + get() { + val packageInfo = this.packageInfo + var sign: Signature? = null + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + val signatures: Array? = packageInfo.signatures + if (signatures != null) { + sign = signatures[0] + } + } else { + val signingInfo: SigningInfo? = packageInfo.signingInfo + if (signingInfo != null) { + sign = signingInfo.apkContentsSigners[0] + } + } + if (sign == null) { + return "" + } + return hashSignature(sign) + } + +private fun hashSignature(signature: Signature): String { + return try { + val md = MessageDigest.getInstance("MD5") + md.update(signature.toByteArray()) + val digest = md.digest() + digest.let { it -> it.joinToString("") { "%02x".format(it) } } + } catch (e: Exception) { + Log.e(TAG, "Error hashing signature", e) + "" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/MainActivity.kt b/app/src/main/java/com/lizongying/mytv/MainActivity.kt index 256607e..4857c23 100644 --- a/app/src/main/java/com/lizongying/mytv/MainActivity.kt +++ b/app/src/main/java/com/lizongying/mytv/MainActivity.kt @@ -1,10 +1,5 @@ package com.lizongying.mytv -import android.content.pm.PackageInfo -import android.content.pm.PackageManager -import android.content.pm.Signature -import android.content.pm.SigningInfo -import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -22,17 +17,16 @@ import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.launch -import java.security.MessageDigest class MainActivity : FragmentActivity(), Request.RequestListener { private var ready = 0 - private var playerFragment = PlayerFragment() - private var mainFragment = MainFragment() - private var infoFragment = InfoFragment() - private var channelFragment = ChannelFragment() - private lateinit var settingFragment: SettingFragment + private val playerFragment = PlayerFragment() + private val mainFragment = MainFragment() + private val infoFragment = InfoFragment() + private val channelFragment = ChannelFragment() + private val settingFragment = SettingFragment() private var doubleBackToExitPressedOnce = false @@ -74,20 +68,6 @@ class MainActivity : FragmentActivity(), Request.RequestListener { .commit() } gestureDetector = GestureDetector(this, GestureListener()) - val packageInfo = getPackageInfo() - val versionName = packageInfo.versionName - val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - packageInfo.longVersionCode - } else { - packageInfo.versionCode.toLong() - } - settingFragment = SettingFragment( - versionName, - versionCode, - SP.channelReversal, - SP.channelNum, - SP.bootStartup - ) } fun showInfoFragment(tvViewModel: TVViewModel) { @@ -446,56 +426,7 @@ class MainActivity : FragmentActivity(), Request.RequestListener { return super.onKeyDown(keyCode, event) } - private fun getPackageInfo(): PackageInfo { - val flag = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - PackageManager.GET_SIGNATURES - } else { - PackageManager.GET_SIGNING_CERTIFICATES - } - - return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { - packageManager.getPackageInfo(packageName, flag) - } else { - packageManager.getPackageInfo( - packageName, - PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNING_CERTIFICATES.toLong()) - ) - } - } - - private fun getAppSignature(): String { - val packageInfo = getPackageInfo() - - var sign: Signature? = null - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { - val signatures: Array? = packageInfo.signatures - if (signatures != null) { - sign = signatures[0] - } - } else { - val signingInfo: SigningInfo? = packageInfo.signingInfo - if (signingInfo != null) { - sign = signingInfo.apkContentsSigners[0] - } - } - if (sign == null) { - return "" - } - - return hashSignature(sign) - } - - private fun hashSignature(signature: Signature): String { - return try { - val md = MessageDigest.getInstance("MD5") - md.update(signature.toByteArray()) - val digest = md.digest() - digest.let { it -> it.joinToString("") { "%02x".format(it) } } - } catch (e: Exception) { - Log.e(TAG, "Error hashing signature", e) - "" - } - } + private fun getAppSignature() = this.appSignature override fun onStart() { Log.i(TAG, "onStart") diff --git a/app/src/main/java/com/lizongying/mytv/SettingFragment.kt b/app/src/main/java/com/lizongying/mytv/SettingFragment.kt index 801f279..dbf63b5 100644 --- a/app/src/main/java/com/lizongying/mytv/SettingFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/SettingFragment.kt @@ -8,14 +8,7 @@ import androidx.fragment.app.DialogFragment import com.lizongying.mytv.databinding.DialogBinding -class SettingFragment( - private val versionName: String, - private val versionCode: Long, - private val channelReversal: Boolean, - private val channelNum: Boolean, - private val bootStartup: Boolean, -) : - DialogFragment() { +class SettingFragment : DialogFragment() { private var _binding: DialogBinding? = null private val binding get() = _binding!! @@ -32,33 +25,37 @@ class SettingFragment( container: ViewGroup?, savedInstanceState: Bundle? ): View { + val context = requireContext() // It‘s safe to get context here. _binding = DialogBinding.inflate(inflater, container, false) - _binding?.version?.text = - "当前版本: $versionName\n获取最新: https://github.com/lizongying/my-tv/releases/" - - val switchChannelReversal = _binding?.switchChannelReversal - switchChannelReversal?.isChecked = channelReversal - switchChannelReversal?.setOnCheckedChangeListener { _, isChecked -> - SP.channelReversal = isChecked - (activity as MainActivity).settingActive() + binding.version.text = + "当前版本: ${context.appVersionName}\n获取最新: https://github.com/lizongying/my-tv/releases/" + + binding.switchChannelReversal.run { + isChecked = SP.channelReversal + setOnCheckedChangeListener { _, isChecked -> + SP.channelReversal = isChecked + (activity as MainActivity).settingActive() + } } - val switchChannelNum = _binding?.switchChannelNum - switchChannelNum?.isChecked = channelNum - switchChannelNum?.setOnCheckedChangeListener { _, isChecked -> - SP.channelNum = isChecked - (activity as MainActivity).settingActive() + binding.switchChannelNum.run { + isChecked = SP.channelNum + setOnCheckedChangeListener { _, isChecked -> + SP.channelNum = isChecked + (activity as MainActivity).settingActive() + } } - val switchBootStartup = _binding?.switchBootStartup - switchBootStartup?.isChecked = bootStartup - switchBootStartup?.setOnCheckedChangeListener { _, isChecked -> - SP.bootStartup = isChecked - (activity as MainActivity).settingActive() + binding.switchBootStartup.run { + isChecked = SP.bootStartup + setOnCheckedChangeListener { _, isChecked -> + SP.bootStartup = isChecked + (activity as MainActivity).settingActive() + } } - updateManager = UpdateManager(context, this, versionCode) - _binding?.checkVersion?.setOnClickListener(OnClickListenerCheckVersion(updateManager)) + updateManager = UpdateManager(context, this, context.appVersionCode) + binding.checkVersion.setOnClickListener(OnClickListenerCheckVersion(updateManager)) return binding.root } diff --git a/app/src/main/java/com/lizongying/mytv/UpdateManager.kt b/app/src/main/java/com/lizongying/mytv/UpdateManager.kt index ac1b852..5616bdd 100644 --- a/app/src/main/java/com/lizongying/mytv/UpdateManager.kt +++ b/app/src/main/java/com/lizongying/mytv/UpdateManager.kt @@ -23,7 +23,7 @@ import java.io.File class UpdateManager( - private var context: Context?, + private var context: Context, private var settingFragment: SettingFragment, private var versionCode: Long ) : @@ -67,7 +67,7 @@ class UpdateManager( val apkFileName = "my-tv-${release.data.versionName}.apk" Log.i(TAG, "apkFileName $apkFileName") val downloadManager = - context!!.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager + context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val request = Request(Uri.parse(release.data.downloadUrl)) Log.i(TAG, "url ${Uri.parse(release.data.downloadUrl)}") request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, apkFileName) @@ -77,22 +77,22 @@ class UpdateManager( // 获取下载任务的引用 val downloadReference = downloadManager.enqueue(request) - downloadReceiver = DownloadReceiver(context!!, apkFileName, downloadReference) + downloadReceiver = DownloadReceiver(context, apkFileName, downloadReference) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context!!.registerReceiver( + context.registerReceiver( downloadReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), Context.RECEIVER_NOT_EXPORTED, ) } else { - context!!.registerReceiver( + context.registerReceiver( downloadReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ) } - getDownloadProgress(context!!, downloadReference) { progress -> + getDownloadProgress(context, downloadReference) { progress -> println("Download progress: $progress%") } } @@ -182,7 +182,7 @@ class UpdateManager( fun destroy() { if (downloadReceiver != null) { - context!!.unregisterReceiver(downloadReceiver) + context.unregisterReceiver(downloadReceiver) Log.i(TAG, "destroy downloadReceiver") } }