Commit Graph

19 Commits (23cc9f6e5bbd01c6e67b5d8c8f6cb99008f79d7a)

Author SHA1 Message Date
RyuJongJin 23cc9f6e5b M4 1묶음: "Android 인지" 전역 함수 둘 (앱 관리자 단추 · 볼륨 키) 을 PlatformInfo 로 + WakeLock (보기 화면 화면 켜 두기) 을 주입으로
- ExplorerButton.explorerValues · defaultOrder · fromSettings 는 android 를 받는다 (부르는 쪽이 c.services.platform.isAndroid) -
  예전 바꿀 수 있는 전역 함수 appsButtonSupported
- 보기 화면 볼륨 키는 c.services.platform.isAndroid (예전 ReaderPage.volumeKeysSupported)
- PlatformServices.keepScreenOn (처음 값 WakelockPlus - 예전 ReaderPage.keepScreenOn)
- 시험: app_manager · explorer_archive_trash · explorer_conflict · reader · reader_more 는 주입으로 (2회 통과). 볼륨 키 시험은
  Android 조립과 Windows 조립 두 화면으로
- 사용자가 보게 될 동작: 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:00:31 +09:00
RyuJongJin 39b76e2423 M3 ThumbPolicy: 원격 썸네일 "Wi-Fi 에서만" 의 망 판단 (전역 함수 activeMeteredOf) 을 PlatformServices.isMetered 주입으로
- lan_scan.dart: deviceMetered (실제 - Android 만 묻고 PC 는 false, 물을 수 없으면 true) 는 그대로 함수로 두고, 바꿀 수 있는 전역 변수는 뺌
- remoteThumbsAllowedNow 는 c.services.isMetered 를 부름 (처음 값 = deviceMetered)
- 시험: remote_thumbs_test 는 isMetered 를 넘김 (2회 통과)
- 썸네일 캐시 상한 · 받기 허락은 이미 RemoteThumbs 생성자로 넘기는 값이라 그대로. netKindsOf (망 종류) 는 M4 LanFinder 몫
- 사용자가 보게 될 동작: 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:21:29 +09:00
RyuJongJin 26d6b01752 M3 PrivilegedFs: 시스템 폴더 · 루트 읽기의 static 넷 · 전역 함수 둘을 주입으로
- core/shizuku.dart PrivilegedFs: Shizuku 뒤쪽 · 루트 뒤쪽 · 임시 폴더를 한 곳에서. 앱은 켤 때 PlatformServices.privileged 를 건다
  (Android 조립만 PrivilegedFs.device(앱 임시 폴더) 를 넘김, 원격 서버 목록처럼 한 번). 예전 ShizukuRemote.backend · rootBackend ·
  tempDir · SuRoot.start (static) 를 대신 - SuRoot 의 프로세스 시작은 생성자로 넘김
- shizukuSupported · rootSupported (전역 함수) 를 빼고 c.services.platform.isAndroid (M1 PlatformInfo) 로
- Android 에서 Shizuku · 루트 내용을 잠깐 받는 곳이 시스템 TEMP (앱 캐시) → 앱 임시 폴더 (앱 데이터/tmp, 켤 때 비움) - 둘 다 앱 전용
- 시험: privileged_fs_contract_test (넘기면 걸고 안 넘기면 그대로 · device 꼴). shizuku · root · 보관함 시험은 PrivilegedFs.use 로 2회 통과
- 사용자가 보게 될 동작: 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:46:49 +09:00
RyuJongJin f1624759ba M3 VaultLocation: 보관함 자리 전역 함수 셋 (vaultDirOf · vaultViewRootOf · vaultPickFolder) 을 주입으로 + 실제 60만 번 시험
- lib/app/vault_location.dart: 보관함 폴더 · [보기] 로 잠깐 푼 파일 자리 · 꺼낼 폴더 고르기. device = 지금과 같은 실제 자리
  (앱 조립 PlatformServices.create 가 씀), under(tempDir) = 앱 임시 폴더 아래 (손으로 조립할 때 처음 값 - 시험이 사용자 보관함 ·
  앱 데이터를 건드리지 않음. 예전 flutter_test_config 의 전역 덮어쓰기를 대신)
