From b64df76c90aa31db7e9726b206ce55e57872cbae Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Tue, 21 Apr 2026 16:36:43 +0900 Subject: [PATCH] ... --- .../launcher/player/DocumentViewerActivity.kt | 4 +- .../lunatic/launcher/player/PlayerActivity.kt | 86 +++++++++++++++++-- 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/bums/lunatic/launcher/player/DocumentViewerActivity.kt b/app/src/main/kotlin/bums/lunatic/launcher/player/DocumentViewerActivity.kt index 798609b0..6661cde6 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/player/DocumentViewerActivity.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/player/DocumentViewerActivity.kt @@ -83,7 +83,9 @@ class DocumentViewerActivity : AppCompatActivity() { } override fun onSwipeLeft(count: Int) { pagedLayout.doNext() } override fun onSwipeRight(count: Int) { pagedLayout.doPrev() } - override fun onLongClick() { finish() } // 잠깐 확인용이므로 롱클릭 시 종료 + override fun onLongClick() { +// finish() + } // 잠깐 확인용이므로 롱클릭 시 종료 override fun onTimeoverTouch() {} override fun onSwipeDown(count: Int) {} override fun onSwipeUp(count: Int) {} diff --git a/app/src/main/kotlin/bums/lunatic/launcher/player/PlayerActivity.kt b/app/src/main/kotlin/bums/lunatic/launcher/player/PlayerActivity.kt index 136c60d5..695d851f 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/player/PlayerActivity.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/player/PlayerActivity.kt @@ -191,6 +191,81 @@ class PlayerActivity : AppCompatActivity(), TextureView.SurfaceTextureListener { private lateinit var tvTime: TextView private var uiUpdateJob: Job? = null private var isUserSeeking = false + private fun setupSyncControls(root: FrameLayout) { + val topControlLayout = android.widget.LinearLayout(this).apply { + orientation = android.widget.LinearLayout.HORIZONTAL + gravity = Gravity.CENTER + setPadding(0, 20, 0, 0) + } + + // [ -0.5s ] 버튼 + val btnPrev = TextView(this).apply { + text = " -0.5s " + setTextColor(Color.YELLOW) + setPadding(30, 10, 30, 10) + setBackgroundColor(Color.parseColor("#66000000")) + setOnClickListener { + adjustSubtitleSync(500) + + } + } + + // [ SYNC RESET ] 버튼 + val btnReset = TextView(this).apply { + text = " SYNC RESET " + setTextColor(Color.WHITE) + setPadding(40, 10, 40, 10) + setMargins(20, 0, 20, 0) + setBackgroundColor(Color.parseColor("#AA000000")) + setOnClickListener { + syncSubtitleToCurrentTime() + } + } + + // [ +0.5s ] 버튼 + val btnNext = TextView(this).apply { + text = " +0.5s " + setTextColor(Color.YELLOW) + setPadding(30, 10, 30, 10) + setBackgroundColor(Color.parseColor("#66000000")) + setOnClickListener { + adjustSubtitleSync(500) + } + } + + topControlLayout.addView(btnPrev) + topControlLayout.addView(btnReset) + topControlLayout.addView(btnNext) + + root.addView(topControlLayout, FrameLayout.LayoutParams(-2, -2, Gravity.TOP or Gravity.CENTER_HORIZONTAL).apply { + topMargin = 100 // 노치나 상태바 아래로 배치 + }) + } + + // 헬퍼 함수: Margin 적용용 + fun View.setMargins(l: Int, t: Int, r: Int, b: Int) { + if (layoutParams is ViewGroup.MarginLayoutParams) { + val p = layoutParams as ViewGroup.MarginLayoutParams + p.setMargins(l, t, r, b) + requestLayout() + } + } + + private fun syncSubtitleToCurrentTime() { + if (externalSubtitles.isEmpty()) return + + val currentVideoSec = nativePlayer?.getCurrentPosition() ?: 0.0 + val firstSubtitleStartSec = externalSubtitles[0].startSec + + val neededDelaySec = firstSubtitleStartSec - currentVideoSec + subtitleDelayMs = (neededDelaySec * 1000).toLong() + + currentSubtitleIndex = 0 + lastSubTitle = "" // 💡 추가: 즉시 갱신을 위해 비움 + + val sign = if (subtitleDelayMs >= 0) "+" else "" + Toast.makeText(this, "자막 기준점 동기화 완료: $sign${String.format("%.1f", -neededDelaySec)}초 보정", Toast.LENGTH_SHORT).show() + } private fun setupUI() { val root = FrameLayout(this).apply { setBackgroundColor(Color.BLACK) } @@ -280,7 +355,7 @@ class PlayerActivity : AppCompatActivity(), TextureView.SurfaceTextureListener { root.addView(bottomControlLayout, FrameLayout.LayoutParams(-1, -2, Gravity.BOTTOM)) root.addView(geckoWeb, FrameLayout.LayoutParams(-2, -2, Gravity.CENTER)) setContentView(root) - + setupSyncControls(root) hideSystemUI() } @@ -435,14 +510,15 @@ class PlayerActivity : AppCompatActivity(), TextureView.SurfaceTextureListener { private var subtitleDelayMs: Long = 0L private fun adjustSubtitleSync(deltaMs: Long) { subtitleDelayMs += deltaMs + + // 💡 핵심: 기존 자막 상태를 초기화하여 루프가 즉시 새 자막을 그리도록 유도 + lastSubTitle = "" + val seconds = subtitleDelayMs / 1000.0 val sign = if (subtitleDelayMs >= 0) "+" else "" Toast.makeText(this, "자막 싱크: $sign${String.format("%.1f", seconds)}초", Toast.LENGTH_SHORT).show() - - // 싱크가 변경되면 즉시 루프에서 반영되므로 별도의 처리는 필요 없으나, - // 즉각적인 피드백을 위해 lastSubTitle을 초기화하여 강제 갱신 유도 가능 - lastSubTitle = "" } + override fun onConfigurationChanged(newConfig: android.content.res.Configuration) { super.onConfigurationChanged(newConfig) hideSystemUI()