Commit Graph

223 Commits (624076f787001d0fc00288b50cda9a33f3bcfe06)

Author SHA1 Message Date
RyuJongJin e6556a086e 시험: 흔들림 고침 (dismiss 105 · 165 드라이브)
- dismiss_test 105: 창이 뜨기 전에도 "비교하는 중" 이 없어 조건이 먼저 참이 되었다 → 창 제목이 뜨고 비교가 끝날 때까지 기다린다
- explorer_drives_test 165: 걸린 시간 (5초, 전체 시험 중 바쁘면 넘김) 대신 응답 없는 드라이브가 끝내 대답하지 않은 채로 목록이 떴는지 본다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:04 +09:00
RyuJongJin 36de96dd0b 해상도 올리기 메모리 설정 (176 보충)
- 환경 설정 > AI: 해상도 올리기 메모리 적게 (20%) · 보통 (30%, 처음 값) · 많이 (45%) - Android CPU 타일 크기
- 수준마다 이 기기에서의 타일 · 예상 메모리, 예시 시간 (16GB 폰)
- 빠르기 기록 열쇠에 메모리 설정을 넣어 다른 설정의 시간으로 어림하지 않음
- 모르는 설정 값은 보통

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:03 +09:00
RyuJongJin d6f3de130c Rsync 확인 창: 1280×720 에서 체크 · 경고가 버튼에 가리지 않게
- 미리 보기 높이를 화면 높이의 28% (140 이상) 로
- [원본 파일 지우기] 체크 · 경고를 미리 보기 위로
- 시험: 1280×720 에서 체크 · 경고가 버튼보다 위

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:03 +09:00
RyuJongJin 4f10cf167f 파일 탐색기 창마다 뒤로 · 앞으로 (75)
- 창마다 가 본 폴더 내역 (50개). 머리 줄 [←] [→], Alt+← / Alt+→, 마우스 4 · 5번 버튼
- 두 창일 때 마우스 4 · 5번은 마우스가 올라간 창에 적용하고 그 창을 활성으로 (창 밖이면 활성 창)
- 갈 폴더가 지워졌거나 열 수 없으면 그 항목은 버리고 지금 폴더는 그대로, 이유를 알림
- 시험: 버튼 · 단축키 · 마우스, 두 창 + 마우스 버튼, 지워진 폴더로 앞으로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:03 +09:00
RyuJongJin a7ef14382c 파일 탐색기 고르기 도구 (74) · 붙여넣기 줄에 남기기 · WebDAV 즐겨찾기 시험 (73 보충)
74: 고르기 막대에 "n개 표시함 · 합계 크기" (폴더는 개수만). [고르기 도구 ▾]: 반전 · 패턴으로 고르기 (*.srt, ?, ;, 대소문자 무시) ·
같은 확장자 모두. 범위: PC Shift+누르기, 폰은 첫 항목을 표시한 뒤 마지막 항목을 길게 눌러 [여기까지 범위 고르기] (시작점은 창마다).
73 보충: 복사 · 이동으로 담아 둔 것이 있으면 [붙여넣기] 는 좁아도 줄에 (pinned). WebDAV 폴더 즐겨찾기 - 마스터 문을 지나야 열림.
explorer_test · explorer_webdav_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:03 +09:00
RyuJongJin fe4ca6adb2 파일 탐색기 즐겨찾기 (73): 지금 폴더 넣기 · 창 위에서 한 번에 · Rsync 짝
- 창 맨 위 줄 맨 앞 ★ (즐겨찾기한 폴더면 채움) · 버튼 줄 [즐겨찾기] (처음 값 순서 · Rsync 버튼 줄에도).
- 즐겨찾기 창: 누르면 그 창이 그 폴더로, [지금 폴더 추가] (표시 이름 고침), 이름 바꾸기 · 빼기 (폴더는 그대로),
  바로 가기 (다운로드 · MKV 결과 폴더).
- Rsync 화면: [지금 짝 추가] 로 "왼쪽 ⇄ 오른쪽", 누르면 두 창이 함께. 설정 folderBookmarks.
- explorer_test (넣기 · 가기 · 빼기 · Rsync 짝 · 저장). 버튼이 늘어 기존 시험 두 곳 고침 (처음 값 순서 · [더 보기] 안의 [붙여넣기]).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:03 +09:00
RyuJongJin f86697c634 버전 2026.10.10_001
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 12:24:24 +09:00
RyuJongJin ae51fdfa34 원본 지우기 옵션: 확인 창에 보이는 것과 실제 실행을 같게 (178, 데이터)
환경 설정의 rsync 옵션에 --remove-source-files 가 있으면 [좌 → 우] 확인 창은 [원본 파일 지우기] 꺼짐 · [실행] 인데
실행하면 원본이 지워졌다 (사용자는 복사라고 믿음).
- rsyncArgs · robocopyRuns: 원본을 지우는 옵션 (--remove-source-files · --remove-sent-files · /MOV · /MOVE) 은 옵션 글에서 늘 빼고
  move (이동 · [원본 파일 지우기]) 일 때만 넣는다 - 탐색기 복사 · Rsync 확인 창 · 모니터링 다시 실행 모두.
