From d212cda1e18d601db15c111a16df4824ff1c7496 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:47:49 +0800 Subject: [PATCH] You can delete the downloaded geo file, which will be restored to the built-in geo file. --- .../com/v2ray/ang/handler/SettingsManager.kt | 30 +++++++++++++++++++ .../kotlin/com/v2ray/ang/ui/MainActivity.kt | 2 +- .../com/v2ray/ang/ui/UserAssetActivity.kt | 27 +++++++++++++---- .../com/v2ray/ang/viewmodel/MainViewModel.kt | 29 ++---------------- 4 files changed, 56 insertions(+), 32 deletions(-) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt index 3c0bb5f1..29ebfb8e 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt @@ -1,8 +1,11 @@ package com.v2ray.ang.handler import android.content.Context +import android.content.res.AssetManager import android.text.TextUtils +import android.util.Log import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.AppConfig.GEOIP_PRIVATE import com.v2ray.ang.AppConfig.GEOSITE_PRIVATE import com.v2ray.ang.AppConfig.TAG_DIRECT @@ -14,6 +17,8 @@ import com.v2ray.ang.handler.MmkvManager.decodeServerList import com.v2ray.ang.util.JsonUtil import com.v2ray.ang.util.Utils import com.v2ray.ang.util.Utils.parseInt +import java.io.File +import java.io.FileOutputStream import java.util.Collections import kotlin.Int @@ -153,4 +158,29 @@ object SettingsManager { return parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_HTTP_PORT), AppConfig.PORT_HTTP.toInt()) } + fun initAssets(context: Context, assets: AssetManager) { + val extFolder = Utils.userAssetPath(context) + + 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) + } + + } } 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 9edcdc4a..8b38b368 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 @@ -173,7 +173,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } } mainViewModel.startListenBroadcast() - mainViewModel.copyAssets(assets) + mainViewModel.initAssets(assets) } private fun migrateLegacy() { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt index 8a4ab68d..b9d7ffd7 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt @@ -34,6 +34,7 @@ import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.util.Utils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.io.FileOutputStream import java.net.HttpURLConnection @@ -239,6 +240,15 @@ class UserAssetActivity : BaseActivity() { return list + assets } + fun initAssets() { + lifecycleScope.launch(Dispatchers.Default) { + SettingsManager.initAssets(this@UserAssetActivity, assets) + withContext(Dispatchers.Main) { + binding.recyclerView.adapter?.notifyDataSetChanged() + } + } + } + inner class UserAssetAdapter : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserAssetViewHolder { return UserAssetViewHolder( @@ -270,10 +280,10 @@ class UserAssetActivity : BaseActivity() { if (item.second.remarks in builtInGeoFiles && item.second.url == AppConfig.GeoUrl + item.second.remarks) { holder.itemUserAssetBinding.layoutEdit.visibility = GONE - holder.itemUserAssetBinding.layoutRemove.visibility = GONE + //holder.itemUserAssetBinding.layoutRemove.visibility = GONE } else { holder.itemUserAssetBinding.layoutEdit.visibility = item.second.url.let { if (it == "file") GONE else VISIBLE } - holder.itemUserAssetBinding.layoutRemove.visibility = VISIBLE + //holder.itemUserAssetBinding.layoutRemove.visibility = VISIBLE } holder.itemUserAssetBinding.layoutEdit.setOnClickListener { @@ -282,9 +292,16 @@ class UserAssetActivity : BaseActivity() { startActivity(intent) } holder.itemUserAssetBinding.layoutRemove.setOnClickListener { - file?.delete() - MmkvManager.removeAssetUrl(item.first) - binding.recyclerView.adapter?.notifyItemRemoved(position) + AlertDialog.Builder(this@UserAssetActivity).setMessage(R.string.del_config_comfirm) + .setPositiveButton(android.R.string.ok) { _, _ -> + file?.delete() + MmkvManager.removeAssetUrl(item.first) + initAssets() + } + .setNegativeButton(android.R.string.no) { _, _ -> + //do noting + } + .show() } } 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 aa6f3413..a62be1fa 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 @@ -22,16 +22,14 @@ import com.v2ray.ang.extension.toast import com.v2ray.ang.fmt.CustomFmt import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager +import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.util.MessageUtil import com.v2ray.ang.util.SpeedtestUtil -import com.v2ray.ang.util.Utils import kotlinx.coroutines.CoroutineScope 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) { @@ -320,30 +318,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { MmkvManager.encodeServerList(serverList) } - - fun copyAssets(assets: AssetManager) { - val extFolder = Utils.userAssetPath(getApplication()) + fun initAssets(assets: AssetManager) { 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) - } + SettingsManager.initAssets(getApplication(), assets) } }