Add picture in picture for emulation activity

This commit is contained in:
Abandoned Cart 2023-02-14 10:08:18 -05:00 committed by Billy Laws
parent 179363a5e7
commit 4298415134
2 changed files with 31 additions and 2 deletions

View File

@ -67,7 +67,8 @@
<activity
android:name=".EmulationActivity"
android:configChanges="orientation|screenSize|uiMode"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|uiMode"
android:exported="true"
android:launchMode="singleTask"
android:process="${emulationProcess}"

View File

@ -6,9 +6,11 @@
package emu.skyline
import android.annotation.SuppressLint
import android.app.PictureInPictureParams
import android.content.Context
import android.content.Intent
import android.content.res.AssetManager
import android.content.res.Configuration
import android.graphics.PointF
import android.hardware.display.DisplayManager
import android.os.*
@ -168,6 +170,7 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
/**
* Return from emulation to either [MainActivity] or the activity on the back stack
*/
@SuppressWarnings("WeakerAccess")
fun returnFromEmulation() {
if (shouldFinish) {
runOnUiThread {
@ -260,6 +263,9 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
binding.onScreenControllerToggle.setOnApplyWindowInsetsListener(insetsOrMarginHandler)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
setPictureInPictureParams(PictureInPictureParams.Builder().setAutoEnterEnabled(true).build())
binding.gameView.holder.addCallback(this)
binding.gameView.setAspectRatio(
@ -343,6 +349,23 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
if (isInPictureInPictureMode) {
binding.onScreenControllerView.isGone = true
binding.onScreenControllerToggle.isGone = true
} else {
binding.onScreenControllerView.apply {
controllerType = inputHandler.getFirstControllerType()
isGone = controllerType == ControllerType.None || !appSettings.onScreenControl
}
binding.onScreenControllerToggle.apply {
isGone = binding.onScreenControllerView.isGone
}
}
}
/**
* Stop the currently executing ROM and replace it with the one specified in the new intent
*/
@ -354,6 +377,11 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
}
}
override fun onUserLeaveHint() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S)
enterPictureInPictureMode(PictureInPictureParams.Builder().build())
}
override fun onDestroy() {
super.onDestroy()
shouldFinish = false
@ -519,7 +547,7 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
return ((major shl 22) or (minor shl 12) or (patch)).toInt()
}
val insetsOrMarginHandler = View.OnApplyWindowInsetsListener { view, insets ->
private val insetsOrMarginHandler = View.OnApplyWindowInsetsListener { view, insets ->
insets.displayCutout?.let {
val defaultHorizontalMargin = view.resources.getDimensionPixelSize(R.dimen.onScreenItemHorizontalMargin)
val left = if (it.safeInsetLeft == 0) defaultHorizontalMargin else it.safeInsetLeft