android: Add settings for variable orientation

This commit is contained in:
Abandoned Cart 2023-06-04 10:24:18 -04:00
parent e804f24519
commit 9440d5eb8d
6 changed files with 105 additions and 6 deletions

View file

@ -144,7 +144,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
startMotionSensorListener()
NativeLibrary.notifyOrientationChange(
EmulationMenuSettings.landscapeScreenLayout,
EmulationMenuSettings.screenLayout,
getAdjustedRotation()
)
}

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,35 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
super.onDetach()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
var emulatorLayout = 5
when (newConfig.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> { emulatorLayout = 5 }
Configuration.ORIENTATION_PORTRAIT -> { emulatorLayout = 4 }
Configuration.ORIENTATION_UNDEFINED -> { emulatorLayout = 5 }
else -> {}
}
emulationActivity?.let {
var rotation = it.getSystemService<DisplayManager>()!!
.getDisplay(Display.DEFAULT_DISPLAY).rotation
if ((newConfig.screenLayout and Configuration.SCREENLAYOUT_LONG_YES) == 0 ||
(newConfig.screenLayout and Configuration.SCREENLAYOUT_LONG_NO) != 0
) {
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 }
}
}
NativeLibrary.notifyOrientationChange(emulatorLayout, rotation)
}
}
private fun refreshInputOverlay() {
binding.surfaceInputOverlay.refreshControls()
}
@ -217,6 +249,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
}
@SuppressLint("SourceLockedOrientationActivity")
private fun updateScreenLayout() {
emulationActivity?.let {
when (EmulationMenuSettings.screenLayout) {
5 -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE }
4 -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT }
0 -> { 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 +281,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 +310,14 @@ 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) {
5 -> { subMenu.findItem(R.id.menu_screen_layout_landscape).isChecked = true }
4 -> { subMenu.findItem(R.id.menu_screen_layout_portrait).isChecked = true }
0 -> { 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 +333,29 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
true
}
R.id.menu_screen_layout_landscape -> {
EmulationMenuSettings.screenLayout = 5
updateScreenLayout()
false
}
R.id.menu_screen_layout_portrait -> {
EmulationMenuSettings.screenLayout = 4
updateScreenLayout()
false
}
R.id.menu_screen_layout_auto -> {
EmulationMenuSettings.screenLayout = 0
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>