reduced logs for orientation changes

This commit is contained in:
BeZide93
2025-09-27 11:56:09 -05:00
committed by KeatonTheBot
parent c42663115b
commit 327416c967
2 changed files with 42 additions and 32 deletions
@@ -40,6 +40,9 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
// last known Android rotation (0,1,2,3) // last known Android rotation (0,1,2,3)
private var lastRotation: Int? = null private var lastRotation: Int? = null
// Debounce for resize kick
private var lastKickAt = 0L
var currentSurface: Long = -1 var currentSurface: Long = -1
private set private set
@@ -52,6 +55,11 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
mainViewModel.gameHost = this mainViewModel.gameHost = this
} }
private fun ghLog(msg: String) {
val enabled = BuildConfig.DEBUG && org.kenjinx.android.viewmodels.QuickSettings(mainViewModel.activity).enableDebugLogs
if (enabled) Log.d("GameHost", msg)
}
override fun surfaceCreated(holder: SurfaceHolder) { override fun surfaceCreated(holder: SurfaceHolder) {
// no-op // no-op
} }
@@ -112,10 +120,7 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
val id = mainViewModel.physicalControllerManager?.connect() val id = mainViewModel.physicalControllerManager?.connect()
mainViewModel.motionSensorManager?.setControllerId(id ?: -1) mainViewModel.motionSensorManager?.setControllerId(id ?: -1)
// ❌ Removed: initial "flip" at 270° (caused 90° lock at start right) // No initial "flip" special case: we give the real rotation downwards
// NativeHelpers.instance.setIsInitialOrientationFlipped(mainViewModel.activity.display?.rotation == 3)
// ✅ Correct: Report current Android rotation directly to the native site
val currentRot = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val currentRot = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
mainViewModel.activity.display?.rotation mainViewModel.activity.display?.rotation
} else { } else {
@@ -126,14 +131,12 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
KenjinxNative.setSurfaceRotationByAndroidRotation(currentRot) KenjinxNative.setSurfaceRotationByAndroidRotation(currentRot)
// Pass the window handle for safety reasons (if Surface has just been refreshed) // Pass the window handle for safety reasons (if Surface has just been refreshed)
try { KenjinxNative.deviceSetWindowHandle(currentWindowHandle) } catch (_: Throwable) {} try { KenjinxNative.deviceSetWindowHandle(currentWindowHandle) } catch (_: Throwable) {}
// Swapchain/Viewport “knock”: set identical size again // gentle kick: set identical size again
if (width > 0 && height > 0) { if (width > 0 && height > 0) {
try { KenjinxNative.resizeRendererAndInput(width, height) } catch (_: Throwable) {} try { KenjinxNative.resizeRendererAndInput(width, height) } catch (_: Throwable) {}
} }
} catch (_: Throwable) {} } catch (_: Throwable) {}
// NO graphicsRendererSetSize here – we set it via the stabilizer!
_guestThread = thread(start = true, name = "KenjinxGuest") { _guestThread = thread(start = true, name = "KenjinxGuest") {
runGame() runGame()
} }
@@ -192,7 +195,7 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
if (_isClosed) return if (_isClosed) return
if (w <= 0 || h <= 0) return if (w <= 0 || h <= 0) return
try { try {
Log.d("GameHost", "safeSetSize: ${w}x$h (started=$_isStarted)") ghLog("safeSetSize: ${w}x$h (started=$_isStarted)")
KenjinxNative.graphicsRendererSetSize(w, h) KenjinxNative.graphicsRendererSetSize(w, h)
if (_isStarted) { if (_isStarted) {
KenjinxNative.inputSetClientSize(w, h) KenjinxNative.inputSetClientSize(w, h)
@@ -203,8 +206,8 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
} }
/** /**
* Called on the activity when the rotation/layout changes. * Called by the activity when the rotation/layout changes.
* Detects 90°↔270° and immediately forces a NativeWindow query. * Detects 90°↔270° and forces (debounces) a requery/resize.
*/ */
fun onOrientationOrSizeChanged(rotation: Int? = null) { fun onOrientationOrSizeChanged(rotation: Int? = null) {
if (_isClosed) return if (_isClosed) return
@@ -225,13 +228,17 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
try { KenjinxNative.deviceSetWindowHandle(currentWindowHandle) } catch (_: Throwable) {} try { KenjinxNative.deviceSetWindowHandle(currentWindowHandle) } catch (_: Throwable) {}
} catch (_: Throwable) {} } catch (_: Throwable) {}
// 3) Swapchain/Viewport directly “knock”, set identical size again // 3) Debounced kick of identical size (update swap chain/viewport)
val now = android.os.SystemClock.uptimeMillis()
if (now - lastKickAt >= 300L) {
lastKickAt = now
val w = if (holder.surfaceFrame.width() > 0) holder.surfaceFrame.width() else width val w = if (holder.surfaceFrame.width() > 0) holder.surfaceFrame.width() else width
val h = if (holder.surfaceFrame.height() > 0) holder.surfaceFrame.height() else height val h = if (holder.surfaceFrame.height() > 0) holder.surfaceFrame.height() else height
if (w > 0 && h > 0) { if (w > 0 && h > 0) {
try { KenjinxNative.resizeRendererAndInput(w, h) } catch (_: Throwable) {} try { KenjinxNative.resizeRendererAndInput(w, h) } catch (_: Throwable) {}
} }
} }
}
startStabilizedResize(rotation) startStabilizedResize(rotation)
} }
@@ -273,7 +280,6 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
// If rotation is known: Force plausibility (Landscape ↔ Portrait) // If rotation is known: Force plausibility (Landscape ↔ Portrait)
expectedRotation?.let { rot -> expectedRotation?.let { rot ->
// ROTATION_90 (1) / ROTATION_270 (3) => Landscape
val landscape = (rot == 1 || rot == 3) val landscape = (rot == 1 || rot == 3)
if (landscape && h > w) { if (landscape && h > w) {
val t = w; w = h; h = t val t = w; w = h; h = t
@@ -293,9 +299,9 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su
attempts++ attempts++
// 2 consecutive identical measurements OR 20 attempts → apply // slightly tightened: 1 stable tick or max. 12 attempts
if ((stableCount >= 2 || attempts >= 20) && w > 0 && h > 0) { if ((stableCount >= 1 || attempts >= 12) && w > 0 && h > 0) {
Log.d("GameHost", "resize stabilized after $attempts ticks → ${w}x$h") ghLog("resize stabilized after $attempts ticks → ${w}x$h")
safeSetSize(w, h) safeSetSize(w, h)
stabilizerActive = false stabilizerActive = false
return return
@@ -10,7 +10,6 @@ import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.net.Uri
import android.util.Log import android.util.Log
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
@@ -22,7 +21,6 @@ import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.preference.PreferenceManager
import com.anggrayudi.storage.SimpleStorageHelper import com.anggrayudi.storage.SimpleStorageHelper
import com.sun.jna.JNIEnv import com.sun.jna.JNIEnv
import org.kenjinx.android.ui.theme.KenjinxAndroidTheme import org.kenjinx.android.ui.theme.KenjinxAndroidTheme
@@ -30,8 +28,6 @@ import org.kenjinx.android.viewmodels.MainViewModel
import org.kenjinx.android.viewmodels.QuickSettings import org.kenjinx.android.viewmodels.QuickSettings
import org.kenjinx.android.viewmodels.GameModel import org.kenjinx.android.viewmodels.GameModel
import org.kenjinx.android.views.MainView import org.kenjinx.android.views.MainView
import java.io.File
import android.content.res.Configuration
import android.content.Context import android.content.Context
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.hardware.display.DisplayManager import android.hardware.display.DisplayManager
@@ -54,9 +50,15 @@ class MainActivity : BaseActivity() {
private lateinit var displayManager: DisplayManager private lateinit var displayManager: DisplayManager
private var lastKnownRotation: Int? = null private var lastKnownRotation: Int? = null
private var pulsingOrientation = false private var pulsingOrientation = false
private var lastPulseAt = 0L
private val TAG_ROT = "RotationDebug" private val TAG_ROT = "RotationDebug"
private fun rotLog(msg: String) {
val enabled = BuildConfig.DEBUG && QuickSettings(this).enableDebugLogs
if (enabled) Log.d(TAG_ROT, msg)
}
private val displayListener = object : DisplayManager.DisplayListener { private val displayListener = object : DisplayManager.DisplayListener {
override fun onDisplayAdded(displayId: Int) {} override fun onDisplayAdded(displayId: Int) {}
override fun onDisplayRemoved(displayId: Int) {} override fun onDisplayRemoved(displayId: Int) {}
@@ -70,23 +72,23 @@ class MainActivity : BaseActivity() {
val rot = display?.rotation val rot = display?.rotation
if (rot == lastKnownRotation) return if (rot == lastKnownRotation) return
Log.d(TAG_ROT, "onDisplayChanged: display.rotation=$rot → ${deg(rot)}°") rotLog("onDisplayChanged: display.rotation=$rot → ${deg(rot)}°")
val pref = QuickSettings(this@MainActivity).orientationPreference val pref = QuickSettings(this@MainActivity).orientationPreference
val old = lastKnownRotation val old = lastKnownRotation
lastKnownRotation = rot lastKnownRotation = rot
// 1) Inform Native/Renderer // 1) Inform Native/Renderer (applies to Sensor & SensorLandscape)
try { KenjinxNative.setSurfaceRotationByAndroidRotation(rot) } catch (_: Throwable) {} try { KenjinxNative.setSurfaceRotationByAndroidRotation(rot) } catch (_: Throwable) {}
// 2) Initiate host resize // 2) Initiate host resize (applies to Sensor & SensorLandscape)
if (isGameRunning) { if (isGameRunning) {
handler.post { handler.post {
try { mainViewModel?.gameHost?.onOrientationOrSizeChanged(rot) } catch (_: Throwable) {} try { mainViewModel?.gameHost?.onOrientationOrSizeChanged(rot) } catch (_: Throwable) {}
} }
} }
// 3) For SENSOR_LANDSCAPE possibly pulse, if 90↔270 flip // 3) Only with SENSOR_LANDSCAPE: gentle pulse with real 90↔270 flip
if (pref == QuickSettings.OrientationPreference.SensorLandscape && old != null && rot != null) { if (pref == QuickSettings.OrientationPreference.SensorLandscape && old != null && rot != null) {
val isSideFlip = (old == Surface.ROTATION_90 && rot == Surface.ROTATION_270) || val isSideFlip = (old == Surface.ROTATION_90 && rot == Surface.ROTATION_270) ||
(old == Surface.ROTATION_270 && rot == Surface.ROTATION_90) (old == Surface.ROTATION_270 && rot == Surface.ROTATION_90)
@@ -104,10 +106,12 @@ class MainActivity : BaseActivity() {
} }
private fun doOrientationPulse(currentRot: Int) { private fun doOrientationPulse(currentRot: Int) {
if (pulsingOrientation) return val now = android.os.SystemClock.uptimeMillis()
if (pulsingOrientation || now - lastPulseAt < 350L) return
pulsingOrientation = true pulsingOrientation = true
lastPulseAt = now
// Short lock on the target page (instead of portrait intermediate step; prevents flickering) // Short lock on the target page (prevents flickering)
val lock = if (currentRot == Surface.ROTATION_90) val lock = if (currentRot == Surface.ROTATION_90)
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
else else
@@ -249,7 +253,7 @@ class MainActivity : BaseActivity() {
storedIntent = intent storedIntent = intent
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Log.d(TAG_ROT, "onCreate: initial display.rotation=${display?.rotation} → ${deg(display?.rotation)}°") rotLog("onCreate: initial display.rotation=${display?.rotation} → ${deg(display?.rotation)}°")
} }
} }
@@ -293,7 +297,7 @@ class MainActivity : BaseActivity() {
// Enable display listener // Enable display listener
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
lastKnownRotation = display?.rotation lastKnownRotation = display?.rotation
Log.d(TAG_ROT, "onResume: display.rotation=${display?.rotation} → ${deg(display?.rotation)}°") rotLog("onResume: display.rotation=${display?.rotation} → ${deg(display?.rotation)}°")
} }
try { displayManager.registerDisplayListener(displayListener, handler) } catch (_: Throwable) {} try { displayManager.registerDisplayListener(displayListener, handler) } catch (_: Throwable) {}
@@ -340,7 +344,7 @@ class MainActivity : BaseActivity() {
} else { } else {
TODO("VERSION.SDK_INT < R") TODO("VERSION.SDK_INT < R")
} }
Log.d(TAG_ROT, "applyOrientationPreference: rot=$rot → ${deg(rot)}°, pref=${pref.name}") rotLog("applyOrientationPreference: rot=$rot → ${deg(rot)}°, pref=${pref.name}")
try { KenjinxNative.setSurfaceRotationByAndroidRotation(rot) } catch (_: Throwable) {} try { KenjinxNative.setSurfaceRotationByAndroidRotation(rot) } catch (_: Throwable) {}
} }