- Rsync 확인 창: 설정 (기억한) 옵션에 원본 지우기가 있으면 체크를 켠 채로 · [이동] · 경고. 끄면 명령 줄 · 실행에서 빠진다.
  ⇄ 는 원본을 지우지 않는다고 알린다. 복사 확인 창 · 모니터링 카드의 옵션 줄도 실제 쓰는 것으로.
- sync_tools_test · explorer_webdav_test (끄면 원본이 남음).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:14:11 +09:00
RyuJongJin d5bb200d00 explorer_test 흔들림: Rsync 화면의 새 폴더가 골라질 때까지 기다리기
전체 시험 중 바쁠 때 새 폴더가 보인 직후 (골라지기 전) 확인해 실패했다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:14:11 +09:00
RyuJongJin 36e724afc1 AI 해상도 올리기 [이 장] 도 작업으로 · 큰 그림은 메모리에 맞는 타일 (176)
한 장 올리기가 작업 알림 · 앞 서비스 없이 돌아, 앱이 뒤에 있으면 Android 가 꺼 결과가 사라질 수 있었다 (S10: 엔진 6.6GB · 약 4분).
- AiJobs.runTask (1장) 로 - 작업 알림 · 앞 서비스 · 작업 현황. 다른 AI 일이 돌면 막는다.
- 진행 창 [뒤에서 계속]: 창만 닫고 계속. 화면에 남아 있으면 끝난 뒤 비교 화면, 떠났으면 작업 현황 끝 줄 [보기] (비교 → 저장,
  한 번만) 와 Android 끝 알림. 다음 일을 시작하면 남겨 둔 임시 결과를 지운다.
- Android CPU 타일: 기기 메모리 (/proc/meminfo) 의 20% 안에 드는 가장 큰 타일 (512 · 384 · 320 · 256 · 192), 모르면 큰 그림만 256.
- upscale_job_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:14:10 +09:00
RyuJongJin e46c73a317 맨 위 줄: 지금 화면 버튼 아래 밑줄
파란 아이콘 · 옅은 바탕에 더해 3px 밑줄 - 색만으로 알아보기 어려운 사람도 어디인지 알게 (좁은 · 넓은 화면 모두). batch_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 04:32:54 +09:00
RyuJongJin a66f3a8823 파일 탐색기 같은 이름 창: 두 파일의 크기 · 바뀐 날 · 어느 쪽이 새것인지 (172)
"doc.txt: 보낼 것 3B · 2026-10-09 12:00 / 있는 것 3B · 2026-10-01 08:00 (보낼 것이 더 새것)" (3개까지, 폴더는 "폴더").
_findClashes 가 vStat 으로 두 쪽을 함께 읽는다 (WebDAV 포함). explorer_conflict_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 04:25:48 +09:00
RyuJongJin f805403641 버전 고르기 창: 좁은 화면에서는 목록 위 · 바뀐 내용 아래 (168)
창 안 너비가 560 보다 좁으면 목록 (높이 40%, 최대 200) 과 고른 버전 · 바뀐 내용을 위아래로. 넓으면 예전처럼 나란히.
update_ui_test (400×800 · 1200×900).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 04:11:33 +09:00
RyuJongJin 968d62979c 프로그램 정보에 버전 · [최신 버전 확인], 결과는 버튼 옆에 (164)
환경 설정 > 프로그램 정보 맨 위에 "JJ_MKVMaker v<지금>" 과 [최신 버전 확인]. 결과 (최신 · 새 버전 · 확인 못 함) 는 알림이 아니라
버튼 옆에, 확인하는 동안 도는 표시. 업데이트 묶음의 버튼도 같은 위젯 (UpdateCheckButton). 새 버전이면 안내 창은 예전처럼.
checkForUpdate 에 onResult. update_ui_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 04:06:06 +09:00
RyuJongJin ecb1cf93b7 여러 장 AI 작업의 진행 줄: "10장 중 3장째 · 남은 약 …" (161)
폴더 · ZIP 전체 해상도 올리기와 AI 그림 여러 장. Android 진행 알림 · 작업 현황 · AI 그림 화면에 같은 줄.
제목에 붙이던 "3/10" · "남은 n장" 대신 AiJobs.total 로 센다. ai_upscale_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:56:00 +09:00
RyuJongJin afdbcfb2d7 웹 브라우저: 동영상을 못 찾은 페이지의 다운로드 버튼은 테두리만 (137)
- 덜 눈에 띄게 하려던 tonal 버튼이 이 테마에서 채움 버튼과 거의 같아 보였다 → OutlinedButton · IconButton.outlined.
- YouTube 첫 화면 · 구독 목록은 미리보기 <video> 가 있어 동영상 있음으로 보였다 → 동영상 주소가 정해진 사이트
  (YouTube · Vimeo · TikTok · 치지직 등) 는 주소로만, 그 밖은 페이지 안의 <video> 로 (downloadLooksUseful).
