android: Add settings for variable orientation
This commit is contained in:
parent
e804f24519
commit
9440d5eb8d
6 changed files with 105 additions and 6 deletions
|
@ -144,7 +144,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||
startMotionSensorListener()
|
||||
|
||||
NativeLibrary.notifyOrientationChange(
|
||||
EmulationMenuSettings.landscapeScreenLayout,
|
||||
EmulationMenuSettings.screenLayout,
|
||||
getAdjustedRotation()
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue