From 86f387b2fa58f950f9231d09192b963dcf97e734 Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Mon, 30 Mar 2026 14:28:54 +0900 Subject: [PATCH] ... --- .../bums/lunatic/launcher/home/GeckoWeb.kt | 13 ++++++--- .../lunatic/launcher/home/NeoRssActivity.kt | 29 ++++++++++--------- .../lunatic/launcher/receiver/NLService.kt | 11 ++++--- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt index bab856ca..6ba809da 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt @@ -53,6 +53,8 @@ import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDLRequest import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.launch import okhttp3.OkHttpClient import okhttp3.Request @@ -252,7 +254,8 @@ open class GeckoWeb @JvmOverloads constructor( } } - fun checkIfDownloadable(firstUrl: String, forMusic: Boolean = false) { + var checkIfDownloadableJob : Job? = null + suspend fun checkIfDownloadable(firstUrl: String, forMusic: Boolean = false) { if (firstUrl.startsWith("about")) { return } @@ -262,8 +265,8 @@ open class GeckoWeb @JvmOverloads constructor( it.setOnClickListener {} it.visibility = GONE } - - CoroutineScope(Dispatchers.IO).launch { + checkIfDownloadableJob?.cancelAndJoin() + checkIfDownloadableJob = CoroutineScope(Dispatchers.IO).launch { try { val request = YoutubeDLRequest(cleanUrl).apply { // 1. yt-dlp 업데이트 강제 (가장 중요!) @@ -618,7 +621,9 @@ open class GeckoWeb @JvmOverloads constructor( CoroutineScope(Dispatchers.IO).launch { saveYoutubeCookiesToFile() } - checkIfDownloadable(currentCookieUrlString) + CoroutineScope(Dispatchers.IO).launch { + checkIfDownloadable(currentCookieUrlString) + } } "SCROLL_STATE" -> { // Blog.LOGE("${msg.type} : ${msg.value}") diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt index db0dabd1..c7bea30c 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt @@ -127,9 +127,8 @@ open class NeoRssActivity : CommonActivity() { } override fun dispatchKeyEvent(ev: KeyEvent): Boolean { - Blog.LOGE("keyEvent >>>>> ${ev?.device?.name}:dispatchKeyEvent >>> ${ev} ") + if (ev?.device?.name?.contains("JX-05") == true) { -// (ev.action?.equals(KeyEvent.ACTION_DOWN) == true || ev.action?.equals(KeyEvent.ACTION_UP) == true) if (ev.action?.equals(KeyEvent.ACTION_UP) == true) { when(ev.keyCode) { KEYCODE_MEDIA_PLAY_PAUSE->{ @@ -150,7 +149,6 @@ open class NeoRssActivity : CommonActivity() { if (ev?.device?.name?.contains("SM-031N Mouse") == true) { when(ev.action) { ACTION_UP -> { - Blog.LOGE("dispatch dispatchKeyEvent>>> ${ev}") when(ev.keyCode) { KEYCODE_BUTTON_Y->{ @@ -265,7 +263,7 @@ open class NeoRssActivity : CommonActivity() { private fun onRemoteKeyDetected(keyType: String, isDouble : Boolean = false) { Blog.LOGE("Remote Mapping Success: $keyType") - val currentFragment = supportFragmentManager.fragments.find { it.isVisible } + val currentFragment = targetFragment ?: supportFragmentManager.fragments.find { it.isVisible } if (currentFragment is RemoteGestureFragment && currentFragment.isRemoteEnabled) { when(keyType) { "UP_ARROW"->{currentFragment.onRemoteUp(isDouble)} @@ -288,7 +286,7 @@ open class NeoRssActivity : CommonActivity() { } override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { - Blog.LOGE("keyEvent >>>>> dispatchTouchEvent ${ev}") +// Blog.LOGE("keyEvent >>>>> dispatchTouchEvent ${ev}") if (ev?.device?.name?.contains("JX-05") == true) { // 리모컨 이벤트인 경우 제스처 디텍터에 위임 if (remoteGestureDetector.onTouchEvent(ev)) { @@ -507,22 +505,22 @@ open class NeoRssActivity : CommonActivity() { private var lastTouchX = 0f private var lastTouchY = 0f - + var targetFragment : Fragment? = null // private val fragmentMap = mutableMapOf() fun showContents(id : Int) { if (id == View.NO_ID) { - Blog.LOGE("무효한 ID(-1) 호출로 인해 showContents를 취소합니다.") +// Blog.LOGE("무효한 ID(-1) 호출로 인해 showContents를 취소합니다.") return } - Blog.LOGE("targetFragment id ${id}") +// Blog.LOGE("targetFragment id ${id}") // 1. 모든 관련 레이어 가시성 확보 binding.fragmentContainer.isVisible = true val transaction = supportFragmentManager.beginTransaction() val tagKey = "TAG_$id" - Blog.LOGE("targetFragment id ${id} tagKey ${tagKey}") +// Blog.LOGE("targetFragment id ${id} tagKey ${tagKey}") // 2. 매니저에 등록된 모든 프래그먼트를 찾아서 숨김 (중복 방지) val allFragments = supportFragmentManager.fragments for (f in allFragments) { @@ -532,7 +530,7 @@ open class NeoRssActivity : CommonActivity() { } // 3. 대상 프래그먼트 찾기 (findFragmentByTag 우선) - var targetFragment = supportFragmentManager.findFragmentByTag(tagKey) + targetFragment = supportFragmentManager.findFragmentByTag(tagKey) if (targetFragment == null) { // 처음 호출되는 메뉴라면 인스턴스 생성 및 추가 @@ -562,13 +560,16 @@ open class NeoRssActivity : CommonActivity() { } targetFragment?.let { - Blog.LOGE("targetFragment id ${id} key : ${tagKey}, instance ${targetFragment}") +// Blog.LOGE("targetFragment id ${id} key : ${tagKey}, instance ${targetFragment}") transaction.add(R.id.fragment_container, it, tagKey) } } else { - Blog.LOGE("targetFragment id ${id} key : ${tagKey}, instance ${targetFragment}") +// Blog.LOGE("targetFragment id ${id} key : ${tagKey}, instance ${targetFragment}") // 이미 생성된 프래그먼트가 있다면 다시 보여줌 - transaction.show(targetFragment) + targetFragment?.let { + transaction.show(it) + } + } transaction.commit() @@ -625,7 +626,7 @@ open class NeoRssActivity : CommonActivity() { onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { Blog.LOGE("handleBackPress") - val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) + val currentFragment = targetFragment ?: supportFragmentManager.findFragmentById(R.id.fragment_container) if (currentFragment == null) showContents(R.id.close) when(currentFragment) { is RssHome ->{ diff --git a/app/src/main/kotlin/bums/lunatic/launcher/receiver/NLService.kt b/app/src/main/kotlin/bums/lunatic/launcher/receiver/NLService.kt index 8949f41d..34e46f5f 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/receiver/NLService.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/receiver/NLService.kt @@ -88,11 +88,11 @@ class NLService : NotificationListenerService() { // 이름이 왔을 때 -> 주소록에서 번호 조회 val foundNumber = getPhoneNumberByName(applicationContext, cleanTitle) if (foundNumber != null) { - Blog.LOGE("이름($title)으로 번호($foundNumber) 조회 성공") +// Blog.LOGE("이름($title)으로 번호($foundNumber) 조회 성공") WorkersDb.logContactInteraction(foundNumber, UsageUpdateType.SMS) } else { // 주소록에도 없는 이름일 경우 (이름 자체로 로그를 남기려면 WorkersDb 수정 필요) - Blog.LOGE("주소록에서 찾을 수 없는 이름: $title") +// Blog.LOGE("주소록에서 찾을 수 없는 이름: $title") } } } @@ -159,7 +159,7 @@ class NLService : NotificationListenerService() { val regex = Regex("[^가-힣ㄱ-ㅎ0-9a-zA-Z]") val cleaned = input.replace(regex, "").trim() - Blog.LOGE("정제 전: [$input] -> 정제 후: [$cleaned]") +// Blog.LOGE("정제 전: [$input] -> 정제 후: [$cleaned]") return cleaned } @@ -233,11 +233,10 @@ class NLService : NotificationListenerService() { } override fun onNotificationRemoved(sbn: StatusBarNotification) { - Blog.LOGE("onNotificationPosted ${sbn}") +// Blog.LOGE("onNotificationRemoved ${sbn}") if (sbn.packageName == "bums.lunatic.launcher" && sbn.id == 830721) { // 포그라운드 알림이 사라짐 감지 - Blog.LOGE("NotificationListener", "포그라운드 알림 제거 감지") - +// Blog.LOGE("NotificationListener", "포그라운드 알림 제거 감지") // 서비스 재시작 시도 val intent = Intent(this, ForeGroundService::class.java) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {