From 7c5bf77f17dab0d9e080f12cb4db23aa3bfeab4f Mon Sep 17 00:00:00 2001 From: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> Date: Thu, 5 Nov 2026 09:44:56 -0500 Subject: [PATCH] fix: fit output after pip resize --- .../main/java/com/droiddeck/launcher/SessionActivity.kt | 4 +++- .../main/java/com/droiddeck/launcher/session/PipPolicy.kt | 8 ++++++++ .../java/com/droiddeck/launcher/session/PipPolicyTest.kt | 6 ++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt index 6aa3354ba..023679de2 100644 --- a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt +++ b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt @@ -2220,7 +2220,9 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { } private fun windowOutputSize(width: Int, height: Int): Pair? { - if (isInPictureInPictureMode || width <= 0 || height <= 0) return null + if (width <= 0 || height <= 0) return null + if (isInPictureInPictureMode) return com.droiddeck.launcher.session.PipPolicy.outputSize( + width, height, SessionState.outputSize.first, SessionState.outputSize.second) if (bottomGame != null) return when { SessionState.followScreen -> com.droiddeck.launcher.session.SessionDisplay.followSize(width, height, false, SessionState.followScale) diff --git a/app/src/main/java/com/droiddeck/launcher/session/PipPolicy.kt b/app/src/main/java/com/droiddeck/launcher/session/PipPolicy.kt index d2d4d49bd..b5c9f112f 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/PipPolicy.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/PipPolicy.kt @@ -11,4 +11,12 @@ object PipPolicy { height.toDouble() / width > 2.39 -> 100 to 239 else -> width to height } + + fun outputSize(width: Int, height: Int, outputWidth: Int, outputHeight: Int): Pair? { + if (width <= 0 || height <= 0 || outputWidth <= 0 || outputHeight <= 0) return null + val scale = minOf(width.toFloat() / outputWidth, height.toFloat() / outputHeight) + val fittedWidth = ((outputWidth * scale).toInt() and 1.inv()).coerceAtLeast(2) + val fittedHeight = ((outputHeight * scale).toInt() and 1.inv()).coerceAtLeast(2) + return fittedWidth to fittedHeight + } } diff --git a/app/src/test/java/com/droiddeck/launcher/session/PipPolicyTest.kt b/app/src/test/java/com/droiddeck/launcher/session/PipPolicyTest.kt index 1261abd54..40b169fad 100644 --- a/app/src/test/java/com/droiddeck/launcher/session/PipPolicyTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/session/PipPolicyTest.kt @@ -24,4 +24,10 @@ class PipPolicyTest { assertEquals(100 to 239, PipPolicy.aspect(1080, 5760)) assertEquals(16 to 9, PipPolicy.aspect(0, 0)) } + + @Test fun pipOutputFitsTheResizedSurfaceWithoutChangingAspectRatio() { + assertEquals(640 to 360, PipPolicy.outputSize(640, 480, 1920, 1080)) + assertEquals(480 to 270, PipPolicy.outputSize(480, 270, 1920, 1080)) + assertNull(PipPolicy.outputSize(0, 270, 1920, 1080)) + } }