From 30347546a2037347f659981e20238453af845c32 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 8 Jun 2024 10:17:54 +0800 Subject: [PATCH] Optimized code --- V2rayNG/app/build.gradle.kts | 16 ++--- .../kotlin/com/v2ray/ang/ui/MainActivity.kt | 67 ++++--------------- .../com/v2ray/ang/viewmodel/MainViewModel.kt | 30 ++++++++- 3 files changed, 49 insertions(+), 64 deletions(-) diff --git a/V2rayNG/app/build.gradle.kts b/V2rayNG/app/build.gradle.kts index 20dce754..edefe388 100644 --- a/V2rayNG/app/build.gradle.kts +++ b/V2rayNG/app/build.gradle.kts @@ -11,7 +11,7 @@ android { applicationId = "com.v2ray.ang" minSdk = 21 targetSdk = 34 - versionCode = 562 + versionCode = 563 versionName = "1.8.25" multiDexEnabled = true splits.abi { @@ -95,7 +95,7 @@ dependencies { // Androidx implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.legacy:legacy-support-v4:1.0.0") - implementation("androidx.appcompat:appcompat:1.6.1") + implementation("androidx.appcompat:appcompat:1.7.0") implementation("com.google.android.material:material:1.12.0") implementation("androidx.cardview:cardview:1.0.0") implementation("androidx.preference:preference-ktx:1.2.1") @@ -106,17 +106,17 @@ dependencies { // Androidx ktx implementation("androidx.activity:activity-ktx:1.9.0") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.1") //kotlin implementation("org.jetbrains.kotlin:kotlin-reflect:1.9.23") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") implementation("com.tencent:mmkv-static:1.3.4") - implementation("com.google.code.gson:gson:2.10.1") + implementation("com.google.code.gson:gson:2.11.0") implementation("io.reactivex:rxjava:1.3.8") implementation("io.reactivex:rxandroid:1.2.1") implementation("com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar") diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index 4c3f8146..f8f5e45b 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -9,7 +9,6 @@ import android.net.VpnService import android.os.Build import android.os.Bundle import android.text.TextUtils -import android.util.Log import android.view.KeyEvent import android.view.Menu import android.view.MenuItem @@ -28,7 +27,6 @@ import com.google.android.material.navigation.NavigationView import com.tbruyelle.rxpermissions.RxPermissions import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityMainBinding import com.v2ray.ang.databinding.LayoutProgressBinding @@ -46,8 +44,6 @@ import kotlinx.coroutines.launch import me.drakeet.support.toast.ToastCompat import rx.Observable import rx.android.schedulers.AndroidSchedulers -import java.io.File -import java.io.FileOutputStream import java.util.concurrent.TimeUnit class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener { @@ -112,8 +108,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList setupViewModel() - copyAssets() - //migrateLegacy() + mainViewModel.copyAssets(assets) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { RxPermissions(this) @@ -162,45 +157,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList mainViewModel.startListenBroadcast() } - private fun copyAssets() { - val extFolder = Utils.userAssetPath(this) - lifecycleScope.launch(Dispatchers.IO) { - try { - val geo = arrayOf("geosite.dat", "geoip.dat") - assets.list("") - ?.filter { geo.contains(it) } - ?.filter { !File(extFolder, it).exists() } - ?.forEach { - val target = File(extFolder, it) - assets.open(it).use { input -> - FileOutputStream(target).use { output -> - input.copyTo(output) - } - } - Log.i(ANG_PACKAGE, "Copied from apk assets folder to ${target.absolutePath}") - } - } catch (e: Exception) { - Log.e(ANG_PACKAGE, "asset copy failed", e) - } - } - } - -// private fun migrateLegacy() { -// lifecycleScope.launch(Dispatchers.IO) { -// val result = AngConfigManager.migrateLegacyConfig(this@MainActivity) -// if (result != null) { -// launch(Dispatchers.Main) { -// if (result) { -// toast(getString(R.string.migration_success)) -// mainViewModel.reloadServerList() -// } else { -// toast(getString(R.string.migration_fail)) -// } -// } -// } -// } -// } - fun startV2Ray() { if (mainStorage?.decodeString(MmkvManager.KEY_SELECTED_SERVER).isNullOrEmpty()) { return @@ -328,6 +284,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm) .setPositiveButton(android.R.string.ok) { _, _ -> mainViewModel.removeDuplicateServer() + mainViewModel.reloadServerList() } .setNegativeButton(android.R.string.no) {_, _ -> //do noting @@ -372,7 +329,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from qrcode */ - fun importQRcode(forConfig: Boolean): Boolean { + private fun importQRcode(forConfig: Boolean): Boolean { // try { // startActivityForResult(Intent("com.google.zxing.client.android.SCAN") // .addCategory(Intent.CATEGORY_DEFAULT) @@ -408,7 +365,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from clipboard */ - fun importClipboard() + private fun importClipboard() : Boolean { try { val clipboard = Utils.getClipboard(this) @@ -420,7 +377,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList return true } - fun importBatchConfig(server: String?) { + private fun importBatchConfig(server: String?) { val dialog = AlertDialog.Builder(this) .setView(LayoutProgressBinding.inflate(layoutInflater).root) .setCancelable(false) @@ -441,7 +398,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } } - fun importConfigCustomClipboard() + private fun importConfigCustomClipboard() : Boolean { try { val configText = Utils.getClipboard(this) @@ -460,7 +417,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from local config file */ - fun importConfigCustomLocal(): Boolean { + private fun importConfigCustomLocal(): Boolean { try { showFileChooser() } catch (e: Exception) { @@ -470,7 +427,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList return true } - fun importConfigCustomUrlClipboard() + private fun importConfigCustomUrlClipboard() : Boolean { try { val url = Utils.getClipboard(this) @@ -488,7 +445,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from url */ - fun importConfigCustomUrl(url: String?): Boolean { + private fun importConfigCustomUrl(url: String?): Boolean { try { if (!Utils.isValidUrl(url)) { toast(R.string.toast_invalid_url) @@ -515,7 +472,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from sub */ - fun importConfigViaSub() : Boolean { + private fun importConfigViaSub() : Boolean { val dialog = AlertDialog.Builder(this) .setView(LayoutProgressBinding.inflate(layoutInflater).root) .setCancelable(false) @@ -587,7 +544,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import customize config */ - fun importCustomizeConfig(server: String?) { + private fun importCustomizeConfig(server: String?) { try { if (server == null || TextUtils.isEmpty(server)) { toast(R.string.toast_none_data) @@ -607,7 +564,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } } - fun setTestState(content: String?) { + private fun setTestState(content: String?) { binding.tvTestState.text = content } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index 7e0510c8..6c3d8b9b 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.IntentFilter +import android.content.res.AssetManager import android.os.Build import android.util.Log import android.view.LayoutInflater @@ -37,6 +38,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.launch +import java.io.File +import java.io.FileOutputStream import java.util.Collections class MainViewModel(application: Application) : AndroidViewModel(application) { @@ -283,7 +286,6 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { for (it in deleteServer) { MmkvManager.removeServer(it) } - reloadServerList() getApplication().toast( getApplication().getString( R.string.title_del_duplicate_config_count, @@ -292,6 +294,32 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { ) } + fun copyAssets(assets: AssetManager) { + val extFolder = Utils.userAssetPath(getApplication()) + viewModelScope.launch(Dispatchers.Default) { + try { + val geo = arrayOf("geosite.dat", "geoip.dat") + assets.list("") + ?.filter { geo.contains(it) } + ?.filter { !File(extFolder, it).exists() } + ?.forEach { + val target = File(extFolder, it) + assets.open(it).use { input -> + FileOutputStream(target).use { output -> + input.copyTo(output) + } + } + Log.i( + ANG_PACKAGE, + "Copied from apk assets folder to ${target.absolutePath}" + ) + } + } catch (e: Exception) { + Log.e(ANG_PACKAGE, "asset copy failed", e) + } + } + } + private val mMsgReceiver = object : BroadcastReceiver() { override fun onReceive(ctx: Context?, intent: Intent?) { when (intent?.getIntExtra("key", 0)) {