diff --git a/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt b/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt
index 3eb73d6bd3..ed4042b687 100644
--- a/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt
+++ b/android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt
@@ -28,7 +28,6 @@ import androidx.documentfile.provider.DocumentFile
import coil.load
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import com.google.android.material.materialswitch.MaterialSwitch
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
@@ -121,7 +120,6 @@ class GameLibraryActivity : AppCompatActivity() {
private lateinit var btnAbout: ImageButton
private lateinit var btnViewList: MaterialButton
private lateinit var btnViewGrid: MaterialButton
- private lateinit var switchBoxArtLookup: MaterialSwitch
private var gamesFolderUri: Uri? = null
private var scanGeneration = 0
@@ -175,15 +173,14 @@ class GameLibraryActivity : AppCompatActivity() {
btnAbout = findViewById(R.id.btn_library_about)
btnViewList = findViewById(R.id.btn_view_list)
btnViewGrid = findViewById(R.id.btn_view_grid)
- switchBoxArtLookup = findViewById(R.id.switch_box_art_lookup)
btnViewList.isCheckable = true
btnViewGrid.isCheckable = true
gamesFolderUri = prefs.getString("gamesFolderUri", null)?.let(Uri::parse)
useCoverGrid = prefs.getBoolean("library_cover_grid", false)
- boxArtLookupEnabled = prefs.getBoolean("library_box_art_lookup", true)
+ boxArtLookupEnabled = true
+ prefs.edit().putBoolean("library_box_art_lookup", true).apply()
- switchBoxArtLookup.isChecked = boxArtLookupEnabled
syncDisplayModeUi()
btnBootDashboard.setOnClickListener {
@@ -207,13 +204,6 @@ class GameLibraryActivity : AppCompatActivity() {
}
btnViewList.setOnClickListener { setDisplayMode(false) }
btnViewGrid.setOnClickListener { setDisplayMode(true) }
- switchBoxArtLookup.setOnCheckedChangeListener { _, checked ->
- boxArtLookupEnabled = checked
- prefs.edit().putBoolean("library_box_art_lookup", checked).apply()
- if (useCoverGrid) {
- renderGames()
- }
- }
updateConvertButtonState()
if (!isFolderReady(gamesFolderUri)) {
@@ -572,7 +562,6 @@ class GameLibraryActivity : AppCompatActivity() {
private fun syncDisplayModeUi() {
btnViewList.isChecked = !useCoverGrid
btnViewGrid.isChecked = useCoverGrid
- switchBoxArtLookup.visibility = if (useCoverGrid) View.VISIBLE else View.GONE
gamesListContainer.visibility = if (useCoverGrid) View.GONE else View.VISIBLE
gamesGridContainer.visibility = if (useCoverGrid) View.VISIBLE else View.GONE
}
diff --git a/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt b/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt
index 1911dcd7f7..1adbd28b5e 100644
--- a/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt
+++ b/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt
@@ -8,6 +8,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Process
+import android.view.Gravity
import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
@@ -725,48 +726,108 @@ class MainActivity : SDLActivity(), InputManager.InputDeviceListener {
return
}
- val options = arrayOf(
- getString(R.string.in_game_menu_resume),
+ val dp = resources.displayMetrics.density
+ val verticalButtonSpacing = (8 * dp).toInt()
+ val horizontalButtonSpacing = (8 * dp).toInt()
+ lateinit var dialog: androidx.appcompat.app.AlertDialog
+ data class MenuButtonSpec(
+ val label: String,
+ val action: () -> Unit,
+ )
+
+ fun createMenuButton(spec: MenuButtonSpec): MaterialButton {
+ return MaterialButton(
+ this@MainActivity,
+ null,
+ com.google.android.material.R.attr.materialButtonOutlinedStyle
+ ).apply {
+ text = spec.label
+ gravity = Gravity.CENTER
+ textAlignment = View.TEXT_ALIGNMENT_CENTER
+ isSingleLine = false
+ maxLines = 2
+ setOnClickListener {
+ dialog.dismiss()
+ spec.action()
+ }
+ }
+ }
+
+ fun addSingleButton(parent: LinearLayout, spec: MenuButtonSpec) {
+ parent.addView(createMenuButton(spec).apply {
+ layoutParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ ).also { lp ->
+ lp.bottomMargin = verticalButtonSpacing
+ }
+ })
+ }
+
+ fun addButtonRow(parent: LinearLayout, left: MenuButtonSpec, right: MenuButtonSpec) {
+ parent.addView(
+ LinearLayout(this).apply {
+ orientation = LinearLayout.HORIZONTAL
+ layoutParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ ).also { lp ->
+ lp.bottomMargin = verticalButtonSpacing
+ }
+ addView(createMenuButton(left).apply {
+ layoutParams = LinearLayout.LayoutParams(
+ 0,
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ 1f
+ ).also { lp ->
+ lp.marginEnd = horizontalButtonSpacing
+ }
+ })
+ addView(createMenuButton(right).apply {
+ layoutParams = LinearLayout.LayoutParams(
+ 0,
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ 1f
+ )
+ })
+ }
+ )
+ }
+
+ val resumeButton = MenuButtonSpec(getString(R.string.in_game_menu_resume)) { /* Resume */ }
+ val touchControlsButton = MenuButtonSpec(
if (isControllerVisible) {
getString(R.string.in_game_menu_hide_touch_controls)
} else {
getString(R.string.in_game_menu_show_touch_controls)
- },
- getString(R.string.in_game_menu_save_state),
- getString(R.string.in_game_menu_load_state),
- getString(R.string.in_game_menu_reboot_system),
- getString(R.string.in_game_menu_exit_to_library),
- getString(R.string.in_game_menu_quit_app),
- )
-
- val dp = resources.displayMetrics.density
- lateinit var dialog: androidx.appcompat.app.AlertDialog
+ }
+ ) {
+ toggleOnScreenController()
+ }
+ val saveStateButton = MenuButtonSpec(getString(R.string.in_game_menu_save_state)) {
+ showSaveStateDialog()
+ }
+ val loadStateButton = MenuButtonSpec(getString(R.string.in_game_menu_load_state)) {
+ showLoadStateDialog()
+ }
+ val rebootButton = MenuButtonSpec(getString(R.string.in_game_menu_reboot_system)) {
+ showRebootSystemConfirmation()
+ }
+ val exitToLibraryButton = MenuButtonSpec(getString(R.string.in_game_menu_exit_to_library)) {
+ exitToGameLibrary()
+ }
+ val quitAppButton = MenuButtonSpec(getString(R.string.in_game_menu_quit_app)) {
+ quitApp()
+ }
val buttonList = LinearLayout(this).apply {
orientation = LinearLayout.VERTICAL
setPadding((20 * dp).toInt(), (12 * dp).toInt(), (20 * dp).toInt(), 0)
- options.forEachIndexed { i, label ->
- addView(MaterialButton(this@MainActivity, null,
- com.google.android.material.R.attr.materialButtonOutlinedStyle).apply {
- text = label
- layoutParams = LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.MATCH_PARENT,
- LinearLayout.LayoutParams.WRAP_CONTENT
- ).also { lp -> lp.bottomMargin = (8 * dp).toInt() }
- setOnClickListener {
- dialog.dismiss()
- when (i) {
- 0 -> { /* Resume — dialog dismissed above */ }
- 1 -> toggleOnScreenController()
- 2 -> showSaveStateDialog()
- 3 -> showLoadStateDialog()
- 4 -> showRebootSystemConfirmation()
- 5 -> exitToGameLibrary()
- 6 -> quitApp()
- }
- }
- })
- }
+ addSingleButton(this, resumeButton)
+ addSingleButton(this, touchControlsButton)
+ addButtonRow(this, saveStateButton, loadStateButton)
+ addSingleButton(this, rebootButton)
+ addButtonRow(this, exitToLibraryButton, quitAppButton)
}
val scrollContainer = NestedScrollView(this).apply {
diff --git a/android/app/src/main/res/layout/activity_game_library.xml b/android/app/src/main/res/layout/activity_game_library.xml
index 9fca332712..fe68547713 100644
--- a/android/app/src/main/res/layout/activity_game_library.xml
+++ b/android/app/src/main/res/layout/activity_game_library.xml
@@ -169,13 +169,30 @@
app:iconPadding="8dp" />
-
+ android:gravity="center"
+ android:orientation="horizontal">
+
+
+
+
+
#66FF00
#1A5224
+
+ #FFD54F
+
#FF6B6B
#4A1515
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 8758577a65..8c20b1f707 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -45,6 +45,7 @@
List
Cover Grid
Look up box art online
+ Press and hold on a game for more options.
No folder selected
Scanning games...
Converting %1$s...