android: Add settings for variable orientation

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

View file

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

View file

@ -132,7 +132,7 @@ class Settings {
const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter" const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter"
const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable" const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable"
const val PREF_MENU_SETTINGS_HAPTICS = "EmulationMenuSettings_Haptics" 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_FPS = "EmulationMenuSettings_ShowFps"
const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay" 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.DialogInterface
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Color import android.graphics.Color
import android.hardware.display.DisplayManager
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@ -19,6 +21,7 @@ import android.view.*
import android.widget.TextView import android.widget.TextView
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.content.getSystemService
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
@ -178,6 +181,35 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
super.onDetach() 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() { private fun refreshInputOverlay() {
binding.surfaceInputOverlay.refreshControls() 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() private val Number.toPx get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt()
fun updateCurrentLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) { fun updateCurrentLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) {
@ -237,7 +281,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
binding.inGameMenu.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT binding.inGameMenu.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.overlayContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT binding.overlayContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.overlayContainer.updatePadding(0, 0, 0, 0) binding.overlayContainer.updatePadding(0, 0, 0, 0)
emulationActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE updateScreenLayout()
} }
binding.surfaceInputOverlay.requestLayout() binding.surfaceInputOverlay.requestLayout()
binding.inGameMenu.requestLayout() binding.inGameMenu.requestLayout()
@ -266,6 +310,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
popup.menu.apply { popup.menu.apply {
findItem(R.id.menu_toggle_fps).isChecked = EmulationMenuSettings.showFps 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_rel_stick_center).isChecked = EmulationMenuSettings.joystickRelCenter
findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide
findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay
@ -281,6 +333,29 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
true 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 -> { R.id.menu_edit_overlay -> {
binding.drawerLayout.close() binding.drawerLayout.close()
binding.surfaceInputOverlay.requestFocus() binding.surfaceInputOverlay.requestFocus()

View file

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

View file

@ -6,6 +6,26 @@
android:title="@string/emulation_fps_counter" android:title="@string/emulation_fps_counter"
android:checkable="true" /> 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 <item
android:id="@+id/menu_edit_overlay" android:id="@+id/menu_edit_overlay"
android:title="@string/emulation_touch_overlay_edit" /> android:title="@string/emulation_touch_overlay_edit" />

View file

@ -209,6 +209,10 @@
<string name="emulation_exit">Exit Emulation</string> <string name="emulation_exit">Exit Emulation</string>
<string name="emulation_done">Done</string> <string name="emulation_done">Done</string>
<string name="emulation_fps_counter">FPS Counter</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_toggle_controls">Toggle Controls</string>
<string name="emulation_rel_stick_center">Relative Stick Center</string> <string name="emulation_rel_stick_center">Relative Stick Center</string>
<string name="emulation_dpad_slide">DPad Slide</string> <string name="emulation_dpad_slide">DPad Slide</string>