From 069e3406c7a915b57b8c38c87796bbfd8adc993e Mon Sep 17 00:00:00 2001 From: Abandoned Cart Date: Sat, 3 Jun 2023 14:52:12 -0400 Subject: [PATCH] android: Dynamic picture in picture actions --- .../yuzu_emu/activities/EmulationActivity.kt | 38 +++++++++++-------- .../yuzu_emu/fragments/EmulationFragment.kt | 4 ++ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 9713016822..9fff105ec8 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -70,7 +70,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { private val actionPause = "ACTION_EMULATOR_PAUSE" private val actionPlay = "ACTION_EMULATOR_PLAY" - private lateinit var pictureInPictureParamsBuilder : PictureInPictureParams.Builder private lateinit var game: Game @@ -100,8 +99,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { // Set these options now so that the SurfaceView the game renders into is the right size. enableFullscreenImmersive() - pictureInPictureParamsBuilder = getPictureInPictureActionsBuilder() - setContentView(R.layout.activity_emulation) window.decorView.setBackgroundColor(getColor(android.R.color.black)) @@ -168,10 +165,11 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { getAdjustedRotation() ) + val pictureInPictureParamsBuilder = getPictureInPictureActionsBuilder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { pictureInPictureParamsBuilder.setAutoEnterEnabled(BooleanSetting.PICTURE_IN_PICTURE.boolean) - setPictureInPictureParams(pictureInPictureParamsBuilder.build()) } + setPictureInPictureParams(pictureInPictureParamsBuilder.build()) } override fun onPause() { @@ -183,6 +181,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { override fun onUserLeaveHint() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { if (BooleanSetting.PICTURE_IN_PICTURE.boolean && !isInPictureInPictureMode) { + val pictureInPictureParamsBuilder = getPictureInPictureActionsBuilder() enterPictureInPictureMode(pictureInPictureParamsBuilder.build()) } } @@ -320,15 +319,18 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { val pictureInPictureActions : MutableList = mutableListOf() val pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - val pauseIcon = Icon.createWithResource(this, R.drawable.ic_pip_pause) - val pausePendingIntent = PendingIntent.getBroadcast(this, R.drawable.ic_pip_pause, Intent(actionPause), pendingFlags) - val pauseRemoteAction = RemoteAction(pauseIcon, getString(R.string.pause), getString(R.string.pause), pausePendingIntent) - pictureInPictureActions.add(pauseRemoteAction) - - val playIcon = Icon.createWithResource(this, R.drawable.ic_pip_play) - val playPendingIntent = PendingIntent.getBroadcast(this, R.drawable.ic_pip_play, Intent(actionPlay), pendingFlags) - val playRemoteAction = RemoteAction(playIcon, getString(R.string.play), getString(R.string.play), playPendingIntent) - pictureInPictureActions.add(playRemoteAction) + val isEmulationPaused = emulationFragment?.isEmulationStatePaused() ?: false + if (isEmulationPaused) { + val playIcon = Icon.createWithResource(this, R.drawable.ic_pip_play) + val playPendingIntent = PendingIntent.getBroadcast(this, R.drawable.ic_pip_play, Intent(actionPlay), pendingFlags) + val playRemoteAction = RemoteAction(playIcon, getString(R.string.play), getString(R.string.play), playPendingIntent) + pictureInPictureActions.add(playRemoteAction) + } else { + val pauseIcon = Icon.createWithResource(this, R.drawable.ic_pip_pause) + val pausePendingIntent = PendingIntent.getBroadcast(this, R.drawable.ic_pip_pause, Intent(actionPause), pendingFlags) + val pauseRemoteAction = RemoteAction(pauseIcon, getString(R.string.pause), getString(R.string.pause), pausePendingIntent) + pictureInPictureActions.add(pauseRemoteAction) + } return PictureInPictureParams.Builder().apply { setActions(pictureInPictureActions) @@ -337,12 +339,16 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { private var pictureInPictureReceiver = object : BroadcastReceiver() { override fun onReceive(context : Context?, intent : Intent) { - if (intent.action == actionPause) { - emulationFragment?.onPictureInPicturePause() - } if (intent.action == actionPlay) { emulationFragment?.onPictureInPicturePlay() + } else if (intent.action == actionPause) { + emulationFragment?.onPictureInPicturePause() } + val pictureInPictureParamsBuilder = getPictureInPictureActionsBuilder() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + pictureInPictureParamsBuilder.setAutoEnterEnabled(BooleanSetting.PICTURE_IN_PICTURE.boolean) + } + setPictureInPictureParams(pictureInPictureParamsBuilder.build()) } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 3f1e4a3349..2aa3f6e969 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -179,6 +179,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { super.onDetach() } + fun isEmulationStatePaused() : Boolean { + return this::emulationState.isInitialized && emulationState.isPaused + } + fun onPictureInPictureEnter() { if (binding.drawerLayout.isOpen) { binding.drawerLayout.close()