Compare commits

...

3 Commits

Author SHA1 Message Date
Abandoned Cart
7ab4ab16a7 android: Set default rotation to landscape 2023-06-04 14:44:24 -04:00
Abandoned Cart
4767fe993b android: Use the predefined layout values 2023-06-04 10:34:59 -04:00
Abandoned Cart
9440d5eb8d android: Add settings for variable orientation 2023-06-04 10:27:53 -04:00
6 changed files with 120 additions and 28 deletions

View File

@@ -6,15 +6,12 @@ package org.yuzu.yuzu_emu.activities
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Rect
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.hardware.display.DisplayManager
import android.os.Bundle
import android.view.Display
import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
@@ -22,7 +19,6 @@ import android.view.Surface
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.getSystemService
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
@@ -144,8 +140,8 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
startMotionSensorListener()
NativeLibrary.notifyOrientationChange(
EmulationMenuSettings.landscapeScreenLayout,
getAdjustedRotation()
EmulationMenuSettings.LayoutOption_MobileLandscape,
Surface.ROTATION_90
)
}
@@ -252,23 +248,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
override fun onAccuracyChanged(sensor: Sensor, i: Int) {}
private fun getAdjustedRotation():Int {
val rotation = getSystemService<DisplayManager>()!!.getDisplay(Display.DEFAULT_DISPLAY).rotation
val config: Configuration = resources.configuration
if ((config.screenLayout and Configuration.SCREENLAYOUT_LONG_YES) != 0 ||
(config.screenLayout and Configuration.SCREENLAYOUT_LONG_NO) == 0) {
return rotation
}
when (rotation) {
Surface.ROTATION_0 -> return Surface.ROTATION_90
Surface.ROTATION_90 -> return Surface.ROTATION_0
Surface.ROTATION_180 -> return Surface.ROTATION_270
Surface.ROTATION_270 -> return Surface.ROTATION_180
}
return rotation
}
private fun restoreState(savedInstanceState: Bundle) {
game = savedInstanceState.parcelable(EXTRA_SELECTED_GAME)!!
}

View File

