Code clean
This commit is contained in:
1 parent
490a07d75b
commit
389e55d72a
49 files changed
+140
-229
No files matched your search
@@ -6,8 +6,8 @@ import androidx.work.Configuration
|
|||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
import com.tencent.mmkv.MMKV
|
import com.tencent.mmkv.MMKV
|
||||||
import com.v2ray.ang.AppConfig.ANG_PACKAGE
|
import com.v2ray.ang.AppConfig.ANG_PACKAGE
|
||||||
import com.v2ray.ang.ui.compose.ThemeManager
|
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
|
import com.v2ray.ang.ui.compose.ThemeManager
|
||||||
|
|
||||||
class AngApplication : Application() {
|
class AngApplication : Application() {
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -378,8 +378,8 @@ object CoreConfigManager {
|
|||||||
val fallbackTag = if (strategyType.supportsObservatory && resolvedOutbound.profile.policyGroupTestOutbounds != false) {
|
val fallbackTag = if (strategyType.supportsObservatory && resolvedOutbound.profile.policyGroupTestOutbounds != false) {
|
||||||
resolvedOutbound.profile.policyGroupFallbackTag
|
resolvedOutbound.profile.policyGroupFallbackTag
|
||||||
?.takeIf { it.isNotEmpty() && it != AppConfig.TAG_PROXY }
|
?.takeIf { it.isNotEmpty() && it != AppConfig.TAG_PROXY }
|
||||||
// Xray excludes dead random/roundRobin candidates only when fallbackTag is set;
|
// Xray excludes dead random/roundRobin candidates only when fallbackTag is set;
|
||||||
// without this default, an enabled empty field creates no observatory.
|
// without this default, an enabled empty field creates no observatory.
|
||||||
?: membersToAdd.first().tag
|
?: membersToAdd.first().tag
|
||||||
} else null
|
} else null
|
||||||
val strategy = buildBalancerStrategy(
|
val strategy = buildBalancerStrategy(
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import android.system.OsConstants
|
|||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.contracts.IDialerService
|
||||||
import com.v2ray.ang.contracts.ServiceControl
|
import com.v2ray.ang.contracts.ServiceControl
|
||||||
import com.v2ray.ang.dto.OutboundTrafficStat
|
import com.v2ray.ang.dto.OutboundTrafficStat
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
@@ -21,11 +22,10 @@ import com.v2ray.ang.handler.MmkvManager
|
|||||||
import com.v2ray.ang.handler.NotificationManager
|
import com.v2ray.ang.handler.NotificationManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.handler.SpeedtestManager
|
import com.v2ray.ang.handler.SpeedtestManager
|
||||||
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
import com.v2ray.ang.service.DialerNativeService
|
import com.v2ray.ang.service.DialerNativeService
|
||||||
import com.v2ray.ang.service.DialerWebviewService
|
import com.v2ray.ang.service.DialerWebviewService
|
||||||
import com.v2ray.ang.contracts.IDialerService
|
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import com.v2ray.ang.extension.toast
|
|||||||
import com.v2ray.ang.extension.toastError
|
import com.v2ray.ang.extension.toastError
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
import com.v2ray.ang.root.RootManager
|
import com.v2ray.ang.root.RootManager
|
||||||
import com.v2ray.ang.service.CoreProxyOnlyService
|
import com.v2ray.ang.service.CoreProxyOnlyService
|
||||||
import com.v2ray.ang.service.CoreRootService
|
import com.v2ray.ang.service.CoreRootService
|
||||||
import com.v2ray.ang.service.CoreVpnService
|
import com.v2ray.ang.service.CoreVpnService
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
object LauncherManager {
|
object LauncherManager {
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ data class TestServiceMessage(
|
|||||||
val key: Int,
|
val key: Int,
|
||||||
val subscriptionId: String = "",
|
val subscriptionId: String = "",
|
||||||
val serverGuids: List<String> = emptyList(),
|
val serverGuids: List<String> = emptyList(),
|
||||||
val onlyTcp : Boolean = false
|
val onlyTcp: Boolean = false
|
||||||
) : Serializable
|
) : Serializable
|
||||||
|
|
||||||
@@ -13,8 +13,8 @@ import androidx.work.workDataOf
|
|||||||
import com.v2ray.ang.AngApplication
|
import com.v2ray.ang.AngApplication
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.dto.SubscriptionUpdateMessage
|
import com.v2ray.ang.dto.SubscriptionUpdateMessage
|
||||||
import com.v2ray.ang.util.LogUtil
|
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
|
import com.v2ray.ang.util.LogUtil
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
object SubscriptionUpdater {
|
object SubscriptionUpdater {
|
||||||
@@ -45,12 +45,12 @@ object SubscriptionUpdater {
|
|||||||
MmkvManager.decodeSubscriptions()
|
MmkvManager.decodeSubscriptions()
|
||||||
.filter { it.subscription.autoUpdate && it.subscription.url.isNotEmpty() }
|
.filter { it.subscription.autoUpdate && it.subscription.url.isNotEmpty() }
|
||||||
.forEach { sub ->
|
.forEach { sub ->
|
||||||
scheduleOne(
|
scheduleOne(
|
||||||
context = context,
|
context = context,
|
||||||
subId = sub.guid,
|
subId = sub.guid,
|
||||||
existingWorkPolicy = existingWorkPolicy
|
existingWorkPolicy = existingWorkPolicy
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
LogUtil.i(
|
LogUtil.i(
|
||||||
AppConfig.TAG,
|
AppConfig.TAG,
|
||||||
"SubscriptionUpdater: sync complete forceReschedule=$forceReschedule"
|
"SubscriptionUpdater: sync complete forceReschedule=$forceReschedule"
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class BootReceiver : BroadcastReceiver() {
|
|||||||
Intent.ACTION_MY_PACKAGE_REPLACED -> {
|
Intent.ACTION_MY_PACKAGE_REPLACED -> {
|
||||||
// Continue
|
// Continue
|
||||||
}
|
}
|
||||||
|
|
||||||
Intent.ACTION_LOCKED_BOOT_COMPLETED -> {
|
Intent.ACTION_LOCKED_BOOT_COMPLETED -> {
|
||||||
val userManager = context.getSystemService(Context.USER_SERVICE) as? UserManager
|
val userManager = context.getSystemService(Context.USER_SERVICE) as? UserManager
|
||||||
if (userManager != null && !userManager.isUserUnlocked) {
|
if (userManager != null && !userManager.isUserUnlocked) {
|
||||||
@@ -37,6 +38,7 @@ class BootReceiver : BroadcastReceiver() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
LogUtil.w(AppConfig.TAG, "BootReceiver: Unhandled action: $action")
|
LogUtil.w(AppConfig.TAG, "BootReceiver: Unhandled action: $action")
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ import com.v2ray.ang.dto.TestServiceMessage
|
|||||||
import com.v2ray.ang.enums.NotificationChannelType
|
import com.v2ray.ang.enums.NotificationChannelType
|
||||||
import com.v2ray.ang.extension.serializable
|
import com.v2ray.ang.extension.serializable
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.util.LogUtil
|
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
import com.v2ray.ang.helper.NotificationHelper
|
import com.v2ray.ang.helper.NotificationHelper
|
||||||
|
import com.v2ray.ang.util.LogUtil
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
|
|
||||||
class CoreTestService : Service() {
|
class CoreTestService : Service() {
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ import com.v2ray.ang.AppConfig
|
|||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.core.CoreServiceManager
|
import com.v2ray.ang.core.CoreServiceManager
|
||||||
import com.v2ray.ang.core.LauncherManager
|
import com.v2ray.ang.core.LauncherManager
|
||||||
import com.v2ray.ang.util.LogUtil
|
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import java.lang.ref.SoftReference
|
import java.lang.ref.SoftReference
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger
|
|||||||
class RealPingWorkerService(
|
class RealPingWorkerService(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val guids: List<String>,
|
private val guids: List<String>,
|
||||||
private val onlyTcp : Boolean = false,
|
private val onlyTcp: Boolean = false,
|
||||||
private val onEvent: (RealPingEvent) -> Unit = {}
|
private val onEvent: (RealPingEvent) -> Unit = {}
|
||||||
) {
|
) {
|
||||||
private val job = SupervisorJob()
|
private val job = SupervisorJob()
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ import com.v2ray.ang.enums.NotificationChannelType
|
|||||||
import com.v2ray.ang.extension.serializable
|
import com.v2ray.ang.extension.serializable
|
||||||
import com.v2ray.ang.handler.AngConfigManager
|
import com.v2ray.ang.handler.AngConfigManager
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.util.LogUtil
|
|
||||||
import com.v2ray.ang.helper.NotificationHelper
|
import com.v2ray.ang.helper.NotificationHelper
|
||||||
|
import com.v2ray.ang.util.LogUtil
|
||||||
import kotlinx.coroutines.CompletableDeferred
|
import kotlinx.coroutines.CompletableDeferred
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -109,7 +109,7 @@ class SubscriptionUpdateService : Service() {
|
|||||||
|
|
||||||
private suspend fun updateSingle(subId: String, forcedUpdate: Boolean) {
|
private suspend fun updateSingle(subId: String, forcedUpdate: Boolean) {
|
||||||
val subItem = MmkvManager.decodeSubscription(subId) ?: return
|
val subItem = MmkvManager.decodeSubscription(subId) ?: return
|
||||||
if(!subItem.enabled || subItem.url.isEmpty()){
|
if (!subItem.enabled || subItem.url.isEmpty()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ import androidx.compose.ui.viewinterop.AndroidView
|
|||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.BuildConfig
|
import com.v2ray.ang.BuildConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.core.CoreNativeManager
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.SettingsMenuItem
|
import com.v2ray.ang.ui.compose.SettingsMenuItem
|
||||||
import com.v2ray.ang.ui.compose.VersionInfoBlock
|
import com.v2ray.ang.ui.compose.VersionInfoBlock
|
||||||
import com.v2ray.ang.core.CoreNativeManager
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
class AboutActivity : BaseComponentActivity() {
|
class AboutActivity : BaseComponentActivity() {
|
||||||
|
|||||||
@@ -63,10 +63,10 @@ import com.google.zxing.PlanarYUVLuminanceSource
|
|||||||
import com.google.zxing.common.HybridBinarizer
|
import com.google.zxing.common.HybridBinarizer
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.enums.PermissionType
|
import com.v2ray.ang.enums.PermissionType
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.util.QRCodeDecoder
|
import com.v2ray.ang.util.QRCodeDecoder
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ import androidx.compose.ui.res.painterResource
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.dto.AppInfo
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppListItem
|
import com.v2ray.ang.ui.compose.AppListItem
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.dto.AppInfo
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
|
|
||||||
class AppPickerActivity : BaseComponentActivity() {
|
class AppPickerActivity : BaseComponentActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -31,16 +31,16 @@ import androidx.lifecycle.repeatOnLifecycle
|
|||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.BuildConfig
|
import com.v2ray.ang.BuildConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.InputDialog
|
|
||||||
import com.v2ray.ang.ui.compose.InputField
|
|
||||||
import com.v2ray.ang.ui.compose.SelectListDialog
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsMenuItem
|
|
||||||
import com.v2ray.ang.dto.entities.WebDavConfig
|
import com.v2ray.ang.dto.entities.WebDavConfig
|
||||||
import com.v2ray.ang.extension.toastError
|
import com.v2ray.ang.extension.toastError
|
||||||
import com.v2ray.ang.extension.toastSuccess
|
import com.v2ray.ang.extension.toastSuccess
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.InputDialog
|
||||||
|
import com.v2ray.ang.ui.compose.InputField
|
||||||
|
import com.v2ray.ang.ui.compose.SelectListDialog
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsMenuItem
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import androidx.activity.ComponentActivity
|
|||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.activity.enableEdgeToEdge
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import com.v2ray.ang.ui.compose.AppTheme
|
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
|
import com.v2ray.ang.ui.compose.AppTheme
|
||||||
import com.v2ray.ang.util.MyContextWrapper
|
import com.v2ray.ang.util.MyContextWrapper
|
||||||
|
|
||||||
abstract class BaseComponentActivity : ComponentActivity() {
|
abstract class BaseComponentActivity : ComponentActivity() {
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.v2ray.ang.BuildConfig
|
import com.v2ray.ang.BuildConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.core.CoreNativeManager
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.SettingsMenuItem
|
import com.v2ray.ang.ui.compose.SettingsMenuItem
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
import com.v2ray.ang.ui.compose.VersionInfoBlock
|
import com.v2ray.ang.ui.compose.VersionInfoBlock
|
||||||
import com.v2ray.ang.core.CoreNativeManager
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
class CheckUpdateActivity : BaseComponentActivity() {
|
class CheckUpdateActivity : BaseComponentActivity() {
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ class AppSnackbarController(
|
|||||||
|
|
||||||
fun show(message: CharSequence, type: ToastType = ToastType.NORMAL, long: Boolean = false) {
|
fun show(message: CharSequence, type: ToastType = ToastType.NORMAL, long: Boolean = false) {
|
||||||
val id = ++currentId
|
val id = ++currentId
|
||||||
scope.launch {
|
scope.launch {
|
||||||
if (currentShowTime != 0L) {
|
if (currentShowTime != 0L) {
|
||||||
val elapsed = System.currentTimeMillis() - currentShowTime
|
val elapsed = System.currentTimeMillis() - currentShowTime
|
||||||
if (elapsed < SnackbarThrottleMs) {
|
if (elapsed < SnackbarThrottleMs) {
|
||||||
@@ -92,7 +92,7 @@ class AppSnackbarController(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hostState.currentSnackbarData?.dismiss()
|
hostState.currentSnackbarData?.dismiss()
|
||||||
|
|
||||||
launch {
|
launch {
|
||||||
hostState.showSnackbar(
|
hostState.showSnackbar(
|
||||||
@@ -108,8 +108,8 @@ class AppSnackbarController(
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentShowTime = System.currentTimeMillis()
|
currentShowTime = System.currentTimeMillis()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class AppSnackbarVisuals(
|
private data class AppSnackbarVisuals(
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ import androidx.core.content.FileProvider
|
|||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.extension.toast
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.v2ray.ang.ui.compose.colorFabActive
|
|
||||||
import com.v2ray.ang.dto.GroupMapItem
|
import com.v2ray.ang.dto.GroupMapItem
|
||||||
import com.v2ray.ang.dto.entities.ServersCache
|
import com.v2ray.ang.dto.entities.ServersCache
|
||||||
|
import com.v2ray.ang.ui.compose.colorFabActive
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import androidx.compose.material3.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.SelectListDialog
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.isComplexType
|
import com.v2ray.ang.extension.isComplexType
|
||||||
|
import com.v2ray.ang.ui.compose.SelectListDialog
|
||||||
|
|
||||||
internal enum class ServerMenuAction(
|
internal enum class ServerMenuAction(
|
||||||
@StringRes val labelRes: Int,
|
@StringRes val labelRes: Int,
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ import com.v2ray.ang.handler.AngConfigManager
|
|||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.handler.SubscriptionUpdater
|
import com.v2ray.ang.handler.SubscriptionUpdater
|
||||||
import com.v2ray.ang.util.LogUtil
|
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import kotlinx.coroutines.channels.BufferOverflow
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.platform.LocalLayoutDirection
|
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.ui.compose.LocalDarkTheme
|
import com.v2ray.ang.ui.compose.LocalDarkTheme
|
||||||
import com.v2ray.ang.ui.compose.QRCodeDialog
|
import com.v2ray.ang.ui.compose.QRCodeDialog
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
|
import com.v2ray.ang.dto.entities.ServersCache
|
||||||
|
import com.v2ray.ang.extension.isComplexType
|
||||||
|
import com.v2ray.ang.extension.nullIfBlank
|
||||||
|
import com.v2ray.ang.handler.AngConfigManager
|
||||||
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
import com.v2ray.ang.ui.compose.ReorderableGridItem
|
import com.v2ray.ang.ui.compose.ReorderableGridItem
|
||||||
import com.v2ray.ang.ui.compose.ReorderableListItem
|
import com.v2ray.ang.ui.compose.ReorderableListItem
|
||||||
@@ -50,12 +56,6 @@ import com.v2ray.ang.ui.compose.colorConfigType
|
|||||||
import com.v2ray.ang.ui.compose.colorPing
|
import com.v2ray.ang.ui.compose.colorPing
|
||||||
import com.v2ray.ang.ui.compose.colorPingRed
|
import com.v2ray.ang.ui.compose.colorPingRed
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
|
||||||
import com.v2ray.ang.dto.entities.ServersCache
|
|
||||||
import com.v2ray.ang.extension.isComplexType
|
|
||||||
import com.v2ray.ang.extension.nullIfBlank
|
|
||||||
import com.v2ray.ang.handler.AngConfigManager
|
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
|
||||||
import sh.calvin.reorderable.ReorderableItem
|
import sh.calvin.reorderable.ReorderableItem
|
||||||
import sh.calvin.reorderable.rememberReorderableLazyGridState
|
import sh.calvin.reorderable.rememberReorderableLazyGridState
|
||||||
import sh.calvin.reorderable.rememberReorderableLazyListState
|
import sh.calvin.reorderable.rememberReorderableLazyListState
|
||||||
|
|||||||
@@ -672,7 +672,7 @@ class MainViewModel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testAllRealPing(onlyTcp : Boolean = false) {
|
fun testAllRealPing(onlyTcp: Boolean = false) {
|
||||||
dataSource.cancelAllPing()
|
dataSource.cancelAllPing()
|
||||||
val groupId = uiState.value.selectedGroupId
|
val groupId = uiState.value.selectedGroupId
|
||||||
val servers = currentServers()
|
val servers = currentServers()
|
||||||
|
|||||||
@@ -41,16 +41,16 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.dto.AppInfo
|
||||||
|
import com.v2ray.ang.extension.toastInfo
|
||||||
|
import com.v2ray.ang.extension.toastSuccess
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppDivider
|
import com.v2ray.ang.ui.compose.AppDivider
|
||||||
import com.v2ray.ang.ui.compose.AppListItem
|
import com.v2ray.ang.ui.compose.AppListItem
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
import com.v2ray.ang.ui.compose.colorFabActive
|
import com.v2ray.ang.ui.compose.colorFabActive
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.dto.AppInfo
|
|
||||||
import com.v2ray.ang.extension.toastInfo
|
|
||||||
import com.v2ray.ang.extension.toastSuccess
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
class PerAppProxyActivity : BaseComponentActivity() {
|
class PerAppProxyActivity : BaseComponentActivity() {
|
||||||
|
|||||||
@@ -34,12 +34,6 @@ import androidx.lifecycle.lifecycleScope
|
|||||||
import com.v2ray.ang.AppConfig.BUILTIN_OUTBOUND_TAGS
|
import com.v2ray.ang.AppConfig.BUILTIN_OUTBOUND_TAGS
|
||||||
import com.v2ray.ang.AppConfig.TAG_PROXY
|
import com.v2ray.ang.AppConfig.TAG_PROXY
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.RulesetItem
|
import com.v2ray.ang.dto.entities.RulesetItem
|
||||||
import com.v2ray.ang.extension.nullIfBlank
|
import com.v2ray.ang.extension.nullIfBlank
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
@@ -47,6 +41,12 @@ import com.v2ray.ang.extension.toastSuccess
|
|||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.ui.apppicker.AppPickerActivity
|
import com.v2ray.ang.ui.apppicker.AppPickerActivity
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.dto.entities.RulesetItem
|
||||||
|
import com.v2ray.ang.extension.toastError
|
||||||
|
import com.v2ray.ang.extension.toastSuccess
|
||||||
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
|
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
import com.v2ray.ang.ui.compose.ReorderableListItem
|
import com.v2ray.ang.ui.compose.ReorderableListItem
|
||||||
@@ -53,12 +59,6 @@ import com.v2ray.ang.ui.compose.SettingsListItem
|
|||||||
import com.v2ray.ang.ui.compose.colorConfigType
|
import com.v2ray.ang.ui.compose.colorConfigType
|
||||||
import com.v2ray.ang.ui.compose.colorFabActive
|
import com.v2ray.ang.ui.compose.colorFabActive
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.dto.entities.RulesetItem
|
|
||||||
import com.v2ray.ang.extension.toastError
|
|
||||||
import com.v2ray.ang.extension.toastSuccess
|
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
|
||||||
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.JsonUtil
|
import com.v2ray.ang.util.JsonUtil
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
|||||||
@@ -32,12 +32,6 @@ import androidx.compose.ui.unit.dp
|
|||||||
import com.v2ray.ang.AppConfig.REALITY
|
import com.v2ray.ang.AppConfig.REALITY
|
||||||
import com.v2ray.ang.AppConfig.TLS
|
import com.v2ray.ang.AppConfig.TLS
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.enums.NetworkType
|
import com.v2ray.ang.enums.NetworkType
|
||||||
@@ -47,6 +41,12 @@ import com.v2ray.ang.handler.AngConfigManager
|
|||||||
import com.v2ray.ang.handler.CertificateFingerprintManager
|
import com.v2ray.ang.handler.CertificateFingerprintManager
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.util.JsonUtil
|
import com.v2ray.ang.util.JsonUtil
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|||||||
@@ -34,12 +34,6 @@ import com.v2ray.ang.AppConfig.TLS
|
|||||||
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V4
|
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V4
|
||||||
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_MTU
|
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_MTU
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.enums.NetworkType
|
import com.v2ray.ang.enums.NetworkType
|
||||||
@@ -50,6 +44,12 @@ import com.v2ray.ang.handler.AngConfigManager
|
|||||||
import com.v2ray.ang.handler.CertificateFingerprintManager
|
import com.v2ray.ang.handler.CertificateFingerprintManager
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.util.JsonUtil
|
import com.v2ray.ang.util.JsonUtil
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -255,7 +255,7 @@ fun ServerScreen(
|
|||||||
var finalMask by rememberSaveable { mutableStateOf(initialConfig.finalMask ?: "") }
|
var finalMask by rememberSaveable { mutableStateOf(initialConfig.finalMask ?: "") }
|
||||||
var kcpMtu by rememberSaveable { mutableStateOf(initialConfig.kcpMtu?.toString() ?: "") }
|
var kcpMtu by rememberSaveable { mutableStateOf(initialConfig.kcpMtu?.toString() ?: "") }
|
||||||
var kcpTti by rememberSaveable { mutableStateOf(initialConfig.kcpTti?.toString() ?: "") }
|
var kcpTti by rememberSaveable { mutableStateOf(initialConfig.kcpTti?.toString() ?: "") }
|
||||||
var browserDialerMode by rememberSaveable { mutableStateOf(initialConfig.browserDialerMode?: "") }
|
var browserDialerMode by rememberSaveable { mutableStateOf(initialConfig.browserDialerMode ?: "") }
|
||||||
var streamSecurity by rememberSaveable { mutableStateOf(initialConfig.security ?: "") }
|
var streamSecurity by rememberSaveable { mutableStateOf(initialConfig.security ?: "") }
|
||||||
var sni by rememberSaveable { mutableStateOf(initialConfig.sni ?: "") }
|
var sni by rememberSaveable { mutableStateOf(initialConfig.sni ?: "") }
|
||||||
var allowInsecure by rememberSaveable { mutableStateOf(initialConfig.insecure == true) }
|
var allowInsecure by rememberSaveable { mutableStateOf(initialConfig.insecure == true) }
|
||||||
|
|||||||
@@ -55,11 +55,6 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.horizontalScrollbar
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
@@ -68,6 +63,11 @@ import com.v2ray.ang.fmt.CustomFmt
|
|||||||
import com.v2ray.ang.handler.AngConfigManager
|
import com.v2ray.ang.handler.AngConfigManager
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.horizontalScrollbar
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,6 @@ import androidx.compose.ui.unit.dp
|
|||||||
import com.v2ray.ang.AppConfig.BUILTIN_OUTBOUND_TAGS
|
import com.v2ray.ang.AppConfig.BUILTIN_OUTBOUND_TAGS
|
||||||
import com.v2ray.ang.AppConfig.TAG_PROXY
|
import com.v2ray.ang.AppConfig.TAG_PROXY
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.BalancerStrategyType
|
import com.v2ray.ang.enums.BalancerStrategyType
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
@@ -40,6 +35,11 @@ import com.v2ray.ang.extension.toastSuccess
|
|||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
|
|
||||||
class ServerGroupActivity : BaseComponentActivity() {
|
class ServerGroupActivity : BaseComponentActivity() {
|
||||||
|
|
||||||
@@ -67,10 +67,10 @@ class ServerGroupActivity : BaseComponentActivity() {
|
|||||||
val config = MmkvManager.decodeServerConfig(editGuid)
|
val config = MmkvManager.decodeServerConfig(editGuid)
|
||||||
populateSubscriptionSpinner()
|
populateSubscriptionSpinner()
|
||||||
fallbackSuggestions = (
|
fallbackSuggestions = (
|
||||||
BUILTIN_OUTBOUND_TAGS + SettingsManager.getProfileRemarks(
|
BUILTIN_OUTBOUND_TAGS + SettingsManager.getProfileRemarks(
|
||||||
excludeConfigTypes = setOf(EConfigType.CUSTOM, EConfigType.POLICYGROUP)
|
excludeConfigTypes = setOf(EConfigType.CUSTOM, EConfigType.POLICYGROUP)
|
||||||
)
|
)
|
||||||
).filter { it != TAG_PROXY }
|
).filter { it != TAG_PROXY }
|
||||||
|
|
||||||
initialRemarks = config?.remarks ?: ""
|
initialRemarks = config?.remarks ?: ""
|
||||||
initialFilter = config?.policyGroupFilter ?: ""
|
initialFilter = config?.policyGroupFilter ?: ""
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import androidx.compose.runtime.rememberCoroutineScope
|
|||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerHttpActivity : BaseServerActivity() {
|
class ServerHttpActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
|
|
||||||
class ServerHysteria2Activity : BaseServerActivity() {
|
class ServerHysteria2Activity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -35,12 +35,6 @@ import androidx.compose.ui.res.painterResource
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.reorderableDragHandle
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.isComplexType
|
import com.v2ray.ang.extension.isComplexType
|
||||||
@@ -50,9 +44,15 @@ import com.v2ray.ang.extension.toastSuccess
|
|||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import java.util.UUID
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.reorderableDragHandle
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import sh.calvin.reorderable.ReorderableItem
|
import sh.calvin.reorderable.ReorderableItem
|
||||||
import sh.calvin.reorderable.rememberReorderableLazyListState
|
import sh.calvin.reorderable.rememberReorderableLazyListState
|
||||||
|
import java.util.UUID
|
||||||
|
|
||||||
class ServerProxyChainActivity : BaseComponentActivity() {
|
class ServerProxyChainActivity : BaseComponentActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
|||||||
import androidx.compose.ui.res.stringArrayResource
|
import androidx.compose.ui.res.stringArrayResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerShadowsocksActivity : BaseServerActivity() {
|
class ServerShadowsocksActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import androidx.compose.runtime.rememberCoroutineScope
|
|||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerSocksActivity : BaseServerActivity() {
|
class ServerSocksActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import androidx.compose.runtime.rememberCoroutineScope
|
|||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerTrojanActivity : BaseServerActivity() {
|
class ServerTrojanActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
|||||||
import androidx.compose.ui.res.stringArrayResource
|
import androidx.compose.ui.res.stringArrayResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerVlessActivity : BaseServerActivity() {
|
class ServerVlessActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
|||||||
import androidx.compose.ui.res.stringArrayResource
|
import androidx.compose.ui.res.stringArrayResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.dto.entities.ProfileItem
|
import com.v2ray.ang.dto.entities.ProfileItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerVmessActivity : BaseServerActivity() {
|
class ServerVmessActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.input.KeyboardType
|
import androidx.compose.ui.text.input.KeyboardType
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
|
||||||
class ServerWireguardActivity : BaseServerActivity() {
|
class ServerWireguardActivity : BaseServerActivity() {
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.AppConfig.VPN
|
import com.v2ray.ang.AppConfig.VPN
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.handler.MmkvManager.rememberMmkvBool
|
||||||
|
import com.v2ray.ang.handler.MmkvManager.rememberMmkvString
|
||||||
|
import com.v2ray.ang.handler.SettingsChangeManager
|
||||||
|
import com.v2ray.ang.root.RootManager
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.CollapsiblePreferenceGroupHeader
|
import com.v2ray.ang.ui.compose.CollapsiblePreferenceGroupHeader
|
||||||
import com.v2ray.ang.ui.compose.SettingsEditItem
|
import com.v2ray.ang.ui.compose.SettingsEditItem
|
||||||
@@ -33,11 +38,6 @@ import com.v2ray.ang.ui.compose.SettingsMenuItem
|
|||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
import com.v2ray.ang.ui.compose.ThemeManager
|
import com.v2ray.ang.ui.compose.ThemeManager
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.handler.MmkvManager.rememberMmkvBool
|
|
||||||
import com.v2ray.ang.handler.MmkvManager.rememberMmkvString
|
|
||||||
import com.v2ray.ang.handler.SettingsChangeManager
|
|
||||||
import com.v2ray.ang.root.RootManager
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
class SettingsActivity : BaseComponentActivity() {
|
class SettingsActivity : BaseComponentActivity() {
|
||||||
|
|||||||
@@ -31,11 +31,11 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
|
|
||||||
class TaskerActivity : BaseComponentActivity() {
|
class TaskerActivity : BaseComponentActivity() {
|
||||||
|
|||||||
@@ -26,12 +26,6 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormDropdownField
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.SubscriptionItem
|
import com.v2ray.ang.dto.entities.SubscriptionItem
|
||||||
import com.v2ray.ang.enums.EConfigType
|
import com.v2ray.ang.enums.EConfigType
|
||||||
import com.v2ray.ang.extension.toLongEx
|
import com.v2ray.ang.extension.toLongEx
|
||||||
@@ -42,6 +36,12 @@ import com.v2ray.ang.handler.SettingsChangeManager
|
|||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.handler.SubscriptionUpdater
|
import com.v2ray.ang.handler.SubscriptionUpdater
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormDropdownField
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|||||||
@@ -40,6 +40,10 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
|
import com.v2ray.ang.handler.MmkvManager.rememberMmkvBool
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
@@ -49,10 +53,6 @@ import com.v2ray.ang.ui.compose.SelectListDialog
|
|||||||
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
import com.v2ray.ang.ui.compose.SettingsSwitchItem
|
||||||
import com.v2ray.ang.ui.compose.colorFabActive
|
import com.v2ray.ang.ui.compose.colorFabActive
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.extension.toast
|
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
|
||||||
import com.v2ray.ang.handler.MmkvManager.rememberMmkvBool
|
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
|
||||||
import com.v2ray.ang.util.QRCodeDecoder
|
import com.v2ray.ang.util.QRCodeDecoder
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import sh.calvin.reorderable.ReorderableItem
|
import sh.calvin.reorderable.ReorderableItem
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import com.v2ray.ang.extension.moveItem
|
|||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsChangeManager
|
import com.v2ray.ang.handler.SettingsChangeManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.ui.base.BaseViewModel
|
|
||||||
import com.v2ray.ang.helper.MessageHelper
|
import com.v2ray.ang.helper.MessageHelper
|
||||||
|
import com.v2ray.ang.ui.base.BaseViewModel
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
|||||||
@@ -45,11 +45,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.ItemDivider
|
|
||||||
import com.v2ray.ang.ui.compose.SettingsListItem
|
|
||||||
import com.v2ray.ang.ui.compose.verticalScrollbar
|
|
||||||
import com.v2ray.ang.dto.entities.AssetUrlCache
|
import com.v2ray.ang.dto.entities.AssetUrlCache
|
||||||
import com.v2ray.ang.dto.entities.AssetUrlItem
|
import com.v2ray.ang.dto.entities.AssetUrlItem
|
||||||
import com.v2ray.ang.extension.toTrafficString
|
import com.v2ray.ang.extension.toTrafficString
|
||||||
@@ -59,6 +54,11 @@ import com.v2ray.ang.extension.toastSuccess
|
|||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.ItemDivider
|
||||||
|
import com.v2ray.ang.ui.compose.SettingsListItem
|
||||||
|
import com.v2ray.ang.ui.compose.verticalScrollbar
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.ui.compose.AppTopBar
|
|
||||||
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
|
||||||
import com.v2ray.ang.ui.compose.FormTextField
|
|
||||||
import com.v2ray.ang.dto.entities.AssetUrlItem
|
import com.v2ray.ang.dto.entities.AssetUrlItem
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
import com.v2ray.ang.extension.toastSuccess
|
import com.v2ray.ang.extension.toastSuccess
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.ui.base.BaseComponentActivity
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.DeleteConfirmDialog
|
||||||
|
import com.v2ray.ang.ui.compose.FormTextField
|
||||||
import com.v2ray.ang.util.LogUtil
|
import com.v2ray.ang.util.LogUtil
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@@ -4,12 +4,9 @@ import android.content.ClipData
|
|||||||
import android.content.ClipboardManager
|
import android.content.ClipboardManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.res.Configuration.UI_MODE_NIGHT_MASK
|
|
||||||
import android.content.res.Configuration.UI_MODE_NIGHT_NO
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.LocaleList
|
import android.os.LocaleList
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import android.text.Editable
|
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.util.Patterns
|
import android.util.Patterns
|
||||||
import android.webkit.URLUtil
|
import android.webkit.URLUtil
|
||||||
@@ -35,27 +32,6 @@ object Utils {
|
|||||||
Regex("^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$")
|
Regex("^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$")
|
||||||
private val IPV6_REGEX = Regex("^((?:[0-9A-Fa-f]{1,4}))?((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))?((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7}$")
|
private val IPV6_REGEX = Regex("^((?:[0-9A-Fa-f]{1,4}))?((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))?((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7}$")
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert string to editable for Kotlin.
|
|
||||||
*
|
|
||||||
* @param text The string to convert.
|
|
||||||
* @return An Editable instance containing the text.
|
|
||||||
*/
|
|
||||||
fun getEditable(text: String?): Editable {
|
|
||||||
return Editable.Factory.getInstance().newEditable(text.orEmpty())
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the position of a value in an array.
|
|
||||||
*
|
|
||||||
* @param array The array to search.
|
|
||||||
* @param value The value to find.
|
|
||||||
* @return The index of the value in the array, or -1 if not found.
|
|
||||||
*/
|
|
||||||
fun arrayFind(array: Array<out String>, value: String): Int {
|
|
||||||
return array.indexOf(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a string to an integer with a default value.
|
* Parse a string to an integer with a default value.
|
||||||
*
|
*
|
||||||
@@ -115,7 +91,7 @@ object Utils {
|
|||||||
* @param text The base64 encoded string.
|
* @param text The base64 encoded string.
|
||||||
* @return The decoded string, or null if decoding fails.
|
* @return The decoded string, or null if decoding fails.
|
||||||
*/
|
*/
|
||||||
fun tryDecodeBase64(text: String?): String? {
|
private fun tryDecodeBase64(text: String?): String? {
|
||||||
if (text.isNullOrEmpty()) return null
|
if (text.isNullOrEmpty()) return null
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -304,36 +280,6 @@ object Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode a URL-encoded string.
|
|
||||||
*
|
|
||||||
* @param url The URL-encoded string.
|
|
||||||
* @return The decoded string, or the original string if decoding fails.
|
|
||||||
*/
|
|
||||||
fun urlDecode(url: String): String {
|
|
||||||
return try {
|
|
||||||
URLDecoder.decode(url, Charsets.UTF_8.toString())
|
|
||||||
} catch (e: Exception) {
|
|
||||||
LogUtil.e(AppConfig.TAG, "Failed to decode URL", e)
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode a string to URL-encoded format.
|
|
||||||
*
|
|
||||||
* @param url The string to encode.
|
|
||||||
* @return The URL-encoded string, or the original string if encoding fails.
|
|
||||||
*/
|
|
||||||
fun urlEncode(url: String): String {
|
|
||||||
return try {
|
|
||||||
URLEncoder.encode(url, Charsets.UTF_8.toString())
|
|
||||||
} catch (e: Exception) {
|
|
||||||
LogUtil.e(AppConfig.TAG, "Failed to encode URL", e)
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode a "encodeURIComponent" string.
|
* Decode a "encodeURIComponent" string.
|
||||||
*
|
*
|
||||||
@@ -424,16 +370,6 @@ object Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the dark mode status.
|
|
||||||
*
|
|
||||||
* @param context The context to use.
|
|
||||||
* @return True if dark mode is enabled, false otherwise.
|
|
||||||
*/
|
|
||||||
fun getDarkModeStatus(context: Context): Boolean {
|
|
||||||
return context.resources.configuration.uiMode and UI_MODE_NIGHT_MASK != UI_MODE_NIGHT_NO
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the IPv6 address in a formatted string.
|
* Get the IPv6 address in a formatted string.
|
||||||
*
|
*
|
||||||
@@ -468,26 +404,6 @@ object Utils {
|
|||||||
.replace("|", "%7C")
|
.replace("|", "%7C")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Find a free port from a list of ports.
|
|
||||||
*
|
|
||||||
* @param ports The list of ports to check.
|
|
||||||
* @return The first free port found.
|
|
||||||
* @throws IOException If no free port is found.
|
|
||||||
*/
|
|
||||||
fun findFreePort(ports: List<Int>): Int {
|
|
||||||
for (port in ports) {
|
|
||||||
try {
|
|
||||||
return ServerSocket(port).use { it.localPort }
|
|
||||||
} catch (ex: IOException) {
|
|
||||||
continue // try next port
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the program gets here, no port in the range was found
|
|
||||||
throw IOException("no free port found")
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a random free port.
|
* Find a random free port.
|
||||||
*
|
*
|
||||||
@@ -544,13 +460,6 @@ object Utils {
|
|||||||
*/
|
*/
|
||||||
fun isXray(): Boolean = BuildConfig.APPLICATION_ID.startsWith("com.v2ray.ang")
|
fun isXray(): Boolean = BuildConfig.APPLICATION_ID.startsWith("com.v2ray.ang")
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if it is the Google Play version.
|
|
||||||
*
|
|
||||||
* @return True if the package is Google Play, false otherwise.
|
|
||||||
*/
|
|
||||||
fun isGoogleFlavor(): Boolean = BuildConfig.FLAVOR == "playstore"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts an InetAddress to its long representation
|
* Converts an InetAddress to its long representation
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in new issue
Block a user