diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt index cc7e2f73..2aa3b6c4 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt @@ -9,10 +9,8 @@ import android.os.Bundle import android.widget.Toast import com.v2ray.ang.AngApplication import es.dmoral.toasty.Toasty -import org.json.JSONObject import java.io.Serializable import java.net.URI -import java.net.URLConnection val Context.v2RayApplication: AngApplication? get() = applicationContext as? AngApplication @@ -71,25 +69,6 @@ fun Context.toastError(message: CharSequence) { Toasty.error(this, message, Toast.LENGTH_SHORT, true).show() } - -/** - * Puts a key-value pair into the JSONObject. - * - * @param pair The key-value pair to put. - */ -fun JSONObject.putOpt(pair: Pair) { - put(pair.first, pair.second) -} - -/** - * Puts multiple key-value pairs into the JSONObject. - * - * @param pairs The map of key-value pairs to put. - */ -fun JSONObject.putOpt(pairs: Map) { - pairs.forEach { put(it.key, it.value) } -} - const val THRESHOLD = 1000L const val DIVISOR = 1024.0 diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt index d97afd10..7825b30c 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt @@ -4,14 +4,13 @@ import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig.PREF_IS_BOOTED import com.v2ray.ang.AppConfig.PREF_ROUTING_RULESET import com.v2ray.ang.dto.AssetUrlItem -import com.v2ray.ang.dto.WebDavConfig import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.RulesetItem import com.v2ray.ang.dto.ServerAffiliationInfo import com.v2ray.ang.dto.SubscriptionItem +import com.v2ray.ang.dto.WebDavConfig import com.v2ray.ang.util.JsonUtil import com.v2ray.ang.util.Utils -import kotlin.collections.mutableListOf object MmkvManager { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt index 92141de5..bad38e6d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt @@ -223,7 +223,7 @@ object NotificationManager { */ private fun appendSpeedString(text: StringBuilder, name: String?, up: Double, down: Double) { var n = name ?: "no tag" - n = n.substring(0, min(n.length, 6)) + n = n.take(min(n.length, 6)) text.append(n) for (i in n.length..6 step 2) { text.append("\t") diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt index c1550c13..09656a70 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt @@ -338,12 +338,12 @@ object SettingsManager { Language.ENGLISH -> Locale.ENGLISH Language.CHINA -> Locale.CHINA Language.TRADITIONAL_CHINESE -> Locale.TRADITIONAL_CHINESE - Language.VIETNAMESE -> Locale("vi") - Language.RUSSIAN -> Locale("ru") - Language.PERSIAN -> Locale("fa") - Language.ARABIC -> Locale("ar") - Language.BANGLA -> Locale("bn") - Language.BAKHTIARI -> Locale("bqi", "IR") + Language.VIETNAMESE -> Locale.forLanguageTag("vi") + Language.RUSSIAN -> Locale.forLanguageTag("ru") + Language.PERSIAN -> Locale.forLanguageTag("fa") + Language.ARABIC -> Locale.forLanguageTag("ar") + Language.BANGLA -> Locale.forLanguageTag("bn") + Language.BAKHTIARI -> Locale.forLanguageTag("bqi-IR") } } @@ -387,7 +387,7 @@ object SettingsManager { ensureDefaultValue(AppConfig.PREF_VPN_DNS, AppConfig.DNS_VPN) ensureDefaultValue(AppConfig.PREF_VPN_MTU, AppConfig.VPN_MTU.toString()) ensureDefaultValue(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL, AppConfig.SUBSCRIPTION_DEFAULT_UPDATE_INTERVAL) - ensureDefaultValue(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS.toString()) + ensureDefaultValue(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS) ensureDefaultValue(AppConfig.PREF_REMOTE_DNS, AppConfig.DNS_PROXY) ensureDefaultValue(AppConfig.PREF_DOMESTIC_DNS, AppConfig.DNS_DIRECT) ensureDefaultValue(AppConfig.PREF_DELAY_TEST_URL, AppConfig.DELAY_TEST_URL) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt index 5948f1bd..760c7d72 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt @@ -2,7 +2,6 @@ package com.v2ray.ang.handler import android.content.Context import android.os.SystemClock -import android.text.TextUtils import android.util.Log import com.v2ray.ang.AppConfig import com.v2ray.ang.R @@ -57,31 +56,6 @@ object SpeedtestManager { } } - /** - * Measures the ping time to a given URL using the system ping command. - * - * @param url The URL to ping. - * @return The ping time in milliseconds as a string, or "-1ms" if the ping failed. - */ - fun ping(url: String): String { - try { - val command = "/system/bin/ping -c 3 $url" - val process = Runtime.getRuntime().exec(command) - val allText = process.inputStream.bufferedReader().use { it.readText() } - if (!TextUtils.isEmpty(allText)) { - val tempInfo = allText.substring(allText.indexOf("min/avg/max/mdev") + 19) - val temps = - tempInfo.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - if (temps.count() > 0 && temps[0].length < 10) { - return temps[0].toFloat().toInt().toString() + "ms" - } - } - } catch (e: Exception) { - Log.e(AppConfig.TAG, "Failed to ping URL: $url", e) - } - return "-1ms" - } - /** * Measures the time taken to establish a TCP connection to a given URL and port. * diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt index f70e427f..7c7d051b 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt @@ -4,7 +4,6 @@ import android.content.Context import android.text.TextUtils import android.util.Log import com.v2ray.ang.AppConfig -import com.v2ray.ang.R import com.v2ray.ang.dto.ConfigResult import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.NetworkType diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/WebDavManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/WebDavManager.kt index b71d42ee..1da3ab48 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/WebDavManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/WebDavManager.kt @@ -97,13 +97,7 @@ object WebDavManager { return@withContext false } - val body = resp.body - if (body == null) { - Log.e(AppConfig.TAG, "WebDAV download failed: $remoteRelativePath (empty response body)") - return@withContext false - } - - body.byteStream().use { input -> + resp.body.byteStream().use { input -> destFile.parentFile?.mkdirs() FileOutputStream(destFile).use { fos -> input.copyTo(fos) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt index 31737449..2e19d6dc 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt @@ -6,7 +6,6 @@ import android.appwidget.AppWidgetProvider import android.content.ComponentName import android.content.Context import android.content.Intent -import android.os.Build import android.widget.RemoteViews import com.v2ray.ang.AppConfig import com.v2ray.ang.R diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt index 28ba8be3..85fb1ffc 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt @@ -5,11 +5,9 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.graphics.drawable.Icon -import android.os.Build import android.service.quicksettings.Tile import android.service.quicksettings.TileService import android.util.Log -import androidx.annotation.RequiresApi import androidx.core.content.ContextCompat import com.v2ray.ang.AppConfig import com.v2ray.ang.R diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt index 602701bf..40bf9440 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt @@ -3,9 +3,7 @@ package com.v2ray.ang.service import android.app.Service import android.content.Context import android.content.Intent -import android.os.Build import android.os.IBinder -import androidx.annotation.RequiresApi import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.util.MyContextWrapper diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/BackupActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/BackupActivity.kt index e2c9b33f..703b3c78 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/BackupActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/BackupActivity.kt @@ -11,24 +11,24 @@ import android.util.Log import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.core.content.FileProvider +import androidx.lifecycle.lifecycleScope import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig import com.v2ray.ang.BuildConfig import com.v2ray.ang.R +import com.v2ray.ang.databinding.ActivityBackupBinding +import com.v2ray.ang.databinding.DialogWebdavBinding +import com.v2ray.ang.dto.WebDavConfig import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastError import com.v2ray.ang.extension.toastSuccess -import com.v2ray.ang.handler.WebDavManager import com.v2ray.ang.handler.MmkvManager -import com.v2ray.ang.dto.WebDavConfig -import androidx.lifecycle.lifecycleScope -import com.v2ray.ang.databinding.ActivityBackupBinding +import com.v2ray.ang.handler.SettingsChangeManager +import com.v2ray.ang.handler.WebDavManager +import com.v2ray.ang.util.ZipUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import com.v2ray.ang.databinding.DialogWebdavBinding -import com.v2ray.ang.handler.SettingsChangeManager -import com.v2ray.ang.util.ZipUtil import java.io.File import java.text.SimpleDateFormat import java.util.Locale diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt index 60dc5aea..676701f2 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.text.TextUtils import android.view.Menu import android.view.MenuItem +import android.widget.ArrayAdapter import androidx.appcompat.app.AlertDialog import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityServerGroupBinding @@ -11,7 +12,6 @@ import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastSuccess -import android.widget.ArrayAdapter import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.util.Utils diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index cdb418e8..47f57884 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -1,7 +1,6 @@ package com.v2ray.ang.ui import android.os.Bundle -import android.text.TextUtils import android.view.View import androidx.preference.CheckBoxPreference import androidx.preference.EditTextPreference diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt index 16c618f0..34352f05 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt @@ -4,9 +4,7 @@ import android.content.Context import android.content.ContextWrapper import android.content.res.Configuration import android.content.res.Resources -import android.os.Build import android.os.LocaleList -import androidx.annotation.RequiresApi import java.util.Locale open class MyContextWrapper(base: Context?) : ContextWrapper(base) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt index b909a078..9c310ef8 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -14,9 +14,9 @@ import androidx.lifecycle.viewModelScope import com.v2ray.ang.AngApplication import com.v2ray.ang.AppConfig import com.v2ray.ang.R +import com.v2ray.ang.dto.GroupMapItem import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.ServersCache -import com.v2ray.ang.dto.GroupMapItem import com.v2ray.ang.extension.serializable import com.v2ray.ang.extension.toastError import com.v2ray.ang.extension.toastSuccess diff --git a/V2rayNG/app/src/test/java/com/v2ray/ang/fmt/ShadowsocksFmtTest.kt b/V2rayNG/app/src/test/java/com/v2ray/ang/fmt/ShadowsocksFmtTest.kt index 85def8ff..21c3328c 100644 --- a/V2rayNG/app/src/test/java/com/v2ray/ang/fmt/ShadowsocksFmtTest.kt +++ b/V2rayNG/app/src/test/java/com/v2ray/ang/fmt/ShadowsocksFmtTest.kt @@ -4,13 +4,13 @@ import android.util.Base64 import android.util.Log import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.ProfileItem +import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Before -import org.junit.After import org.junit.Test import org.mockito.MockedStatic import org.mockito.Mockito