mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	android: Enable automated portrait controls
This commit is contained in:
		@@ -10,6 +10,7 @@ import android.content.DialogInterface
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.content.pm.ActivityInfo
 | 
			
		||||
import android.content.res.Configuration
 | 
			
		||||
import android.content.res.Resources
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
@@ -192,6 +193,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onConfigurationChanged(newConfig: Configuration) {
 | 
			
		||||
        super.onConfigurationChanged(newConfig)
 | 
			
		||||
        if (!binding.surfaceInputOverlay.isInEditMode()) refreshInputOverlay()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onResume() {
 | 
			
		||||
        super.onResume()
 | 
			
		||||
        if (!DirectoryInitialization.areDirectoriesReady) {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ import android.annotation.SuppressLint
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.content.res.Configuration
 | 
			
		||||
import android.graphics.Bitmap
 | 
			
		||||
import android.graphics.Canvas
 | 
			
		||||
import android.graphics.Point
 | 
			
		||||
@@ -77,25 +76,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
        requestFocus()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressLint("DrawAllocation")
 | 
			
		||||
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
 | 
			
		||||
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
 | 
			
		||||
        val width = MeasureSpec.getSize(widthMeasureSpec)
 | 
			
		||||
        val height = MeasureSpec.getSize(heightMeasureSpec)
 | 
			
		||||
        if (height > width) {
 | 
			
		||||
            val aspectRatio = with (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager) {
 | 
			
		||||
                val metrics = maximumWindowMetrics.bounds
 | 
			
		||||
                Rational(metrics.height(), metrics.width()).toFloat()
 | 
			
		||||
            }
 | 
			
		||||
            val newWidth: Int = width
 | 
			
		||||
            val newHeight: Int = (width / aspectRatio).roundToInt()
 | 
			
		||||
            setMeasuredDimension(newWidth, newHeight)
 | 
			
		||||
            invalidate()
 | 
			
		||||
        } else {
 | 
			
		||||
            setMeasuredDimension(width, height)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun draw(canvas: Canvas) {
 | 
			
		||||
        super.draw(canvas)
 | 
			
		||||
        for (button in overlayButtons) {
 | 
			
		||||
@@ -256,10 +236,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
        val fingerPositionX = event.getX(pointerIndex).toInt()
 | 
			
		||||
        val fingerPositionY = event.getY(pointerIndex).toInt()
 | 
			
		||||
 | 
			
		||||
        // TODO: Provide support for portrait layout
 | 
			
		||||
        //val orientation =
 | 
			
		||||
        //    if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) "-Portrait" else ""
 | 
			
		||||
 | 
			
		||||
        for (button in overlayButtons) {
 | 
			
		||||
            // Determine the button state to apply based on the MotionEvent action flag.
 | 
			
		||||
            when (event.action and MotionEvent.ACTION_MASK) {
 | 
			
		||||
@@ -288,8 +264,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    saveControlPosition(
 | 
			
		||||
                        buttonBeingConfigured!!.buttonId,
 | 
			
		||||
                        buttonBeingConfigured!!.bounds.centerX(),
 | 
			
		||||
                        buttonBeingConfigured!!.bounds.centerY(),
 | 
			
		||||
                        ""
 | 
			
		||||
                        buttonBeingConfigured!!.bounds.centerY()
 | 
			
		||||
                    )
 | 
			
		||||
                    buttonBeingConfigured = null
 | 
			
		||||
                }
 | 
			
		||||
@@ -321,8 +296,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    saveControlPosition(
 | 
			
		||||
                        dpadBeingConfigured!!.upId,
 | 
			
		||||
                        dpadBeingConfigured!!.bounds.centerX(),
 | 
			
		||||
                        dpadBeingConfigured!!.bounds.centerY(),
 | 
			
		||||
                        ""
 | 
			
		||||
                        dpadBeingConfigured!!.bounds.centerY()
 | 
			
		||||
                    )
 | 
			
		||||
                    dpadBeingConfigured = null
 | 
			
		||||
                }
 | 
			
		||||
@@ -352,8 +326,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    saveControlPosition(
 | 
			
		||||
                        joystickBeingConfigured!!.buttonId,
 | 
			
		||||
                        joystickBeingConfigured!!.bounds.centerX(),
 | 
			
		||||
                        joystickBeingConfigured!!.bounds.centerY(),
 | 
			
		||||
                        ""
 | 
			
		||||
                        joystickBeingConfigured!!.bounds.centerY()
 | 
			
		||||
                    )
 | 
			
		||||
                    joystickBeingConfigured = null
 | 
			
		||||
                }
 | 
			
		||||
@@ -363,7 +336,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun addOverlayControls(orientation: String) {
 | 
			
		||||
    private fun addOverlayControls() {
 | 
			
		||||
        val windowSize = getSafeScreenSize(context)
 | 
			
		||||
        if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_0, true)) {
 | 
			
		||||
            overlayButtons.add(
 | 
			
		||||
@@ -372,8 +345,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_a,
 | 
			
		||||
                    R.drawable.facebutton_a_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_A,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_A
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -384,8 +356,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_b,
 | 
			
		||||
                    R.drawable.facebutton_b_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_B,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_B
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -396,8 +367,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_x,
 | 
			
		||||
                    R.drawable.facebutton_x_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_X,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_X
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -408,8 +378,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_y,
 | 
			
		||||
                    R.drawable.facebutton_y_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_Y,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_Y
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -420,8 +389,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.l_shoulder,
 | 
			
		||||
                    R.drawable.l_shoulder_depressed,
 | 
			
		||||
                    ButtonType.TRIGGER_L,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.TRIGGER_L
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -432,8 +400,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.r_shoulder,
 | 
			
		||||
                    R.drawable.r_shoulder_depressed,
 | 
			
		||||
                    ButtonType.TRIGGER_R,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.TRIGGER_R
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -444,8 +411,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.zl_trigger,
 | 
			
		||||
                    R.drawable.zl_trigger_depressed,
 | 
			
		||||
                    ButtonType.TRIGGER_ZL,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.TRIGGER_ZL
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -456,8 +422,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.zr_trigger,
 | 
			
		||||
                    R.drawable.zr_trigger_depressed,
 | 
			
		||||
                    ButtonType.TRIGGER_ZR,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.TRIGGER_ZR
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -468,8 +433,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_plus,
 | 
			
		||||
                    R.drawable.facebutton_plus_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_PLUS,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_PLUS
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -480,8 +444,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_minus,
 | 
			
		||||
                    R.drawable.facebutton_minus_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_MINUS,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_MINUS
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -492,8 +455,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.dpad_standard,
 | 
			
		||||
                    R.drawable.dpad_standard_cardinal_depressed,
 | 
			
		||||
                    R.drawable.dpad_standard_diagonal_depressed,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    R.drawable.dpad_standard_diagonal_depressed
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -506,8 +468,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    R.drawable.joystick,
 | 
			
		||||
                    R.drawable.joystick_depressed,
 | 
			
		||||
                    StickType.STICK_L,
 | 
			
		||||
                    ButtonType.STICK_L,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.STICK_L
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -520,8 +481,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    R.drawable.joystick,
 | 
			
		||||
                    R.drawable.joystick_depressed,
 | 
			
		||||
                    StickType.STICK_R,
 | 
			
		||||
                    ButtonType.STICK_R,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.STICK_R
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -532,8 +492,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_home,
 | 
			
		||||
                    R.drawable.facebutton_home_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_HOME,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_HOME
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -544,8 +503,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    windowSize,
 | 
			
		||||
                    R.drawable.facebutton_screenshot,
 | 
			
		||||
                    R.drawable.facebutton_screenshot_depressed,
 | 
			
		||||
                    ButtonType.BUTTON_CAPTURE,
 | 
			
		||||
                    orientation
 | 
			
		||||
                    ButtonType.BUTTON_CAPTURE
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
@@ -556,23 +514,21 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
        overlayButtons.clear()
 | 
			
		||||
        overlayDpads.clear()
 | 
			
		||||
        overlayJoysticks.clear()
 | 
			
		||||
        val orientation =
 | 
			
		||||
            if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) "-Portrait" else ""
 | 
			
		||||
 | 
			
		||||
        // Add all the enabled overlay items back to the HashSet.
 | 
			
		||||
        if (EmulationMenuSettings.showOverlay) {
 | 
			
		||||
            addOverlayControls(orientation)
 | 
			
		||||
            addOverlayControls()
 | 
			
		||||
        }
 | 
			
		||||
        invalidate()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun saveControlPosition(sharedPrefsId: Int, x: Int, y: Int, orientation: String) {
 | 
			
		||||
    private fun saveControlPosition(sharedPrefsId: Int, x: Int, y: Int) {
 | 
			
		||||
        val windowSize = getSafeScreenSize(context)
 | 
			
		||||
        val min = windowSize.first
 | 
			
		||||
        val max = windowSize.second
 | 
			
		||||
        PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext).edit()
 | 
			
		||||
            .putFloat("$sharedPrefsId$orientation-X", (x - min.x).toFloat() / max.x)
 | 
			
		||||
            .putFloat("$sharedPrefsId$orientation-Y", (y - min.y).toFloat() / max.y)
 | 
			
		||||
            .putFloat("$sharedPrefsId-X", (x - min.x).toFloat() / max.x)
 | 
			
		||||
            .putFloat("$sharedPrefsId-Y", (y - min.y).toFloat() / max.y)
 | 
			
		||||
            .apply()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -791,9 +747,9 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                val insets = context.windowManager.currentWindowMetrics.windowInsets.displayCutout
 | 
			
		||||
                if (insets != null) {
 | 
			
		||||
                    if (insets.boundingRectTop.bottom != 0 && insets.boundingRectTop.bottom > maxY / 2)
 | 
			
		||||
                        insets.boundingRectTop.bottom.toFloat() else maxY
 | 
			
		||||
                        maxY = insets.boundingRectTop.bottom.toFloat()
 | 
			
		||||
                    if (insets.boundingRectRight.left != 0 && insets.boundingRectRight.left > maxX / 2)
 | 
			
		||||
                        insets.boundingRectRight.left.toFloat() else maxX
 | 
			
		||||
                        maxX = insets.boundingRectRight.left.toFloat()
 | 
			
		||||
 | 
			
		||||
                    minX = insets.boundingRectLeft.right - insets.boundingRectLeft.left
 | 
			
		||||
                    minY = insets.boundingRectBottom.top - insets.boundingRectBottom.bottom
 | 
			
		||||
@@ -862,8 +818,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
            windowSize: Pair<Point, Point>,
 | 
			
		||||
            defaultResId: Int,
 | 
			
		||||
            pressedResId: Int,
 | 
			
		||||
            buttonId: Int,
 | 
			
		||||
            orientation: String
 | 
			
		||||
            buttonId: Int
 | 
			
		||||
        ): InputOverlayDrawableButton {
 | 
			
		||||
            // Resources handle for fetching the initial Drawable resource.
 | 
			
		||||
            val res = context.resources
 | 
			
		||||
@@ -900,8 +855,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
 | 
			
		||||
            // The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
 | 
			
		||||
            // These were set in the input overlay configuration menu.
 | 
			
		||||
            val xKey = "$buttonId$orientation-X"
 | 
			
		||||
            val yKey = "$buttonId$orientation-Y"
 | 
			
		||||
            val xKey = "$buttonId-X"
 | 
			
		||||
            val yKey = "$buttonId-Y"
 | 
			
		||||
            val drawableXPercent = sPrefs.getFloat(xKey, 0f)
 | 
			
		||||
            val drawableYPercent = sPrefs.getFloat(yKey, 0f)
 | 
			
		||||
            val drawableX = (drawableXPercent * max.x + min.x).toInt()
 | 
			
		||||
@@ -943,8 +898,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
            windowSize: Pair<Point, Point>,
 | 
			
		||||
            defaultResId: Int,
 | 
			
		||||
            pressedOneDirectionResId: Int,
 | 
			
		||||
            pressedTwoDirectionsResId: Int,
 | 
			
		||||
            orientation: String
 | 
			
		||||
            pressedTwoDirectionsResId: Int
 | 
			
		||||
        ): InputOverlayDrawableDpad {
 | 
			
		||||
            // Resources handle for fetching the initial Drawable resource.
 | 
			
		||||
            val res = context.resources
 | 
			
		||||
@@ -981,8 +935,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
 | 
			
		||||
            // The X and Y coordinates of the InputOverlayDrawableDpad on the InputOverlay.
 | 
			
		||||
            // These were set in the input overlay configuration menu.
 | 
			
		||||
            val drawableXPercent = sPrefs.getFloat("${ButtonType.DPAD_UP}$orientation-X", 0f)
 | 
			
		||||
            val drawableYPercent = sPrefs.getFloat("${ButtonType.DPAD_UP}$orientation-Y", 0f)
 | 
			
		||||
            val drawableXPercent = sPrefs.getFloat("${ButtonType.DPAD_UP}-X", 0f)
 | 
			
		||||
            val drawableYPercent = sPrefs.getFloat("${ButtonType.DPAD_UP}-Y", 0f)
 | 
			
		||||
            val drawableX = (drawableXPercent * max.x + min.x).toInt()
 | 
			
		||||
            val drawableY = (drawableYPercent * max.y + min.y).toInt()
 | 
			
		||||
            val width = overlayDrawable.width
 | 
			
		||||
@@ -1023,8 +977,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
            defaultResInner: Int,
 | 
			
		||||
            pressedResInner: Int,
 | 
			
		||||
            joystick: Int,
 | 
			
		||||
            button: Int,
 | 
			
		||||
            orientation: String
 | 
			
		||||
            button: Int
 | 
			
		||||
        ): InputOverlayDrawableJoystick {
 | 
			
		||||
            // Resources handle for fetching the initial Drawable resource.
 | 
			
		||||
            val res = context.resources
 | 
			
		||||
@@ -1048,8 +1001,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
 | 
			
		||||
            // The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
 | 
			
		||||
            // These were set in the input overlay configuration menu.
 | 
			
		||||
            val drawableXPercent = sPrefs.getFloat("$button$orientation-X", 0f)
 | 
			
		||||
            val drawableYPercent = sPrefs.getFloat("$button$orientation-Y", 0f)
 | 
			
		||||
            val drawableXPercent = sPrefs.getFloat("$button-X", 0f)
 | 
			
		||||
            val drawableYPercent = sPrefs.getFloat("$button-Y", 0f)
 | 
			
		||||
            val drawableX = (drawableXPercent * max.x + min.x).toInt()
 | 
			
		||||
            val drawableY = (drawableYPercent * max.y + min.y).toInt()
 | 
			
		||||
            val outerScale = 1.66f
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user