- browser_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:45:49 +09:00
RyuJongJin b1f2b1aef4 Android 업데이트 설치: 첫 시도가 다른 오류로 실패하면 1초 뒤 한 번 더 · 원문은 작업 기록에 (170 보충)
폴드에서 첫 시도만 실패하고 두 번째에 바로 된 일 (접은 화면 · 화면 전환 중으로 보임) - 사용자가 두 번 누르지 않아도 되게.
화면에 보이지 않는 첫 시도의 실패 원문 · "허용 필요로 왔지만 허용돼 있음" 은 app.log 에 남겨 다음에 진짜 원인을 볼 수 있게.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:44:18 +09:00
RyuJongJin bf72557fc3 AI 해상도 올리기 비교 화면: 저장하지 않고 닫으면 묻기 (160)
닫으면 올린 그림이 지워지므로 [닫기] · 뒤로 키 · 뒤로 몸짓 모두 "저장하지 않고 닫을까요?" ([취소] · [저장하지 않고 닫기] · [저장]).
위쪽 [저장] 은 묻지 않는다. 시험하려고 UpscaleCompareView 로 공개. upscale_compare_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:44:17 +09:00
RyuJongJin 06b6169ad8 Android 업데이트: 설치가 허용돼 있는데 "설치 허용 필요" 창이 뜨던 것 (170)
폴드 (Android 16 · 허용 allow) 에서 첫 설치 시도에 앱의 "설치 허용 필요" 창이 떴다 (Android 설정 화면은 열리지 않음 -
허용 문제가 아니라 다른 오류). Kotlin 이 installApk 안의 IllegalStateException 을 모두 "허용 필요" 로 보냈기 때문.
- Kotlin: 허용이 꺼져 설정 화면을 연 경우만 InstallPermissionNeededException → PERMISSION, 다른 오류는 "예외 이름: 원문" (INSTALL).
- 채널 canInstallPackages. Dart: PERMISSION 이 와도 허용돼 있으면 창 없이 다시 연다 (한 번).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:30:29 +09:00
RyuJongJin 76f8ab18da 버전 고르기 창: 처음엔 최신 버전을 골라 둔다 (169)
이 기기용 파일이 있는 것 중 가장 새 버전 (없으면 지금 버전). 이 창을 여는 사람은 대개 업데이트하려는 것.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:30:29 +09:00
RyuJongJin 3a220ab073 [MKV 만들기] 와 AI 버튼 구별 · AI 작업 전에 계획 보이기 (138)
[MKV 만들기] 와 [자막 만들기 & MKV 만들기] 를 헷갈려 오래 걸리는 AI 자막이 돌던 것.
- AI 버튼 (자막 만들기 · 자막 & MKV) 은 보라 테두리 · 글자 · ✨ 아이콘, [MKV 만들기] 는 청록 채움 · ▶.
  좁은 화면에서는 AI 버튼을 맨 뒤 구분선 너머로 (넓은 화면은 왼쪽 · 오른쪽으로 원래 떨어져 있음).
- AI 설정 창 맨 위에 계획: 할 일 · 대상 수 · 자막 언어 · 예상 시간 (영상 1시간 ≈ 음성인식 15~30분 + 번역 언어마다 10~20분).
- 환경 설정에서 "매번 묻기" 를 끈 경우는 사용자 설정대로 묻지 않되, 3초 알림
  "AI 자막 (동영상 n개 · 약 m분) 을 시작합니다 [취소]" 뒤에 시작해 잘못 누른 것을 되돌릴 수 있게.
- ai_confirm_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:12:14 +09:00
RyuJongJin 8c1ef5a03b 실패한 다운로드 줄을 쉬운 말로 (136): 진행 막대 대신 실패 · 이유 · [자세히] · [다시 시도]
- 실패하면 진행 막대 ("준비 중…") 를 지우고 사람 말 이유 (화면 언어): 주소에 영상이 없습니다 (404) · 로그인이 필요합니다 (403) ·
  연결할 수 없습니다 · 지원하지 않는 사이트입니다 · 저장 공간이 모자랍니다 · 받지 못했습니다 (그 밖). yt-dlp · aria2 (errorCode) 같은 모양.
