Fix sing-box:// URL scheme import in ComposeActivity

The deep link handling was missing after migrating to Compose UI.
This commit is contained in:
世界
2025-12-27 13:00:49 +08:00
parent d29b6255b7
commit 265902a011

View File

@@ -117,6 +117,8 @@ class ComposeActivity : ComponentActivity(), ServiceConnection.Callback {
private var currentAlert by mutableStateOf<Pair<Alert, String?>?>(null) private var currentAlert by mutableStateOf<Pair<Alert, String?>?>(null)
private var showLocationPermissionDialog by mutableStateOf(false) private var showLocationPermissionDialog by mutableStateOf(false)
private var showBackgroundLocationDialog by mutableStateOf(false) private var showBackgroundLocationDialog by mutableStateOf(false)
private var showImportProfileDialog by mutableStateOf(false)
private var pendingImportProfile by mutableStateOf<Triple<String, String, String>?>(null)
private val notificationPermissionLauncher = private val notificationPermissionLauncher =
registerForActivityResult( registerForActivityResult(
@@ -175,6 +177,8 @@ class ComposeActivity : ComponentActivity(), ServiceConnection.Callback {
} }
} }
handleIntent(intent)
setContent { setContent {
SFATheme { SFATheme {
SFAApp() SFAApp()
@@ -182,6 +186,26 @@ class ComposeActivity : ComponentActivity(), ServiceConnection.Callback {
} }
} }
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
val uri = intent?.data ?: return
if (uri.scheme == "sing-box" && uri.host == "import-remote-profile") {
try {
val profile = Libbox.parseRemoteProfileImportLink(uri.toString())
pendingImportProfile = Triple(profile.name, profile.host, profile.url)
showImportProfileDialog = true
} catch (e: Exception) {
lifecycleScope.launch {
GlobalEventBus.emit(UiEvent.ErrorMessage(e.message ?: "Failed to parse profile link"))
}
}
}
}
@SuppressLint("NewApi") @SuppressLint("NewApi")
fun startService() { fun startService() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !ServiceNotification.checkPermission()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !ServiceNotification.checkPermission()) {
@@ -285,6 +309,41 @@ class ComposeActivity : ComponentActivity(), ServiceConnection.Callback {
}, onDismiss = { showBackgroundLocationDialog = false }) }, onDismiss = { showBackgroundLocationDialog = false })
} }
// Handle import remote profile dialog
if (showImportProfileDialog && pendingImportProfile != null) {
val (name, host, url) = pendingImportProfile!!
AlertDialog(
onDismissRequest = {
showImportProfileDialog = false
pendingImportProfile = null
},
title = { Text(stringResource(R.string.import_remote_profile)) },
text = { Text(stringResource(R.string.import_remote_profile_message, name, host)) },
confirmButton = {
TextButton(onClick = {
startActivity(
Intent(this@ComposeActivity, NewProfileComposeActivity::class.java).apply {
putExtra(NewProfileComposeActivity.EXTRA_IMPORT_NAME, name)
putExtra(NewProfileComposeActivity.EXTRA_IMPORT_URL, url)
},
)
showImportProfileDialog = false
pendingImportProfile = null
}) {
Text(stringResource(R.string.ok))
}
},
dismissButton = {
TextButton(onClick = {
showImportProfileDialog = false
pendingImportProfile = null
}) {
Text(stringResource(android.R.string.cancel))
}
},
)
}
// Handle update check prompt dialog (shown only once on first launch) // Handle update check prompt dialog (shown only once on first launch)
var showUpdateCheckPrompt by remember { mutableStateOf(!Settings.updateCheckPrompted) } var showUpdateCheckPrompt by remember { mutableStateOf(!Settings.updateCheckPrompted) }
if (showUpdateCheckPrompt) { if (showUpdateCheckPrompt) {