Skip to content

Commit abf02ce

Browse files
committed
stability: drop legacy serializable chooser fallback
1 parent aab6397 commit abf02ce

2 files changed

Lines changed: 102 additions & 37 deletions

File tree

app/src/main/java/com/kyhsgeekcode/disassembler/viewmodel/MainViewModel.kt

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -119,36 +119,19 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
119119

120120
fun onSelectIntent(intent: Intent) {
121121
Timber.d("onActivityResultOk")
122-
_openAsProject.value = intent.getBooleanExtra("openProject", false)
123-
val selectedFilePayload = selectedFileIntentPayload(intent)
124-
if (selectedFilePayload != null) {
125-
onSelectFilePayload(selectedFilePayload)
126-
return
127-
}
128-
val fi = intent.serializableExtraCompat<FileItem>("fileItem")
129-
if (fi != null) {
130-
onSelectFileItem(fi)
131-
} else {
132-
val displayName = intent.getStringExtra("displayName")
133-
val uri = intent.parcelableExtraCompat<Uri>("uri")
134-
?: intent.extras.parcelableExtraCompat(Intent.EXTRA_STREAM)
135-
?: return
136-
onSelectUri(uri, displayName)
137-
}
138-
}
122+
when (val selection = resolveIncomingSelection(intent)) {
123+
is IncomingSelection.CompactFile -> {
124+
_openAsProject.value = selection.openAsProject
125+
onSelectFilePayload(selection.payload)
126+
}
139127

140-
private fun onSelectFileItem(fileItem: FileItem) {
141-
val file = fileItem.file ?: run {
142-
Logger.e(TAG, "Failed to load fileItem: $fileItem")
143-
return@onSelectFileItem
128+
is IncomingSelection.UriSelection -> {
129+
_openAsProject.value = selection.openAsProject
130+
onSelectUri(selection.uri, selection.displayName)
131+
}
132+
133+
null -> return
144134
}
145-
onSelectFilePayload(
146-
SelectedFileIntentPayload(
147-
filePath = file.absolutePath,
148-
nativeFilePath = (fileItem as? FileItemApp)?.nativeFile?.absolutePath,
149-
projectType = fileItemTypeToProjectType(fileItem)
150-
)
151-
)
152135
}
153136

154137
private fun onSelectFilePayload(payload: SelectedFileIntentPayload) {
@@ -515,21 +498,62 @@ private inline fun <reified T : Parcelable> Bundle?.parcelableExtraCompat(key: S
515498
}
516499
}
517500

518-
private inline fun <reified T : java.io.Serializable> Intent.serializableExtraCompat(key: String): T? {
519-
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
520-
getSerializableExtra(key, T::class.java)
521-
} else {
522-
@Suppress("DEPRECATION")
523-
getSerializableExtra(key) as? T
524-
}
525-
}
526-
527501
internal data class SelectedFileIntentPayload(
528502
val filePath: String,
529503
val nativeFilePath: String?,
530504
val projectType: String
531505
)
532506

507+
internal sealed class IncomingSelection {
508+
data class CompactFile(
509+
val payload: SelectedFileIntentPayload,
510+
val openAsProject: Boolean
511+
) : IncomingSelection()
512+
513+
data class UriSelection(
514+
val uri: Uri,
515+
val displayName: String?,
516+
val openAsProject: Boolean
517+
) : IncomingSelection()
518+
}
519+
520+
internal fun resolveIncomingSelection(intent: Intent): IncomingSelection? {
521+
return resolveIncomingSelection(
522+
openAsProject = intent.getBooleanExtra("openProject", false),
523+
filePath = intent.getStringExtra(NewFileChooserActivity.EXTRA_FILE_PATH),
524+
nativeFilePath = intent.getStringExtra(NewFileChooserActivity.EXTRA_NATIVE_FILE_PATH),
525+
projectType = intent.getStringExtra(NewFileChooserActivity.EXTRA_PROJECT_TYPE),
526+
uri = intent.parcelableExtraCompat("uri"),
527+
extraStreamUri = intent.extras.parcelableExtraCompat(Intent.EXTRA_STREAM),
528+
displayName = intent.getStringExtra("displayName")
529+
)
530+
}
531+
532+
internal fun resolveIncomingSelection(
533+
openAsProject: Boolean,
534+
filePath: String?,
535+
nativeFilePath: String?,
536+
projectType: String?,
537+
uri: Uri?,
538+
extraStreamUri: Uri?,
539+
displayName: String?
540+
): IncomingSelection? {
541+
val selectedFilePayload = selectedFileIntentPayload(
542+
filePath = filePath,
543+
nativeFilePath = nativeFilePath,
544+
projectType = projectType
545+
)
546+
if (selectedFilePayload != null) {
547+
return IncomingSelection.CompactFile(selectedFilePayload, openAsProject)
548+
}
549+
val incomingUri = uri ?: extraStreamUri ?: return null
550+
return IncomingSelection.UriSelection(
551+
uri = incomingUri,
552+
displayName = displayName,
553+
openAsProject = openAsProject
554+
)
555+
}
556+
533557
internal fun selectedFileIntentPayload(intent: Intent): SelectedFileIntentPayload? {
534558
return selectedFileIntentPayload(
535559
filePath = intent.getStringExtra(NewFileChooserActivity.EXTRA_FILE_PATH),
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.kyhsgeekcode.disassembler.viewmodel
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.Assertions.assertNull
5+
import org.junit.jupiter.api.Test
6+
7+
class IncomingSelectionTest {
8+
@Test
9+
fun `resolveIncomingSelection prefers compact chooser payload`() {
10+
val selection = resolveIncomingSelection(
11+
openAsProject = true,
12+
filePath = "/tmp/sample.apk",
13+
nativeFilePath = "/tmp/lib",
14+
projectType = "APK",
15+
uri = null,
16+
extraStreamUri = null,
17+
displayName = null
18+
)
19+
20+
require(selection is IncomingSelection.CompactFile)
21+
assertEquals(true, selection.openAsProject)
22+
assertEquals("/tmp/sample.apk", selection.payload.filePath)
23+
assertEquals("/tmp/lib", selection.payload.nativeFilePath)
24+
assertEquals("APK", selection.payload.projectType)
25+
}
26+
27+
@Test
28+
fun `resolveIncomingSelection ignores legacy serializable fileItem extras`() {
29+
assertNull(
30+
resolveIncomingSelection(
31+
openAsProject = false,
32+
filePath = null,
33+
nativeFilePath = null,
34+
projectType = null,
35+
uri = null,
36+
extraStreamUri = null,
37+
displayName = null
38+
)
39+
)
40+
}
41+
}

0 commit comments

Comments
 (0)