Refactor UI package structure by feature

This commit is contained in:
2dust committed 2026-07-21 18:16:06 +08:00
1 parent 4b903cf5e0
commit f6ea2df5a0
46 files changed
+130 -130

No files matched your search

+4 -4
View File
@@ -11,7 +11,7 @@
<!--suppress AndroidDomInspection -->
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScSwitchActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScSwitchActivity"
android:targetPackage="com.v2ray.ang.fdroid" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
@@ -26,7 +26,7 @@
<!--suppress AndroidDomInspection -->
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScScannerActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScScannerActivity"
android:targetPackage="com.v2ray.ang.fdroid" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
@@ -41,7 +41,7 @@
<!--suppress AndroidDomInspection -->
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScStartActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScStartActivity"
android:targetPackage="com.v2ray.ang.fdroid" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
@@ -56,7 +56,7 @@
<!--suppress AndroidDomInspection -->
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScStopActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScStopActivity"
android:targetPackage="com.v2ray.ang.fdroid" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
+17 -17
View File
@@ -115,58 +115,58 @@
android:exported="false"
android:windowSoftInputMode="stateUnchanged|adjustResize" />
<activity
android:name=".ui.SettingsActivity"
android:name=".ui.settings.SettingsActivity"
android:exported="false" />
<activity
android:name=".ui.PerAppProxyActivity"
android:name=".ui.perappproxy.PerAppProxyActivity"
android:exported="false" />
<activity
android:name=".ui.AppPickerActivity"
android:name=".ui.apppicker.AppPickerActivity"
android:exported="false" />
<activity
android:name=".ui.ScannerActivity"
android:exported="false" />
<activity
android:name=".ui.LogcatActivity"
android:name=".ui.logcat.LogcatActivity"
android:exported="false" />
<activity
android:name=".ui.RoutingSettingActivity"
android:name=".ui.routing.RoutingSettingActivity"
android:exported="false" />
<activity
android:name=".ui.RoutingEditActivity"
android:name=".ui.routing.RoutingEditActivity"
android:windowSoftInputMode="stateUnchanged|adjustResize"
android:exported="false" />
<activity
android:name=".ui.SubSettingActivity"
android:name=".ui.subscription.SubSettingActivity"
android:exported="false" />
<activity
android:name=".ui.UserAssetActivity"
android:name=".ui.userasset.UserAssetActivity"
android:exported="false" />
<activity
android:name=".ui.UserAssetUrlActivity"
android:name=".ui.userasset.UserAssetUrlActivity"
android:exported="false" />
<activity
android:name=".ui.SubEditActivity"
android:name=".ui.subscription.SubEditActivity"
android:windowSoftInputMode="stateUnchanged|adjustResize"
android:exported="false" />
<activity
android:name=".ui.ScScannerActivity"
android:name=".ui.shortcut.ScScannerActivity"
android:exported="false" />
<activity
android:name=".ui.ScSwitchActivity"
android:name=".ui.shortcut.ScSwitchActivity"
android:excludeFromRecents="true"
android:exported="false"
android:process=":RunSoLibV2RayDaemon"
android:theme="@style/AppThemeDayNight.NoActionBar.Translucent" />
<activity
android:name=".ui.ScStartActivity"
android:name=".ui.shortcut.ScStartActivity"
android:excludeFromRecents="true"
android:exported="false"
android:process=":RunSoLibV2RayDaemon"
android:theme="@style/AppThemeDayNight.NoActionBar.Translucent" />
<activity
android:name=".ui.ScStopActivity"
android:name=".ui.shortcut.ScStopActivity"
android:excludeFromRecents="true"
android:exported="false"
android:process=":RunSoLibV2RayDaemon"
@@ -192,10 +192,10 @@
</intent-filter>
</activity>
<activity
android:name=".ui.CheckUpdateActivity"
android:name=".ui.checkupdate.CheckUpdateActivity"
android:exported="false" />
<activity
android:name=".ui.BackupActivity"
android:name=".ui.backup.BackupActivity"
android:exported="false" />
<activity
android:name=".ui.AboutActivity"
@@ -292,7 +292,7 @@
</service>
<!-- =====================Tasker===================== -->
<activity
android:name=".ui.TaskerActivity"
android:name=".ui.shortcut.TaskerActivity"
android:exported="true"
android:icon="@mipmap/ic_launcher">
<intent-filter>
@@ -33,6 +33,7 @@ import com.v2ray.ang.compose.AppTopBar
import com.v2ray.ang.compose.SettingsMenuItem
import com.v2ray.ang.compose.VersionInfoBlock
import com.v2ray.ang.core.CoreNativeManager
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.Utils
class AboutActivity : BaseComponentActivity() {
@@ -1,7 +1,6 @@
package com.v2ray.ang.ui
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.os.Bundle
import android.util.Size as TargetSize
@@ -68,7 +67,7 @@ import com.v2ray.ang.R
import com.v2ray.ang.compose.AppTopBar
import com.v2ray.ang.enums.PermissionType
import com.v2ray.ang.extension.toast
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.util.QRCodeDecoder
import java.util.concurrent.Executors
@@ -10,6 +10,7 @@ import com.v2ray.ang.R
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastError
import com.v2ray.ang.handler.AngConfigManager
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.ui.main.MainActivity
import com.v2ray.ang.util.LogUtil
import kotlinx.coroutines.Dispatchers
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.apppicker
import android.content.Context
import android.content.Intent
@@ -36,7 +36,7 @@ import com.v2ray.ang.compose.AppListItem
import com.v2ray.ang.compose.AppTopBar
import com.v2ray.ang.compose.verticalScrollbar
import com.v2ray.ang.dto.AppInfo
import com.v2ray.ang.viewmodel.AppPickerViewModel
import com.v2ray.ang.ui.base.BaseComponentActivity
class AppPickerActivity : BaseComponentActivity() {
@@ -1,9 +1,11 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.apppicker
import android.app.Application
import android.content.Context
import com.v2ray.ang.AppConfig
import com.v2ray.ang.R
import com.v2ray.ang.dto.AppInfo
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.util.AppManagerUtil
import com.v2ray.ang.util.LogUtil
import kotlinx.coroutines.Dispatchers
@@ -12,6 +14,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.withContext
import java.text.Collator
import kotlin.collections.plus
/**
* ViewModel for AppPicker screen.
@@ -45,7 +48,7 @@ class AppPickerViewModel(application: Application) : BaseViewModel(application)
_displayedApps.value = applyFilter(currentQuery)
} catch (e: Exception) {
LogUtil.e("AppPickerViewModel", "Failed to load app list", e)
toastError(com.v2ray.ang.R.string.toast_failure)
toastError(R.string.toast_failure)
}
}
}
@@ -107,11 +110,11 @@ class AppPickerViewModel(application: Application) : BaseViewModel(application)
?: context.getDrawable(android.R.drawable.sym_def_app_icon)
?: error("No fallback drawable available")
return AppInfo(
appName = context.getString(com.v2ray.ang.R.string.app_picker_unknown_app),
appName = context.getString(R.string.app_picker_unknown_app),
packageName = AppConfig.UNIDENTIFIED_PACKAGE,
appIcon = icon,
isSystemApp = false,
isSelected = 0
)
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.backup
import android.content.Intent
import android.net.Uri
@@ -40,8 +40,8 @@ import com.v2ray.ang.dto.entities.WebDavConfig
import com.v2ray.ang.extension.toastError
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.viewmodel.BackupViewModel
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import java.io.File
@@ -1,18 +1,18 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.backup
import android.app.Application
import android.net.Uri
import com.tencent.mmkv.MMKV
import com.v2ray.ang.AppConfig
import com.v2ray.ang.AppConfig.WEBDAV_BACKUP_FILE_NAME
import com.v2ray.ang.R
import com.v2ray.ang.dto.entities.WebDavConfig
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsChangeManager
import com.v2ray.ang.handler.WebDavManager
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.ui.base.ViewModelEvent
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.util.ZipUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -91,7 +91,7 @@ class BackupViewModel(application: Application) : BaseViewModel(application) {
WebDavManager.init(config)
val ok = try {
WebDavManager.uploadFile(tempFile, WEBDAV_BACKUP_FILE_NAME)
WebDavManager.uploadFile(tempFile, AppConfig.WEBDAV_BACKUP_FILE_NAME)
} catch (e: Exception) {
LogUtil.e(AppConfig.TAG, "WebDAV upload error", e)
false
@@ -123,7 +123,7 @@ class BackupViewModel(application: Application) : BaseViewModel(application) {
try {
target = File(cacheDir, "download_${System.currentTimeMillis()}.zip")
WebDavManager.init(config)
val ok = WebDavManager.downloadFile(WEBDAV_BACKUP_FILE_NAME, target)
val ok = WebDavManager.downloadFile(AppConfig.WEBDAV_BACKUP_FILE_NAME, target)
if (!ok) {
toastError(R.string.toast_failure)
return@launchLoading
@@ -178,4 +178,4 @@ class BackupViewModel(application: Application) : BaseViewModel(application) {
return count > 0
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.base
import android.content.Context
import android.os.Bundle
@@ -28,4 +28,4 @@ abstract class BaseComponentActivity : ComponentActivity() {
@Composable
protected abstract fun ScreenContent()
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.base
import android.app.Application
import androidx.lifecycle.AndroidViewModel
@@ -7,8 +7,8 @@ import com.v2ray.ang.AngApplication
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastError
import com.v2ray.ang.extension.toastSuccess
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -113,4 +113,4 @@ abstract class BaseViewModel(application: Application) : AndroidViewModel(applic
}
}
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.base
import android.net.Uri
import android.os.Bundle
@@ -86,4 +86,4 @@ abstract class HelperBaseComponentActivity : BaseComponentActivity() {
) {
qrCodeScanner.launch(onResult)
}
}
}
@@ -1,13 +1,13 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.base
/**
* Base interface for ViewModel UI events.
*/
sealed interface ViewModelEvent
interface ViewModelEvent
/**
* Common UI events for all ViewModels.
*/
sealed interface BaseViewModelEvent : ViewModelEvent {
interface BaseViewModelEvent : ViewModelEvent {
object FinishActivity : BaseViewModelEvent
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.checkupdate
import android.os.Bundle
import androidx.activity.viewModels
@@ -28,8 +28,8 @@ import com.v2ray.ang.compose.SettingsMenuItem
import com.v2ray.ang.compose.SettingsSwitchItem
import com.v2ray.ang.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.viewmodel.CheckUpdateViewModel
class CheckUpdateActivity : BaseComponentActivity() {
@@ -1,4 +1,4 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.checkupdate
import android.app.Application
import com.v2ray.ang.AppConfig
@@ -6,6 +6,7 @@ import com.v2ray.ang.R
import com.v2ray.ang.dto.CheckUpdateResult
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.UpdateCheckerManager
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.util.LogUtil
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -54,4 +55,4 @@ class CheckUpdateViewModel(application: Application) : BaseViewModel(application
fun dismissUpdateDialog() {
_showUpdateDialog.value = false
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.logcat
import android.content.ClipData
import android.content.Intent
@@ -43,11 +43,9 @@ import com.v2ray.ang.compose.AppTopBar
import com.v2ray.ang.compose.LocalAppSnackbar
import com.v2ray.ang.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.viewmodel.LogcatViewModel
import kotlinx.coroutines.Delay
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
@@ -1,8 +1,8 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.logcat
import android.app.Application
import com.v2ray.ang.AppConfig
import com.v2ray.ang.AppConfig.ANG_PACKAGE
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.util.LogUtil
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -25,7 +25,7 @@ class LogcatViewModel(application: Application) : BaseViewModel(application) {
lst.add("-v")
lst.add("time")
lst.add("-s")
lst.add("GoLog,${ANG_PACKAGE},AndroidRuntime,System.err")
lst.add("GoLog,${AppConfig.ANG_PACKAGE},AndroidRuntime,System.err")
val process = Runtime.getRuntime().exec(lst.toTypedArray())
val allText = process.inputStream.bufferedReader().use { it.readLines() }.reversed()
@@ -65,4 +65,4 @@ class LogcatViewModel(application: Application) : BaseViewModel(application) {
logsetsAll.filter { it.contains(currentFilter) }
}
}
}
}
@@ -25,15 +25,15 @@ import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsChangeManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.AboutActivity
import com.v2ray.ang.ui.BackupActivity
import com.v2ray.ang.ui.CheckUpdateActivity
import com.v2ray.ang.ui.HelperBaseComponentActivity
import com.v2ray.ang.ui.LogcatActivity
import com.v2ray.ang.ui.PerAppProxyActivity
import com.v2ray.ang.ui.RoutingSettingActivity
import com.v2ray.ang.ui.SettingsActivity
import com.v2ray.ang.ui.SubSettingActivity
import com.v2ray.ang.ui.UserAssetActivity
import com.v2ray.ang.ui.backup.BackupActivity
import com.v2ray.ang.ui.checkupdate.CheckUpdateActivity
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
import com.v2ray.ang.ui.logcat.LogcatActivity
import com.v2ray.ang.ui.perappproxy.PerAppProxyActivity
import com.v2ray.ang.ui.routing.RoutingSettingActivity
import com.v2ray.ang.ui.settings.SettingsActivity
import com.v2ray.ang.ui.subscription.SubSettingActivity
import com.v2ray.ang.ui.userasset.UserAssetActivity
import com.v2ray.ang.ui.server.ProfileEditorResult
import com.v2ray.ang.ui.server.ServerCustomConfigActivity
import com.v2ray.ang.ui.server.ServerGroupActivity
@@ -48,7 +48,6 @@ import com.v2ray.ang.ui.server.ServerVmessActivity
import com.v2ray.ang.ui.server.ServerWireguardActivity
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.util.Utils
import com.v2ray.ang.viewmodel.MainViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -19,7 +19,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.v2ray.ang.compose.colorFabActive
import com.v2ray.ang.dto.GroupMapItem
import com.v2ray.ang.dto.entities.ServersCache
import com.v2ray.ang.viewmodel.MainViewModel
import kotlinx.coroutines.flow.StateFlow
@Composable
@@ -31,7 +31,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.v2ray.ang.compose.LocalDarkTheme
import com.v2ray.ang.compose.QRCodeDialog
import com.v2ray.ang.dto.entities.ProfileItem
import com.v2ray.ang.viewmodel.MainViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch
@@ -56,7 +56,6 @@ 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.viewmodel.MainViewModel
import sh.calvin.reorderable.ReorderableItem
import sh.calvin.reorderable.rememberReorderableLazyGridState
import sh.calvin.reorderable.rememberReorderableLazyListState
@@ -1,4 +1,4 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.main
import android.app.Application
import androidx.lifecycle.ViewModel
@@ -14,10 +14,7 @@ import com.v2ray.ang.dto.entities.ServersCache
import com.v2ray.ang.dto.entities.SubscriptionCache
import com.v2ray.ang.extension.isComplexType
import com.v2ray.ang.extension.matchesPattern
import com.v2ray.ang.ui.main.MainAction
import com.v2ray.ang.ui.main.MainDataSource
import com.v2ray.ang.ui.main.MainUiState
import com.v2ray.ang.ui.main.MainServiceEvent
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.util.LogUtil
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CompletableDeferred
@@ -785,4 +782,4 @@ class MainViewModel(
throw IllegalArgumentException("Unknown ViewModel class")
}
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.perappproxy
import android.os.Bundle
import androidx.activity.viewModels
@@ -49,8 +49,8 @@ import com.v2ray.ang.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.viewmodel.PerAppProxyViewModel
class PerAppProxyActivity : BaseComponentActivity() {
@@ -1,14 +1,14 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.perappproxy
import android.app.Application
import android.content.Context
import com.v2ray.ang.AppConfig
import com.v2ray.ang.AppConfig.ANG_PACKAGE
import com.v2ray.ang.dto.AppInfo
import com.v2ray.ang.dto.UrlContentRequest
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsChangeManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.util.AppManagerUtil
import com.v2ray.ang.util.HttpUtil
import com.v2ray.ang.util.LogUtil
@@ -132,7 +132,7 @@ class PerAppProxyViewModel(application: Application) : BaseViewModel(application
appsAll = apps
_displayedApps.value = apps
} catch (e: Exception) {
LogUtil.e(ANG_PACKAGE, "Error loading apps", e)
LogUtil.e(AppConfig.ANG_PACKAGE, "Error loading apps", e)
}
}
}
@@ -268,4 +268,4 @@ class PerAppProxyViewModel(application: Application) : BaseViewModel(application
setPerAppProxyEnabled(true)
SettingsChangeManager.makeRestartService()
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.routing
import android.app.Activity
import android.os.Bundle
@@ -16,7 +16,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.Text
@@ -46,6 +45,8 @@ import com.v2ray.ang.extension.nullIfBlank
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.apppicker.AppPickerActivity
import com.v2ray.ang.ui.base.BaseComponentActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.routing
import android.content.Intent
import android.os.Bundle
@@ -58,10 +58,10 @@ 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.LogUtil
import com.v2ray.ang.util.Utils
import com.v2ray.ang.viewmodel.RoutingSettingsViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@@ -1,9 +1,10 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.routing
import android.app.Application
import com.v2ray.ang.dto.entities.RulesetItem
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.base.BaseViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -48,4 +49,4 @@ class RoutingSettingsViewModel(application: Application) : BaseViewModel(applica
_rulesetsFlow.value = rulesets.toList()
}
}
}
}
@@ -46,7 +46,7 @@ import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.AngConfigManager
import com.v2ray.ang.handler.CertificateFingerprintManager
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.BaseComponentActivity
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.JsonUtil
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -49,7 +49,7 @@ import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.AngConfigManager
import com.v2ray.ang.handler.CertificateFingerprintManager
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.BaseComponentActivity
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.JsonUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -67,7 +67,7 @@ import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.fmt.CustomFmt
import com.v2ray.ang.handler.AngConfigManager
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.BaseComponentActivity
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.LogUtil
import kotlinx.coroutines.flow.collectLatest
@@ -32,7 +32,7 @@ import com.v2ray.ang.extension.isNotNullEmpty
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.BaseComponentActivity
import com.v2ray.ang.ui.base.BaseComponentActivity
class ServerGroupActivity : BaseComponentActivity() {
@@ -47,7 +47,7 @@ import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.BaseComponentActivity
import com.v2ray.ang.ui.base.BaseComponentActivity
import sh.calvin.reorderable.ReorderableItem
import sh.calvin.reorderable.rememberReorderableLazyListState
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.settings
import android.os.Bundle
import androidx.activity.viewModels
@@ -16,7 +16,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
@@ -36,8 +35,8 @@ 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.viewmodel.SettingsViewModel
class SettingsActivity : BaseComponentActivity() {
@@ -1,11 +1,11 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.settings
import android.app.Application
import com.v2ray.ang.AppConfig
import com.v2ray.ang.R
import com.v2ray.ang.root.RootManager
import com.v2ray.ang.ui.base.BaseViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
class SettingsViewModel(application: Application) : BaseViewModel(application) {
@@ -56,4 +56,4 @@ class SettingsViewModel(application: Application) : BaseViewModel(application) {
null
}
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.shortcut
import android.content.Intent
import android.os.Bundle
@@ -8,6 +8,7 @@ import com.v2ray.ang.R
import com.v2ray.ang.extension.toastError
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.AngConfigManager
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
import com.v2ray.ang.ui.main.MainActivity
class ScScannerActivity : HelperBaseComponentActivity() {
@@ -39,4 +40,4 @@ class ScScannerActivity : HelperBaseComponentActivity() {
finish()
}
}
}
}
@@ -1,9 +1,10 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.shortcut
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import com.v2ray.ang.core.CoreServiceManager
import com.v2ray.ang.ui.base.BaseComponentActivity
class ScStartActivity : BaseComponentActivity() {
@@ -1,9 +1,10 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.shortcut
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import com.v2ray.ang.core.CoreServiceManager
import com.v2ray.ang.ui.base.BaseComponentActivity
class ScStopActivity : BaseComponentActivity() {
@@ -1,9 +1,10 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.shortcut
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import com.v2ray.ang.core.CoreServiceManager
import com.v2ray.ang.ui.base.BaseComponentActivity
class ScSwitchActivity : BaseComponentActivity() {
@@ -1,9 +1,8 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.shortcut
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import androidx.activity.compose.setContent
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -36,6 +35,7 @@ import com.v2ray.ang.compose.AppTopBar
import com.v2ray.ang.compose.SettingsSwitchItem
import com.v2ray.ang.compose.verticalScrollbar
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.LogUtil
class TaskerActivity : BaseComponentActivity() {
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.subscription
import android.os.Bundle
import android.text.TextUtils
@@ -11,7 +11,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.runtime.Composable
@@ -20,7 +19,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
@@ -42,6 +40,7 @@ import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsChangeManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.handler.SubscriptionUpdater
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.Utils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -1,6 +1,7 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.subscription
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
import androidx.activity.viewModels
import androidx.compose.foundation.layout.Column
@@ -10,7 +11,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
@@ -52,9 +52,9 @@ import com.v2ray.ang.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.Utils
import com.v2ray.ang.viewmodel.SubscriptionsViewModel
import sh.calvin.reorderable.ReorderableItem
import sh.calvin.reorderable.rememberReorderableLazyListState
@@ -107,7 +107,7 @@ fun SubSettingScreen(
onSubUpdate: () -> Unit,
onEditSub: (String) -> Unit,
onRemoveSub: (String) -> Unit,
onShareQRCode: (String) -> android.graphics.Bitmap?,
onShareQRCode: (String) -> Bitmap?,
onShareClipboard: (String) -> Unit,
shareSubMethodEntries: List<String>
) {
@@ -117,7 +117,7 @@ fun SubSettingScreen(
val confirmRemove = MmkvManager.decodeSettingsBool(AppConfig.PREF_CONFIRM_REMOVE, false)
var shareTarget by remember { mutableStateOf<Pair<String, String>?>(null) }
var showQRCodeBitmap by remember { mutableStateOf<android.graphics.Bitmap?>(null) }
var showQRCodeBitmap by remember { mutableStateOf<Bitmap?>(null) }
val lazyListState = rememberLazyListState()
val reorderableState = rememberReorderableLazyListState(lazyListState) { from, to ->
@@ -1,4 +1,4 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.subscription
import android.app.Application
import com.v2ray.ang.R
@@ -8,6 +8,7 @@ import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsChangeManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.handler.SubscriptionUpdater
import com.v2ray.ang.ui.base.BaseViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -62,4 +63,4 @@ class SubscriptionsViewModel(application: Application) : BaseViewModel(applicati
toast(R.string.subscription_updater_job_tips)
}
}
}
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.userasset
import android.content.Intent
import android.net.Uri
@@ -48,7 +48,6 @@ import com.v2ray.ang.R
import com.v2ray.ang.compose.AppDivider
import com.v2ray.ang.compose.AppTopBar
import com.v2ray.ang.compose.ConfirmDialog
import com.v2ray.ang.compose.SelectListDialog
import com.v2ray.ang.compose.SettingsListItem
import com.v2ray.ang.compose.verticalScrollbar
import com.v2ray.ang.dto.entities.AssetUrlCache
@@ -59,9 +58,9 @@ import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.extension.toTrafficString
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SettingsManager
import com.v2ray.ang.ui.base.HelperBaseComponentActivity
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.util.Utils
import com.v2ray.ang.viewmodel.UserAssetViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@@ -1,4 +1,4 @@
package com.v2ray.ang.ui
package com.v2ray.ang.ui.userasset
import android.os.Bundle
import android.text.TextUtils
@@ -7,10 +7,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -29,6 +27,7 @@ import com.v2ray.ang.dto.entities.AssetUrlItem
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.base.BaseComponentActivity
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.util.Utils
import java.io.File
@@ -1,4 +1,4 @@
package com.v2ray.ang.viewmodel
package com.v2ray.ang.ui.userasset
import android.app.Application
import com.v2ray.ang.AppConfig
@@ -7,6 +7,7 @@ import com.v2ray.ang.dto.entities.AssetUrlCache
import com.v2ray.ang.dto.entities.AssetUrlItem
import com.v2ray.ang.extension.concatUrl
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.ui.base.BaseViewModel
import com.v2ray.ang.util.HttpUtil
import com.v2ray.ang.util.LogUtil
import com.v2ray.ang.util.Utils
@@ -126,4 +127,4 @@ class UserAssetViewModel(application: Application) : BaseViewModel(application)
val failureCount: Int,
val failedAssets: List<String>
)
}
}
+4 -4
View File
@@ -10,7 +10,7 @@
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScSwitchActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScSwitchActivity"
android:targetPackage="com.v2ray.ang" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
@@ -24,7 +24,7 @@
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScScannerActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScScannerActivity"
android:targetPackage="com.v2ray.ang" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
@@ -38,7 +38,7 @@
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScStartActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScStartActivity"
android:targetPackage="com.v2ray.ang" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
@@ -52,7 +52,7 @@
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.v2ray.ang.ui.ScStopActivity"
android:targetClass="com.v2ray.ang.ui.shortcut.ScStopActivity"
android:targetPackage="com.v2ray.ang" />
<categories android:name="android.shortcut.conversation" />
</shortcut>