- 보관함 화면 · 보기 세션 · 넣기 · 꺼내기 · 켤 때 남은 것 정리 (app_runtime) 가 c.services.vault (또는 넘겨받은 자리) 를 부른다
- KdfParams 점검: 반복 수는 이미 화면 · 만들기에 넘기는 값 (static 아님) - 바꾸지 않음. 실제 반복 수 (60만) 로 만들기 · 다시 열기 ·
  읽기 · 틀린 비밀번호 시험을 vault_modules_test 에 (2회 통과, 4초)
- 시험: vault_location_contract_test (손 조립 처음 값 · 주입 그대로). 보관함 시험 · 캡처는 주입으로
- 사용자가 보게 될 동작: 없음 (자리는 그대로) - 보관함 캡처 앞 · 뒤 두 번씩 0px

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 14:01:05 +09:00
RyuJongJin 1b09030b80 W FloatingAction: 떠 있는 단추 자리 판단을 FloatingActions 하나로 + 작업 기록 시계 주입 + 캡처 흔들림 고정
- lib/ui/floating_actions.dart: 좁거나 낮으면 (글자 배율로 나눈 높이 500 미만 - F7) 내용 안 단추 줄, 넓으면 오른쪽 아래에 떠 있고
  내용 아래를 단추 높이만큼 비움 (206). MKV 자세히 [이동] 단추가 부르기만 한다 (예전에는 화면 안에 판단 · Stack 이 있었음). 보이는 것 그대로
