프로젝트

일반

사용자정보

Actions

정리 #46

완료됨

BBPlayer 완성

이태훈이(가) 약 한달 전에 추가함. 약 한달 전에 수정됨.

상태:
완료
우선순위:
보통
담당자:
시작시간:
2026/03/25
완료기한:
2026/03/25
진척도:

100%

추정시간:

설명

완료된 기능 구현

1. Android Immersive 모드 적용 (v4.14)

  • initState에서 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky) 호출
  • 플레이어 진입 시 시스템 UI 고정 숨김
  • 컨트롤 표시/숨김 전환 시 MediaQuery.padding 변화로 인한 레이아웃 이탈 현상 완전 해결
  • disposeedgeToEdge로 복원

2. 컨트롤 숨김 시 터치 차단 방식 변경 (v4.15)

  • 기존: AnimatedOpacityIgnorePointer로 래핑
    • 문제: 컨트롤 외부 GestureDetector의 스와이프 제스처까지 모두 차단
  • 변경: SlideronChanged / onChangeStart / onChangeEnd_controlsVisible 조건부 null 처리
    • 진행바만 비활성화되고 스와이프·탭 제스처는 정상 동작 유지

3. Android 뒤로가기 동작 개선 (v4.16)

  • PopScope(canPop: false) 적용으로 시스템 뒤로가기 버튼 인터셉트
  • _saveAndPop()에서 현재 재생 위치 DB 저장 후 SystemNavigator.pop()으로 앱 완전 종료
    • DS File 등 외부 앱에서 실행한 경우 해당 앱으로 복귀
  • PC(Windows/macOS)는 기존 Navigator.pop() 유지 (홈 화면으로 이동)

4. Android 홈 화면 최근 목록 숨김 (v4.17)

  • Android는 DS File 등 외부 앱 인텐트로 직접 플레이어를 실행하는 패턴으로 최근 목록이 불필요
  • Platform.isAndroid 조건으로 최근 목록 리스트 및 전체 삭제 버튼 미표시 처리
  • Android 홈 화면은 파일/폴더 열기 버튼만 표시

5. Android 시스템 제스처 충돌 방지 — 엣지 데드존 (v4.18)

  • 화면 좌/우/하단 32dp 이내에서 시작한 스와이프를 BBPlayer 제스처로 처리하지 않음
  • _isEdgeTouch() 헬퍼 메서드, _gestureCancelled 플래그 추가
  • 수직 드래그(밝기/볼륨) 및 수평 드래그(탐색) 핸들러 모두 적용
  • Android 시스템 UI 표시용 엣지 스와이프와의 충돌 해결

6. SMI 자막 형식 지원 (v4.19)

  • 자동 로드 확장자 목록에 .smi 추가 (기존: .srt / .ass / .ssa)
  • 수동 로드 파일 선택 다이얼로그에 smi 확장자 추가
  • mpv 기반 media_kit이 SAMI 형식을 네이티브 지원하므로 별도 파싱 불필요
  • 싱크 오프셋(SubtitleService)은 SRT 전용으로 SMI에는 미적용

7. 3.4.7 재생 중 파일 교체 — Android 제외 (v4.20)

  • Android는 외부 앱 인텐트로 직접 실행하는 패턴이므로 재생 중 파일 교체 기능 불필요
  • 상단 바 파일 열기 버튼 및 Ctrl+O 단축키를 !Platform.isAndroid 조건으로 제한

8. 3.5.1 진행바 썸네일 미리보기 (v4.21)

  • 플랫폼: Windows / macOS 전용 (마우스 입력 환경)
  • 별도 _thumbPlayer (Player) 인스턴스로 메인 재생 중단 없이 프레임 seek
  • LayoutBuilder로 슬라이더 실제 너비 계산
  • MouseRegion (onHover / onExit) 으로 호버 위치 추적
  • 150ms 디바운스 후 _thumbPlayer.seek() + screenshot()Image.memory() 팝업
  • 160×90 썸네일 + 시간 레이블 표시
  • 드래그 중(_isDragging) 팝업 자동 숨김

9. 3.5.4 드래그 앤 드롭 (v4.22)

  • 플랫폼: Windows / macOS 전용 (desktop_drop 패키지)
  • DropTarget으로 전체 화면 래핑 (Android는 조건부 제외)
  • 드롭 위치 판별: detail.localPosition.dx로 플레이리스트 패널(우측 300px) 여부 확인
드롭 위치 동작
비디오 영역 현재 파일 교체 (다중 파일 시 전체 플레이리스트 교체 후 첫 번째 재생)
플레이리스트 패널 위 (패널 열림 상태) 파일을 목록 끝에 추가
  • 드래그 중 영역별 시각 피드백 오버레이 표시
상태 오버레이
플레이리스트 닫힘 전체 화면 파란 테두리 + "파일을 드롭하여 재생"
플레이리스트 열림 — 좌측 파란 영역 "파일 교체"
플레이리스트 열림 — 우측 초록 영역 "목록에 추가"

10. 3.5.2 자막 자동 검색 취소

  • 외부 API 의존성 및 유지보수 부담 대비 실용성 부족으로 계획 취소
  • 동일 폴더 자막 자동 로드(3.2.1)로 대체 가능

버그 수정

# 증상 원인 해결
1 컨트롤 숨김/표시 전환 시 버튼 위치 이탈 MediaQuery.padding이 시스템 UI 표시 여부에 따라 변동 immersiveSticky로 시스템 UI 고정 숨김
2 컨트롤 숨김 상태에서 스와이프 제스처 불가 IgnorePointer가 외부 GestureDetector까지 터치 차단 Slider 콜백을 null 처리하는 방식으로 교체
3 PopScope 닫는 괄호 위치 오류로 빌드 실패 build() 메서드 종료 지점 이후에 괄호를 삽입 build() 내부 올바른 위치에 괄호 재배치
4 Android에서 뒤로가기 시 홈 화면으로 이동 Navigator.pop()은 앱 내 스택 이동 SystemNavigator.pop()으로 앱 완전 종료
5 Android 엣지 스와이프가 BBPlayer 제스처로 인식 드래그 시작 위치 판별 없음 32dp 엣지 데드존 검사 추가

변경된 파일 목록

파일 변경 내용
lib/screens/player_screen.dart immersive 모드, IgnorePointer → Slider null 방식, PopScope, _saveAndPop, 엣지 데드존, SMI 지원, 파일 교체 Android 제외, 썸네일 미리보기, 드래그 앤 드롭
lib/screens/home_screen.dart Android 최근 목록 및 삭제 버튼 숨김
pubspec.yaml desktop_drop: ^0.4.4 추가
개발계획서.md v4.22으로 업데이트, 3.5.1·3.5.4 완료, 3.5.2 취소
Actions

내보내기 Atom PDF