Skip to content

Commit 1c94cf2

Browse files
committed
project: centralize project source file helpers
1 parent e07ed22 commit 1c94cf2

8 files changed

Lines changed: 35 additions & 10 deletions

File tree

app/src/main/java/com/kyhsgeekcode/disassembler/FileDrawerListAdapter.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ class FileDrawerListAdapter(val progressHandler: ProgressHandler) {
6363
}
6464
DrawerItemType.PROJECT -> {
6565
val projectModel = item.tag as ProjectModel
66-
val file = File(projectModel.sourceFilePath)
66+
val file = projectModel.sourceFile
6767
items.add(FileDrawerListItem(file, newLevel))
6868
if (projectModel.projectType == ProjectType.APK) {
69-
val libsFolder = File("${file.absolutePath}_libs")
69+
val libsFolder = projectModel.sourceLibrariesDirectory
7070
if (libsFolder.exists()) {
7171
items.add(FileDrawerListItem(libsFolder, newLevel))
7272
}
@@ -389,4 +389,4 @@ object FileNameComparator : Comparator<FileDrawerListItem> {
389389
fun dpToPx(dp: Int): Int {
390390
val density = appCtx.resources.displayMetrics.density
391391
return (dp * density).roundToInt()
392-
}
392+
}

app/src/main/java/com/kyhsgeekcode/disassembler/FileDrawerListItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ class FileDrawerListItem {
261261
}
262262
DrawerItemType.PROJECT -> {
263263
val projectModel = tag as ProjectModel
264-
val file = File(projectModel.sourceFilePath)
264+
val file = projectModel.sourceFile
265265
items.add(FileDrawerListItem(file, newLevel))
266266
if (projectModel.projectType == ProjectType.APK) {
267-
val libsFolder = File("${file.absolutePath}_libs")
267+
val libsFolder = projectModel.sourceLibrariesDirectory
268268
if (libsFolder.exists()) {
269269
items.add(FileDrawerListItem(libsFolder, newLevel))
270270
}

app/src/main/java/com/kyhsgeekcode/disassembler/project/ProjectDataStorage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ object ProjectDataStorage {
3636
fun resolveToRead(relPath: String): File? {
3737
requireNotNull(ProjectManager.currentProject)
3838
val paths = relPath.split("/")
39-
val projectOrig = File(ProjectManager.currentProject!!.sourceFilePath)
39+
val projectOrig = ProjectManager.currentProject!!.sourceFile
4040
var file = projectOrig.resolve(relPath)
4141
Log.d(TAG, "Orig cand: $file")
4242
if (file.exists() && !file.isDirectory)
@@ -47,7 +47,7 @@ object ProjectDataStorage {
4747
return newfile
4848
}
4949
Log.d(TAG, "Could not find from orig:$relPath")
50-
file = projectOrig.parentFile.resolve(relPath)
50+
file = requireNotNull(projectOrig.parentFile).resolve(relPath)
5151
if (file.exists() && !file.isDirectory)
5252
return file
5353
Log.d(TAG, "Could not find from libs: $file")

app/src/main/java/com/kyhsgeekcode/disassembler/project/models/ProjectModel.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ data class ProjectModel(
5555
val rootFile: File
5656
get() = requireNotNull(File(generatedFolder).parentFile)
5757

58+
val sourceFile: File
59+
get() = File(sourceFilePath)
60+
61+
val sourceLibrariesDirectory: File
62+
get() = File("${sourceFile.absolutePath}_libs")
63+
5864
val resolvedSourceDescriptor: ProjectSourceDescriptor
5965
get() = sourceDescriptor ?: legacyProjectSourceDescriptor(sourceFilePath)
6066
}

app/src/main/java/com/kyhsgeekcode/disassembler/ui/FileDrawerTree.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,10 @@ class FileDrawerTreeItem : TreeNode<FileDrawerTreeItem> {
176176
}
177177
DrawerItemType.PROJECT -> {
178178
val projectModel = tag as ProjectModel
179-
val file = File(projectModel.sourceFilePath)
179+
val file = projectModel.sourceFile
180180
items.add(FileDrawerTreeItem(file, newLevel))
181181
if (projectModel.projectType == ProjectType.APK) {
182-
val libsFolder = File("${file.absolutePath}_libs")
182+
val libsFolder = projectModel.sourceLibrariesDirectory
183183
if (libsFolder.exists()) {
184184
items.add(FileDrawerTreeItem(libsFolder, newLevel))
185185
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ fun fileItemTypeToProjectType(fileItem: FileItem): String {
454454

455455
fun copyNativeDirToProject(nativeFile: File?, project: ProjectModel) {
456456
if (nativeFile != null && nativeFile.exists() && nativeFile.canRead()) {
457-
val targetFolder = File(project.sourceFilePath + "_libs")
457+
val targetFolder = project.sourceLibrariesDirectory
458458
targetFolder.mkdirs()
459459
var targetFile = targetFolder.resolve(nativeFile.name)
460460
var i = 0

app/src/test/java/com/kyhsgeekcode/disassembler/ProjectManagerTest.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,23 @@ class ProjectManagerTest {
6666
assertEquals("content://samples/app.apk", project.resolvedSourceDescriptor.location)
6767
}
6868

69+
@Test
70+
fun `sourceFile exposes sourceFilePath as File`() {
71+
val project = projectModelFor("sample.apk")
72+
73+
assertEquals(File("sample.apk"), project.sourceFile)
74+
}
75+
76+
@Test
77+
fun `sourceLibrariesDirectory appends libs suffix next to source file`() {
78+
val project = projectModelFor("sample.apk")
79+
80+
assertEquals(
81+
File("${project.sourceFile.absolutePath}_libs"),
82+
project.sourceLibrariesDirectory
83+
)
84+
}
85+
6986
private fun projectModelFor(
7087
sourceName: String,
7188
sourceDescriptor: ProjectSourceDescriptor? = null

docs/maintenance/implementation-log.ko.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
| 이슈 `#719`, PR `#726` 릴리스 경로 부재 | tag push와 manual dispatch를 지원하는 `release.yml`을 추가하고 기존 CI를 최신 action 버전으로 정리 | 최신 브랜치에서 unsigned/signed APK를 GitHub Actions로 다시 만들고 배포할 수 있는 운영 경로를 복구했다 | `.github/workflows/ci.yml`, `.github/workflows/release.yml` | 완료 |
1212
| 저장소 정책 현대화 착수, 이슈 `#95` 대응 기반 | SAF 기반 선택 경로를 도입하고 `content://` 입력을 앱 내부 import 파일로 저장 | 외부 절대경로 전제를 줄이고, 재시작 이후에도 다시 열 수 있는 URI 권한 흐름을 시작했다 | `app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserActivity.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/viewmodel/MainViewModel.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/PermissionUtils.kt` | 진행 중 |
1313
| 이슈 `#95` 외부 문서 인텐트 권한 누락 | 앱이 `ACTION_VIEW``EXTRA_STREAM`으로 열린 경우에도 persistable grant 가능 여부를 계산하고 `content://` URI 권한을 선제적으로 유지 | SAF picker 밖에서 들어온 문서도 같은 storage 정책 흐름으로 흡수해서, provider가 허용하는 경우 앱 재실행 이후에도 접근이 끊길 가능성을 줄였다 | `app/src/main/java/com/kyhsgeekcode/disassembler/MainActivity.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/PermissionUtils.kt`, `app/src/test/java/com/kyhsgeekcode/disassembler/PermissionUtilsTest.kt` | 완료 |
14+
| 프로젝트 경계의 raw path 의존 | `ProjectModel`에 source helper를 추가하고 프로젝트 트리/리스트/저장소가 helper를 사용하도록 교체 | `sourceFilePath` 문자열 조합을 한곳으로 모아서 이후 `sourceDescriptor` 중심 구조로 더 옮기기 쉬운 상태를 만들었다 | `app/src/main/java/com/kyhsgeekcode/disassembler/project/models/ProjectModel.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/ui/FileDrawerTree.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/FileDrawerListAdapter.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/FileDrawerListItem.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/project/ProjectDataStorage.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/viewmodel/MainViewModel.kt`, `app/src/test/java/com/kyhsgeekcode/disassembler/ProjectManagerTest.kt` | 완료 |
1415
| broad storage 우회 경로 정리 | 더 이상 쓰지 않는 legacy picker 코드와 Android 11+의 `MANAGE_ALL_FILES_ACCESS` 유도 설정을 제거 | SAF 기반 경로를 기본 흐름으로 고정하고, 정책상 불리한 all-files access 진입점을 줄였다 | `app/src/main/java/com/kyhsgeekcode/disassembler/MainActivity.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/preference/SettingsFragment.kt`, `app/src/main/res/xml/pref_settings.xml`, `app/src/main/res/xml-v30/pref_settings.xml`, `app/src/main/res/values/array.xml` | 완료 |
1516
| 프로젝트 저장 모델 확장 | `sourceDescriptor`를 추가하고 새 프로젝트 생성 시 원본 유형을 함께 기록 | 기존 `sourceFilePath` 호환성은 유지하면서 이후 `Uri | file path | cache` 구분으로 넘어갈 발판을 만들었다 | `app/src/main/java/com/kyhsgeekcode/disassembler/project/models/ProjectModel.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/project/ProjectManager.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/viewmodel/MainViewModel.kt` | 완료 |
1617
| SAF와 파워유저 경로 분리 | 기본 import는 SAF 직행으로 두고, settings에서 power-user mode를 켰을 때만 `Advanced import`를 노출 | 기본 사용자 경로와 비정책적/고급 경로를 같은 UI에서 섞지 않고 분리했다 | `app/src/main/java/com/kyhsgeekcode/disassembler/importing/ImportEntryPointCatalog.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/preference/PowerUserModeSettings.kt`, `app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainTab.kt`, `app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserActivity.kt`, `app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserAdapter.kt`, `app/src/main/java/com/kyhsgeekcode/filechooser/model/FileItem.kt`, `app/src/main/res/xml/pref_settings.xml`, `app/src/main/res/xml-v30/pref_settings.xml` | 완료 |
@@ -34,6 +35,7 @@
3435
| 파워유저 import entry-point 테스트 | 통과 | standard mode는 SAF only, power-user mode는 advanced import 추가 |
3536
| 파워유저 advanced source catalog 테스트 | 통과 | power-user 비활성 시 advanced source 없음, 활성 시 선택된 source group만 노출 |
3637
| persistable URI permission helper 테스트 | 통과 | content scheme + persistable/read 플래그 조합만 유지 대상으로 판정 |
38+
| project source helper 테스트 | 통과 | source file 및 `_libs` 경로 계산이 helper 계약으로 고정 |
3739
| workflow YAML 파싱 | 통과 | `.github/workflows/ci.yml`, `.github/workflows/release.yml` 모두 Ruby YAML 파서 기준 확인 |
3840

3941
## 다음 웨이브 후보

0 commit comments

Comments
 (0)