- MessageText 점검: 문장 잇기는 이미 joinSentences (tr.dart) 하나 - 손으로 빈칸 잇는 곳 없음, 바꾸지 않음
- 주입: PlatformServices.clock → AppLog(now:) (처음 값 실제 시계 - 작업 기록의 [시:분:초])
- 시험: floating_actions_contract_test (떠 있음 / 내용 안 · 비울 높이 · 첫 단추 맨 아래 · floatingInline 4 경우)
- 캡처 흔들림 (시험 쪽): mkvdetail (폴더 · 시각 · 기록 시각) · bigtext (JJ_SHOT_TMP 아래 · 드라이브 남은 공간 shotDevice).
  b3_52 의 받는 중 파일 (.jjpart) 시각은 찍기 전에 고정해 보았으나 복사가 아직 쓰는 중이라 목록이 읽은 시각이 남아 그대로 (까닭을 시험에 적음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 13:01:19 +09:00
RyuJongJin 48a2ba56dc W JjTitleBar 2: 창 · 판 안의 제목 줄 6곳을 JjHeaderRow 로 + F11 · G1 · G2 를 새 구조로 옮김 (7247aeb · a22832d, after_1020)
- lib/ui/jj_header_row.dart: 아이콘 · 제목 (titleLines 줄까지, "…") · 설명 (넓으면 옆, 좁으면 제목 아래 - 숨기지 않음) ·
  단추 (늘 오른쪽 끝에 다 보임, 좁으면 narrowActions). 다운로드 창 · 재생 목록 판 · 즐겨찾기 판 · 작업 현황 판 ·
  저장 공간 정리 창 · 화면 · 색 보정이 부르기만 한다
- F11 (7247aeb): 화면 · 색 보정 제목 줄 - 560 미만이면 안내 글은 제목 아래, [모두 초기화] 는 같은 이름의 아이콘 단추, ✕ 늘 보임
- G1 (a22832d): 다운로드 종료 창 제목 두 줄까지 · ✕ 늘 보임
- G2 (a22832d): jjTitleBar 에 lowerActions - AI 비교는 600 미만이면 원본 / 올린 것 고르기만 둘째 줄 가운데, [저장] 은 그대로.
  앱 안 폴더 고르기는 단추 셋이 함께 둘째 줄로
- 시험: jj_header_row_contract_test · windows_hdr360_shot_test (a22832d 에서 옮김 - 앞 판은 360 에서 47px 넘쳐 실패)
- 캡처 흔들림 고정 (시험 쪽): bigtext (폴더 · 기록 시각 · 대상 디스크) · magnet (움직이는 "준비 중…" 막대, TickerMode)
- 주입: AppController.note(at:) (처음 값 지금) · PlatformServices.diskSpace + DiskSpaceInfo(space:) (처음 값 실제 디스크)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 03:28:46 +09:00
RyuJongJin eaaa096ea1 (가) 10곳: 시험이 앱 동작을 바꾸던 길을 주입 · 모듈로 (lib 의 @visibleForTesting 은 들여다보기 4곳만 남음)
- Tor: debugRunning · executable 없앰 → 떠난 뒤 잠시 켜 두기를 IdleStop 모듈로 (schedule · cancel · stopNow).
  환경 설정 > Tor 는 IdleStop 을 받음 (처음 값 = 앱의 Tor), [지금 끄기] = stopNow
- Wi-Fi 공유: debugLoopbackOnly · debugAddresses · loopbackOnly 인자 없앰 → WifiShareNet 주입 (열 주소 · 설정 열기).
  WifiSharePage(net:) 가 debugLaunch 를 대신함. debugFail 없앰 - 시험이 실제 다른 루프백 주소 (127.0.0.x) 에서 틀린 코드를 보냄
- 관리자 권한: Elevation.debugElevated 없앰 → PlatformInfo.elevated (조립 주입), CefView(elevated:)
- CEF 시작 시간: 바꿀 수 없게 (const) - 시험은 가짜 시간을 넘김
- 단일 실행: debugStopListening 없앰 - 시험이 instance.json 을 아무도 듣지 않는 포트로 (받는 곳이 죽은 첫 창)
- SMB 찾기: 전역 debugFindSmbServers 없앰 → PlatformServices.findLanSmb 주입
- 남은 @visibleForTesting (들여다보기만): browser_page · tor_page debugNav, secret_store dpapiAt, reader_page dropMissingFiles

확인: analyze 0 · 단위 1473 ×2 · 통합 6/6 ×2 · base10 214장 0px · windows_wifi_shot ×2 · windows_smbfind_shot ×2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:06:00 +09:00
RyuJongJin 3434ad4937 M1-2: lib 의 …ForTest 이름 정리 (실제 기능 · 주입으로)
- SuRoot.resetForTest → forgetGrant (이번 실행의 su 허락 잊기)
- ComGuard.releaseForTest → release (ensure 와 짝인 CoUninitialize)
- debugUpscalerForTest 전역 → PlatformServices.createUpscaler 주입
- 원격 썸네일 reset…ForTest 3개 → forgetRemoteThumbHub · forgetRemoteRangeSupport · forgetRemoteThumbNet
- vaultIterationsForTest 전역 → VaultPage(iterations:) (처음 값 VaultCrypto.defaultIterations)
- 남은 recycleBinForTest 는 M2 (TrashBackend) 에서 정리

확인: analyze 0 · 단위 1470 ×2 · 통합 6/6 ×2 · base10 214장 0px · com_guard_test · windows_vault_shot_test ×2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:45:32 +09:00
RyuJongJin 2199d7c15f M1-1: "Android 인 척" 스위치 · 실패 흉내 플래그를 주입으로 (PlatformInfo · WebViewProxyTarget)
- MemorySecretStore.failRead/failWrite 를 없앰 → 시험 쪽 test/support/flaky_secret_store.dart
- WebProxy.debugAndroid/debugSetProxy 를 없앰 → WebViewProxyTarget 주입 (Android=ProxyController, 그 밖=없음)
- ExitGuard.forceAndroid 를 없앰 → PlatformServices.platform (PlatformInfo)
- JJ_NLLB_LOW_MEMORY 환경 변수를 없앰 → NllbTranslator(lowMemory:), 처음 값은 PlatformInfo.host
- archive_ops · rsync_launch · file_error 의 기본값을 PlatformInfo.host 로 모음
- 이름 바꿈: WebProxy.shownForTest → shown, debugReset → reset
- 보안: 남은 Tor 웹 뷰가 있는 동안에도 removeImplicitRules (localhost 까지 Tor 로)
- 약속 시험 platform_info_contract_test 3개

확인: analyze 0 · 단위 1470 ×2 · 통합 6/6 ×2 · base10 214장 0px

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:05:31 +09:00
RyuJongJin 7fe2f0562f 설정 A: MKV · 자막 분야 (MkvSettings) - 저장 위치 · 이동 버튼 · 인코딩 · AI 자막 · OpenSubtitles 키를 분야로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 00:11:13 +09:00
RyuJongJin 6beeb22e43 설정 A 분야 7: 다운로드 · YouTube (DownloadSettings) - 키 12
- settings_group.dart 에 pickEnum (분야들의 읽기가 같이 씀 - fromJson 의 지역 함수 pick 대신)
- AppSettings.resolvedDownloadRoot 는 download.root 를 씀

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:20:58 +09:00
RyuJongJin 6b60f348e2 WIP 마그넷: 인터넷 IPv6 가 없으면 (Tailscale ULA 뿐) aria2 의 IPv6 끔 - 시작되지 않던 것 (28 확인) · 정한 시간 (처음 60초) 동안 메타데이터 · 피어가 없으면 줄에 이유 후보 · [다시 시도] · 실제 마그넷 받기 통합 시험 (JJ_REAL_MAGNET=1) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 11:32:40 +09:00
RyuJongJin 597d853943 비밀번호 안전 저장 · 동기화 안전장치 · 휴지통 · 시작 메뉴 알림 · 보기 화면 (계속 보기 · 두 쪽 · 회전) · 탐색기 배치 등
- 40/54: WebDAV · OpenSubtitles 비밀번호를 안전 저장소 (Android Keystore · Windows DPAPI) 로
- 95~114: rsync 지우기 확인 · 미리 보기 · 좁은 화면 확인 창 · 실시간 동기화 멈춤 알림
- 99: 시작 메뉴 바로 가기 (AUMID) · jjmkvmaker:// · Windows 알림 꺼짐 안내
- 102: 질문을 설정으로 · 시스템 언어 따르기
- 113 · 117~120: 보기 화면 막대 · 계속 보기 · 두 쪽 나눠 보기 · 회전 · 반전 · 좁으면 ⋮ 메뉴
- 115 · 116: 자동 백업 복원 알림 · 권한 안내와 자동 다시 분석
- 118 · 122: 탐색기 좌우 ⇆ / 위아래 ⇅ 버튼 · 경로로 가면 새로 읽어 펼침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:25:08 +09:00
RyuJongJin 7df26039c9 화면 언어: 한국어 · English · 日本語 · 简体中文, 언어 추가 (AI 자동 번역) · 삭제, 바꾸면 화면 전체가 바로 그 언어로
- 모든 화면 글자를 tr() / trf() 로 (한국어 원문이 사전 열쇠), assets/l10n 에 영어 · 일본어 · 중국어 사전
- 더한 언어는 이 기기의 NLLB 번역 모델로 영어 사전을 자동 번역해 설정 폴더 l10n 에 저장
- 언어 이름 · 선택 목록 · 모델 이름은 화면에 보일 때 번역 (파일명 인식 규칙은 그대로)
- tool/l10n: 새 글자 감싸기 · 사전 점검

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 14:13:02 +09:00
RyuJongJin 18d003f392 설정 맨 위: 프로그램 정보 · 최신 버전 확인 (Windows · Android), Android 업데이트
- 환경 설정 맨 위에 지금 버전 · [최신 버전 확인] · 시작할 때 확인 (아래쪽 예전 업데이트 칸은 옮김)
- Android: GitHub 최신 Release 의 APK 를 받아 SHA256 확인 후 Android 설치 화면으로 (AndroidUpdater, MainActivity.installApk,
  FileProvider, REQUEST_INSTALL_PACKAGES). 앱을 끝내지 않고 설치 화면이 이어서 설치. 시작할 때 하루 한 번 자동 확인
- Release 해석: 플랫폼별 설치 파일 (win64.zip / android_arm64.apk), 설명의 SHA256 은 그 파일 이름이 있는 줄에서
- 시험용 --dart-define=JJ_VERSION_OVERRIDE (지금 버전을 낮춰 업데이트 과정 점검)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 03:31:30 +09:00
RyuJongJin 0160c7591d Android 다운로드: 앱 안 브라우저 [다운로드] · 다운로드 목록 (yt-dlp · aria2c)
- youtubedl-android 0.18.1 (Python · yt-dlp · ffmpeg · aria2c) 을 넣고, MainActivity 가 처음 켤 때 풀어
  실행 경로 · 환경 변수를 알려 준다. 받을 때마다 새 yt-dlp 확인 (못 받아도 계속)
- YtDlpBackend · Aria2Backend: 실행 명령 앞 인수 · 환경 변수 · JS 실행기 (deno / quickjs) 를 받게 해 Windows 와 같은 코드로 실행
- 다운로드 엔진은 처음 쓸 때 준비 (앱 시작을 늦추지 않음), 실패하면 다음에 다시 시도
- 기본 위치: 내장 저장소 Download/JJ_MKVMaker. 환경 설정에 다운로드 위치 · YouTube 형식 · 화질 · 쿠키 · 동시 다운로드 수 표시
- R8 keep 규칙 (youtubedl-android 의 Jackson · 압축 풀기 클래스)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 21:36:15 +09:00
RyuJongJin bf6429dc76 Android 판 (APK): FFmpeg (ffmpeg-kit) 로 MKV 만들기, 앱 안 파일 고르기, 저장소 접근 권한, Windows 전용 설정 숨김
- 플러그인 사본: flutter_inappwebview_android (AGP 9 빌드 오류), ffmpeg_kit_flutter_new_min_gpl (Android 만), whisper_ggml (같은 FFmpeg 사용)
- 64비트 ARM 만, 배포 키 서명 (android/key.properties, 저장소에 올리지 않음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:46:08 +09:00
RyuJongJin 1ba49ffa8d v2026.09.30_001: 일괄 작업, 다운로드 진행률 · 쿠키 재시도, 상태 표시
- 버전 표기를 년.월.일_순번 으로 변경 (tool/next_version.ps1)
- 동영상 목록 여러 개 선택 · 정렬, 자막 만들기 / 자막 만들기 & MKV 만들기 /
  선택한 파일 재생 일괄 실행
- 다운로드: 동영상 추가 버튼, 완료시 자동 동영상추가, 받은 크기 / 전체 크기,
  yt-dlp 진행률 출력 복구 (--no-quiet --progress), 영상 + 음성 진행률 합산
- YouTube 쿠키를 못 읽으면 앱 안 브라우저 쿠키 → 쿠키 없이 순서로 재시도
- 모든 화면 오른쪽 위에 CPU · MEM · DISK, 환경 설정 · 종료 버튼
- 단축키로 창 보이기 / 숨기기 전환, 종료 시간 단축 (exit.log 에 단계별 시간)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 21:31:07 +09:00
RyuJongJin c05a657756 JJ_MKVMaker v1.0.0
동영상 + 자막 → MKV, 자막 편집 · AI 자막 · 번역, 플레이어,
웹 브라우저 · 다운로드 (yt-dlp · aria2), 작업 대기열, 자동 업데이트.

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