mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-20 22:41:38 +02:00
refactor(android): drop unreachable dispatch cases and dead channel handlers
RustCoreBackend.invokeApplication handled readFileMetadata, editFileMetadata and cancelNativeDataJob, but MainActivity intercepts all three first: the metadata methods are in nativeBackendMethods and dispatchBackendApplication answers cancelNativeDataJob before it calls invokeApplication. No Kotlin code calls invokeApplication with those names. Dart never sends these channel methods, so their handlers go on every platform: - shareMultipleContentUris (Android) and getAvailableLyricsProviders (Android and iOS) have no Dart caller. - scanLibraryFolderIncrementalFromSnapshot and scanSafTreeIncrementalFromSnapshot are called only from the Dart host branch of the library scan, which runs only when supportsCoreBackend is false, that is never on Android or iOS. The unreachable Dart wrappers are removed separately. The allowlist and the when cases in MainActivity stay in sync (70 names). The UniFFI exports get_available_lyrics_providers_json and scan_library_folder_incremental_from_snapshot were used only by the removed handlers; the backend methods behind them stay.
This commit is contained in:
1 parent
ca950dc35a
commit
8aca5e4ef2
6 files changed
-97
No files matched your search
@@ -190,7 +190,6 @@ internal interface CoreBackend {
|
||||
fun setLibraryCoverCacheDirectory(path: String)
|
||||
fun scanLibraryFolderToNdjsonFile(folder: String, output: String): Long
|
||||
fun scanLibraryFolderIncremental(folder: String, existing: String): String
|
||||
fun scanLibraryFolderIncrementalFromSnapshot(folder: String, snapshot: String): String
|
||||
fun getLibraryScanProgress(): String
|
||||
fun cancelLibraryScan()
|
||||
fun pauseLibraryScan()
|
||||
|
||||
@@ -93,10 +93,8 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
"setLibraryCoverCacheDir",
|
||||
"scanLibraryFolderToNDJSONFile",
|
||||
"scanLibraryFolderIncremental",
|
||||
"scanLibraryFolderIncrementalFromSnapshot",
|
||||
"scanSafTreeToNDJSONFile",
|
||||
"scanSafTreeIncremental",
|
||||
"scanSafTreeIncrementalFromSnapshot",
|
||||
"getLibraryScanProgress",
|
||||
"cancelLibraryScan",
|
||||
"pauseLibraryScan",
|
||||
@@ -119,7 +117,6 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
"safClosePlaybackLease",
|
||||
"openContentUri",
|
||||
"shareContentUri",
|
||||
"shareMultipleContentUris",
|
||||
"getSafFileModTimes",
|
||||
"safCreateFromPath",
|
||||
"safCreateIfAbsentFromPath",
|
||||
@@ -1499,28 +1496,6 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
result.error("share_failed", e.message, null)
|
||||
}
|
||||
}
|
||||
"shareMultipleContentUris" -> {
|
||||
val uriStrings = call.argument<List<String>>("uris") ?: emptyList()
|
||||
val title = call.argument<String>("title") ?: ""
|
||||
try {
|
||||
val uris = ArrayList<Uri>(uriStrings.size)
|
||||
for (s in uriStrings) {
|
||||
uris.add(Uri.parse(s))
|
||||
}
|
||||
val shareIntent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
|
||||
putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
|
||||
setType("audio/*")
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
if (title.isNotBlank()) {
|
||||
putExtra(Intent.EXTRA_SUBJECT, title)
|
||||
}
|
||||
}
|
||||
startActivity(Intent.createChooser(shareIntent, title.ifBlank { "Share" }))
|
||||
result.success(true)
|
||||
} catch (e: Exception) {
|
||||
result.error("share_failed", e.message, null)
|
||||
}
|
||||
}
|
||||
"rewriteSplitArtistTags" -> {
|
||||
val filePath = call.argument<String>("file_path") ?: ""
|
||||
val artist = call.argument<String>("artist") ?: ""
|
||||
@@ -2015,20 +1990,6 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
}
|
||||
result.success(response)
|
||||
}
|
||||
"scanLibraryFolderIncrementalFromSnapshot" -> {
|
||||
val folderPath = call.argument<String>("folder_path") ?: ""
|
||||
val snapshotPath = call.argument<String>("snapshot_path") ?: ""
|
||||
val response = withContext(Dispatchers.IO) {
|
||||
safScanActive = false
|
||||
bridgeJsonResult(
|
||||
coreBackend.scanLibraryFolderIncrementalFromSnapshot(
|
||||
folderPath,
|
||||
snapshotPath,
|
||||
)
|
||||
)
|
||||
}
|
||||
result.success(response)
|
||||
}
|
||||
"scanSafTreeToNDJSONFile" -> {
|
||||
val treeUri = call.argument<String>("tree_uri") ?: ""
|
||||
val outputPath = call.argument<String>("output_path") ?: ""
|
||||
@@ -2045,16 +2006,6 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
}
|
||||
result.success(response)
|
||||
}
|
||||
"scanSafTreeIncrementalFromSnapshot" -> {
|
||||
val treeUri = call.argument<String>("tree_uri") ?: ""
|
||||
val snapshotPath = call.argument<String>("snapshot_path") ?: ""
|
||||
val response = withContext(Dispatchers.IO) {
|
||||
val existingFiles =
|
||||
loadExistingFilesFromSnapshot(snapshotPath)
|
||||
scanSafTreeIncremental(treeUri, existingFiles)
|
||||
}
|
||||
result.success(response)
|
||||
}
|
||||
"getSafFileModTimes" -> {
|
||||
val uris = call.argument<String>("uris") ?: "[]"
|
||||
val response = withContext(Dispatchers.IO) {
|
||||
|
||||
@@ -358,18 +358,6 @@ internal object RustCoreBackend : CoreBackend {
|
||||
it.scanLibraryFolderIncremental(File(folder).canonicalPath, existing, null)
|
||||
}
|
||||
|
||||
override fun scanLibraryFolderIncrementalFromSnapshot(folder: String, snapshot: String): String =
|
||||
withLibraryDirectories(listOf(folder)) { current ->
|
||||
if (snapshot.isEmpty()) current.scanLibraryFolderIncremental(File(folder).canonicalPath, "{}", null)
|
||||
else {
|
||||
val staged = workspace.createTemporaryFile("library_snapshot_", ".ndjson")
|
||||
try {
|
||||
File(snapshot).copyTo(staged, overwrite = true)
|
||||
current.scanLibraryFolderIncrementalFromSnapshot(File(folder).canonicalPath, staged.canonicalPath, null)
|
||||
} finally { staged.delete() }
|
||||
}
|
||||
}
|
||||
|
||||
override fun getLibraryScanProgress(): String =
|
||||
synchronized(this) { manager }?.getLibraryScanProgress() ?: "{}"
|
||||
|
||||
@@ -598,10 +586,6 @@ internal object RustCoreBackend : CoreBackend {
|
||||
return (0 until values.length()).map { values.getString(it) }
|
||||
}
|
||||
when (method) {
|
||||
"cancelNativeDataJob" -> {
|
||||
NativeDataJobs.cancel(string("request_id"))
|
||||
return null
|
||||
}
|
||||
"cancelExtensionRequest" -> synchronized(this) {
|
||||
requestRegistry().cancel(string("request_id"))
|
||||
return null
|
||||
@@ -656,15 +640,6 @@ internal object RustCoreBackend : CoreBackend {
|
||||
}
|
||||
"buildFilename" -> return buildFilename(string("template"), string("metadata", "{}"))
|
||||
"sanitizeFilename" -> return sanitizeFilename(string("filename"))
|
||||
"readFileMetadata", "editFileMetadata" -> return try {
|
||||
if (method == "readFileMetadata") {
|
||||
readFileMetadata(string("file_path"), string("display_name"))
|
||||
} else {
|
||||
editFileMetadata(string("file_path"), string("metadata_json", "{}"))
|
||||
}
|
||||
} catch (error: Exception) {
|
||||
JSONObject().put("error", error.message ?: "File metadata operation failed").toString()
|
||||
}
|
||||
"getLogsSince" -> return synchronized(this) {
|
||||
manager?.environment()?.use { environment ->
|
||||
environment.logBuffer().use { it.since((args["index"] as? Number)?.toLong() ?: 0L) }
|
||||
@@ -773,7 +748,6 @@ internal object RustCoreBackend : CoreBackend {
|
||||
"getProviderPriority", "getMetadataProviderPriority" -> {
|
||||
JSONObject(current.providerPriorities()).optJSONArray(if (method == "getProviderPriority") "download" else "metadata")?.toString() ?: "[]"
|
||||
}
|
||||
"getAvailableLyricsProviders" -> current.getAvailableLyricsProvidersJson()
|
||||
"searchTracksWithMetadataProviders" -> current.searchMetadataProviders(
|
||||
string("query"),
|
||||
(args["limit"] as? Number)?.toLong() ?: 20L,
|
||||
|
||||
@@ -855,7 +855,6 @@ final class RustCoreBackend: CoreBackend {
|
||||
let priorities = try JSONSerialization.jsonObject(with: Data(current.providerPriorities().utf8)) as! [String: Any]
|
||||
let value = priorities[method == "getProviderPriority" ? "download" : "metadata"] as? [String] ?? []
|
||||
return String(decoding: try JSONSerialization.data(withJSONObject: value), as: UTF8.self)
|
||||
case "getAvailableLyricsProviders": return try current.getAvailableLyricsProvidersJson()
|
||||
default: throw failure("Rust application method is not connected yet: \(method)")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,12 +88,6 @@ impl ExtensionManager {
|
||||
.map_err(ExtensionManagerError::Operation)
|
||||
}
|
||||
|
||||
pub fn get_available_lyrics_providers_json(&self) -> Result<String, ExtensionManagerError> {
|
||||
self.inner
|
||||
.get_available_lyrics_providers_json()
|
||||
.map_err(ExtensionManagerError::Operation)
|
||||
}
|
||||
|
||||
pub fn set_lyrics_fetch_options_json(
|
||||
&self,
|
||||
options_json: String,
|
||||
|
||||
@@ -140,20 +140,6 @@ impl ExtensionManager {
|
||||
.map_err(ExtensionManagerError::Operation)
|
||||
}
|
||||
|
||||
pub fn scan_library_folder_incremental_from_snapshot(
|
||||
&self,
|
||||
folder: String,
|
||||
snapshot: String,
|
||||
lease: Option<Arc<RequestLease>>,
|
||||
) -> Result<String, ExtensionManagerError> {
|
||||
self.inner
|
||||
.scan_library_folder_incremental_from_snapshot(&folder, &snapshot, &|| {
|
||||
check_lease(lease.as_deref())
|
||||
})
|
||||
.map(|value| value.to_string())
|
||||
.map_err(ExtensionManagerError::Operation)
|
||||
}
|
||||
|
||||
pub fn scan_library_folder_to_ndjson_file(
|
||||
&self,
|
||||
folder: String,
|
||||
|
||||
Reference in new issue
Block a user