@@ -132,7 +132,7 @@ class Settings {
const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter"
const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable"
const val PREF_MENU_SETTINGS_HAPTICS = "EmulationMenuSettings_Haptics"
const val PREF_MENU_SETTINGS_LANDSCAPE = "EmulationMenuSettings_LandscapeScreenLayout"
const val PREF_MENU_SETTINGS_SCREEN_LAYOUT = "EmulationMenuSettings_ScreenLayout"
const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps"
const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay"

View File

@@ -9,8 +9,10 @@ import android.content.Context
import android.content.DialogInterface
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.hardware.display.DisplayManager
import android.os.Bundle
import android.os.Handler
import android.os.Looper
@@ -19,6 +21,7 @@ import android.view.*
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.getSystemService
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat
@@ -178,6 +181,37 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
super.onDetach()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
val emulatorLayout = when (newConfig.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> { EmulationMenuSettings.LayoutOption_MobileLandscape }
Configuration.ORIENTATION_PORTRAIT -> { EmulationMenuSettings.LayoutOption_MobilePortrait }
else -> { EmulationMenuSettings.LayoutOption_MobileLandscape }
}
emulationActivity?.let {
var rotation = it.getSystemService<DisplayManager>()!!
.getDisplay(Display.DEFAULT_DISPLAY).rotation
if (newConfig.orientation != Configuration.ORIENTATION_PORTRAIT) {
rotation = when (rotation) {
Surface.ROTATION_0 -> Surface.ROTATION_90
Surface.ROTATION_90 -> Surface.ROTATION_0
Surface.ROTATION_180 -> Surface.ROTATION_270
Surface.ROTATION_270 -> Surface.ROTATION_180
else -> { rotation }
}
}
if (it.isInPictureInPictureMode) {
NativeLibrary.notifyOrientationChange(
EmulationMenuSettings.LayoutOption_MobileLandscape, rotation
)
} else {
NativeLibrary.notifyOrientationChange(emulatorLayout, rotation)
}
}
}
private fun refreshInputOverlay() {
binding.surfaceInputOverlay.refreshControls()
}
@@ -217,6 +251,24 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
}
@SuppressLint("SourceLockedOrientationActivity")
private fun updateScreenLayout() {
emulationActivity?.let {
when (EmulationMenuSettings.screenLayout) {
EmulationMenuSettings.LayoutOption_MobileLandscape -> {
it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE
}
EmulationMenuSettings.LayoutOption_MobilePortrait -> {
it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT
}
EmulationMenuSettings.LayoutOption_Default -> {
it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
else -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE }
}
}
}
private val Number.toPx get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt()
fun updateCurrentLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) {
@@ -237,7 +289,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
binding.inGameMenu.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.overlayContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.overlayContainer.updatePadding(0, 0, 0, 0)
emulationActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
updateScreenLayout()
}
binding.surfaceInputOverlay.requestLayout()
binding.inGameMenu.requestLayout()
@@ -266,6 +318,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
popup.menu.apply {
findItem(R.id.menu_toggle_fps).isChecked = EmulationMenuSettings.showFps
findItem(R.id.menu_screen_layout).subMenu?.let { subMenu ->
when (EmulationMenuSettings.screenLayout) {
EmulationMenuSettings.LayoutOption_MobileLandscape -> {
subMenu.findItem(R.id.menu_screen_layout_landscape).isChecked = true
}
EmulationMenuSettings.LayoutOption_MobilePortrait -> {
subMenu.findItem(R.id.menu_screen_layout_portrait).isChecked = true
}
EmulationMenuSettings.LayoutOption_Default -> {
subMenu.findItem(R.id.menu_screen_layout_auto).isChecked = true
}
else -> { subMenu.findItem(R.id.menu_screen_layout_landscape).isChecked = true }
}
}
findItem(R.id.menu_rel_stick_center).isChecked = EmulationMenuSettings.joystickRelCenter
findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide
findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay
@@ -281,6 +347,29 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
true
}
R.id.menu_screen_layout_landscape -> {
EmulationMenuSettings.screenLayout = EmulationMenuSettings.LayoutOption_MobileLandscape
updateScreenLayout()
false
}
R.id.menu_screen_layout_portrait -> {
EmulationMenuSettings.screenLayout = EmulationMenuSettings.LayoutOption_MobilePortrait
updateScreenLayout()
false
}
R.id.menu_screen_layout_auto -> {
EmulationMenuSettings.screenLayout = EmulationMenuSettings.LayoutOption_Default
updateScreenLayout()
false
}
R.id.menu_screen_layout -> {
it.subMenu?.setGroupCheckable(R.id.menu_screen_layout_group, true, true)
true
}
R.id.menu_edit_overlay -> {
binding.drawerLayout.close()
binding.surfaceInputOverlay.requestFocus()

View File

@@ -41,14 +41,14 @@ object EmulationMenuSettings {
.apply()
}
var landscapeScreenLayout: Int
var screenLayout: Int
get() = preferences.getInt(
Settings.PREF_MENU_SETTINGS_LANDSCAPE,
Settings.PREF_MENU_SETTINGS_SCREEN_LAYOUT,
LayoutOption_MobileLandscape
)
set(value) {
preferences.edit()
.putInt(Settings.PREF_MENU_SETTINGS_LANDSCAPE, value)
.putInt(Settings.PREF_MENU_SETTINGS_SCREEN_LAYOUT, value)
.apply()
}
var showFps: Boolean

View File

@@ -6,6 +6,26 @@
android:title="@string/emulation_fps_counter"
android:checkable="true" />
<item
android:id="@+id/menu_screen_layout"
android:title="@string/emulation_screen_rotation">
<menu>
<group
android:id="@+id/menu_screen_layout_group"
android:checkableBehavior="single">
<item
android:id="@+id/menu_screen_layout_landscape"
android:title="@string/emulation_screen_rotation_landscape"/>
<item
android:id="@+id/menu_screen_layout_portrait"
android:title="@string/emulation_screen_rotation_portrait"/>
<item
android:id="@+id/menu_screen_layout_auto"
android:title="@string/emulation_screen_rotation_auto"/>
</group>
</menu>
</item>
<item
android:id="@+id/menu_edit_overlay"
android:title="@string/emulation_touch_overlay_edit" />

View File

@@ -209,6 +209,10 @@
<string name="emulation_exit">Exit Emulation</string>
<string name="emulation_done">Done</string>
<string name="emulation_fps_counter">FPS Counter</string>
<string name="emulation_screen_rotation">Orientation</string>
<string name="emulation_screen_rotation_landscape">Landscape</string>
<string name="emulation_screen_rotation_portrait">Portrait</string>
<string name="emulation_screen_rotation_auto">Auto</string>
<string name="emulation_toggle_controls">Toggle Controls</string>
<string name="emulation_rel_stick_center">Relative Stick Center</string>
<string name="emulation_dpad_slide">DPad Slide</string>