From 51149823b0e95c6c22f0ae3e3bb2b991d65ac97f Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Tue, 24 Mar 2026 20:40:17 -0400 Subject: [PATCH] minor ui touchups --- .../izzy2lost/x1box/GameLibraryActivity.kt | 15 +- .../java/com/izzy2lost/x1box/MainActivity.kt | 129 +++++++++++++----- .../main/res/layout/activity_game_library.xml | 25 +++- android/app/src/main/res/values/colors.xml | 3 + android/app/src/main/res/values/strings.xml | 1 + 5 files changed, 122 insertions(+), 51 deletions(-) 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...