From 80c06c5ab306f6135b6b2b73ea1c65c95708729d Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Wed, 8 Apr 2026 15:58:56 +0900 Subject: [PATCH] ... --- app/src/main/cpp/Renderer.cpp | 3 ++- app/src/main/cpp/Renderer.h | 3 +++ app/src/main/cpp/native_renderer.cpp | 10 ++++++++ .../bums/lunatic/launcher/LauncherActivity.kt | 6 ++++- .../launcher/wall/MyWallpaperService.kt | 23 ++++++++++++++++++- .../lunatic/launcher/wall/NativeRenderer.kt | 7 ++++++ .../launcher/workers/TorrentManager.kt | 2 -- 7 files changed, 49 insertions(+), 5 deletions(-) diff --git a/app/src/main/cpp/Renderer.cpp b/app/src/main/cpp/Renderer.cpp index 1e7fd68f..b94a66c4 100644 --- a/app/src/main/cpp/Renderer.cpp +++ b/app/src/main/cpp/Renderer.cpp @@ -110,7 +110,8 @@ void Renderer::handleAnimationState(ANativeWindow_Buffer& buffer, int surfaceWid bool isCycleComplete = animationStrategy_->execute(this, buffer, currentMedia_, surfaceWidth, surfaceHeight); - if (isCycleComplete && nextMedia_.isValid()) { + if ((isCycleComplete || forceNextFlag_) && nextMedia_.isValid()) { + forceNextFlag_ = false; // 플래그 초기화 lastAnimationState_ = animationStrategy_->getState(); predictedNextAnimationMode_ = predictNextAnimationMode(); currentState_ = RenderState::TRANSITIONING; diff --git a/app/src/main/cpp/Renderer.h b/app/src/main/cpp/Renderer.h index f61965ff..564281dc 100644 --- a/app/src/main/cpp/Renderer.h +++ b/app/src/main/cpp/Renderer.h @@ -33,7 +33,10 @@ public: void startRenderLoop(ANativeWindow* window); void stopRenderLoop(); + bool forceNextFlag_ = false; +// 공개 메서드 추가 + void forceNext() { forceNextFlag_ = true; } void setAnimationSpeed(float speed); void setAnimationMode(int mode); void setFadeDuration(int durationMs); diff --git a/app/src/main/cpp/native_renderer.cpp b/app/src/main/cpp/native_renderer.cpp index f25cc7b3..b4095bc8 100644 --- a/app/src/main/cpp/native_renderer.cpp +++ b/app/src/main/cpp/native_renderer.cpp @@ -113,6 +113,16 @@ Java_bums_lunatic_launcher_wall_NativeRenderer_nativeRender(JNIEnv* env, jobject renderer->renderFrame(window); ANativeWindow_release(window); } + +extern "C" +JNIEXPORT void JNICALL +Java_bums_lunatic_launcher_wall_NativeRenderer_nativeForceNext(JNIEnv* env, jobject, jlong nativeHandle) { + Renderer* renderer = reinterpret_cast(nativeHandle); + if (renderer) { + renderer->forceNext(); // Renderer에 추가할 함수 호출 + } +} + extern "C" JNIEXPORT void JNICALL Java_bums_lunatic_launcher_wall_NativeRenderer_nativeSetWeatherBitmap(JNIEnv* env, jobject, jlong nativeHandle, jobject bitmap) { diff --git a/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt b/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt index 0e2b3ff4..4cea1805 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt @@ -171,7 +171,11 @@ open class LauncherActivity : CommonActivity() { // 각 구간별로 실행할 함수들 (예시) private fun handleTopLongPress() { - // 상단 전용 기능 + showToast("배경화면 전환 중...") + val intent = Intent("ACTION_NEXT_WALLPAPER") + // 같은 앱 내의 리시버로만 한정 (보안 및 정확성) + intent.setPackage(packageName) + sendBroadcast(intent) } private fun handleBottomLongPress() { diff --git a/app/src/main/kotlin/bums/lunatic/launcher/wall/MyWallpaperService.kt b/app/src/main/kotlin/bums/lunatic/launcher/wall/MyWallpaperService.kt index d02ccca6..26a2d674 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/wall/MyWallpaperService.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/wall/MyWallpaperService.kt @@ -2,6 +2,7 @@ package bums.lunatic.launcher.wall import android.app.ActivityManager import android.app.WallpaperManager +import android.content.Context import android.content.Intent import android.content.IntentFilter import android.graphics.Bitmap @@ -159,6 +160,16 @@ class MyWallpaperService : WallpaperService() { stopRendering() } } + private val nextMediaReceiver = object : android.content.BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent?) { + if (intent?.action == "ACTION_NEXT_WALLPAPER") { + Log.d(TAG, "Manual next wallpaper requested via Broadcast") + // 현재 콜백 객체의 함수를 직접 호출하여 다음 미디어로 넘김 + nextMediaCallback.onNextMediaRequested() + nativeRenderer?.forceNext() + } + } + } override fun onCreate(surfaceHolder: SurfaceHolder) { super.onCreate(surfaceHolder) @@ -166,7 +177,12 @@ class MyWallpaperService : WallpaperService() { Log.d(TAG, "onCreate: Engine created.") wasInPreview = isPreview() Log.d(TAG, "onCreate: Engine created. Initial isPreview = $wasInPreview") - + val filter = IntentFilter("ACTION_NEXT_WALLPAPER") + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { + registerReceiver(nextMediaReceiver, filter, Context.RECEIVER_NOT_EXPORTED) + } else { + registerReceiver(nextMediaReceiver, filter) + } ensureHandlerThread() } @@ -259,6 +275,11 @@ class MyWallpaperService : WallpaperService() { if (::handlerThread.isInitialized) { handlerThread.quitSafely() } + try { + unregisterReceiver(nextMediaReceiver) + } catch (e: Exception) { + // 리시버가 등록되지 않았을 경우 예외 방지 + } } diff --git a/app/src/main/kotlin/bums/lunatic/launcher/wall/NativeRenderer.kt b/app/src/main/kotlin/bums/lunatic/launcher/wall/NativeRenderer.kt index 7d2b1d78..55dac42e 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/wall/NativeRenderer.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/wall/NativeRenderer.kt @@ -41,6 +41,12 @@ open class NativeRenderer { } } + fun forceNext() { + if (nativeHandle != 0L) { + nativeForceNext(nativeHandle) + } + } + fun startNextPreload(fd: Int) { if (nativeHandle != 0L) { nativeStartNextPreload(nativeHandle, fd) @@ -124,6 +130,7 @@ open class NativeRenderer { private external fun nativeGetDebugInfo(nativeHandle: Long): String private external fun nativeSetPageTurnDelay(nativeHandle: Long, duration: Int) private external fun nativeSetTransitionMode(nativeHandle: Long, mode: Int) + private external fun nativeForceNext(nativeHandle: Long) // --- Companion Object --- companion object { diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/TorrentManager.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/TorrentManager.kt index 6fa05119..ccc6bcc0 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/workers/TorrentManager.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/TorrentManager.kt @@ -167,7 +167,6 @@ class TorrentService : Service() { // 상태가 실제로 변했을 때만 업데이트하여 불필요한 로그와 로직 실행을 방지합니다. if (isWifiConnected != wifiNow) { isWifiConnected = wifiNow - Blog.LOGE("와이파이 상태 변경: $isWifiConnected") updateSessionState() } } @@ -192,7 +191,6 @@ class TorrentService : Service() { if (curentTime - lastUpdateTime > 5000) { serviceScope.launch { lastUpdateTime = curentTime - Blog.LOGE("isWifiConnected $isWifiConnected isCharging $isCharging") val vector = session.swig().get_torrents() // (핸들, 계산된 우선순위 점수) val torrentsWithMetadata = mutableListOf>()