- yt-dlp 백엔드는 원문을 저장하고 화면에서 바꾼다. [자세히] 는 원문 - 주소의 서명 · 키 (?… · #… · 아이디:비밀번호@) 는 가림 (redactUrlSecrets).
- [다시 시도] 는 기존 다시 받기. 진행 막대만 쓰는 곳도 실패면 "실패".
- download_error_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:52:57 +09:00
RyuJongJin 26f6389f02 MKV 화면 맨 위 줄: 다른 언어에서 버튼 글이 잘리던 것 (61)
줄이기 순서 (제목 → 버튼 글 → …) 를 정할 때 버튼 너비를 한국어 글로 잰 고정 값으로 셈해, 글이 긴 일본어
("字幕作成 & MKV 作成") 에서는 줄이기 전에 잘렸다 (S10 Ultra 가로). 지금 언어의 글 너비를 재어 차이를 더한다
(한국어는 그대로). 캡처 시험: 실제 서비스로 일본어 1644 · 1480 · 1280 · 1138 · 960, 체크 0 · 50개.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:41:14 +09:00
RyuJongJin c986690b3c 환경 설정 > MKV 만들기 > 기본 자막 언어 (MKV 기본 자막 트랙 · 플레이어가 먼저 켜는 자막)
화면 언어 따르기 (처음 값) / 한국어 / English / 日本語 / 中文 / 직접 고르기 (자막 언어 목록).
화면은 일본어인데 한국어 자막을 기본으로 원하는 경우처럼, 고른 언어가 화면 언어보다 먼저.
설정 preferredSubtitleLanguage ('' = 화면 언어 따르기). i18n_small_test 에 시험.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:41:14 +09:00
RyuJongJin f429c59502 다국어 작은 것들 (61)
- 영어 복수형: 영어 글에서 수가 1 이면 단수 ("1 videos" → "1 video"). 11 · 21 · 1.5 는 그대로.
- 탐색기 복사 · 이동 확인: 문장 조각 + "복사할까요?" 를 잇던 것을 두 문장으로 (언어마다 어순이 깨졌음).
- MKV 기본 자막 트랙 · 플레이어가 먼저 켜는 자막: 늘 한국어 → 화면 언어 (목록에 없는 언어면 한국어).
- robocopy 진행: 종류 글 ("New File" 등) 이 아니라 탭 모양으로 파일 줄을 알아봐 일본어 · 중국어 Windows 에서도.
- Android 저장소 이름: 내장 · SD 카드는 앱 화면 언어로 (Kotlin 이 isPrimary 를 넘김), USB 등은 기기 이름 그대로.
- 기본 즐겨찾기 ("YouTube 구독" · 표시줄 · 기타): 한국어 열쇠로 저장하고 이름을 바꾸지 않았으면 화면 언어로
  (예전 판이 다른 언어로 저장한 기본 이름 포함). 바꾼 이름 · 사용자 항목은 그대로.
- i18n_small_test · sync_tools_test (일본어 · 중국어 robocopy 줄), 캡처 시험에 일본어 가로 첫 화면.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:29:58 +09:00
RyuJongJin f33a4b3547 휴지통 시험: 기본은 가짜 휴지통, 실제 휴지통은 JJ_TEST_REAL_RECYCLE=1 일 때만
전체 시험 도중에 끊기면 사용자 휴지통에 시험 흔적이 남았다 (10/10 01:31).
- 탐색기는 recycle() · restoreRecycled() 를 쓴다 (앱은 늘 실제 휴지통, 시험만 recycleBinForTest 로 바꿈).
- test/support/fake_recycle_bin.dart: 실제와 같은 규칙 (긴 경로 거부 · 되돌릴 때 덮지 않음 · 원래 폴더 없으면 안 만듦),
  다른 드라이브면 복사 후 지움. useTestRecycleBin() 은 JJ_TEST_REAL_RECYCLE=1 이 아니면 가짜로.
- recycle_bin_test 의 실제 휴지통 시험 3개와 긴 경로의 실제 함수 부르기는 실제 모드에서만.
  explorer_conflict · explorer · 캡처 시험 (b3 · check) 은 기본 가짜.
- windows_check_shot_test 의 "65 · 94 · 98" 은 144 뒤로 깨져 있었다 ([그대로 두기] 창을 닫지 않아 다음 크기에서 막힘) - 닫게 고침.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:11:38 +09:00
RyuJongJin 5601f9d4fb 화면 글자 검사기가 놓치던 것 잡기 · 찾은 번역 빠짐 고치기 (60)
- tool/l10n: trf( 뒤에서 줄을 바꾼 열쇠도 (앞 200글자까지 봄). tr 로 감싸지 않은 한글 글이 사전에 없으면
  "번역 안 된 글" 로 실패 (tr(변수) 로 쓰이는 글 포함). 일부러 번역하지 않는 자료는 // l10n-skip (줄) · // l10n-skip-file.
- 찾아 고친 것: Rsync 위아래 배치 버튼 "위 → 아래 · 위 ← 아래 · 위 ⇄ 아래", 컴포넌트 "AI 그림" 설명,
  AI 목록의 NVIDIA 라이선스 이름 (받기 화면), 라이선스 화면의 이름 · stable-diffusion.cpp 요약 (화면을 열 때 언어로),
  Android 되돌리기 안내 한 줄, 파일 작업 오류 글 (같은 이름 · 원본 없음 · 자기 안으로 · 쓸 수 없는 이름).
- 자료로 표시: 음성인식 말버릇 목록 (ai_subtitle) · 실제 폴더 이름 · PowerShell 스크립트.
- l10n_check_test: check.py 가 통과하는지, 검사기가 줄 바꾼 trf( · tr(변수) 글을 잡고 skip · raw 는 넘기는지.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:39:33 +09:00
RyuJongJin a37ae55e2d 보관 폴더에 README.txt (영어 · 한국어): "설정 보관" · "AI 모델 보관"
Download 아래 한국어 이름 폴더를 한국어를 모르는 사용자도 알아보게 만들 때 안에 README.txt 를 둔다
(이미 있으면 그대로). 보관본 고르기 · 모델 되살리기에는 끼지 않는다. 작은 파일이라 동기로 쓴다
(비동기면 되돌리기 흐름에 기다릴 단계가 늘어 update_ui_test 의 Android 되돌리기가 시간 안에 끝나지 않았다).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:39:32 +09:00
RyuJongJin 388d01a0e3 오류 메시지 안쪽을 화면 언어로 (59)
- 컴포넌트 설치 (진행 단계 글 포함) · WebDAV (실패 글 · 상태별 힌트 · 동작 이름) · cron · rsync 설치 · 복사 (rsync · robocopy 종료 코드) ·
  이름 바꾸기 · 설정 복구 · 웹 번역 응답 · 그림 읽기의 오류 글을 tr / trf 로 (번역 3개 언어).
- explainFileError (예전 탐색기 _explain) 는 한국어 글과 화면 언어로 바뀐 글을 둘 다 보고 오류 종류를 가른다.
  WebDAV 실패 글은 상태 번호 앞 빈칸 (" 401") 을 번역에서도 지킨다.
- 컴포넌트 설정의 trStep (한국어 진행 글 앞부분만 번역) 은 할 일이 없어 지움.
- file_error_test: ja 에서 로컬 서버의 401 · 403 · 404 오류 글에 한국어가 없고 종류를 맞게 가르는지
  (시험 바인딩이 HttpClient 를 가짜로 바꾸므로 이 시험에서만 HttpOverrides 를 풂).
- 폴더 이름 "설정 보관" · "AI 모델 보관" 은 예전 보관을 찾아야 하므로 그대로 둔다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:11:17 +09:00
RyuJongJin a4afdda5c6 Android 알림 글 · 채널 이름을 화면 언어로 (57)
- 앱이 고른 언어라 Android 의 values-xx 로는 맞출 수 없어, Dart (AndroidKeepAlive) 가 시작할 때와 화면 언어가 바뀔 때
  번역된 글 8개 (진행 알림 제목, "작업 멈춤" 알림, 채널 2개의 이름 · 설명) 를 보낸다.
- Kotlin 은 받은 글을 SharedPreferences 에 저장해 앱이 꺼진 뒤 서비스만 떠도 마지막 언어로 쓰고,
  이미 만든 채널은 같은 ID 로 다시 만들어 이름 · 설명만 바꾼다. 받은 적이 없으면 한국어.
- notification_texts_test: Kotlin 기본값과 Dart 의 한국어 글이 같은지, ja 로 바꾸면 모두 번역되는지.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:48:24 +09:00
RyuJongJin abeb3d8999 옮기기: 시작하면 바로 목록에서 빼고, 옮기지 못하면 원래 자리 · 표시 · 선택으로 되돌리기
- 다른 드라이브 · NAS 로는 복사라 큰 동영상이 1초 넘게 목록에 남아 보였다 (1GB 시험 파일 M: → C: 1,079ms, 같은 드라이브 22ms).
- 데이터 버그 고침 (moveFileInto): 다른 드라이브로 복사한 뒤 원본을 지우지 못하면 (열려 있음 등) 대상 폴더에 사본이
  남아 두 벌이 됐다. 이제 방금 만든 사본을 지우고 오류를 낸다 (원본은 그대로).
  같은 함수를 쓰는 app_controller 안의 다른 두 곳 (옆 자막 · jj_mkv 결과물 함께 옮기기) 도 시험으로 확인했다:
  자막 · 결과물을 열어 둔 채 옮기면 동영상만 옮겨지고, 자막 · 결과물은 원래 자리에 하나만 남는다
  (고치기 전 코드로는 이 시험이 실패하는 것도 확인).
- move_test: 옮기는 중 목록에 없음 → 실패하면 복원 · 대상에 사본 없음, 함께 옮기는 파일의 실패.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:48:24 +09:00
RyuJongJin bd0b75ce7b move_test 흔들림: 세 번 눌러 옮긴 뒤 목록에서 빠질 때까지 기다리기
전체 시험 중 바쁠 때 파일은 옮겨졌는데 목록 (c.videos) 에서 빠지는 것이 늦어 실패했다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:30:01 +09:00
RyuJongJin cd81f6db37 라이선스 원문 (175): 네이티브 구성 요소 · 받는 AI 모델의 저작권 줄과 허가 문구를 그 판 그대로
- assets/licenses 에 원문 9개를 더한다 (tool/licenses/fetch_licenses.py 로 상류에서 그 판 그대로 받아 만든다):
  · STABLE_DIFFUSION_CPP_LICENSES: sd.cpp 228c707 과 sd-cli 에 함께 묶인 ggml · libwebp · libwebm · Oniguruma · Darts-clone ·
    utf8proc · nlohmann/json · miniz · stb · zip
  · WHISPER_CPP_LICENSE (v1.9.1) · ONNXRUNTIME_LICENSES (1.15.1, Third Party Notices 포함)
  · 받는 모델: CreativeML OpenRAIL-M (SD1.5) · OpenRAIL++-M (LCM-LoRA) · TAESD · Real-ESRGAN · Whisper 모델 · NLLB (CC BY-NC 4.0)
- 라이선스 화면에 원문으로 등록. AI 그림 받기 화면의 줄마다 [원문], 동의 창에 [라이선스 원문 보기].
- NLLB 를 받는 곳 (AI 자막 · 번역 · 화면 언어 더하기) 에 "비상업적 이용만 허용" 과 [원문].
- SD1.5 licenseUrl 을 원문이 있는 CompVis 저장소로 (사본 저장소의 LICENSE.md 는 없음).
- THIRD_PARTY_NOTICES (Windows · Android) 에 원문 위치. Windows 는 whisper.cpp · onnxruntime 원문을 실행 파일 옆에도.
- licenses_test: MIT 는 Copyright 줄 + "Permission is hereby granted", BSD 는 "Redistribution and use", OpenRAIL 은 부속서 A,
  NLLB 는 NonCommercial 정의까지. AI 목록의 파일마다 원문 asset 이 있는지.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:29:19 +09:00
RyuJongJin 6010aa908b explorer_test: tearDown 의 임시 폴더 지우기를 될 때까지 기다리기
Windows 에서 방금 닫은 파일 (65 의 잠금 시험) 이나 색인 · 백신이 잠깐 잡고 있으면 지우기가 실패할 수 있다.
100ms 씩 최대 약 5초 다시 지운다. (65 만 20번 연달아 돌려 모두 통과 - 실패는 재현되지 않음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:29:19 +09:00
RyuJongJin 4c0bc0b9ce Flutter 기본 글을 화면 언어로 (140 · 158): 뒤로 · 라이선스 화면 · 복사 · 붙여넣기 메뉴 등
- flutter_localizations 를 더하고 MaterialApp 이 화면 언어 (i18n) 를 바꿀 때만 다시 그려진다.
- Flutter 가 아는 언어면 그 언어 (앱이 더한 기계 번역 언어 포함, 예 de · vi), 모르는 언어일 때만 영어. 한국어가 섞이지 않는다.
- supportedLocales 는 kMaterialSupportedLanguages 전체 + 지금 언어 (zh-Hant · pt-BR 처럼 글자 체계 · 나라까지 그대로).
- Material 만 알고 Cupertino 는 모르는 언어 (ps) 는 Cupertino 글만 영어로 채운다.
- 시험: locale_test (de → Zurück, 없는 언어 → Back, zh-Hant 유지, ps 열림).
- Windows 캡처 시험 (windows_i18n_shot_test): 라이선스 목록을 다 읽은 뒤까지 찍는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:54:24 +09:00
RyuJongJin f331672e3a 진행 표시: 해상도 올리기는 모델을 읽는 동안 숫자 없이 (167) · 큰 파일 하나도 보낸 바이트로 오름 · 끝난 진행 창의 이름 (171)
- 167: sd-cli 의 모델 읽기 막대를 올리기 진행으로 읽어 처음부터 100% 였다. 읽는 동안은 움직이는 막대,
  올리기는 타일 n/m 으로 % 와 "약 n초 남음" (upscaleProgressOf)
- 앱이 직접 복사할 때 항목마다 바이트 크기와 보낸 바이트로 진행률 (이름 바꾸기로 옮기면 파일 수로),
  보내는 동안 0.2초마다 알림 - 큰 파일 하나가 끝날 때까지 0% 에 머물던 것
- 171: 끝난 진행 창의 " 안의 파일" 에 마지막 항목 이름
- 시험: upscaleProgressOf, 256KB 를 256KB/s 로 복사하는 도중 20~100%

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:14:31 +09:00
RyuJongJin 794f484c19 explorer_test 흔들림: "여러 개 표시 →" 시험이 전체 시험 중에만 실패하던 것 - 될 때까지 기다리기
- 표시 직후 "2개 표시함" 을 될 때까지 기다림, 이 파일의 settle 은 300번 (최대 9초) 까지 (되면 바로 나옴)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:14:31 +09:00
RyuJongJin daac19a514 157 · 162 끝난 작업 알림은 따로 "끝난 작업" 채널로 · [열기] 는 Android 에서 이 앱의 탐색기로
- 157: 끝 알림이 진행 알림 채널 (조용히, 낮은 중요도) 에 올라가 알림 창의 조용한 칸에 묻혔다 -
  새 채널 "끝난 작업" (보통 중요도, 소리 없음, 설정에서 따로 끌 수 있음)
- 162: ExplorerPage.openAt - 이 앱의 탐색기를 그 폴더로 (이미 열려 있으면 그 화면에서, 처음 열면 첫 창으로).
  AI 해상도 끝 알림 · 작업 현황의 [열기] 가 Android 에서 이것을 씀 (Windows 는 Windows 탐색기).
  폴더 메뉴의 "파일 관리자에서 보기" 로 다른 파일 앱도 그대로 열 수 있다
- 시험: openAt 으로 열기 · 열린 채로 다른 폴더

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:03:55 +09:00
RyuJongJin cc05fcad3c 174 MKV 화면이 맨 처음 화면이 아니어도 (홈 화면 = 탐색기 등) MKV 아이콘이 "지금 여기"
- 위쪽 아이콘 줄이 MKV 를 맨 처음 화면일 때만 알아봐, 홈 화면이 다른 화면인 사용자는 MKV 화면에서 아무것도 파랗지 않았다
- 다른 화면처럼 MKV 화면이 스스로 알린다 (AppNavButtons onMkvPage)
- 시험: 다른 화면 위에 연 MKV 화면에서 MKV 아이콘이 지금 여기

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:52:18 +09:00
RyuJongJin 746082db22 147 좁은 화면의 버튼 줄: 들어가지 않는 버튼은 [더 보기] 메뉴로 · 창 배치 버튼은 늘 줄에 · 처음 값은 자주 쓰는 것부터
- 버튼 줄은 밀어 넘기는 줄이라 아래쪽 버튼 (숨은 항목 표시 등) 을 찾지 못했다 - 들어가는 만큼 보이고 나머지는 [더 보기 ⋯]
- 창 배치 (두 창으로 / 좌우 ⇆) 는 사용자 요청대로 늘 줄에 (넘치면 마지막 자리를 내줌)
- 처음 값 (버튼 구성을 바꾸지 않았을 때 · [기본값]) 순서: 복사 · 이동 · 삭제 · 새 폴더 · 이름 변경 · 선택 · 찾기 · 창 배치 → 나머지.
  사용자가 정한 순서는 그대로
- 시험: 낮은 화면에서 [더 보기] · 메뉴로 숨은 항목 표시 · 창 배치 버튼은 줄에 · 처음 값 순서 · 정한 순서 유지

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:52:34 +09:00
RyuJongJin 6a5aea5ff2 135 · 146 · 37-2 같은 폴더로 이동 · 복사는 창으로 알림 · 경로 입력은 칸 아래 오류 · 지워진 폴더는 상위로
- 135: [이동] 을 모두 이미 그 폴더에 있는 것으로 하면 "이미 이 폴더에 있습니다" 창 (짧은 알림은 놓치기 쉬움).
  섞어 고르면 이미 있는 것만 건너뛰고 나머지를 옮김 (확인 창 · 끝난 알림에 "이미 이 폴더에 있어 건너뜀: …").
  [복사] 를 모두 같은 폴더로 하면 "같은 폴더에 사본을 만들까요? (이름 (2))" [취소] / [사본 만들기] (확인 창은 한 번만)
- 146: 경로 입력 창은 없는 경로면 닫지 않고 칸 아래 "폴더가 없거나 열 수 없습니다", 고치면 오류를 지움
- 37-2: 보던 폴더가 밖에서 지워지면 새로 읽을 때 남아 있는 가장 가까운 상위 폴더로, "보던 폴더가 없어져 상위 폴더로 옮겼습니다"
- 시험: explorer_conflict_test (135 · 135 보충 · 146 · 37-2), explorer_parallel_test 의 경로 입력 시험은 창이 열린 채로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:23:29 +09:00
RyuJongJin 6a90ae5706 51 MKV 목록: 동영상 줄을 길게 누르면 오른쪽 클릭과 같은 메뉴 · "목록에서 빼기 (파일은 그대로)"
- 터치 화면에서 길게 누르면 누른 자리에 메뉴 (그 줄 선택, 짧은 진동). 한 번 · 두 번 · 세 번 누르기는 그대로
- 메뉴의 "삭제 (목록에서 제거)" 를 "목록에서 빼기 (파일은 그대로)" 로 - 파일이 지워진다고 오해하지 않게
- AI 자막 만들기 · 인터넷 자막 찾기는 쓸 수 있을 때 (오른쪽 클릭 메뉴와 같은 조건) 나온다
- 시험: 길게 누르기 → 선택 · 메뉴, 한 번 누르기는 메뉴 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:02:24 +09:00
RyuJongJin ba332f9f84 E10 · 50 보충: 로컬 폴더를 읽지 못하면 빈 폴더로 보이지 않게 ("읽을 수 없습니다 · 이유" 와 [다시 시도])
- listEntries 가 Directory.list 의 오류를 버려 권한 없는 폴더 · 빠진 USB · 없는 폴더가 빈 폴더로 보였다.
  하나도 읽지 못했으면 그 오류를 던지고, 일부를 읽은 뒤의 오류는 읽은 것까지 보여 준다
- 부르는 다른 곳: [폴더 재생] 은 이유 알림, [MKV 목록에 추가] 는 읽지 못한 폴더를 건너뛰고 알림, 그림 보기는 고른 그림만
- 시험: 빈 폴더 · 없는 폴더 · C:\System Volume Information (권한 없음) - 탐색기에 "이 폴더를 읽을 권한이 없습니다" 와 [다시 시도]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:52:38 +09:00
RyuJongJin c25a754035 50 Android 가 막은 폴더 (Android/data · obb): 빈 폴더가 아니라 "이 폴더는 Android 가 막아 볼 수 없습니다" · [위 폴더로]
- Android 11 부터 이런 폴더는 오류 없이 빈 목록으로 읽힌다 - 막힌 것이라고 알리고 그 앱의 내보내기 · 공유를 안내
- 다시 해도 같으므로 [다시 시도] 대신 [위 폴더로]
- 시험: file_error_test (경로 판별 · 안내 글)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:52:03 +09:00
RyuJongJin de967d190a 49 탐색기 뒤로 키: 먼저 고른 것 풀기 → 상위 폴더 → 맨 위에서 화면 닫기 (위쪽 ← 는 늘 닫기)
- 탐색기 · Rsync 화면에 PopScope: 시스템 뒤로 (Android 뒤로 키 · 몸짓 · 마우스 뒤로 · Esc) 만 차례를 거친다
- 위쪽 ← 는 브라우저처럼 늘 바로 닫기 (Navigator.pop)
- 시험: 선택 → 뒤로 (풀기) → 뒤로 (상위) → 뒤로 (닫기). 66-2 캡처 시험 (integration_test/windows_662_shot_test) 도 함께

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:29:03 +09:00
RyuJongJin 01600ec69a 66-2 화면 옮기기: 지금 화면 아이콘 파랗게 · 민 쪽으로 미끄러지는 전환 · 처음으로 / 끝 알림 · 브라우저 안내 한 줄 (한 번)
- 지금 화면 아이콘: 넓은 화면도 파란 글자 + 옅은 바탕 (좁은 화면은 바탕 더함)
- 좌우로 밀기 · 이전 · 다음으로 옮길 때만 민 쪽에서 미끄러져 들어옴 (NavSlideTransitionsBuilder, 그 밖은 기본 전환)
- 끝에서 처음으로 넘어가면 "처음으로: …", 처음에서 끝이면 "마지막으로: …", 돌기를 끈 채 끝이면 "마지막 화면입니다" / "첫 화면입니다"
- 웹 브라우저 처음 열 때 위쪽 막대 아래 한 줄 안내 (✕ 로 닫음, browserSwipeHinted) - 알림이면 다른 알림을 뒤로 밀어서 한 줄로
- 캡처 시험: 154 · 155 를 새 화면에서 알림을 지운 뒤 찍음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:16:08 +09:00
RyuJongJin 1450b51316 묶음 3 Windows 확인 캡처 · 휴지통 시험 흔적 스스로 확인 · 꺼내는 드라이브가 비면 "비어 있음"
- integration_test/windows_b3_shot_test: 165 · 48 · 154 · 52 · 148 · 144 를 실제 화면으로 눌러 PNG (JJ_SHOT_DIR)
- 휴지통을 건드리는 시험은 끝에 사용자 휴지통 전체에서 시험 폴더 아래 (하위 포함) 가 원래 위치인 항목이 0 인지 확인
  (test/support/recycle_leftovers.dart)
- 165 보충: 카드 리더 · USB · CD (GetDriveType 2 · 5) 가 열리지 않으면 "연결 안 됨" 이 아니라 "비어 있음" (회색)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:55:29 +09:00
RyuJongJin f97f63df79 144 긴 경로 지우기: 휴지통에 넣지 못한 이유는 한 줄 · 이름만 · [그대로 두기] / [영구 삭제 (n개, 되돌릴 수 없음)]
- 휴지통이 받지 않는 긴 경로 (260자 넘음) 는 LongPathException 으로 따로 모아, 실패 창 위에 이유 한 줄과 이름만
- [영구 삭제] 는 그 항목만 지우고 결과를 알림. 긴 경로가 없으면 예전처럼 [확인]
- 시험: 긴 경로 폴더 → 이유 한 줄 · [그대로 두기] 면 남음 · [영구 삭제] 면 지움
- recycle_bin_test: 148 의 "원래 폴더 없음" 시험이 휴지통에 남긴 것을 정확히 그 폴더로 찾아 지우게 (사용자 휴지통에 남던 것)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:31:07 +09:00
RyuJongJin e1e3316d8d 탐색기: 이동해도 그 폴더를 고르지 않음 · 148 휴지통으로 보낸 뒤 [되돌리기]
- 드라이브 탭 · 경로로 가기 · 상위 폴더 · .. · [열기] 로 가도 그 폴더를 복사 · 이동 대상으로 잡지 않는다
  (누르거나 표시하지 않은 폴더가 대상이 되지 않게, 위치는 지금 폴더 표시 · 스크롤로)
- 148: 휴지통으로 보낸 알림 (10초) 에 [되돌리기]. 이 사용자 (SID) 의 휴지통에서 보낸 시각 뒤의 $I 를 찾아 $R 을 원래 경로로.
  원래 자리에 같은 이름이 있거나 원래 폴더가 그사이 지워졌으면 되돌리지 않고 알림 (폴더를 다시 만들지 않음)
- 시험: 실제 휴지통으로 되돌리기 · 같은 이름 · 원래 폴더 없음 · 휴지통에 없음, 탐색기 [휴지통으로] → [되돌리기], 상위 폴더 뒤 [복사]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:23:58 +09:00
RyuJongJin 8f5d2204f0 흔들리는 시험 2개: 정해 둔 시간 대신 될 때까지 기다리기 (decisions_test 126 · drop_test)
- 전체 시험 중 PC 가 바쁘면 실패하던 것 (따로 돌리면 통과). 흔들리는 시험이 실제 실패를 가리지 않게
- decisions_test 126: 설정 파일을 다시 읽어 migrated 가 빌 때까지 (최대 10초)
- drop_test: 안내 글이 뜰 때까지

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:23:57 +09:00